51单片机的中断学习与数码管的点亮,仿真过程中遇到一个问题,8.9之前仿真时,点亮数码管顺序为先段选后位选,到8.12后居然全是乱码,找了好久找不到毛病,最后网上查到改成先位选再段选即可,解决问题。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #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)
|