完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
AD电路图 和数据手册 均已上传 还是搞不懂四个模拟输入通道到底是怎么回事,从电路图上看不是只用到了AIN0和AIN1吗?AIN2和AIN3 就是没有输入了?? 还有就是 AD转换时的ADC发送字节[命令]数据函数在数据手册上AD转换就直接读就可以啦,为什么还要写这个函数,不懂??求大神指点,灰常感谢。。。
#include #include #include //else IO //此表为 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[8]; unsigned int D[32]; /******************************************************************* DAC 变换, 转化函数 *******************************************************************/ bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val) { Start_I2c(); //启动总线 SendByte(sla); if(ack==0)return(0); SendByte(c); //发送控制字节 if(ack==0)return(0); SendByte(Val); //发送DAC的数值 if(ack==0)return(0); Stop_I2c(); //结束总线 return(1); } /******************************************************************* *******************************************************************/ bit ISendByte(unsigned char sla,unsigned char c) { Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 谁是发送器??单片机还是8951???? if(ack==0)return(0); SendByte(c); //发送数据 if(ack==0)return(0); Stop_I2c(); //结束总线 return(1); } /******************************************************************* ADC读字节数据函数 读取AD转换的数据 *******************************************************************/ unsigned char IRcvByte(unsigned char sla) { unsigned char c; Start_I2c(); //启动总线 SendByte(sla+1); //发送器件地址 +1为了是读模式 if(ack==0)return(0); c=RcvByte(); //读取数据0 Ack_I2c(1); //发送非就答位 Stop_I2c(); //结束总线 return(c); } //******************************************************************/ main() { char i,j; while(1) {/********以下AD-DA处理*************/ switch(AD_CHANNEL) { // 四个通道又是起什么作用呢??? case 0: ISendByte(PCF8591,0x41); D[0]=IRcvByte(PCF8591)*2; //ADC0 模数转换1 放大2倍显示 case0是用来读取8591第一通道所采集到模拟量的值 break; //0x41是控制字节 D[0]=IRcvByte(PCF8591)*用来读取AD转换的数据 case 1: ISendByte(PCF8591,0x42); D[1]=IRcvByte(PCF8591)*2; //ADC1 模数转换2 4个模拟输入在该单片机中只用到两个 break; case 2: ISendByte(PCF8591,0x43); D[2]=IRcvByte(PCF8591)*2; //ADC2 模数转换3 break; case 3: ISendByte(PCF8591,0x40); D[3]=IRcvByte(PCF8591)*2; //ADC3 模数转换4 break; case 4: DACconversion(PCF8591,0x40, D[4]/4); //DAC 数模转换 break; } D[4]=400; //数字--->>模拟输出 D[4]=D[0]; // 把模拟输入 采样的信号 通过数模转换输出 即把D0 转化成模拟量输出 if(++AD_CHANNEL>4) AD_CHANNEL=0; /********以下将AD的值送到LED数码管显示*************/ LedOut[0]=Disp_Tab[D[1]%10000/1000]; LedOut[1]=Disp_Tab[D[1]%1000/100]; LedOut[2]=Disp_Tab[D[1]%100/10]|0x80; LedOut[3]=Disp_Tab[D[1]%10]; LedOut[4]=Disp_Tab[D[0]%10000/1000]; LedOut[5]=Disp_Tab[D[0]%1000/100]; LedOut[6]=Disp_Tab[D[0]%100/10]|0x80; LedOut[7]=Disp_Tab[D[0]%10]; for( i=0; i<8; i++) { P0 = LedOut; switch(i) //使用switch 语句控制138译码器 也可以是用查表的方式 学员可以试着自己修改 { case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break; case 5:LS138A=1; LS138B=0; LS138C=1; break; case 6:LS138A=0; LS138B=1; LS138C=1; break; case 7:LS138A=1; LS138B=1; LS138C=1; break; } for (j = 0 ; j<90 ;j++) { ;} //扫描间隔时间 } P0 = 0; } } ADDA电路图.jpg (56.2 KB, 下载次数: 37) ADDA电路图.jpg |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
ad把一个15mm*1.5mm的灯放到直径15mm的圆形pcb板上,可以实现吗
843 浏览 1 评论
1130 浏览 1 评论
请问PCB覆铜规则改成了Direct Connect为什么还是Relief Connect连接?
1484 浏览 1 评论
如何防止多个IIC器件出现时序错乱或者工作一定时长后不工作?
2011 浏览 3 评论
10 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 15:28 , Processed in 0.314339 second(s), Total 38, Slave 33 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号