#include<reg52.h> #include<math.h> #define uchar unsigned char #define uint unsigned int sbit Cntl0 = P2^0; sbit Cntl1 = P2^1; uchar Buffer[2] = {0}; //從串口接收的數據 uint i,j,r0=1,r1=1; /******************************************************************** * 名稱 : Delay_1ms() * 功能 : 延時子程序,延時時間為 1ms * x * 輸入 : x (延時一毫秒的個數) * 輸出 : 無 ***********************************************************************/ void Delay_1ms(uint i)//1ms延時 { uchar x,j; for(j=0;j<i;j++) for(x=0;x<=148;x++); } /******************************************************************** * 名稱 : Com_Int() * 功能 : 串口中斷子函數 * 輸入 : 無 * 輸出 : 無 ***********************************************************************/ void Com_Int(void) interrupt 4 {
EA = 0; if(RI == 1) //當硬件接收到一個數據時,RI會置位 { Buffer[0] = SBUF - 48; //這里減去48是因為從電腦中發送過來的數據是該字符的ASCII碼,0的ASCII是48。 RI = 0; } EA = 1; } /******************************************************************** * 名稱 : Com_Init() * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中斷 * 輸入 : 無 * 輸出 : 無 ***********************************************************************/ void Com_Init(void) { TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd; //設置波特率 9600 TL1 = 0xFd; TR1 = 1; //啟動定時器1 ES = 1; //開串口中斷 EA = 1; //開總中斷 } /******************************************************************** * 名稱 : Relay00() * 功能 : 控制P2^0管腳電平,實現點奇數次為高,偶數次為低 * 輸入 : 無 * 輸出 : 無 ***********************************************************************/ void Relay00() { r0++; Cntl0=r0%2; //r0用于記調用本Relay()函數的次數,將次數除以2的余數賦給對應管腳 Delay_1ms(100); } /******************************************************************** * 名稱 :Relay01() * 功能 : 控制P2^1管腳電平,實現點奇數次為高,偶數次為低 * 輸入 : 無 * 輸出 : 無 ***********************************************************************/ void Relay01() { r1++; Cntl1=r1%2; //r1用于記調用本Relay()函數的次數,將次數除以2的余數賦給對應管腳 Delay_1ms(100); }
void main() { Delay_1ms(100); Com_Init();//串口初始化 while(1) { switch(Buffer[0]) //括號里面的值為ASCII-48的值,減后即為從上位機發過來的十進制數? { case 0: Relay00(); break; case 1: Relay01(); break; default:break; } } }
想實現的功能是:電腦上位機軟件會發送0或1到單片機串口,當發送奇數次0時p2^0端口輸出低電平,偶數次是輸出高電平;上位機發送1時同理控制p2^1端口; 上面這個程序編譯沒問題,只是燒進單片機后,單片機一上電,p2^0端口就不斷的低高低高低高重復變化,用上位機發送0,對單片機p2^0端電平無影響,直到上位機發送1后,p2^0口才會有變化,請問程序哪里有問題? |