#include <AT89X51.H> // 包含51单片机寄存器定义的头文件
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char codedispcode[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};
unsigned char dispcount;
unsigned char getdata;
unsigned int temp;
long int i;
unsigned int R1;
sbit ST=P3^0; //定义管脚
sbit OE=P3^1; //定义管脚
sbit EOC=P3^2; //定义管脚
sbit CLK=P3^3; //定义管脚
void main(void)
{
ST=0;//初始化时,使ST和OE信号全为低电平
OE=0;
ET0=1; //允许定时器T0中断
ET1=1; //允许定时器T1中断
EA=1; //允许中断
TMOD=0x12; //使用定时器T1的工作方式1及T0的工作方式2
TH0=216; //定时器T0的高8位赋初值
TL0=216; //定时器T0的低8位赋初值
TH1=(65536-5000)/256; //定时器T1的高8位赋初值
TL1=(65536-5000)%256; //定时器T1的低8位赋初值
TR1=1; //启动定时器T1
TR0=1; //启动定时器T0
ST=1; //产生启动转换的正脉冲信号
ST=0;
while(1) //无限循环等待中断
{
if(EOC==1)
{
OE=1;
getdata=P0;
OE=0;
i=getdata*196;
dispbuf[5]=i/10000;
i=i%10000;
dispbuf[6]=i/1000;
i=i%1000;
dispbuf[7]=i/100;
ST=1;
ST=0;
}
}
}
void t0(void) interrupt 1 using 0 //定时器0 中断服务
{
CLK=~CLK; //定时取反一次,制造脉冲
}
void t1(void) interrupt 3 using 0 //定时器1 中断服务
{
TH1=(65536-6000)/256;
TL1=(65536-6000)%256;
P2=0xff;
P1=dispcode[dispbuf[dispcount]]; //数码管的字段码
P2=dispbitcode[dispcount]; //扫描数码管的每一位
if(dispcount==5)
{
P1=P1 |0x80;
}
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}
小数点位置不对。。应该再三后面
如果加上三极管驱动数码管的位选。。为什么数码管一直亮