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

標(biāo)題: 風(fēng)向傳感器連接單片機(jī),用LCD顯示數(shù)據(jù),求大家?guī)兔纯闯绦蚰睦镉袉栴} [打印本頁]

作者: 明日香    時(shí)間: 2020-12-8 21:51
標(biāo)題: 風(fēng)向傳感器連接單片機(jī),用LCD顯示數(shù)據(jù),求大家?guī)兔纯闯绦蚰睦镉袉栴}
本帖最后由 明日香 于 2020-12-9 13:30 編輯

風(fēng)向傳感器與單片機(jī)連接,用LCD1602顯示風(fēng)向數(shù)據(jù),傳感器返回的的應(yīng)答幀數(shù)據(jù)是9個(gè),其中LCD顯示第7個(gè)數(shù)據(jù)
求大家?guī)兔纯茨睦镉袉栴}:

這是單片機(jī)原理圖:

這是傳感器說明書:

以下為源程序:
  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數(shù)據(jù)/命令選擇引腳

  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};//風(fēng)向傳感器問詢幀
  15. uchar wind_direction1;//單片機(jī)接收風(fēng)向數(shù)據(jù)
  16. uchar strwind[3];
  17. uchar num=0;

  18. void delay(uint z)//延時(shí)函數(shù)
  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)//寫命令函數(shù)
  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)//寫數(shù)據(jù)函數(shù)
  37. {
  38.   delay(10);
  39.         RS=1;//數(shù)據(jù)選擇端
  40.         delay(10);
  41.         RW=0;//寫命令
  42.         delay(10);
  43.         P0=dat;  //把要顯示的數(shù)據(jù)寫入
  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()  //系統(tǒng)初始化
  57. {
  58. TMOD |=0X20;//定時(shí)器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; //定時(shí)器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];//風(fēng)向數(shù)據(jù)
  78.                         while(TI==0);
  79.       {
  80.                                          }                        //數(shù)據(jù)發(fā)送結(jié)束時(shí)TI自動(dòng)置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.         //接收完緩沖數(shù)據(jù)后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;//風(fēng)向數(shù)據(jù)
  115.                         if(num>8)
  116.                         {
  117.                                 num=0;
  118.                                 wind_direction1=table[6];//風(fēng)向數(shù)據(jù)給wind_direction1[0]
  119.                         }
  120.                 }
  121.         }
  122. }
復(fù)制代碼

最終運(yùn)行后LCD只顯示00,請(qǐng)問程序哪里錯(cuò)了?是不是初始化或者中斷部分有問題?求大家?guī)兔獯穑x謝。

風(fēng)向傳感器5.PNG (134.94 KB, 下載次數(shù): 154)

風(fēng)向傳感器5.PNG

作者: 黃youhui    時(shí)間: 2020-12-9 08:38
哎,你上電路圖和風(fēng)向傳感器的說明書吧,你這個(gè)設(shè)備地址碼可能是I2C的通訊地址。如果是I2C的話你可能從一開始就錯(cuò)了。
作者: 明日香    時(shí)間: 2020-12-9 13:31
黃youhui 發(fā)表于 2020-12-9 08:38
哎,你上電路圖和風(fēng)向傳感器的說明書吧,你這個(gè)設(shè)備地址碼可能是I2C的通訊地址。如果是I2C的話你可能從一開 ...

你好,已經(jīng)上傳電路圖和說明書,請(qǐng)您再幫忙看一下吧,感謝不已~
作者: 名字不是重點(diǎn)    時(shí)間: 2020-12-9 16:37
風(fēng)向傳感器是哪個(gè)器件?
作者: 黃youhui    時(shí)間: 2020-12-9 18:55
這個(gè)00可能時(shí)你數(shù)組里面本來就存在的數(shù)據(jù),你根本就沒收到數(shù)據(jù),試一下吧接收到的所有幀都打印出來

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

51hei截圖20201209185354.png

