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. C语言每日一题之No.8

    正式面对自己第二天,突然一种强烈的要放弃的冲动,在害怕什么?害怕很难赶上步伐?害怕这样坚持到底是对还是错?估计是今天那个来了,所以身体激素有变化导致情绪起伏比较大比较神经质吧(☆_☆)~矮油,女人每个 ...

  2. opacity兼容写法

    .opacity{ position: absolute; top: 0px;left: 0px; background: #000; filter:alpha(opacity=50); /* IE ...

  3. Php检测文件编码方法

    <?php /** * 检测文件编码 * @param string $file 文件路径 * @return string|null 返回 编码名 或 null */ function det ...

  4. 我的wordpress插件总结

    酷壳(CoolShell.cn)WordPress的插件 注意: 下面的这些插件的链接是其插件主页的链接,你可以在WordPress后台管理中添加插件时直接搜索安装就可以了. 插件不是越多越好.WP的 ...

  5. MySql5.6 Window超详细安装教程

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录 一.安装包准备二.开始安装三.验证安装四.客户端工具 一.安装包准备 1.下载MySql ...

  6. GL_GL系列 - 多币种管理分析(案例)

    2014-07-08 Created By BaoXinjian

  7. OAF_OAF Debug And Log调试和记录工具的详解(案例)

    2014-06-16 Created By BaoXinjian

  8. 实现读入一个彩色视频文件并以灰度格式输出这个视频文件,学习opencv例2-10

    #include "cv.h"#include "highgui.h"int main(int argc,char* argv[]){ //书本中的main没有 ...

  9. 在windows下添加php的Imagick扩展

    安装ImageMagick-6.9.2-6-Q16-x64-dll.exe 将安装目录下的CORE_开头的dll文件和X11.dll文件复制到c:\windows\system32\下, 在windo ...

  10. MySQL 开启与关闭远程访问&&授权前需执行GRANT USAGE ON *.* TO 'cai'@'%' IDENTIFIED BY 'caigan2015';才能终端访问

    MySQL 开启与关闭远程访问 (1)通过MySQL用户去限制访问 权限系统目的: MySQL基于安全考虑root账户一般只能本地访问,但是在开发过程中可能需要打开root的远程访问权限,今天介绍的就 ...