实验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通讯.两 ...
随机推荐
- django模板语言和过滤
一:模板组成 HTML代码 + 逻辑控制代码 逻辑代码组成格式: 使用大括号来引用变量, {{ var_name }} 二: Template和Context对象 //进入该的django的项目环境 ...
- PHP 判断字符串括号是否匹配
<?php function aa($str) { $temp = array(); for ($i = 0; $i < strlen($str); $i++) { $t = $str[$ ...
- maven mirror , profile , snapshot 和release
1. settings.xml 配置的mirror <mirrors> <mirror> <id>Nexus</id> <name>nexu ...
- Sophus libSophus.so
在编译包含Sophus的源文件的时候,出现如下错误 ../lib/libmyslam.so: undefined reference to `Sophus::SO3::SO3(double, doub ...
- 《C#从现象到本质》读书笔记(二)第2章 C#类型基础(上)
<C#从现象到本质>读书笔记第二篇 第2章 C#类型基础(上) 类型指的是集合{类,结构,接口,枚举,委托}中的任意一个成员.任何拥有某类型的值(value)称为某类型的一个实例(inst ...
- On the internet, nobody known you are a dog !
- windows中执行celery beat任务
由于最新的celery4.2不支持windows系统,因此按照网上的建议安装了3.1.25版.按照官网的说明使用 app.conf.beat_schedule = { 'add-every-30-se ...
- 如何将frm文件导入MySql数据库
只要在mysql的安装文件中找到data文件夹,然后在里面建立一个文件夹,比如test.这个test其实就对应着数据库的名称,所以,你想要起什么样的数据库名称就把文件夹起什么名字. 然后把.frm文件 ...
- C#装箱,拆箱和强制转换(转)
出处:https://www.cnblogs.com/fengjiulin110120/p/6605739.html 关系: 强制转换就包含有装箱拆箱操作,装箱就是把值类型转换成引用类型,反之就是拆箱 ...
- 安装了nodejs后在命令行运行npm报错:Error: Cannot find module 'internal/util/types'
报错如下图所示: 解决方法:删除目录“C:\Users\wls\AppData\Roaming\npm\node_modules”下的npm文件夹