給你寫一個示例程序,兩種數據解析方案任選一種。輸出端口可以自行重新定義。
無標題.jpg (211.15 KB, 下載次數: 21)
下載附件
2019-4-11 08:11 上傳
- #include <AT89X52.H>
- #define uint unsigned int
- #define uchar unsigned char
- sbit LED1=P1^0;
- sbit LED2=P1^1;
- bit flag; //接收完成標志,
- uchar num,num1,num2; //接收/分解的變量
- void main()
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位數據,可變波特率
- TMOD|= 0x20; //設定定時器1為8位自動重裝方式
- TL1 = 0xFD; //設定定時初值
- TH1 = 0xFD; //設定定時器重裝值
- TR1 = 1; //啟動定時器1
- ET1 = 0; //禁止定時器1中斷
- EA = 1; //開總中斷
- ES = 1; //開串口中斷
- while(1)
- {
- if(flag==1) //接收完成標志為1
- {
- ES=0; //關串口中斷
- flag=0; //接收完成標志清0
- SBUF=num; //返回PC收到的數據
- while(!TI); //等待發送中斷請求標志位為1
- TI=0; //發送中斷請求標志位清0
- ES=1; //開串口中斷
- /*************數據解析方案一************/
- num1=num&0xf0;
- num2=num&0x0f;
- if(num1==0xa0)LED1=0;
- if(num1==0xb0)LED1=1;
- if(num2==0x0a)LED2=0;
- if(num2==0x0b)LED2=1;
- /*************數據解析方案二************/
- /* num1=num>>4;
- num2=num&0x0f;
- if(num1==0x0a)LED1=0;
- if(num1==0x0b)LED1=1;
- if(num2==0x0a)LED2=0;
- if(num2==0x0b)LED2=1;
- */
- }
- }
- }
- void ser() interrupt 4
- { //當接收完成發生中斷請求RI由硬件置1
- RI=0; //接收中斷請求標志位必須軟件清0
- num=SBUF; //獲取SBUF接收到的數據
- flag=1; //接收完成標志置1
- }
復制代碼
|