久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3857|回復: 9
打印 上一主題 下一主題
收起左側

風向傳感器連接單片機,用LCD顯示數據,求大家幫忙看看程序哪里有問題

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 明日香 于 2020-12-9 13:30 編輯

風向傳感器與單片機連接,用LCD1602顯示風向數據,傳感器返回的的應答幀數據是9個,其中LCD顯示第7個數據
求大家幫忙看看哪里有問題:

這是單片機原理圖:

這是傳感器說明書:

以下為源程序:
  1. #include <stc12c5a.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <intrins.h>
  7. #define uchar unsigned char
  8. #define uint  unsigned int
  9.         
  10. sbit E=P2^2;    //1602使能引腳
  11. sbit RW=P2^1;    //1602讀寫引腳   
  12. sbit RS=P2^0;    //1602數據/命令選擇引腳

  13. 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};
  14. uchar wind_direction[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};//風向傳感器問詢幀
  15. uchar wind_direction1;//單片機接收風向數據
  16. uchar strwind[3];
  17. uchar num=0;

  18. void delay(uint z)//延時函數
  19. {
  20.         uint x,y;
  21.         for(x=z;x>0;x--);
  22.                 for(y=110;y>0;y--);
  23. }

  24. void wcmd(uchar del)//寫命令函數
  25. {
  26.   RS=0;//命令選擇端
  27.         delay(10);
  28.         RW=0;//寫命令
  29.         delay(10);
  30.         P0=del;  //把命令字寫入
  31.         delay(10);
  32.         E=1;//使能
  33.         delay(10);
  34.         E=0;
  35. }

  36. void lcd1602_writedata(uchar dat)//寫數據函數
  37. {
  38.   delay(10);
  39.         RS=1;//數據選擇端
  40.         delay(10);
  41.         RW=0;//寫命令
  42.         delay(10);
  43.         P0=dat;  //把要顯示的數據寫入
  44.         delay(10);
  45.         E=1;
  46.         delay(10);
  47.         E=0;
  48. }

  49. void lcd1602_init()//LCD初始化
  50. {
  51. wcmd(0x38);
  52. wcmd(0x0C);
  53. wcmd(0x06);
  54. wcmd(0x01);
  55. }

  56. void init()  //系統初始化
  57. {
  58. TMOD |=0X20;//定時器T1,方式2,波特率由PCON寄存器的SMOD決定
  59. SCON=0x50; //REN RI TI,RI為0,TI為0
  60. //串行口1方式1 SCON是串行口1的串行控制寄存器,REN為1,允許接收
  61. PCON=0x00;//各工作方式波特率加倍
  62. TH1=0xfD;//9600bps@11.0592
  63. TL1=0xfD;
  64. TR1=1; //定時器1中斷打開
  65. EA=1;//cpu總中斷允許位,1為開放中斷
  66. ES=1;// 1允許串行口中斷
  67. }

  68. void main()
  69. {
  70.         uchar m=0;
  71.         init();
  72.   while(1)
  73.         {
  74.          int i;               
  75.          for(i=0;i<8;i++)
  76.                 {
  77.                 SBUF=wind_direction[i];//風向數據
  78.                         while(TI==0);
  79.       {
  80.                                          }                        //數據發送結束時TI自動置1
  81.                         TI=0;
  82.                         
  83.                 }
  84.                 delay(1000);
  85.                 strwind[0]=(wind_direction1/100%10)+'0';
  86.                 strwind[1]=(wind_direction1/10%10)+'0';
  87.                 strwind[2]=(wind_direction1%10)+'0';
  88.                 lcd1602_init();
  89.                 delay(1000);
  90.                 wcmd(0x80);
  91.                 delay(1000);
  92.                 for(m=0;m<2;m++)
  93.                 {
  94.                 lcd1602_writedata(strwind[m]);
  95.                 }
  96.                 delay(5000);
  97.   }
  98. }

  99. void UART_1() interrupt 4
  100. {
  101.         //接收完緩沖數據后RI置1
  102.         if(RI)//如果RI為1,即如果收到
  103.         {
  104.                 RI=0; //RI置0
  105.                 if(num==0)
  106.                 {
  107.                         if(SBUF==0x01)
  108.                         {
  109.                                 table[num++] = SBUF;
  110.                         }
  111.                 }
  112.                 else
  113.                 {
  114.                         table[num++]=SBUF;//風向數據
  115.                         if(num>8)
  116.                         {
  117.                                 num=0;
  118.                                 wind_direction1=table[6];//風向數據給wind_direction1[0]
  119.                         }
  120.                 }
  121.         }
  122. }
復制代碼

最終運行后LCD只顯示00,請問程序哪里錯了?是不是初始化或者中斷部分有問題?求大家幫忙解答,謝謝。

