这个是题目要求,利用AD转换芯片ET2046每秒检测一次滑动变阻器电压,转换成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(temp%1000/100+‘0’);//百位
SendChar(temp%1000%100/10+‘0’);//十位
SendChar(temp%1000%100%10+‘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程序,亲测无误,大家有其他想法可以讨论。



