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——六个好友之间的 ...
随机推荐
- 尽量使用条件属性(Conditional Attribute)而不是#if/#endif预处理
http://www.cnblogs.com/JiangSoney/archive/2009/08/10/1543197.html .net框架提供了一个特性:属性(Attribute),注意:此属性 ...
- 想当然是编程最大的坑,记更新删除过期cookie无效有感
一般来说只要设置了cookie的过期时间,就可以实现删除cookie的作用. 可是我尝试了设置过期时间,清除cookie内容都无效. 最后才发现,我根本没有执行到那段设置过期的代码. 刚开始是因为登出 ...
- Synchronizing with Remote Repositories
Synchronizing the states of local and remote repositories consists of pulling from and pushing to th ...
- VALGRIND
系统编程中一个重要的方面就是有效地处理与内存相关的问题.你的工作越接近系统,你就需要面对越多的内存问题.有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦.所以,在实践中会用到很多工具来 ...
- PLSQL_Oracle簇表和簇表管理Index clustered tables(案例)
2012-06-08 Created By BaoXinjian
- Nexus配置
1.可以为maven项目单独配置nexus路径 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- WCF z
终结点与服务寄宿 由于最近可能要使用WCF做开发,开始重读蒋金楠的<WCF全面解析>,并整理个人学习WCF的笔记. 蒋金楠的书是我的第一本WCF入门书,虽说硬着头皮啃下来了,但是原理内容太 ...
- mac打开.caj格式文件
以为用mac后使用会变得更方便些,写毕设时终于派上用场,可惜啊,mac竟然打不开.caj文件,这意味着什么?相信所有在做毕设的小伙伴们都能懂其中的凄凉.特别是硕士或博士的论文,你得从知网上下上百篇的文 ...
- android studio 安装报错 unable to run mksdcard sdk tool
搜了一下原来缺少这个 sudo apt-get install lib32z1 lib32ncurses5 lib32stdc++6
- linux 去掉 ^M
要去除他,最简单用下面的命令: dos2unix filename 亲测可用 以下方式不可以: set ff=unix %s/^M//g 可能是^M输入方式有问题 ^M 输入方法: ctrl+V ...