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——六个好友之间的 ...
随机推荐
- DateGridView中添加下拉框列并实现数据绑定、更改背景色
1.添加下拉框 代码实现==> using System; using System.Collections.Generic; using System.Windows.Forms; names ...
- 【SQL Server】系统学习之三:逻辑查询处理阶段-六段式
一.From阶段 针对连接说明: 1.笛卡尔积 2.on筛选器 插播:unknown=not unknuwn 缺失的值: 筛选器(on where having)把unknown当做FALSE处理,排 ...
- Linux IO调度器相关算法介绍(转)
IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...
- hdu 5774 Where Amazing Happens
Where Amazing Happens 题意: 让你输出各个队名的出现次数. 题解: 打表题,好坑,相同的没有放在一起,需要认真找,否则容易错. 代码: #include<iostream& ...
- 如何判断TCP包是否发送成功
1. TCP发送接口:send() TCP发送数据的接口有send,write,sendmsg.在系统内核中这些函数有一个统一的入口,即sock_sendmsg().由于TCP是可靠传输,所以对TCP ...
- mysql server has gone away 与max_allowed_packed
今天在本地测试测试给所有店铺批量发信息的功能,大约2万条记录,在本地和备用linux服务器上测试都没有问题,但上windows时一直报mysql server has gone away的错误,搜索一 ...
- 从千分位格式化谈JS性能优化
所谓的千分位形式,即从个位数起,每三位之间加一个逗号.例如“10,000”.针对这个需求,我起初写了这样一个函数: // 方法一function toThousands(num) {var resul ...
- ylbtech-Unitity-cs:传递的字符串中数字字符的数目
ylbtech-Unitity-cs:传递的字符串中数字字符的数目 1.A,效果图返回顶部 1.B,源代码返回顶部 1.B.1, using System; namespace Functions ...
- 树莓派安装3.5inch RPi LCD (A)显示屏
3.5inch RPi LCD (A) 资料 产品介绍 用户手册 开发资料 开发软件 树莓派镜像 演示视频 FAQ 在自定义Raspbian系统镜像上怎么使用树莓派LCD? 先确保自定义镜像可正常进入 ...
- bootstrap-响应式工具和打印样式
响应式工具: <div class="container"> <!-- 针对不同的宽度 展示或隐藏相关内容 visible-lg-block 显示 hidden- ...