欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4564|回復: 4
收起左側(cè)

關(guān)于超聲波測距加LCD1602顯示

[復制鏈接]
ID:339124 發(fā)表于 2018-7-13 16:45 | 顯示全部樓層 |閱讀模式
在LCD1602上只可以正確顯示溫度,其他都是初始化的值,硬件接在開發(fā)板上,東西型號都對的,求幫忙看看是否是程序問題,或者怎么寫一段串口通信程序,用電腦串口看一下超聲波是否有回傳距離。
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  4. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535


  5. sbit c_send   = P1^5;                //超聲波發(fā)射
  6. sbit c_recive = P3^2;                //超聲波接收


  7. //這三個引腳參考資料
  8. sbit rs=P1^0;         //1602數(shù)據(jù)/命令選擇引腳 H:數(shù)據(jù)              L:命令
  9. sbit rw=P1^1;         //1602讀寫引腳                 H:數(shù)據(jù)寄存器          L:指令寄存器
  10. sbit e =P2^5;         //1602使能引腳          下降沿觸發(fā)
  11. uchar code table_num[]="0123456789abcdefg";
  12. sbit beep = P2^3;   //蜂鳴器IO口定義


  13. uint flag_300ms ;
  14. long distance;                //距離
  15. uint set_d = 100;                    //距離
  16. bit flag_csb_juli;        //超聲波超出量程
  17. uint  flag_time0;     //用來保存定時器0的時候的
  18. uchar menu_1;        //菜單設(shè)計的變量


  19. uint code wendu_buchang1[46] = {                     //溫度補償表格
  20.                                                                 331,332,333,333,334,334,335,336,336,337,        // 0-9度
  21.                                                                 337,338,339,339,340,341,341,342,342,343,        //10-19度
  22.                                                                 343,344,345,345,346,346,347,348,348,349,        //20-29度
  23.                                                                 349,350,351,351,352,352,353,354,354,355,        //30-39度
  24.                                                                 355,356,357,357,358,358                         //40-45度
  25.                                                                 };


  26. sbit dq   = P2^4;        //18b20 IO口的定義
  27. uint temperature ;  //


  28. /***********************1ms延時函數(shù)*****************************/
  29. void delay_1ms(uint q)
  30. {
  31.         uint i,j;
  32.         for(i=0;i<q;i++)
  33.                 for(j=0;j<120;j++);
  34. }


  35. /********************************************************************
  36. * 名稱 : delay_uint()
  37. * 功能 : 小延時。
  38. * 輸入 : 無
  39. * 輸出 : 無
  40. ***********************************************************************/
  41. void delay_uint(uint q)
  42. {
  43.         while(q--);
  44. }






  45. /********************************************************************
  46. * 名稱 : write_com(uchar com)
  47. * 功能 : 1602命令函數(shù)
  48. * 輸入 : 輸入的命令值
  49. * 輸出 : 無
  50. ***********************************************************************/
  51. void write_com(uchar com) //判斷是否繁忙
  52. {
  53.         e=0;
  54.         rs=0;
  55.         rw=0;
  56.         P0=com;
  57.         delay_uint(25);
  58.         e=1;
  59.         delay_uint(100);
  60.         e=0;
  61. }


  62. /********************************************************************
  63. * 名稱 : write_data(uchar dat)
  64. * 功能 : 1602寫數(shù)據(jù)函數(shù)
  65. * 輸入 : 需要寫入1602的數(shù)據(jù)
  66. * 輸出 : 無
  67. ***********************************************************************/
  68. void write_data(uchar dat)
  69. {
  70.         e=0;
  71.         rs=1;
  72.         rw=0;
  73.         P0=dat;
  74.         delay_uint(25);
  75.         e=1;
  76.         delay_uint(100);
  77.         e=0;        
  78. }


  79. /********************************************************************
  80. * 名稱 : write_string(uchar hang,uchar add,uchar *p)
  81. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
  82.                   write_string(1,5,"ab cd ef;")
  83. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  84. * 輸出 : 無
  85. ***********************************************************************/
  86. void write_string(uchar hang,uchar add,uchar *p)
  87. {
  88.         if(hang==1)   
  89.                 write_com(0x80+add);
  90.         else
  91.                 write_com(0x80+0x40+add);
  92.                 while(1)
  93.                 {
  94.                         if(*p == '\0')  break;
  95.                         write_data(*p);
  96.                         p++;
  97.                 }        
  98. }


  99. /***********************lcd1602上顯示兩位十進制數(shù)************************/
  100. void write_sfm2(uchar hang,uchar add,uint date)
  101. {
  102.         if(hang==1)   
  103.                 write_com(0x80+add);
  104.         else
  105.                 write_com(0x80+0x40+add);
  106.         write_data(0x30+date/10%10);
  107.         write_data(0x30+date%10);      
  108. }


  109. /***********************lcd1602上顯示超聲波距離函數(shù)************************/
  110. void write_sfm3(uchar hang,uchar add,uint date)
  111. {
  112.         if(hang==1)   
  113.                 write_com(0x80+add);     //意思是指定地址在第1行的第add個位置
  114.         else
  115.                 write_com(0x80+0x40+add);//意思是指定地址在第2行(0x80+0x40 是第2行)的第add個位置
  116.         write_data(0x30+date/100%10);
  117.         write_data('.');
  118.         write_data(0x30+date/10%10);
  119.         write_data(0x30+date%10);        
  120. }




  121. /***********************lcd1602上顯示特定的字符************************/
  122. void write_zifu(uchar hang,uchar add,uchar date)
  123. {
  124.         if(hang==1)   
  125.                 write_com(0x80+add);
  126.         else
  127.                 write_com(0x80+0x40+add);
  128.         write_data(date);        
  129. }






  130. /********************************************************************
  131. * 名稱 : init_1602()
  132. * 功能 : 初始化1602液晶
  133. * 輸入 : 無
  134. * 輸出 : 無
  135. ***********************************************************************/
  136. void init_1602()      //1602初始化
  137. {
  138.         write_com(0x38);
  139.         write_com(0x0c);
  140.         write_com(0x06);
  141.         delay_uint(1000);
  142.         write_string(1,0,"juli:0.00m      ");
  143.         write_string(2,0," set:0.00m      ");
  144.         write_zifu(1,14,0xdf);  //顯示度
  145.                 write_string(1,15,"C");        
  146. }




  147. /***********************18b20初始化函數(shù)*****************************/
  148. void init_18b20()
  149. {
  150.         bit q;
  151.         dq = 1;                                //把總線拿高
  152.         delay_uint(1);            //15us
  153.         dq = 0;                                //給復位脈沖
  154.         delay_uint(80);                //750us
  155.         dq = 1;                                //把總線拿高 等待
  156.         delay_uint(10);                //110us
  157.         q = dq;                                //讀取18b20初始化信號
  158.         delay_uint(20);                //200us
  159.         dq = 1;                                //把總線拿高 釋放總線
  160. }


  161. /*************寫18b20內(nèi)的數(shù)據(jù)***************/
  162. void write_18b20(uchar dat)
  163. {
  164.         uchar i;
  165.         for(i=0;i<8;i++)
  166.         {                                         //寫數(shù)據(jù)是低位開始
  167.                 dq = 0;                         //把總線拿低寫時間隙開始
  168.                 dq = dat & 0x01; //向18b20總線寫數(shù)據(jù)了
  169.                 delay_uint(5);         // 60us
  170.                 dq = 1;                         //釋放總線
  171.                 dat >>= 1;
  172.         }        
  173. }


  174. /*************讀取18b20內(nèi)的數(shù)據(jù)***************/
  175. uchar read_18b20()
  176. {
  177.         uchar i,value;
  178.         for(i=0;i<8;i++)
  179.         {
  180.                 dq = 0;                         //把總線拿低讀時間隙開始
  181.                 value >>= 1;         //讀數(shù)據(jù)是低位開始
  182.                 dq = 1;                         //釋放總線
  183.                 if(dq == 1)                 //開始讀寫數(shù)據(jù)
  184.                         value |= 0x80;
  185.                 delay_uint(5);         //60us        讀一個時間隙最少要保持60us的時間
  186.         }
  187.         return value;                 //返回數(shù)據(jù)
  188. }


  189. /*************讀取溫度的值 讀出來的是小數(shù)***************/
  190. uint read_temp()
  191. {
  192.         uint value;
  193.         uchar low;                           //在讀取溫度的時候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會影響到18b20的時序
  194.         init_18b20();                   //初始化18b20
  195.         write_18b20(0xcc);           //跳過64位ROM
  196.         write_18b20(0x44);           //啟動一次溫度轉(zhuǎn)換命令
  197.         delay_uint(50);                   //500us


  198.         init_18b20();                   //初始化18b20
  199.         
  200.         write_18b20(0xcc);           //跳過64位ROM
  201.         write_18b20(0xbe);           //發(fā)出讀取暫存器命令
  202.         
  203.         EA = 0;
  204.         low = read_18b20();           //讀溫度低字節(jié)
  205.         value = read_18b20();  //讀溫度高字節(jié)
  206.         EA = 1;
  207.         value <<= 8;                   //把溫度的高位左移8位
  208.         value |= low;                   //把讀出的溫度低位放到value的低八位中
  209.         value *= 0.0625;               //轉(zhuǎn)換到溫度值
  210.         return value;                   //返回讀出的溫度
  211. }


  212. /********************獨立按鍵程序*****************/
  213. uchar key_can;         //按鍵值


  214. void key()         //獨立按鍵程序
  215. {
  216.         static uchar temp,key_new;
  217.         key_can = 20;                                //按鍵值還原
  218.                 P3=0xfe;
  219.                 temp=P3;
  220.         temp=temp&0xf0;                                                                   //11110000松開時高電平1;按下時低電平0
  221.         if((P3 & 0xf0) != 0xf0)                //按鍵按下
  222.         {
  223.                 delay_1ms(10);                     //按鍵消抖動
  224.                 if((P3 & 0xf0) != 0xf0)
  225.                 {                                                //確認是按鍵按下
  226.                         
  227.                       switch(P3 & 0xf0)
  228.                         {
  229.                                 case 0x7e:  key_can = 3;  break;         //得到按鍵值 //1101 1110
  230.                                 case 0xbe:  key_can = 2;  break;         //得到按鍵值//        1011 0000
  231.                                 case 0xde:  key_can = 1;  break;         //得到按鍵值 //0111 0000
  232.                                     case 0xee:  key_can = 0;  break;
  233.                                                 }
  234.                 }
  235.                                 while(temp!=0xf0)
  236.          {
  237.            temp=P3;
  238.            temp=temp&0xf0;
  239.                 }
  240.                 }
  241. }
  242. /**************10us延時函數(shù)***************/
  243. void delay()
  244. {
  245.         _nop_();                            //執(zhí)行一條_nop_()指令就是1us
  246.         _nop_();
  247.         _nop_();
  248.         _nop_();
  249.         _nop_();
  250.         _nop_();
  251.         _nop_();  
  252.         _nop_();
  253.         _nop_();
  254.         _nop_();  
  255.         _nop_();
  256. }




  257. /*********************超聲波測距程序*****************************/
  258. void send_wave()
  259. {
  260.         c_send = 0;                           //10us的高電平觸發(fā)
  261.         delay();
  262.         c_send = 1;         
  263.         TH0 = 0;                          //給定時器0清零
  264.         TL0 = 0;
  265.         TR0 = 0;                                  //關(guān)定時器0定時
  266.         while(!c_recive);                  //當c_recive為零時等待
  267.         while(c_recive)                      //當c_recive為1計數(shù)并等待
  268.         {
  269.                 flag_time0 = TH0 * 256 + TL0;
  270.                 if((flag_time0 > 40000))      //當超聲波超過測量范圍時,顯示3個888
  271.                 {
  272.                         TR0 = 0;
  273.                         flag_csb_juli = 2;
  274.                         distance = 888;
  275.                         break ;               
  276.                 }
  277.                 else
  278.                 {
  279.                         flag_csb_juli = 1;        
  280.                 }
  281.         }
  282.         if(flag_csb_juli == 1)
  283.         {        
  284.                 TR0=0;                                                         //關(guān)定時器0定時
  285.                 distance =flag_time0;                         //讀出定時器0的時間
  286.                 if(temperature <= 45)
  287.                         distance *= wendu_buchang1[temperature] / 2.0 * 0.0001;               // 0.017 = 340M / 2 = 170M = 0.017M 算出來是米
  288.                 else
  289.                         distance *= 358 / 2.0 * 0.0001;               // 0.017 = 340M / 2 = 170M = 0.017M 算出來是米
  290.                 if((distance > 500))                                 //距離 = 速度 * 時間
  291.                 {        
  292.                         distance = 888;                                 //如果大于5.0m就超出超聲波的量程
  293.                 }
  294.         }  
  295. }




  296. /*********************定時器0、定時器1初始化******************/
  297. void time_init()         
  298. {
  299.         EA  = 1;                   //開總中斷
  300.         TMOD = 0X11;          //定時器0、定時器1工作方式1
  301.         ET0 = 0;                  //關(guān)定時器0中斷
  302.         TR0 = 1;                  //允許定時器0定時
  303.         ET1 = 1;                  //開定時器1中斷
  304.         TR1 = 1;                  //允許定時器1定時        
  305. }


  306. /****************按鍵處理數(shù)碼管顯示函數(shù)***************/
  307. void key_with()
  308. {
  309.         if(key_can == 1)         //設(shè)置鍵
  310.         {
  311.                 menu_1 ++;
  312.                 if(menu_1 >= 2)
  313.                 {
  314.                         menu_1 = 0;
  315.                         init_1602() ;     //1602初始化
  316.                         write_sfm3(2,5,set_d);         //顯示設(shè)置的距離
  317.                 }
  318.         }
  319.         if(menu_1 == 1)                        //設(shè)置距離報警
  320.         {
  321.                 if(key_can == 2)
  322.                 {
  323.                         set_d ++ ;                //按鍵按下未松開自動加三次        
  324.                         if(set_d > 400)
  325.                                 set_d = 400;
  326.                 }
  327.                 if(key_can == 3)
  328.                 {
  329.                         set_d -- ;                //按鍵按下未松開自動加三次        
  330.                         if(set_d <= 1)
  331.                                 set_d = 1;
  332.                 }
  333.                 write_sfm3(2,5,set_d);         //顯示設(shè)置的距離
  334.                 write_com(0x80+0x40+6);  //將光標顯示地址
  335.                 write_com(0x0f);         //顯示光標并且閃爍
  336.         }        
  337. }  
  338. /****************報警函數(shù)***************/
  339. void clock_h_l()
  340. {
  341.         if(distance == set_d)
  342.         {
  343.                 beep = ~beep;           //蜂鳴器報警        
  344.         }
  345.         else
  346.         {
  347.                 beep = 1;                //取消報警
  348.         }        
  349. }


  350. /***************主函數(shù)*****************/
  351. void main()
  352. {
  353.         beep = 0;                 //開機蜂鳴器響一下
  354.         delay_1ms(150);
  355.         P0 = P1 = P2 = P3 = 0xff;  //單片機IO口初始化為1
  356.         time_init();          //定時器0、定時器1初始化
  357.         init_1602();      //1602初始化
  358.         write_sfm3(2,5,set_d);         //顯示設(shè)置的距離
  359.         send_wave();        //測距離函數(shù)
  360.         while(1)
  361.         {
  362.                 flag_300ms ++;
  363.                 if(flag_300ms >= 300)
  364.                 {
  365.                         flag_300ms = 0;
  366.                         temperature = read_temp();        //先讀出溫度的值
  367.                         send_wave();        //測距離函數(shù)
  368.                         clock_h_l();    //報警函數(shù)
  369.                         if(menu_1 == 0)
  370.                         {
  371.                                 write_sfm3(1,5,distance);         //顯示測定距離
  372.                                 write_sfm2(1,12,temperature);         //顯示溫度
  373.                         }
  374.                 }
  375.                 key();                                         //按鍵函數(shù)
  376.                 if(key_can < 10)
  377.                 {
  378.                         key_with();                         //按鍵處理函數(shù)
  379.                 }
  380.                 delay_1ms(1);
  381.         }
  382. }
復制代碼




回復

使用道具 舉報

ID:278079 發(fā)表于 2018-7-13 18:01 | 顯示全部樓層
代碼沒怎么看。。distance是long類型,write_date是uint,還有是ucha,會不會跟這個有關(guān)?
回復

使用道具 舉報

ID:339124 發(fā)表于 2018-7-20 13:11 | 顯示全部樓層
a920366858 發(fā)表于 2018-7-13 18:01
代碼沒怎么看。。distance是long類型,write_date是uint,還有是ucha,會不會跟這個有關(guān)?

好的,謝謝回復,忙過這段時間試一試
回復

使用道具 舉報

ID:339124 發(fā)表于 2018-9-23 20:37 | 顯示全部樓層
a920366858 發(fā)表于 2018-7-13 18:01
代碼沒怎么看。。distance是long類型,write_date是uint,還有是ucha,會不會跟這個有關(guān)?

不是這個問題,我改了,還是顯示不出來
回復

使用道具 舉報

ID:475914 發(fā)表于 2019-4-5 09:50 | 顯示全部樓層
請問你的代碼問題解決了么?想學習一下
回復

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表