你搞了這么長時間還搞不定,給你改寫了,用串口助手模擬傳感器實物驗證沒有問題。根據其基本框架,你自己補充完善。
無標題.jpg (35.85 KB, 下載次數: 53)
下載附件
2020-12-9 19:07 上傳
- #include <STC12C5A60S2.H>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit E=P2^2; //1602使能引腳
- sbit RW=P2^1; //1602讀寫引腳
- sbit RS=P2^0; //1602數據/命令選擇引腳
- uchar table1[]="Wind Direction ";
- uchar table2[]="The Angle: ";
- uchar wind_direction[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};//風向傳感器問詢幀
- uchar rec_buf[9];
- uchar strwind[]={'0','0','0',0xdf,' '};
- uchar error[]="Error";
- uint wind_direction1;//單片機接收風向數據
- uint temp;
- uchar num=0;
- bit flag=0;
- bit sign=1;
- uint Angle;
- void delay(uint z)//延時函數
- {
- uint x,y;
- for(x=z;x>0;x--);
- for(y=110;y>0;y--);
- }
- void wcmd(uchar del)//寫命令函數
- {
- RS=0;//命令選擇端
- RW=0;//寫命令
- P0=del; //把命令字寫入
- delay(1);
- E=1;//使能
- delay(1);
- E=0;
- }
- void lcd1602_writedata(uchar dat)//寫數據函數
- {
- RS=1;//數據選擇端
- RW=0;//寫命令
- P0=dat; //把要顯示的數據寫入
- delay(1);
- E=1;
- delay(1);
- E=0;
- }
- void lcd1602_init()//LCD初始化
- {
- wcmd(0x38);
- wcmd(0x0C);
- wcmd(0x06);
- wcmd(0x01);
- }
- void init() //系統初始化
- {
- TMOD |=0X20;//定時器T1,方式2,波特率由PCON寄存器的SMOD決定
- SCON=0x50; //REN RI TI,RI為0,TI為0
- //串行口1方式1 SCON是串行口1的串行控制寄存器,REN為1,允許接收
- PCON=0x00;//各工作方式波特率加倍
- TH1=0xfD;//9600bps@11.0592
- TL1=0xfD;
- TR1=1; //定時器1中斷打開
- EA=1;//cpu總中斷允許位,1為開放中斷
- ES=1;// 1允許串行口中斷
- }
- void main()
- {
- uchar i;
- init();
- lcd1602_init();
- wcmd(0x81);//第一行
- for(i=0;i<14;i++)
- lcd1602_writedata(table1[i]);
- wcmd(0xc1);//第二行
- for(i=0;i<15;i++)
- lcd1602_writedata(table2[i]);
- while(1)
- {
- EA=0;//關中斷
- for(i=0;i<8;i++)//問詢
- {
- SBUF=wind_direction[i];//風向數據
- while(!TI);//數據發送結束時TI自動置1
- TI=0;
- }
- EA=1;//開中斷
- delay(1000);//等待1秒
- if(flag==1)
- {
- flag=0;
- temp=rec_buf[8]<<8|rec_buf[7];//提取驗證碼
- if(temp==0xc8db)//驗證正確
- {
- sign=1;
- wind_direction1=rec_buf[5]<<8|rec_buf[6];
- strwind[0]=(wind_direction1/100%10)+'0';
- strwind[1]=(wind_direction1/10%10)+'0';
- strwind[2]=(wind_direction1%10)+'0';
- }
- else//錯誤,清除緩存
- {
- sign=0;
- for(i=0;i<9;i++)
- rec_buf[i]=0;
- }
- }
- wcmd(0xc0+11);//字符顯示起始位置
- if(sign)
- {
- for(i=0;i<5;i++)
- lcd1602_writedata(strwind[i]);//顯示風向角度數據
- }
- else
- {
- for(i=0;i<5;i++)
- lcd1602_writedata(error[i]);//顯示錯誤字符
- }
- }
- }
- void UART_1() interrupt 4
- {
- RI=0; //RI置0
- rec_buf[num] = SBUF;
- if(rec_buf[0]==0x01)//驗證數據頭,正確繼續接收,錯誤被后續數據覆蓋
- {
- num++;
- if(num>=9) //幀長度
- {
- flag=1; //幀接收完成標志置1
- num=0; //計數變量清0
- }
- }
- }
- //01 03 04 00 02 00 5a db c8
復制代碼
|