菜鸟遇到问题了,同一段代码写进实验板运行正常,仿真时数码管却不能正常显示。
单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char //宏定义。
- #define uint unsigned int
- sbit dula=P2^6; //声明锁存器的锁存端。
- sbit wela=P2^7; //声明锁存器的锁存端。
- sbit beep=P2^3;
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar num,num2,shi,ge;
- uint num1;
- void delay(uint xms) //有参延迟函数。
- {
- uint i,j;
- for(i=xms; i>0; i--)
- for(j=110; j>0; j--); }
- void display(uchar shi,uchar ge) //数码管显示函数。
- {
- dula=1;
- P0=table[shi]; //送段选数据。
- dula=0;
- P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时,原来的段选数据通过位选锁存器造成混乱。
- wela=1;
- P0=0xfe; //送位选数据(十位);
- wela=0;
- delay(5);
- dula=1;
- P0=table[ge];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0xfd;
- wela=0;
- delay(5);
- }
- void zh0() interrupt 1 //定时器T0仅为响声而设。如果取消,得连同它的开关一并取消。
- { TH0=0x4c; //重装初值。
- TL0=0xd0;
- num1++;
- if(num1>=1200) //1200×50ms=60000ms/1000=60s。原文是num1==4,后面控制LED亮灭。
- { num1=0;
- beep=0; //我改成了每分钟一响。
- delay(23); //短促一响
- beep=1;
- }}
- void zh1()interrupt 3
- {
- TH1=0x4c;
- TL1=0xd0;
- num2++;
- if(num2==20)//如果计数到20,说明1秒时间到(20次×50ms=1000ms=1s)。
- {
- num2=0; //把num2清零,计数到20次再进本程序段。
- num++;
- if(num>=60) //到59秒再加1秒时,不显示60而显示0。
- num=0;
- shi=num/10; //把一个2位数分解后分别送数码管显示。
- ge=num%10;
- }}
- void main()
- {
- TMOD=0x11;
- TH0=0x4c;
- TL0=0xd0;
- TH1=0x4c;
- TL1=0xd0;
- EA=1; //开总中断。
- ET0=1; //开定时器0中断。
- ET1=1; //开定时器1中断。
- TR0=1; //启动定时器0中断。
- TR1=1; //启动定时器1中断。
- while(1)
- display(shi,ge);
- } //每分钟慢约250ms。
复制代码
GTX-1C.rar
(25.05 KB, 下载次数: 3)
压缩包里有Proteus仿真文件。
|