8051学习笔记——AD
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的更多相关文章
- [学习笔记] AD笔记
Auto diff 深度学习基础知识,auto diff自动微分的笔记,tensorflow中的求导就是基于这个做的.多用于复杂神经网络求导.来自于一篇论文,没怎么看完,但是会算了,比较底层一点吧.. ...
- 8051学习笔记——IIC与EEPROM实验
main.c #include <reg51.h> #include "iic.h" #define AT24C02 0xa0 //AT24C02 地址 sbit LS ...
- Android自动化学习笔记:编写MonkeyRunner脚本的几种方式
---------------------------------------------------------------------------------------------------- ...
- Linux学习笔记(一)2015.4.13
研究生由单片机转Linux学习 首先安装VMware虚拟机,用的是VMware 10.0 在VMware 10.0上安装视频上推荐的Red Hat Linux 5 安装后正式进入Linux学习 笔记1 ...
- 学习笔记:The Log(我所读过的最好的一篇分布式技术文章)
前言 这是一篇学习笔记. 学习的材料来自Jay Kreps的一篇讲Log的博文. 原文很长,但是我坚持看完了,收获颇多,也深深为Jay哥的技术能力.架构能力和对于分布式系统的理解之深刻所折服.同时也因 ...
- Dynamic CRM 2013学习笔记(二十五)JS调用web service 实现多条记录复制(克隆)功能
前面介绍过如何克隆一条当前的记录: Dynamic CRM 2013学习笔记(十四)复制/克隆记录 , 主要是通过界面上加一个字段,单击form上的clone 按钮时,改变这个字段的值以触发插件来实现 ...
- 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 ...
- CUBRID学习笔记 41 sql语法之select
cubrid的中sql查询语法 SELECT [ ] [{TO | INTO} ][FROM ] [WHERE ][GROUP BY {col_name | expr} [ASC | DESC], . ...
- <老友记>学习笔记
这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...
随机推荐
- Env:VIM配置
注:文章来自于http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html 花了很长时间整理的,感觉用起来很方便,共享一下. 我的vim配 ...
- jQuery Ajax 方法调用 Asp.Net WebService 以及调用aspx.cs中方法的详细例子
一.jQuery Ajax 方法调用 Asp.Net WebService (引自Terry Feng) Html文件 <!DOCTYPE html PUBLIC "-//W3C//D ...
- java 中文 乱码 问号
在基于Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号. 这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码, ...
- web提前做好测试
1.压力测试,找到极限点和瓶颈,最小化扩容2.消息队列应对高并发的写操作 根据数据大小分成不同队列,保证效率 堵塞队列,压队列机极限处理能力3.主要业务和次要业务分开,当出现异常时保障主要业务,保证系 ...
- 纯HTML页面为了避免频繁前后台Ajax交互方案
需求: 看这么一个简单的界面. 它有很多下拉框,下拉框中的可选项并不是固定不变的. 由于页面是静态HTML页面,不能使用后台JSP动态生成. 之前的解决方案是,页面打开后使用多个Ajax请求,获取下拉 ...
- bug_ _java.lang.IllegalArgumentException: View not attached to window manager 2
今天遇到一个很奇特的问题,当用户设置了PIN码,在锁屏界面正常解锁PIN码后,进入Launcher时显示com.android.phone 已停止运行.一开始猜想会不会是解锁PIN码的时候处理导致了P ...
- cvc-elt.1: 找不到元素 'beans' 的声明
这次遇到的这个错误又坑爹又低级 , 是因为网上抄到了错误的xsd搞的. 这是网上抄到的 xsi:schemalocation=" http://www.springframework.org ...
- 带节日和农历的js日历 带农历的脚本:
<html><head><meta http-equiv="Content-Type" content="text/html; charse ...
- [经验总结]利用xlstproc处理XSLT的makefile
转自:http://blog.csdn.net/thinkhy/article/details/5343739 # For XSLT PARSE = xsltproc SRC = main.xml S ...
- crm 2011 plugin setparent setbusiness 用户更改经理 更改办事处
背景: 在更改经理或者更改办事处时,使用plugin处理相应的团队. 问题:plugin写完,注册时发现使用update注册没有效果,然后bing得到,这里要使用setbusiness 和 setpa ...