完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
`电路的目的:有两个按键key1和key2,key1负责控制AD(0809)转换的通道(注:因为现在只有两路,所以是循环转换IN0和IN1的电压值),按下key2将之前的电压值相加。电路图: 实物图: 程序: 注:(1)本来是想用外部中断来执行AD转换的,但发现我这个本来就只有转换的工作,所以就直接用扫描等待就好。(2)程序可能有些乱,因为我改了几次,一开始是从别人程序改过来的,后来就直接改得面目全非了。 #include #define uchar unsigned char #define uint unsigned int ***it le = P2^0; //锁存器锁存控制端,用于数码管位选 ***it clk = P2^1; //ADC0809的时钟信号输入端 ***it adda = P3^4; //ADC0809的地址输入端 ***it addb = P3^5; ***it addc = P3^6; ***it start_ad = P2^5; //ADC0809启动信号,高脉冲启动 ***it eoc = P2^6; //ADC0809转换结束信号 ***it oe = P2^7; //ADC0809读数据控制端 ***it key1 = P3^0; ***it key2 = P3^1; ***it NOA = P2^2; ***it NOB = P2^3; ***it NOC = P2^4; uchar bai = 0, shi = 0, ge = 0; //定义显示全局变量 uchar a = 0, b = 0, c = 0; uchar channel = 0; int d[2] = 0; //通过数组来存储转换后的值 uchar code seg7[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71 }; //共阴极数码管显示编码 void delay(uint x) //微秒级延时子程序 { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void display(uchar bai,uchar shi,uchar ge) //数码管显示函数 { le = 1; NOA = 0; NOB = 1; NOC = 0; P0=(seg7[bai]|0x80); //段选数据,和0x80相与表示显示小数点 le = 0; delay(12); le = 1; NOA = 1; NOB = 0; NOC = 0; P0=seg7[shi]; le = 0; delay(12); le = 1; NOA = 0; NOB = 0; NOC = 0; P0=seg7[ge]; le = 0; delay(12); } void AD_Convert(addr) { uint temp = 0; uchar getdata = 0; addc = 0x01&(addr>>2); addb = 0x01&(addr>>1); adda = 0x01&addr; oe = 0; start_ad = 0; start_ad = 1; start_ad = 0; while(eoc == 0) { display(10,10,10); //如果还没有转换完成,就显示AAA } oe = 1; getdata = P1; oe = 0; temp = getdata*1.96; d[addr] = temp; ge = temp%10; shi = temp%100/10; bai = temp/100; channel++; } void key_scan() { uint temp = 0; if(key1 == 0) { delay(5); if(key1 == 0) { while(!key1) { } if(channel == 2) channel = 0; AD_Convert(channel); } } if(key2 == 0) { delay(5); if(key2 == 0) { while(!key2) { } temp = d[0] + d[1]; ge = temp%10; shi = temp%100/10; bai = temp/100; } } } int main(void) { le = 0; TMOD=0x20; //定时器1工作在方式2 TH1=255-200; TL1=255-200; EA=1; EX0=1; IT0=1; ET1=1; TR1=1; //启动定时器1 while(1) { key_scan(); display(bai,shi,ge); } return 0; } void t1(void) interrupt 3 { clk=~clk; } ` |
|
相关推荐
6个回答
|
|
哦,不好意思忘记说故障现象了。硬件上的问题:IN0和IN1是两个不同的电压3.3V和5V(注:因为我的电源适配器不太准只有4.1V作为AD的参考电压所以实际上显示成功时数值分别是2.25V和4.9V),我按下key1,正确应该是显示两个不同的电压值,可是我按下key1后很多时候只出现一个值无论按多少次,有时按两三次它又能够显示两个不一样的值。
|
|
|
|
召唤高手!!!
|
|
|
|
你的要求是同时显示两个不同的电压值,但是你的显示程序是有问题的,你的显示程序控制的是显示一个三位数的数据,而不是显示俩个数据,还有就是你显示一个电压时需要两位数就够了,显示两个电压需要的是四位数,为什么你的程序是显示三位数。建议你吧显示程序改一下,利用数码管的动态显示应该是没有问题的了
|
|
|
|
感谢你的回答。但你误会了我的意思,我的意思是key1按第一下显示IN0的电压值,再按一下key1,显示IN1的电压值。按下key2就显示两个(IN0+IN1)相加的电压值 |
|
|
|
你对KEY1的处理语句中没有对channel进行处理啊,这样怎么按KEY1,channel的值都不会变化呀,应该是每按一下KEY1就把channel加1吧,channel==2就归零
|
|
|
|
你用ADC0809,看datasheet的clk端口频率范围 10-1280khz范围,最大时间也就100us,你的clk周期是200us。改一下看看。另外定时器赋初值用 十六进制写。程序都没跑到。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
479 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-内核编译之初次编译
229 浏览 0 评论
334 浏览 0 评论
165 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》 第十六章 WATCH_DOG实验
496 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11972 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 14:14 , Processed in 0.931340 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号