菜鳥遇到問題了,同一段代碼寫進實驗板運行正常,仿真時數碼管卻不能正常顯示。
未命名.jpg (43.61 KB, 下載次數: 41)
下載附件
2021-9-25 20:20 上傳
單片機源程序如下:
- #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)
2021-9-25 20:19 上傳
點擊文件名下載附件
壓縮包里有Proteus仿真文件。
|