实验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通讯.两 ...
随机推荐
- Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)
Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...
- 熟悉JSON
JSON是什么 JSON ( JavaScript Object Notation) ,是一种数据交互格式. 为什么有这个技术 Json之前,大家都用 XML 传递数据.XML 是一种纯文本格式,所以 ...
- 解决ubuntu常见问题
cd /usr/local/hadoop 1. bash: cd: ~:Permission denied 报错:bash: cd: /usr/local/hadoop:Permission deni ...
- 【密码学】轻松理解“加盐”的原理与java实现
转自:https://blog.csdn.net/DavidHuang2017/article/details/80283469 一.什么是加盐? 1.背景 现在很多公司后台以hash值形式存储用户密 ...
- spring学习 十七 scope属性,单例多例
Scope属性是<bean>中的属性,取值可以有, singleton 默认值, 单例, prototype 多例, 每次获取重新实例化, request 每次请求重新实例化, sessi ...
- 2019.01.22 hdu5195 DZY Loves Topological Sorting(贪心+线段树)
传送门 题意简述:给出一张DAGDAGDAG,要求删去不超过kkk条边问最后拓扑序的最大字典序是多少. 思路:贪心帮当前不超过删边上限且权值最大的点删边,用线段树维护一下每个点的入度来支持查询即可. ...
- 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)
传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...
- BUG YII2.0 $ is not defined
来源:https://www.cnblogs.com/attitudeY/p/6279985.html BUG描述:$ is not defined 没有加载jquery成功 原因:Yii2.0将JS ...
- 用 ASP.NET MVC 实现基于 XMLHttpRequest long polling(长轮询) 的 Comet(转)
轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 优点:后端程序编写比较容易. 缺点:请求中有大半是无用,浪费带宽和服务器资源. 实例:适于小型应用. 长轮询:客 ...
- AttributeError: type object 'testClass' has no attribute 'testMothod'
点击"Unittest for test_post_API.testClass"按钮,点击”Edit configuration...“,弹出对话框Run/Debug config ...