|
本帖最后由 明日香 于 2020-12-9 13:30 編輯
風向傳感器與單片機連接,用LCD1602顯示風向數據,傳感器返回的的應答幀數據是9個,其中LCD顯示第7個數據
求大家幫忙看看哪里有問題:
這是單片機原理圖:
tu.PNG (654.25 KB, 下載次數: 60)
下載附件
2020-12-9 13:29 上傳
這是傳感器說明書:
風向傳感器1.PNG (140.06 KB, 下載次數: 60)
下載附件
2020-12-9 13:30 上傳
風向傳感器3.PNG (91.17 KB, 下載次數: 73)
下載附件
2020-12-9 13:30 上傳
風向傳感器5.PNG (134.94 KB, 下載次數: 75)
下載附件
2020-12-9 13:30 上傳
以下為源程序:
- #include <stc12c5a.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <math.h>
- #include <intrins.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 table[24]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
- uchar wind_direction[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};//風向傳感器問詢幀
- uchar wind_direction1;//單片機接收風向數據
- uchar strwind[3];
- uchar num=0;
- 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;//命令選擇端
- delay(10);
- RW=0;//寫命令
- delay(10);
- P0=del; //把命令字寫入
- delay(10);
- E=1;//使能
- delay(10);
- E=0;
- }
- void lcd1602_writedata(uchar dat)//寫數據函數
- {
- delay(10);
- RS=1;//數據選擇端
- delay(10);
- RW=0;//寫命令
- delay(10);
- P0=dat; //把要顯示的數據寫入
- delay(10);
- E=1;
- delay(10);
- 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 m=0;
- init();
- while(1)
- {
- int i;
- for(i=0;i<8;i++)
- {
- SBUF=wind_direction[i];//風向數據
- while(TI==0);
- {
- } //數據發送結束時TI自動置1
- TI=0;
-
- }
- delay(1000);
- strwind[0]=(wind_direction1/100%10)+'0';
- strwind[1]=(wind_direction1/10%10)+'0';
- strwind[2]=(wind_direction1%10)+'0';
- lcd1602_init();
- delay(1000);
- wcmd(0x80);
- delay(1000);
- for(m=0;m<2;m++)
- {
- lcd1602_writedata(strwind[m]);
- }
- delay(5000);
- }
- }
- void UART_1() interrupt 4
- {
- //接收完緩沖數據后RI置1
- if(RI)//如果RI為1,即如果收到
- {
- RI=0; //RI置0
- if(num==0)
- {
- if(SBUF==0x01)
- {
- table[num++] = SBUF;
- }
- }
- else
- {
- table[num++]=SBUF;//風向數據
- if(num>8)
- {
- num=0;
- wind_direction1=table[6];//風向數據給wind_direction1[0]
- }
- }
- }
- }
復制代碼
最終運行后LCD只顯示00,請問程序哪里錯了?是不是初始化或者中斷部分有問題?求大家幫忙解答,謝謝。
|
|