作者: wulin    時(shí)間: 2020-12-9 19:14
你搞了這么長(zhǎng)時(shí)間還搞不定,給你改寫了,用串口助手模擬傳感器實(shí)物驗(yàn)證沒有問題。根據(jù)其基本框架,你自己補(bǔ)充完善。



  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數(shù)據(jù)/命令選擇引腳

  8. uchar table1[]="Wind Direction ";
  9. uchar table2[]="The Angle:     ";
  10. uchar wind_direction[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};//風(fēng)向傳感器問詢幀
  11. uchar rec_buf[9];
  12. uchar strwind[]={'0','0','0',0xdf,' '};
  13. uchar error[]="Error";
  14. uint  wind_direction1;//單片機(jī)接收風(fēng)向數(shù)據(jù)
  15. uint  temp;
  16. uchar num=0;
  17. bit   flag=0;
  18. bit   sign=1;
  19. uint  Angle;
  20. void delay(uint z)//延時(shí)函數(shù)
  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)//寫命令函數(shù)
  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)//寫數(shù)據(jù)函數(shù)
  37. {
  38.         RS=1;//數(shù)據(jù)選擇端
  39.         RW=0;//寫命令
  40.         P0=dat;  //把要顯示的數(shù)據(jù)寫入
  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()  //系統(tǒng)初始化
  54. {
  55.         TMOD |=0X20;//定時(shí)器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; //定時(shí)器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;//關(guān)中斷
  79.                 for(i=0;i<8;i++)//問詢
  80.                 {
  81.                         SBUF=wind_direction[i];//風(fēng)向數(shù)據(jù)
  82.                         while(!TI);//數(shù)據(jù)發(fā)送結(jié)束時(shí)TI自動(dòng)置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];//提取驗(yàn)證碼
  91.                         if(temp==0xc8db)//驗(yàn)證正確
  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//錯(cuò)誤,清除緩存
  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]);//顯示風(fēng)向角度數(shù)據(jù)
  111.                 }
  112.                 else
  113.                 {
  114.                         for(i=0;i<5;i++)
  115.                                 lcd1602_writedata(error[i]);//顯示錯(cuò)誤字符
  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)//驗(yàn)證數(shù)據(jù)頭,正確繼續(xù)接收,錯(cuò)誤被后續(xù)數(shù)據(jù)覆蓋
  124.         {
  125.                 num++;
  126.                 if(num>=9)                        //幀長(zhǎng)度
  127.                 {
  128.                         flag=1;                        //幀接收完成標(biāo)志置1
  129.                         num=0;                        //計(jì)數(shù)變量清0
  130.                 }
  131.         }
  132. }
  133. //01 03 04 00 02 00 5a db c8
復(fù)制代碼






作者: wulin    時(shí)間: 2020-12-9 20:23
樓主注意,上面示例的校驗(yàn)碼處理方式只是簡(jiǎn)單模擬解析數(shù)據(jù),不是真正按CRC算法處理校驗(yàn)碼。實(shí)際應(yīng)用中參考制造商資料。
作者: 明日香    時(shí)間: 2020-12-10 10:31
wulin 發(fā)表于 2020-12-9 19:14
你搞了這么長(zhǎng)時(shí)間還搞不定,給你改寫了,用串口助手模擬傳感器實(shí)物驗(yàn)證沒有問題。根據(jù)其基本框架,你自己補(bǔ) ...

謝謝,非常感謝
作者: 明日香    時(shí)間: 2020-12-10 10:37
wulin 發(fā)表于 2020-12-9 20:23
樓主注意,上面示例的校驗(yàn)碼處理方式只是簡(jiǎn)單模擬解析數(shù)據(jù),不是真正按CRC算法處理校驗(yàn)碼。實(shí)際應(yīng)用中參考 ...

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

作者: wulin    時(shí)間: 2020-12-10 11:25
明日香 發(fā)表于 2020-12-10 10:37
您好,請(qǐng)問您是用什么軟件模擬傳感器的呢?是類似于stc-icp串口助手嗎?

就是stc-icp串口助手




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 毛片区 | 欧美综合精品 | 欧美日韩国产精品一区 | 亚洲成人一级 | 国产精品成人在线 | 99色在线视频 | 国产成人jvid在线播放 | 国产综合精品一区二区三区 | 欧美在线a| 国产激情网站 | 美女一区| 黑人精品欧美一区二区蜜桃 | 精品久久久久久久人人人人传媒 | 国产一级片在线观看视频 | 九色91视频| 久久精品国产亚洲 | 成年人黄色小视频 | 久久噜噜噜精品国产亚洲综合 | 夜夜操av | 中文字幕av一区二区三区 | 涩涩99| 成人一区二区电影 | 少妇一级淫片免费放播放 | 亚洲免费在线 | 色秀网站 | 高清国产午夜精品久久久久久 | 爱爱小视频 | 一区二区三区在线看 | 欧美激情综合色综合啪啪五月 | 欧美国产日韩一区二区三区 | 色姑娘av | 欧美性另类 | 狠狠色综合网站久久久久久久 | 精品国产91乱码一区二区三区 | 婷婷福利视频导航 | 亚洲 自拍 另类 欧美 丝袜 | 91久久久久久久久久久 | 日韩免费在线观看视频 | 乱码av午夜噜噜噜噜动漫 | 精品国产一区久久 | 久久躁日日躁aaaaxxxx |