風向傳感器5.PNG (134.94 KB, 下載次數: 154)

風向傳感器5.PNG
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:592807 發表于 2020-12-9 08:38 | 只看該作者
哎,你上電路圖和風向傳感器的說明書吧,你這個設備地址碼可能是I2C的通訊地址。如果是I2C的話你可能從一開始就錯了。
回復

使用道具 舉報

板凳
ID:796670 發表于 2020-12-9 13:31 | 只看該作者
黃youhui 發表于 2020-12-9 08:38
哎,你上電路圖和風向傳感器的說明書吧,你這個設備地址碼可能是I2C的通訊地址。如果是I2C的話你可能從一開 ...

你好,已經上傳電路圖和說明書,請您再幫忙看一下吧,感謝不已~
回復

使用道具 舉報

地板
ID:824490 發表于 2020-12-9 16:37 | 只看該作者
風向傳感器是哪個器件?
回復

使用道具 舉報

5#
ID:592807 發表于 2020-12-9 18:55 | 只看該作者
這個00可能時你數組里面本來就存在的數據,你根本就沒收到數據,試一下吧接收到的所有幀都打印出來

51hei截圖20201209185354.png (23.33 KB, 下載次數: 139)

51hei截圖20201209185354.png
回復

使用道具 舉報

6#
ID:213173 發表于 2020-12-9 19:14 | 只看該作者
你搞了這么長時間還搞不定,給你改寫了,用串口助手模擬傳感器實物驗證沒有問題。根據其基本框架,你自己補充完善。



  1. #include <STC12C5A60S2.H>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4.         
  5. sbit E=P2^2;    //1602使能引腳
  6. sbit RW=P2^1;    //1602讀寫引腳   
  7. sbit RS=P2^0;    //1602數據/命令選擇引腳

  8. uchar table1[]="Wind Direction ";
  9. uchar table2[]="The Angle:     ";
  10. uchar wind_direction[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};//風向傳感器問詢幀
  11. uchar rec_buf[9];
  12. uchar strwind[]={'0','0','0',0xdf,' '};
  13. uchar error[]="Error";
  14. uint  wind_direction1;//單片機接收風向數據
  15. uint  temp;
  16. uchar num=0;
  17. bit   flag=0;
  18. bit   sign=1;
  19. uint  Angle;
  20. void delay(uint z)//延時函數
  21. {
  22.         uint x,y;
  23.         for(x=z;x>0;x--);
  24.                 for(y=110;y>0;y--);
  25. }

  26. void wcmd(uchar del)//寫命令函數
  27. {
  28.         RS=0;//命令選擇端
  29.         RW=0;//寫命令
  30.         P0=del;  //把命令字寫入
  31.         delay(1);
  32.         E=1;//使能
  33.         delay(1);
  34.         E=0;
  35. }

  36. void lcd1602_writedata(uchar dat)//寫數據函數
  37. {
  38.         RS=1;//數據選擇端
  39.         RW=0;//寫命令
  40.         P0=dat;  //把要顯示的數據寫入
  41.         delay(1);
  42.         E=1;
  43.         delay(1);
  44.         E=0;
  45. }

  46. void lcd1602_init()//LCD初始化
  47. {
  48.         wcmd(0x38);
  49.         wcmd(0x0C);
  50.         wcmd(0x06);
  51.         wcmd(0x01);
  52. }

  53. void init()  //系統初始化
  54. {
  55.         TMOD |=0X20;//定時器T1,方式2,波特率由PCON寄存器的SMOD決定
  56.         SCON=0x50; //REN RI TI,RI為0,TI為0
  57.         //串行口1方式1 SCON是串行口1的串行控制寄存器,REN為1,允許接收
  58.         PCON=0x00;//各工作方式波特率加倍
  59.         TH1=0xfD;//9600bps@11.0592
  60.         TL1=0xfD;
  61.         TR1=1; //定時器1中斷打開
  62.         EA=1;//cpu總中斷允許位,1為開放中斷
  63.         ES=1;// 1允許串行口中斷
  64. }

  65. void main()
  66. {
  67.         uchar i;
  68.         init();
  69.         lcd1602_init();
  70.         wcmd(0x81);//第一行
  71.         for(i=0;i<14;i++)
  72.                 lcd1602_writedata(table1[i]);
  73.         wcmd(0xc1);//第二行
  74.         for(i=0;i<15;i++)
  75.                 lcd1602_writedata(table2[i]);
  76.         while(1)
  77.         {
  78.                 EA=0;//關中斷
  79.                 for(i=0;i<8;i++)//問詢
  80.                 {
  81.                         SBUF=wind_direction[i];//風向數據
  82.                         while(!TI);//數據發送結束時TI自動置1
  83.                         TI=0;
  84.                 }
  85.                 EA=1;//開中斷
  86.                 delay(1000);//等待1秒
  87.                 if(flag==1)
  88.                 {
  89.                         flag=0;
  90.                         temp=rec_buf[8]<<8|rec_buf[7];//提取驗證碼
  91.                         if(temp==0xc8db)//驗證正確
  92.                         {
  93.                                 sign=1;
  94.                                 wind_direction1=rec_buf[5]<<8|rec_buf[6];
  95.                                 strwind[0]=(wind_direction1/100%10)+'0';
  96.                                 strwind[1]=(wind_direction1/10%10)+'0';
  97.                                 strwind[2]=(wind_direction1%10)+'0';
  98.                         }
  99.                         else//錯誤,清除緩存
  100.                         {
  101.                                 sign=0;
  102.                                 for(i=0;i<9;i++)
  103.                                         rec_buf[i]=0;
  104.                         }
  105.                 }
  106.                 wcmd(0xc0+11);//字符顯示起始位置
  107.                 if(sign)
  108.                 {
  109.                         for(i=0;i<5;i++)
  110.                                 lcd1602_writedata(strwind[i]);//顯示風向角度數據
  111.                 }
  112.                 else
  113.                 {
  114.                         for(i=0;i<5;i++)
  115.                                 lcd1602_writedata(error[i]);//顯示錯誤字符
  116.                 }
  117.         }
  118. }

  119. void UART_1() interrupt 4
  120. {
  121.         RI=0; //RI置0
  122.         rec_buf[num] = SBUF;
  123.         if(rec_buf[0]==0x01)//驗證數據頭,正確繼續接收,錯誤被后續數據覆蓋
  124.         {
  125.                 num++;
  126.                 if(num>=9)                        //幀長度
  127.                 {
  128.                         flag=1;                        //幀接收完成標志置1
  129.                         num=0;                        //計數變量清0
  130.                 }
  131.         }
  132. }
  133. //01 03 04 00 02 00 5a db c8
