[求助]求高手帮我看下这个单片机程序
我在做单片机实现数字电压表的毕业设计,现有一程序,但是小女子太笨了,翻了一天的书也看不懂,现拿出来给各位高手看看,希望大家能帮帮我,感激啊
我的qq:726643557
#include <at89x51.h>
#define uchar unsigned char //*定义宏uchar=unsigned char**//
uchar code dispbitcode[]={0xfe,0xfd,0xfb,0xf7}; //*位地址代码*//
uchar code dispcode[]={0xc0,0x0f9,0x0a4,0x0b0,0x99,//*0~9,和不显示代码,共阳*//
0x92,0x82,0x0f8,0x80,0x90,0xff};
uchar dispbuf[4]; //*定义数组类型*//
uchar dispcount; //*定义dispcount类型*//
uchar getdata; //*定义getdata类型*//
unsigned int temp; //*定义temp类型*//
uchar i; //*定义i 类型*//
sbit st=p3^0; //*定义st的位地址为p3的第一位*//
sbit oe=p3^1; //定义oe的位地址p3的第二位*//
sbit eoc=p3^2; //定义eoc的位地址p3的第三位*//
sbit clk=p3^3; //定义clk的位地址p3的第四位*//
void main(void)
{
st=0; //*禁止a/d转换器启动*//
oe=0; //*禁止a/d输出*//
et0=1; //*允许t0启动*//
et1=1; //*允许t1启动*//
ea=1; //*打开总开关*//
tmod=0x12; //*设置t0 t1工作方式 。t0 为方式2 ,8位自动重装;t1为方式1,16位计数器*//
th0=216; //*装初值,输出频率为:f=1/(40*2)*1000000=12500hz*//
tl0=216;
th1=(65536-3000)/256; //*给t1定时器赋初值*//
tl1=(65536-3000)%256;
tr1=1; //*启动t1*//
tr0=1; //*启动t0*//
st=1; //*形成一个正脉冲,启动a/d转换器*//
st=0;
while(1) //*等待a/d转换完成*//
{
if(eoc==1) //*a/d转换完成*//
{
oe=1; //*允许a/d转换器输出*//
getdata=p2; //单片机通过p2口读取数据*//
oe=0; //*禁止a/d 转换器输出*//
temp=getdata*251;
temp=temp/128; //*数据处理。如:输入模拟量为5,得到数字量255,temp=255*251/128=500。在数码管显示5.00*//
i=3;
dispbuf[0]=10; //*屏蔽一位。因为精度为:5*1/255=0.020,所以第三位小数号无意义;取两位小数*//
dispbuf[1]=0; //*初次显示为0.00*//
dispbuf[2]=0;
dispbuf[3]=0;
while(temp/10) //将十进制的位的数值分别放到数组里边,等待显示*//
{
dispbuf[i]=temp%10;
temp=temp/10;
i--;
}
dispbuf[i]=temp;
st=1; //*进入下一轮转换*//
st=0;
}
}
}
void t0(void) interrupt 1 using 0 //*中断1子程序,使用0区寄存器组*//
{
clk=~clk; //*从p3.3输出12.5khz的时钟信号*//
}
void t1(void) interrupt 3 using 0 //*中断3子程序,使用0区寄存器组*//
th1=(65536-3000)/256; //*重装初值*//
tl1=(65536-3000)%256;
p0=dispcode[dispbuf[dispcount]]; //*显示电压值*//
p1=dispbitcode[dispcount]; //*动态扫描*//
if(dispcount==3)
{
p0=p0-0x80; //*显示小数点*//
}
dispcount++;
if(dispcount==4) //*进入下一轮显示*//
{
dispcount=0;
}
}
发表时间:2007年4月27日14:56:19