实验5 IIC通讯与AD/接DA接口
1.利用单片机控制PCF8591的AD转换,控制AD0和AD1电位器,在数码光上显示DA转换的值。
2.利用单片机控制PCF8591的DA转换,让发光二极管D1由暗到亮变化,整个过程时间差不多2s左右,再由亮到暗变化,循环变化。
以下代码将1、2实验合并成一个实验。
Lab6.1
#include<reg51.h>
#include <I2C.H>
#define PCF8591 0x90 //PCF8591 地址
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//=========全局变量区============================================
unsignedchar AD_CHANNEL;
];
sbit high;
sbit mid;
sbit low;
uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码
//=========全局变量区结束========================================
//=========函数区============================================
/*******************************************************************
延时
*******************************************************************/
void delay_1ms(uint x){
uint i=x;
uint j;
;--i){
;--j);
}
}
/*******************************************************************
在数码管上显示对应的值
参数说明:
Num 要显示的数字
*******************************************************************/
void display(uchar Num,uchar withDot)
{
P0=NumTable[Num]|withDot;
delay_1ms);
P0; //送完段选信号后,进行消影的处理
}
/*******************************************************************
控制数码管显示,并分解计数值
*******************************************************************/
void DisplayNumByOrder(uint left,uint right){
low); //left
low);
low,0x80);
low);
//right
low);
low);
low,0x80);
low);
}
/*******************************************************************
DAC 变换, 转化函数
*******************************************************************/
bit DACconversion(unsignedchar sla,unsignedchar c, unsignedchar Val)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
);
SendByte(c); //发送控制字节
);
SendByte(Val); //发送DAC的数值
);
Stop_I2c(); //结束总线
);
}
/*******************************************************************
ADC发送字节[命令]数据函数
*******************************************************************/
bit ISendByte(unsignedchar sla,unsignedchar c)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
);
SendByte(c); //发送数据
);
Stop_I2c(); //结束总线
);
}
/*******************************************************************
ADC读字节数据函数
*******************************************************************/
unsignedchar IRcvByte(unsignedchar sla)
{ unsignedchar c;
Start_I2c(); //启动总线
SendByte); //发送器件地址
);
c
Ack_I2c); //发送非就答位
Stop_I2c(); //结束总线
return(c);
}
//******************************************************************/
main()
{
)
{
/********以下AD-DA处理*************/
//个时钟才是正常的值,相当于
//swith经历了一轮case 0~4后,程序里面读取到的AD转换的值才是正常的。
switch(AD_CHANNEL) // A/D信道,通过这个函数,4个信道的数值都能读到
{
: ISendByte(PCF8591,0x41);
D倍显示
break;
: ISendByte(PCF8591,0x42);
D
break;
: ISendByte(PCF8591,0x43);
D
break;
: ISendByte(PCF8591,0x40);
D
break;
]);//DAC 数模转换
break;
}
D]; // 把模拟输入采样的信号通过数模转换输出,最终改变灯泡亮度
;
DisplayNumByOrder]);//将AD的值送到LED数码管显示
}
}
//=========函数结束区============================================
/*************************此部分为I2C总线的驱动程序*************************************/
I2c.c
#include<reg51.h>
#include <intrins.h>
#include <I2C.H>
#define NOP() _nop_() /* 定义空指令 */
#define _Nop() _nop_() /*定义空指令*/
sbit SCL; //I2C 时钟
sbit SDA; //I2C 数据
bit ack; /*应答标志位*/
/*******************************************************************
起动总线函数
函数原型: void Start_I2c();
功能: 启动I2C总线,即发送I2C起始条件.
********************************************************************/
void Start_I2c()
{
SDA; /*发送起始条件的数据信号*/
_Nop();
SCL;
_Nop(); /*起始条件建立时间大于4.7us,延时*/
_Nop();
_Nop();
_Nop();
_Nop();
SDA; /*发送起始信号*/
_Nop(); /* 起始条件锁定时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL; /*钳住I2C总线,准备发送或接收数据 */
_Nop();
_Nop();
}
/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c()
{
SDA; /*发送结束条件的数据信号*/
_Nop(); /*发送结束条件的时钟信号*/
SCL; /*结束条件建立时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA; /*发送I2C总线结束信号*/
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
字节数据发送函数
函数原型: void SendByte(UCHAR c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void SendByte(unsignedchar c)
{
unsignedchar BitCnt;
位*/
{
; /*判断发送位*/
;
_Nop();
SCL; /*置时钟线为高,通知被控器开始接收数据位*/
_Nop();
_Nop(); /*保证时钟高电平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL;
}
_Nop();
_Nop();
SDA; /*8位发送完后释放数据线,准备接收应答位*/
_Nop();
_Nop();
SCL;
_Nop();
_Nop();
_Nop();
;
; /*判断是否接收到应答信号*/
SCL;
_Nop();
_Nop();
}
/*******************************************************************
字节数据接收函数
函数原型: UCHAR RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数应答从机。
********************************************************************/
unsignedchar RcvByte()
{
unsignedchar retc;
unsignedchar BitCnt;
retc;
SDA; /*置数据线为输入方式*/
;BitCnt++)
{
_Nop();
SCL; /*置时钟线为低,准备接收数据位*/
_Nop();
_Nop(); /*时钟低电平周期大于4.7μs*/
_Nop();
_Nop();
_Nop();
SCL; /*置时钟线为高使数据线上数据有效*/
_Nop();
_Nop();
retc;
; /*读数据位,接收的数据位放入retc中 */
_Nop();
_Nop();
}
SCL;
_Nop();
_Nop();
return(retc);
}
/********************************************************************
应答子函数
函数原型: void Ack_I2c(bit a);
功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
********************************************************************/
void Ack_I2c(bit a)
{
; /*在此发出应答或非应答信号 */
;
_Nop();
_Nop();
_Nop();
SCL;
_Nop();
_Nop(); /*时钟低电平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL; /*清时钟线,钳住I2C总线以便继续接收*/
_Nop();
_Nop();
}
I2c.h

实验5 IIC通讯与AD/接DA接口的更多相关文章
- 实验4 IIC通讯与EEPROM接口
1. 用C语言编程,利用定时器产生一个0~99秒变化的秒表,并且显示在数码管上,每过一秒将这个变化写入实验板上AT24C02,当关闭实验板电源,并再次打开实验板电源时,单片机从AT24C0 ...
- 51单片机学习笔记(郭天祥版)(6)——键盘的作业题、AD、DA、DS18B20(这里之后看清翔的补一下好了)
A:analog,D:digital AD,就是模拟量转换为数字量,DA就是数字量转换为模拟量 为什么要转换? 单片机是数字芯片,内部只有0和1,没法表示模拟量 比如我们如果需要2.5V怎么办?其实是 ...
- 基于esp32的IIC通讯
本文源码地址在:http://download.csdn.net/download/noticeable/9962029 IIC 通讯应该是当代比较常用的几种通讯方式之一,其无需特殊的IO接口,连线方 ...
- 用Verilog实现IIC通讯
注意,此代码是错误代码,并不能实现想要的结果. 之所以留着,因为里面的enable 是独立开来的思想值得借鉴.就是控制单元和运算单元分开(我也是借鉴别人的实现思想).具体用verilogHDL实现II ...
- LPC1768的iic通讯
LPC1768有三路IIC,其中IIC0支持高速模式和plus模式,另外两路是普通IIC,使用IIC的过程如下 首先依然是打开IIC时钟,同时打开GPIO时钟 然后配置引脚为IIC功能 另外,因为ii ...
- 2018-2019-1-20165221&20165225 《信息安全系统设计》实验五:通讯协议设计
2018-2019-1-20165221&20165225 <信息安全系统设计>-实验五:通讯协议设计 OpenSSL学习: 简介: OpenSSL是为网络通信提供安全及数据完整性 ...
- STM32作为主设备,Arduino作为从设备进行IIC通讯的注意要点
近日公司的项目重心要往米思齐的Arduino图形化编程上转移了,需要我将STM32和Arduino的IIC通讯调通.之前Arduino并没怎么使用过,仅仅是将超声波的代码移植成TOF激光测距而已.网上 ...
- 「STM32 」IIC通讯原理及其实验
I2C两线式串行总线通讯协议,它是由飞利浦开发的,主要用于连接微控制器及其外围设备之间,它是由数据线SDA和信号线SCL构成的,可发送和接收数据即在MUC和I2C设备之间,I2C和I2C之间进行全双工 ...
- STM32F412应用开发笔记之三:SPI总线通讯与AD采集
本次我们在NUCLEO-F412ZG试验模拟量输入采集.我们的模拟量输入采用ADI公司的AD7705,是一片16位两路差分输入的AD采集芯片.具有SPI接口,我们将采用SPI接口与AD7705通讯.两 ...
随机推荐
- Common tasks that you can perform with the Groovy Script test step
https://support.smartbear.com/readyapi/docs/soapui/steps/groovy.html Get test case object To obtain ...
- NServiceBus消息重播
https://docs.particular.net/tutorials/message-replay/ 链接:https://pan.baidu.com/s/1KdWvpfZYZ2wUivkt3B ...
- dubbo学习(zz)
dubbo学习 博客分类: 开源软件 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站 ...
- JS closure
闭包的概念 闭包,不同于一般的函数,它允许一个函数在立即词法作用域外调用时,仍可访问非本地变量. --维基百科 闭包就是能够读取其他函数内部变量的函数. --阮一峰 由于在Javascript语言中, ...
- iOS中四种实例变量的范围类型@private@protected@public@package
文档上记录是这样的 The Scope of Instance Variables Toenforce the ability of an object to hide its data, the c ...
- CSS Sprites (CSS 精灵) 技术
CSS Sprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就不会像以前那样一幅一幅地慢 ...
- mount 移动硬盘出现的各种小问题
1.fdisk -l 查看硬盘是否存在 2.新建要挂载硬盘的文件夹 mkdir /disk (如果想要挂载到已存在的目录就不要新建了) 3.挂载硬盘:mount /dev/sdc /disk 4 ...
- Java之spilt()函数,trim()函数
一.单个符号作为分隔符 package com.regix; public class FuncSpilt { public static void main(String[] args) { // ...
- Mysql正常启动之后默认使用的文件
--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugi ...
- Redis模块开发示例
实现一个Redis module,支持两个扩展命令: 1) 可同时对hash的多个field进行incr操作: 2) incrby同时设置一个key的过期时间 在没有module之前,需要借助eval ...