做了个数字温度计,有如下问题: 1.5单片机的ALE能否直接作为AD0809的时钟, 2.下边程序是否正确,能否给程序补充作些注释 谢谢 #include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dispbitcode[]={0xfe,0xfd,0xfb,0xf7};/*LED位选*/
uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x00,0x40};/*0,1,2------9,正(不显),负*/
uchar dispbuf[]={0,0,0,10,10,10,10,10};
uchar dispcount=0;
uchar getdata=0;//数据暂存
unsigned long temp=0;
uchar i;
bit sflag=0; /*正负标志*/
sbit ST=P3^0;//AD启动信号,当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平
sbit OE=P3^1;//OE为输出允许信号
sbit EOC=P3^2;//EOC为转换结束信号
sbit LED=P3^4;/*当温度超过10度且低于30度时LED亮*/
void main(void)
{
LED=1;
ST=0;//AD初始化,ST,OE是低电平 OE=0; TMOD=0x10;//计数器1 模式1
TH1=(65536-4000)/256; /*T1工作于方式1下。每4mS采集一次数据,
且刷新一次LED*/ TL1=(65536-4000)%256;
TR1=1;//计数器1开启 ET1=1;//允许计数器1中断 EA=1;//开总中断
ST=1;
ST=0;//开始AD转化
while(1) {
;
}
}
void t1(void) interrupt 3 using 0 {
TH1=(65536-4000)/256;
TL1=(65536-4000)%256; if(EOC==1) /*转换完毕,显示*/ {
OE=1;
getdata=P0;//保存数据
OE=0;
temp=getdata;
temp+=168;//不知道为什么要加168
if(temp<273.2)//判断符号 { temp=273.2-temp;//华氏转化为摄氏?
sflag=1; } if(temp>=273.2) { temp=temp-273.2;
sflag=0; }
if(sflag==0)//温度大于0,最高位不显示,否则显示负号 dispbuf[3]=10; else dispbuf[3]=11;
if(sflag==0 && temp>=10 && temp<=30) /*温度大于10小于30灯亮*/ LED=0; else LED=1;
temp*=10;//
i=0;
while(temp/10) /*分位显示*/ { dispbuf=temp%10;
temp=temp/10;
i++;
}
dispbuf=temp;
ST=1;
ST=0;
P1=dispcode[dispbuf][dispcount]]; //
P2=dispbitcode[dispcount];
if(dispcount==1)/*加小数点*/ { P1=P1 | 0x80; } if(dispcount==2 && P1==dispcode[0]) /*测量温度是一位数,取掉十位的0*/ { P1=dispcode[10]; }
dispcount++;
if(dispcount==4)//第5个led显示结束
dispcount=0; } } |