|
这个源码烧入单片机后好像不行,单片机没串口数据的时候就是开机的时候是正常的,一有数据了定时器0就挂了,就不会动了,求大神看看什么问题
- #include<reg52.h>
- #include<STDIO.H>//printf()
- #define uchar unsigned char
- #define uint unsigned int //宏定义
- bit RXAAOK; //接收到[开头标志
- bit RXFRMOK; //接收一帧完整数据标
- bit tflag;
- sbit S1=P0^0;
- sbit S2=P0^2;
- sbit S3=P0^3;
- sbit S4=P0^1;
- sbit FM=P0^4;
- sbit DS=P0^5;
- sbit keypad1=P1^0;
- sbit keypad2=P1^1;
- sbit keypad3=P1^2;
- sbit keypad4=P1^3;
- /*下面是数码管位选*/
- sbit one=P1^4;
- sbit two=P1^5;
- sbit three=P1^6;
- /*char code table[]={ 0x3f,0x06,0x5b,
- 0x4f,0x66,0x6d,
- 0x7d,0x07,0x7f,0x6f};*/
- uint temp;
- uchar ketnum,t,RXBUF[10],RX_P;
- void main()
- {
- IP = 0x10; //即设置串口中断为最高优先级
- TMOD=0x21; //定时器1的工作方式2,定时器0的工作方式1,16位
- TH1=0xfd; //定时器1的初值,决定波特率9600
- TL1=0xfd;
-
- TH0=0X4C; //高八位的初值 50MS一次
- TL0=0X00; //第八位的初值
-
- PCON=0x00; //波特率倍增0x00不加倍 0x80加倍
- SCON=0x50; //设置工作方式1 开启接受允许
-
- EA=1; //开启总中断
- ES=1; //开启串口接受中断
- ET0=1; //允许定时器0发出中断
-
- TR1=1; //计数器1开始运行
- TR0=1; //计数器0开始运行
- while(1)
- {
- if(RXFRMOK)
- {
- switch(RXBUF[0])
- {
- case 'A' : S1=~S1;
- }
- }
- }
- }
-
- void UARTO_ISR() interrupt 4 //接收中断,不同处理器可能是不同的函数声明
- {
- uchar i; //用处提取接收缓冲器的字符
- if(RI)
- {
- i=SBUF; //提取字符
- RI=0;
- if(RXFRMOK==0) //判断是否接收到起始字符[
- {
- if(RXAAOK) //如果接收到[,继续接收后面的字符
- {
- RXBUF[RX_P]=i; //字符存入数组
- if((RX_P>3)&&(RXBUF[RX_P-3]==0x7C)&&(RXBUF[RX_P-2]==0x7D)&&(RXBUF[RX_P-1]==0x7E)&&(RXBUF[RX_P]==0x5D) )
- {
- RXFRMOK=1; //如果接收完成,置位RXFRMOK;
- RXAAOK=0; //清零开始标志位RXAAOK
- }
- RX_P++; //接收计数器加一
- }
- if(!RXAAOK&&(i==0x5B)) //字符[,协议格式:[数据|}~]
- {
- RXAAOK=1;
- RX_P=0;
- }
- }
- }
- }
- void Timer0() interrupt 1
- {
- TH0=0x4C;
- TL0=0x00;
- t++;
- S1=~S1; //PC串口发送数据过来后S1就不会翻转了
- }
复制代码
|
|