51单片机AD采集电压通过串口每秒发送一次电压值
这是主题要求,使用AD转换芯片ET每秒2046检测一次滑动变阻器电压,转换成ASCLL编码后,通过串口发送数据。同时,添加三个指示灯来显示当前的电压范围。 下面是这个AD芯片的电路原理图也可以改变AD采集的设备(光敏电阻、热敏电阻、外部输入等。)由收集地址确定。
主函数代码
#include “reg52.h” #include “uart.h” #include “rtc.h” #include"adc.h" sbit LED_R = P0^0; sbit LED_Y = P0^1; sbit LED_G = P0^2; void main(void) { // unsigned char i; unsigned char second = Ds1302Read(0X81);//读秒 unsigned long temp=0x00; InitUart(); while(1) { if(second!=Ds1302Read(0X81)) { second=Ds1302Read(0X81); //读秒 temp=Read_AD_Data(0x94);//AIN0 电位器 // SendChar(temp>>8); //高八位字节 // SendChar(temp&255); //低八位字节 temp=temp51000/4096 SendChar(temp/1000 ‘0’);//千位 SendChar(‘.’); SendChar(temp00/100 ‘0’);//百位 SendChar(temp000/10 ‘0’);//十位 SendChar(temp000 ‘0’);//个位 SendChar(‘V’); SendChar(‘\r’); //换行 SendChar(‘\n’); if(temp>4000) { LED_R = 0; LED_G = 1; LED_Y = 1; } else if(temp>1000) { LED_R = 1; LED_G = 0; LED_Y = 1; } else { LED_R = 1; LED_G = 1; LED_Y = 0; } } } }
这些是主函数代码,adc、uart等模块直接采样普通相应模块的底层代码,未修改
在这个代码中,我觉得最有趣的地方是读秒用的不是定时器计数,而是通过读取ds1302的0x81(读秒地址) second!=Ds1302Read(0X81) second=Ds1302Read(0X81) 通过if判断秒是否变化并重新赋值以确定一秒钟。具体代码可以看到上面 我认为这个地方仍然很有趣 然后3个LED灯很简单if判断句子
自己写的51程序,亲测无误,还有其他想法可以讨论。