AD.C

 #include<reg52.h>
#include <iic.h> #define PCF8591 0x90 //PCF8591 地址 sbit LS138A=P2^;
sbit LS138B=P2^;
sbit LS138C=P2^; //此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char AD_CHANNEL;
unsigned long xdata LedOut[];
unsigned int D[]; bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==) return();
SendByte(c); //发送控制字节
if(ack==) return();
SendByte(Val); //发送DAC的数值
if(ack==) return();
Stop_I2c(); //结束总线
return();
} /*******************************************************************
ADC发送字节[命令]数据函数
*******************************************************************/
bit ISendByte(unsigned char sla,unsigned char c)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==) return();
SendByte(c); //发送数据
if(ack==) return();
Stop_I2c(); //结束总线
return();
} /*******************************************************************
ADC读字节数据函数
*******************************************************************/
unsigned char IRcvByte(unsigned char sla)
{
unsigned char c; Start_I2c(); //启动总线
SendByte(sla+); //发送器件地址
if(ack==) return();
c=RcvByte(); //读取数据0 Ack_I2c(); //发送非就答位
Stop_I2c(); //结束总线
return(c);
} void main()
{
char i,j;
while()
{/********以下AD-DA处理*************/
switch(AD_CHANNEL)
{
case : ISendByte(PCF8591,0x41);
D[]=IRcvByte(PCF8591); //ADC0 模数转换1 放大2倍显示
break; case : ISendByte(PCF8591,0x42);
D[]=IRcvByte(PCF8591); //ADC1 模数转换2
break; case : ISendByte(PCF8591,0x43);
D[]=IRcvByte(PCF8591); //ADC2 模数转换3
break; case : ISendByte(PCF8591,0x40);
D[]=IRcvByte(PCF8591); //ADC3 模数转换4
break; case : DACconversion(PCF8591,0x40, D[]); //DAC 数模转换
break;
} D[]=; //数字--->>模拟输出
D[]=D[]; // 把模拟输入 采样的信号 通过数模转换输出
if(++AD_CHANNEL>) AD_CHANNEL=; /********以下将AD的值送到LED数码管显示*************/ LedOut[]=Disp_Tab[D[]%/];
LedOut[]=Disp_Tab[D[]%/]|0x80;
LedOut[]=Disp_Tab[D[]%/];
LedOut[]=Disp_Tab[D[]%]; LedOut[]=Disp_Tab[D[]%/];
LedOut[]=Disp_Tab[D[]%/]|0x80;
LedOut[]=Disp_Tab[D[]%/];
LedOut[]=Disp_Tab[D[]%]; for( i=; i<; i++)
{
P0 = LedOut[i];
switch(i) //使用switch 语句控制138译码器 也可以是用查表的方式 学员可以试着自己修改
{
case :LS138A=; LS138B=; LS138C=; break;
case :LS138A=; LS138B=; LS138C=; break;
case :LS138A=; LS138B=; LS138C=; break;
case :LS138A=; LS138B=; LS138C=; break;
case :LS138A=; LS138B=; LS138C=; break;
case :LS138A=; LS138B=; LS138C=; break;
case :LS138A=; LS138B=; LS138C=; break;
case :LS138A=; LS138B=; LS138C=; break;
}
for (j = ; j< ;j++) { ;} //扫描间隔时间
}
}
}

IIC.h

 #include<reg52.h>
#include <intrins.h> #define _Nop() _nop_() /*定义空指令*/
sbit SCL = P2^; //I2C 时钟
sbit SDA = P2^; //I2C 数据
bit ack; /*应答标志位*/ void Start_I2c()
{
SDA = ; /*发送起始条件的数据信号*/
_Nop();
SCL = ; /*起始条件建立时间大于4.7us,延时*/
_Nop();_Nop();_Nop();_Nop();_Nop();
SDA = ; /*发送起始信号,起始条件锁定时间大于4μs*/
_Nop();_Nop();_Nop();_Nop();_Nop();
SCL = ; /*钳住I2C总线,准备发送或接收数据 */
_Nop();_Nop();
} void Stop_I2c()
{
SDA = ;
_Nop();
SCL = ;
_Nop();_Nop();_Nop();_Nop();_Nop();
SDA = ; /*发送I2C总线结束信号*/
_Nop();_Nop();_Nop();_Nop();
} void SendByte(unsigned char c)
{
int i; for(i = ;i < ;i++) /*要传送的数据长度为8位*/
{
if((c << i) & 0x80) SDA=; /*判断发送位*/
else SDA = ;
_Nop();
SCL = ; /*置时钟线为高,通知被控器开始接收数据位*/
_Nop();_Nop();_Nop();_Nop();_Nop();
SCL = ;
}
_Nop();_Nop();
SDA = ; /*8位发送完后释放数据线,准备接收应答位*/
_Nop();_Nop();
SCL = ;
_Nop();_Nop();_Nop();
if(SDA == ) ack = ;
else ack = ; /*判断是否接收到应答信号*/
SCL = ;
_Nop();_Nop();
} unsigned char RcvByte()
{
unsigned char retc;
int i;
retc = ;
SDA = ; /*置数据线为输入方式*/
for(i = ;i < ;i++)
{
_Nop();
SCL = ; /*置时钟线为低,准备接收数据位*/
_Nop();_Nop();_Nop();_Nop();_Nop();
SCL = ; /*置时钟线为高使数据线上数据有效*/
_Nop();_Nop();
retc = retc<<;
if(SDA == ) retc = retc+; /*读数据位,接收的数据位放入retc中 */
_Nop();_Nop();
}
SCL = ;
_Nop();_Nop();
return(retc);
} void Ack_I2c(bit a)
{
if(a == ) SDA = ; /*在此发出应答或非应答信号 */
else SDA = ;
_Nop();_Nop();_Nop();
SCL = ;
_Nop();_Nop();_Nop();_Nop();_Nop();
SCL = ; /*清时钟线,钳住I2C总线以便继续接收*/
_Nop();_Nop();
}

