|
這個源碼燒入單片機后好像不行,單片機沒串口數據的時候就是開機的時候是正常的,一有數據了定時器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就不會翻轉了
- }
復制代碼
|
|