jhczy 发表于 2023-10-20 10:44 用仿真的软件调试过了,但还是个十位同时计时,这就是问题 |
jhczy 发表于 2023-10-20 10:40 按照你说的确实是可以从0开始计时,这个主意好棒。 |
错误比比皆是,给你改了。
![]()
|
程序中修改的地方较多,可以先用仿真软件调试,将程序调通。如果有板子,可以调整修改程序,理清程序运行流程 |
程序中当“flags==0”时,“a+1”,所以,显示不可能有0的,需将“seg_buf[0]=seg[a%10]; //低位 seg_buf[1]=seg[a/10]; //高位”调整到flags==0的外面 |
后来修改成这个样子,但还是两个同时计时,而且按下按键1不可以从0开始,而是从1开始,而且为什么从一到二需要的时间比二到三时间更多 #include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //段码 uchar code seg_scan[]={10,10,10,10};//位选码 uchar seg_buf[2]={0x01,0x02};//数码管显示缓冲区 void t0();//t0初始化 void ex();//外部中断初始化 void display(uchar date,uchar get);//数码管显示函数 void delayme(uint xms);//延时函数 uchar a=0,count=0; uchar flags=0;//定时标志 void main() { t0(); ex(); while(1) {if(flags==0) { flags=1; a++; if(a>=60) { a=0; } seg_buf[0]=seg[a%10]; //低位 seg_buf[1]=seg[a/10]; //高位 } } } void display(uchar date,uchar get) { P2 = (P2&0x1f)|0xc0; P0=0X01<<get; P2 = (P2&0x1f)|0xf9; P0=date; } void t0() { TMOD=0X01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; //打开t0中断开关 PT0=0; EA=1; //打开中断总开关 } void ex() { IT0=1; EX0=1; PX0=1; IT1=1; EX1=1; PX1=1; EA=1; } void t0_int() interrupt 1 { uchar i=0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if(count>=20) {count=0; flags=0; } P0=0XFF; switch(i) { case 0:i++;display(seg_buf[0],1);break; case 1:i++;display(seg_buf[1],0);break; default:break; } } void key1()interrupt 0 { TR0=1;//启动t0 a=0x00; IE0=0;//清int0中断标志位 } void key2()interrupt 2 { TR0=0;//启动t0 IE1=0;//清int1中断标志位 } |