|
使用單片機串口獲取風向傳感器的數據,然后用LCD1602顯示,求求各位幫忙看看程序哪里有問題,改了好多遍了,但一直沒有現象
這是傳感器的說明:
1.jpg (85.07 KB, 下載次數: 95)
下載附件
2020-12-3 19:14 上傳
捕獲1.PNG (102.68 KB, 下載次數: 102)
下載附件
2020-12-3 19:17 上傳
以下為程序:
- #include <reg52.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit E=P2^2; //LCD1602使能引腳
- sbit RW=P2^1; //LCD1602讀寫引腳
- sbit RS=P2^0; //LCD1602數據/命令選擇引腳
- uchar table[24]= //用來存儲SBUF的數據 {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[]; //用來把得到的整形數據轉為字符串
- int flag1;
- void delay(uint z)//延時函數
- {
- uint x,y;
- for(x=z;x>0;x--);
- for(y=110;y>0;y--);
- }
- void wcmd(uchar del)//LCD寫命令函數
- {
- RS=0;//命令選擇端
- delay(10);
- RW=0;//寫命令
- delay(10);
- P0=del; //把命令字寫入
- delay(10);
- E=1;//使能
- delay(10);
- E=0;
- }
- void lcd1602_writedata(uchar dat)//LCD寫數據函數
- {
- 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決定
- TH1=0xfa;//設置波特率
- TL1=0xfa;
- TR1=1;//定時器1中斷打開
- SCON=0x50;//方式1 SCON是串行口1的串行控制寄存器
- PCON=0x00;//各工作方式波特率加倍
- IP=0X10;//
- REN=1; //串口1接收使能
- EA=1;//cpu開放中斷
- ES=1;//允許串行口中斷
- }
- void main()
- {
- uchar m=0;
- flag1=0;//判斷風速風向傳感器
- init();
- while(1)
- {
- int i;
- if(flag1==0)//flag1=0則發送風向數據
- {
- for(i=0;i<8;i++)
- {
- SBUF=wind_direction[i]; //發送問詢幀
- while(!TI); //數據發送結束時TI置1
- TI=0;
- }
- delay(500);
- strwind[0]=(wind_direction1/10)+'0'; //這里是把整數型數據轉為字符
- strwind[1]=(wind_direction1%10)+'0';
- lcd1602_init();
- delay(100);
- wcmd(0x80); //LCD第一行第一個位置
- delay(100);
- for(m=0;m<3;m++)
- {
- lcd1602_writedata(strwind[m]);
- }
- delay(500);
- }
- }
- }
- void UART_1() interrupt 4
- {
- int i=0;
- //接收完緩沖數據后RI置1
- if(RI)//如果RI為1,即如果收到
- {
- RI=0; //RI置0
- table[i++]=SBUF; // 得到的風向數據存在SBUF,把數據給table[i++]
- if(i>8) //一個應答幀是9個字節,i>8表示一個風向數據傳輸完成
- {
- wind_direction1=table[6];//風向數據是第七個,即table[6],給wind_direction1[0]
- }
- }
- }
復制代碼
求各位幫忙看看以上程序哪里不太對,尤其是串口通信部分,改了好多遍但最后都沒有現象,求大家幫幫忙,謝謝。
|
|