你搞了這么長(zhǎng)時(shí)間還搞不定,給你改寫(xiě)了,用串口助手模擬傳感器實(shí)物驗(yàn)證沒(méi)有問(wèn)題。根據(jù)其基本框架,你自己補(bǔ)充完善。
無(wú)標(biāo)題.jpg (35.85 KB, 下載次數(shù): 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讀寫(xiě)引腳
- sbit RS=P2^0; //1602數(shù)據(jù)/命令選擇引腳
- uchar table1[]="Wind Direction ";
- uchar table2[]="The Angle: ";
- uchar wind_direction[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};//風(fēng)向傳感器問(wèn)詢(xún)幀
- uchar rec_buf[9];
- uchar strwind[]={'0','0','0',0xdf,' '};
- uchar error[]="Error";
- uint wind_direction1;//單片機(jī)接收風(fēng)向數(shù)據(jù)
- uint temp;
- uchar num=0;
- bit flag=0;
- bit sign=1;
- uint Angle;
- void delay(uint z)//延時(shí)函數(shù)
- {
- uint x,y;
- for(x=z;x>0;x--);
- for(y=110;y>0;y--);
- }
- void wcmd(uchar del)//寫(xiě)命令函數(shù)
- {
- RS=0;//命令選擇端
- RW=0;//寫(xiě)命令
- P0=del; //把命令字寫(xiě)入
- delay(1);
- E=1;//使能
- delay(1);
- E=0;
- }
- void lcd1602_writedata(uchar dat)//寫(xiě)數(shù)據(jù)函數(shù)
- {
- RS=1;//數(shù)據(jù)選擇端
- RW=0;//寫(xiě)命令
- P0=dat; //把要顯示的數(shù)據(jù)寫(xiě)入
- delay(1);
- E=1;
- delay(1);
- E=0;
- }
- void lcd1602_init()//LCD初始化
- {
- wcmd(0x38);
- wcmd(0x0C);
- wcmd(0x06);
- wcmd(0x01);
- }
- void init() //系統(tǒng)初始化
- {
- TMOD |=0X20;//定時(shí)器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; //定時(shí)器1中斷打開(kāi)
- EA=1;//cpu總中斷允許位,1為開(kāi)放中斷
- 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;//關(guān)中斷
- for(i=0;i<8;i++)//問(wèn)詢(xún)
- {
- SBUF=wind_direction[i];//風(fēng)向數(shù)據(jù)
- while(!TI);//數(shù)據(jù)發(fā)送結(jié)束時(shí)TI自動(dòng)置1
- TI=0;
- }
- EA=1;//開(kāi)中斷
- delay(1000);//等待1秒
- if(flag==1)
- {
- flag=0;
- temp=rec_buf[8]<<8|rec_buf[7];//提取驗(yàn)證碼
- if(temp==0xc8db)//驗(yàn)證正確
- {
- 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//錯(cuò)誤,清除緩存
- {
- 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]);//顯示風(fēng)向角度數(shù)據(jù)
- }
- else
- {
- for(i=0;i<5;i++)
- lcd1602_writedata(error[i]);//顯示錯(cuò)誤字符
- }
- }
- }
- void UART_1() interrupt 4
- {
- RI=0; //RI置0
- rec_buf[num] = SBUF;
- if(rec_buf[0]==0x01)//驗(yàn)證數(shù)據(jù)頭,正確繼續(xù)接收,錯(cuò)誤被后續(xù)數(shù)據(jù)覆蓋
- {
- num++;
- if(num>=9) //幀長(zhǎng)度
- {
- flag=1; //幀接收完成標(biāo)志置1
- num=0; //計(jì)數(shù)變量清0
- }
- }
- }
- //01 03 04 00 02 00 5a db c8
復(fù)制代碼
|