51單片機的中斷學習與數碼管的點亮,仿真過程中遇到一個問題,8.9之前仿真時,點亮數碼管順序為先段選后位選,到8.12后居然全是亂碼,找了好久找不到毛病,最后網上查到改成先位選再段選即可,解決問題。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
Snipaste_2021-11-27_18-39-57.png (68.08 KB, 下載次數: 83)
下載附件
2021-11-27 18:43 上傳
單片機源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DUAN=P2^6;
- sbit WEI=P2^5;
- sbit LED=P2^1;
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};//共陰極數碼管編碼
- void delayms(uint xms);
- void display(int,int);
- int num,num1,num2,shi,ge;
- void main()
- {
- TMOD=0X11; //設置定時器0和1的工作方式
- TH0=(66536-50000)/256; //T0裝初值
- TL0=(66536-50000)%256;
- TH1=(66536-50000)/256; //T1裝初值
- TL1=(66536-50000)%256;
- EA=1;
- ET0=1;
- ET1=1;
- TR0=1;
- TR1=1;
-
- while(1)
- {
-
- display(shi,ge);
-
- }
-
- }
- void display(int shi, int ge)
- {
-
- WEI=1;
- P0=0Xfd;
- WEI=0;
-
- DUAN=1;
- P0=table[shi];
- DUAN=0;
- P0=0Xff;
-
- delayms(5);
-
- WEI=1;
- P0=0Xfe;
- WEI=0;
- DUAN=1;
- P0=table[ge];
- DUAN=0;
- P0=0Xff;
- delayms(5);
-
-
-
-
-
-
- }
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for (j=100;j>0;j--);
- }
- void T0_time() interrupt 1
- {
- TH0=(66536-50000)/256; //T0裝初值
- TL0=(66536-50000)%256;
- num1++;
- if(num1==4)
- {
- num1=0;
- LED=~LED;
-
- }
- }
- void T1_time() interrupt 3
- {
- TH1=(66536-50000)/256; //T1裝初值
- TL1=(66536-50000)%256;
- num2++;
- if(num2==20)
- {
- num2=0;
- num++;
- if(num==60)
- num=0;
- shi=num/10;
- ge=num%10;
-
- }
- }
復制代碼
仿真代碼51hei附件下載:
interruption case 3-5-2.7z
(102.39 KB, 下載次數: 9)
2021-11-27 18:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|