串行口相關寄存器設置不當,顯示函數也太啰嗦。給你改了。
- #include<reg52.h>//中斷法
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit LSA=P2^2;//控制數碼管顯示位數
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- u8 a=0;
- u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- //12MHz延時時長 T=i*9+16us
- void delay(u16 i)
- {
- while(i--);
- }
- void DigDisplay(u16 num)//數碼管顯示函數
- {
- static u8 i=0;
- u8 buf[3]={0,0,0};
- if(num>99)
- {
- buf[0]=smgduan[num/100%10];
- buf[1]=smgduan[num/10%10];
- buf[2]=smgduan[num%10];
- }
- else if(num>9)
- {
- buf[0]=smgduan[num/10];
- buf[1]=smgduan[num%10];
- buf[2]=0x00;
- }
- else
- {
- buf[0]=smgduan[num];
- buf[1]=0x00;
- buf[2]=0x00;
- }
- P0=0x00;
- P2&=0xe3;
- P2|=((7-i)<<2);
- P0=buf[i];
- i++;
- i%=3;
- }
- void main()
- {
- // REN=1;//串口允許接受信息;
- SCON=0X50;//SM0,SM1同時控制工作方式;
- TMOD=0x20;//設置定時器1工作方式為2;
- TR1=1;//打開定時器1;
- TH1=0xFD;//儲存器,控制頻率,由傳輸頻率計算,
- TL1=0xFD;//與以上共同決定傳輸頻率,信息先進入TH1,溢出的進入TL1;
- EA=1;//中斷打開,EA總中斷,ES串口中斷;
- ES=1;
- while(1)
- {
- DigDisplay(a);
- delay(100);//約1ms
- }
- }
- void ser() interrupt 4//中斷函數,一共有五個,標號4是第五個中斷函數,是串行口中斷函數
- {
- // TH0=0xfc;
- // TL0=0x18;
- RI=0;//RI串口接收中斷申請標志位,數據接收到停止位時RI自動為1;任何標識符初始為0;
- a=SBUF;
- }
復制代碼 |