串行口相关寄存器设置不当,显示函数也太啰嗦。给你改了。
- #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;
- }
复制代码 |