发布网友 发布时间:2022-05-01 22:30
共1个回答
热心网友 时间:2022-06-24 09:30
错误好多哦
错误一、数码管编码声明部分,缺了个 char
错误二、定时器中断里面,各个变量的值运行不对
错误三、程序整体的结构不够合理
另外你的数码管显示部分太过于繁琐,且在主循环内不方便程序的调试
不多说了,还是上程序吧,已经为你改了,且经过硬件测试的
我测试的时候,使用的端口和你的不一样,测试结束后又改为你使用的端口
更改完端口后,未实测,如果有错误请联系我
/***************************************************************************/
#include <reg51.h>//51单片机通用头文件
char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned int i,t,h;
sbit a=P1^0; sbit led=P3^7; sbit lad=P3^6;
//char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
/***************************************************************************/
void YS(char hs){char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}//延时函数
/***************************************************************************/
void XS(int xs) //数码管显示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10; d3=(xs/100)%10; d4=(xs/1000)%10;
P0=table[d1]; P2=0xfe; YS(10); P2=0xff;//个位显示
P0=table[d2]; P2=0xfd; YS(10); P2=0xff;//十位显示
P0=table[d3]; P2=0xfb; YS(10); P2=0xff;//百位显示
P0=table[d4]; P2=0xf7; YS(10); P2=0xff;//千位显示
}
/***************************************************************************/
void main()
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TMOD=0x01; TR0=1; ET0=1; EA=1;
led=0;lad=1;
while(1)
{
XS(h);//调用数码管显示函数
if(a==0){h=10;}//如果按键被按下,则把变量赋值
}
}
/***************************************************************************/
void t0()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++; t++;
if(h>0){t=0;}//如果按键按下,屏蔽 t 计数,
if(t>=10){t=0;led=~led; lad=~lad;}//t计数,用于两个LED闪烁
if(i>=20){i=0;if(h>0){h--;led=0;lad=0;}}//如果数值不为0,则一秒减一,并点亮两个LED
if(h==0&&led==0&&lad==0){led=1;lad=0;}//此句是防止数码管倒计时后两个LED继续同时点亮
}
/***************************************************************************/
追问真不知道该怎么谢你才好!追答别客气,相互学习,共同进步嘛!