復制代碼





回復

使用道具 舉報

7#
ID:213173 發表于 2020-12-9 20:23 | 只看該作者
樓主注意,上面示例的校驗碼處理方式只是簡單模擬解析數據,不是真正按CRC算法處理校驗碼。實際應用中參考制造商資料。
回復

使用道具 舉報

8#
ID:796670 發表于 2020-12-10 10:31 | 只看該作者
wulin 發表于 2020-12-9 19:14
你搞了這么長時間還搞不定,給你改寫了,用串口助手模擬傳感器實物驗證沒有問題。根據其基本框架,你自己補 ...

謝謝,非常感謝
回復

使用道具 舉報

9#
ID:796670 發表于 2020-12-10 10:37 | 只看該作者
wulin 發表于 2020-12-9 20:23
樓主注意,上面示例的校驗碼處理方式只是簡單模擬解析數據,不是真正按CRC算法處理校驗碼。實際應用中參考 ...

您好,請問您是用什么軟件模擬傳感器的呢?是類似于stc-icp串口助手嗎?
回復

使用道具 舉報

10#
ID:213173 發表于 2020-12-10 11:25 | 只看該作者
明日香 發表于 2020-12-10 10:37
您好,請問您是用什么軟件模擬傳感器的呢?是類似于stc-icp串口助手嗎?

就是stc-icp串口助手
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线观看网址 | 日本精品网站 | 中文精品视频 | 欧美日韩在线一区二区三区 | 高清人人天天夜夜曰狠狠狠狠 | 亚洲一区二区三区在线 | 精品久久久久久国产 | 99爱国产 | 亚洲网在线 | 久久久91精品国产一区二区三区 | 久久影院一区 | 色噜噜狠狠色综合中国 | 精品国产乱码久久久久久88av | 久久久久久久久久爱 | 成人婷婷 | 久久毛片 | 欧美成人一区二区 | 久久久久国产精品人 | 91精品久久久久久久久中文字幕 | www.9191| 国产精品久久久久久久久久免费 | 黄色小视频入口 | 欧美一区二区网站 | 精品视频一区二区在线观看 | 日韩在线一区二区 | 国产精品日韩一区二区 | 久久久久久久久久久久亚洲 | 日干夜干 | 欧美激情精品久久久久久变态 | 亚洲精品二区 | 亚洲综合一区二区三区 | 欧美日韩中文字幕在线 | 美女爽到呻吟久久久久 | 亚洲国产中文字幕 | 免费黄色录像视频 | 国产精品爱久久久久久久 | 男女在线免费观看 | 91av精品 | 水蜜桃久久夜色精品一区 | 香蕉视频在线播放 | 一区二区三区四区国产 |