8051学习笔记——AD的更多相关文章

  1. [学习笔记] AD笔记

    Auto diff 深度学习基础知识,auto diff自动微分的笔记,tensorflow中的求导就是基于这个做的.多用于复杂神经网络求导.来自于一篇论文,没怎么看完,但是会算了,比较底层一点吧.. ...

  2. 8051学习笔记——IIC与EEPROM实验

    main.c #include <reg51.h> #include "iic.h" #define AT24C02 0xa0 //AT24C02 地址 sbit LS ...

  3. Android自动化学习笔记:编写MonkeyRunner脚本的几种方式

    ---------------------------------------------------------------------------------------------------- ...

  4. Linux学习笔记(一)2015.4.13

    研究生由单片机转Linux学习 首先安装VMware虚拟机,用的是VMware 10.0 在VMware 10.0上安装视频上推荐的Red Hat Linux 5 安装后正式进入Linux学习 笔记1 ...

  5. 学习笔记:The Log(我所读过的最好的一篇分布式技术文章)

    前言 这是一篇学习笔记. 学习的材料来自Jay Kreps的一篇讲Log的博文. 原文很长,但是我坚持看完了,收获颇多,也深深为Jay哥的技术能力.架构能力和对于分布式系统的理解之深刻所折服.同时也因 ...

  6. Dynamic CRM 2013学习笔记(二十五)JS调用web service 实现多条记录复制(克隆)功能

    前面介绍过如何克隆一条当前的记录: Dynamic CRM 2013学习笔记(十四)复制/克隆记录 , 主要是通过界面上加一个字段,单击form上的clone 按钮时,改变这个字段的值以触发插件来实现 ...

  7. Dynamic CRM 2013学习笔记(三十)Linq使用报错 A proxy type with the name account has been defined by another assembly

    在CRM中使用linq时,有时会报这个错误: A proxy type with the name account has been defined by another assembly. Curr ...

  8. CUBRID学习笔记 41 sql语法之select

    cubrid的中sql查询语法 SELECT [ ] [{TO | INTO} ][FROM ] [WHERE ][GROUP BY {col_name | expr} [ASC | DESC], . ...

  9. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

随机推荐

  1. webstorm 10 设置文件的默认编码

    我在使用webstorm时,发现文件的默认编码是GBK 然后我找到了点击此处可以修改这个文件的编码,但是以后新建文件和项目默认生成的文件还是GBK, 设置项目文件的默认编码可以在 File----Se ...

  2. 解决RPM包相互依赖的有效方法

    出自:http://blog.csdn.net/kai27ks/article/details/7473683 前言:常用RPM的朋友们都知道,RPM简单易用,但是它的依赖关系是最头疼的!有时候比方说 ...

  3. item3 二维数组中的查找[剑指offer]

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有这个整数? 8 9 思路:查找7 ...

  4. spring4.0整合mongodb3.0.4项目实践(用户验证)

    我们的项目用到了spring框架和mongdb数据库,随着mongodb升级到3.0已有半年时间,我们也开始随之升级,但是3.0的用户验证有所更改,导致原来的很多配置无法再用. 经过几天的尝试后,终于 ...

  5. class 文件与dex文件区别 (dvm与jvm区别)及Android DVM介绍

    区别一:dvm执行的是.dex格式文件  jvm执行的是.class文件   android程序编译完之后生产.class文件,然后,dex工具会把.class文件处理成.dex文件,然后把资源文件和 ...

  6. PO_PO系列 - 询价报价单管理分析(案例)

    2014-07-01 Created By BaoXinjian

  7. C#(一维数组)

    定义数组 int[] 变量名 = new int [n]; 数组初始化 int[] myArray = new int[] {1, 3, 5, 7, 9}; //输入班级人数 //输入每个人的分数 / ...

  8. 如何利用svn自动同步更新到网站服务器

    我们最终的目的是:当本地提交后,SVN服务器自动更新服务器端指定WEB目录内的文件 实现方法: 找到服务器端 SVN版本库所在的目录(目录名称是Repositories),这个目录是在安装Visual ...

  9. Centos下yum配置lnmp环境

    首先关闭SELINUX        vi /etc/selinux/config       #SELINUX=enforcing       #注释掉       #SELINUXTYPE=tar ...

  10. Windows 10 中 Eclipse中无法添加Courier New字体的解决方法!

    1,打开"C:\Windows\Fonts\"文件夹. 2,鼠标右键"Courier New",随后点击"显示",这样你就可以在Eclips ...