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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7839|回復: 9
收起左側

超聲波測距+LCD1602/LCD12864顯示

  [復制鏈接]
ID:202326 發表于 2017-5-18 20:40 | 顯示全部樓層 |閱讀模式
很久以前測試過的超聲波測距,并用51單片機+超聲波測距+LCD1602/LCD12864顯示
0.png

12864液晶顯示的程序版本:
  1. /////////////////////////////////////////////////////////////////
  2. /***********************超聲波模塊程序**************************/
  3. /////////////////////////////////////////////////////////////////
  4. #include <reg52.h>
  5. #include <intrins.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. //全局變量定義
  9. unsigned int time;
  10. unsigned int S,s_false;
  11. unsigned long num1;
  12. bit flag;
  13. //12864液晶顯示定義
  14. uchar code sj1[]={"<<超聲波測距儀>>"};
  15. uchar code sj2[]={"“TI”杯電子大賽"};
  16. uchar code sj3[]={"當前狀態:前進  "};
  17. uchar code sj4[]={"當前距離:"};
  18. uchar code sj5[]={"錯誤 "};
  19. //超聲波引腳定義                                                 
  20. sbit Trig =P3^1;          //定義引腳       
  21. sbit Echo =P3^2;
  22. //12864液晶引腳定義
  23. sbit lcdrs=P1^5;          //命令數據
  24. sbit lcdrw=P1^6;          //讀寫
  25. sbit lcde =P1^7;
  26. //時鐘調整按鍵引腳定義
  27. sbit rad=P2^4;
  28. sbit rsu=P2^5;
  29. sbit mad=P2^6;
  30. sbit msu=P2^7;
  31. //需關閉的板上資源
  32. sbit duan=P1^0;                  //數碼管段控制
  33. sbit wei=P1^1;                  //數碼管位控制
  34. sbit LeDen=P1^2;              //LED燈控制端
  35. sbit Line=P1^3;                  //點陣行控制端
  36. sbit rst=P3^4;            //DS1302復位端,低電平關閉  
  37. //延時函數
  38. void delay(uint z)
  39. {
  40.         uint x,y;
  41.         for(x=z;x>0;x--)
  42.                 for(y=110;y>0;y--);
  43. }
  44. void delay_20us()
  45. {
  46.         uchar a;
  47.         for(a=0;a<100;a++);
  48. }
  49. //2864液晶寫命令函數
  50. void xmn(unsigned char com)
  51. {
  52.         lcdrs=0;
  53.         P0=com;
  54.         delay(5);
  55.         lcde=1;
  56.         delay(5);
  57.         lcde=0;
  58. }
  59. //2864液晶寫數據函數
  60. void xsj(unsigned char zifu)
  61. {
  62.         lcdrs=1;
  63.         P0=zifu;
  64.         delay(5);
  65.         lcde=1;
  66.         delay(5);
  67.         lcde=0;
  68. }
  69. //2864液晶顯示函數1
  70. void xs1()
  71. {
  72.         uchar i;
  73.         xmn(0x80);
  74.         for(i=0;i<16;i++)
  75.         {
  76.                 xsj(sj1[i]);
  77.         }
  78.         xmn(0x90);
  79.         for(i=0;i<16;i++)
  80.         {
  81.                 xsj(sj2[i]);
  82.         }
  83.         xmn(0x88);
  84.         for(i=0;i<16;i++)
  85.         {
  86.                 xsj(sj3[i]);
  87.         }
  88.         xmn(0x98);
  89.         for(i=0;i<16;i++)
  90.         {
  91.                 xsj(sj4[i]);
  92.         }
  93. }
  94. //2864液晶顯示函數2
  95. void xs2(uint t_emp)
  96. {
  97.         uchar qian,bai,shi,ge;
  98.         qian=t_emp/1000;
  99.         bai=(t_emp%1000)/100;
  100.         shi=(t_emp%100)/10;
  101.         ge=t_emp%10;

  102.         xmn(0x9d);
  103.         xsj(0x30+qian);
  104.         delay(1);
  105.         xsj(0x30+bai);
  106.         delay(1);
  107.         xsj(0x30+shi);
  108.         delay(1);
  109.         xsj(0x30+ge);
  110.         delay(1);
  111.         xsj('c');
  112.         delay(1);
  113.         xsj('m');
  114.         delay(100);
  115. }
  116. //超聲波計數函數
  117. void T0_time() interrupt 1  //T0中斷用來計數器溢出,超過測距范圍
  118. {
  119.         flag=0;                  //中斷溢出標志,失敗
  120.         TH0=0;
  121.         TL0=0;
  122.         TR0=0;                   //關閉計數
  123. }
  124. //中斷定時函數
  125. void T1_timer() interrupt 3 //中斷
  126. {
  127.         TH1=(65536-50000)/256;
  128.         TL1=(65536-50000)%256;
  129.         num1++;
  130. }
  131. //超聲波模塊啟動函數
  132. void StartModule()          //啟動模塊
  133. {
  134.         Trig=1;                 //啟動一次模塊
  135.         _nop_();_nop_();_nop_();_nop_();_nop_();
  136.         _nop_();_nop_();_nop_();_nop_();_nop_();
  137.         _nop_();_nop_();_nop_();_nop_();_nop_();
  138.         _nop_();_nop_();_nop_();_nop_();_nop_();
  139.         _nop_();
  140.         Trig=0;
  141. }
  142. //超聲波測試距離計算函數
  143. void Count(void)
  144. {
  145.         uchar i;
  146.         time=TH0*256+TL0;
  147.         TH0=0;
  148.         TL0=0;
  149.         S=(time*1.7)/100;               //算出來是CM
  150.         if(((S<5)||(S>=600))||flag==0)  //超出測量范圍顯示“-”失敗
  151.         {
  152.                 //flag=1;
  153.                 s_false=1000;
  154.                 xmn(0x9d);
  155.                 for(i=0;i<6;i++)
  156.                 {
  157.                         xsj(sj5[i]);
  158.                 }
  159.                 //xs(s_false);
  160.         }
  161.         else
  162.         {
  163.                 xs2(S);
  164.         }
  165. }
  166. //12864液晶初始化函數
  167. void init()
  168. {
  169.         delay(100);
  170.         xmn(0x30);
  171.         delay_20us();
  172.         xmn(0x30);
  173.         delay_20us();
  174.         xmn(0x0c);
  175.         delay_20us();
  176.         xmn(0x01);
  177.         delay_20us();
  178.         xmn(0x06);
  179.         delay_20us();
  180. }
  181. //主函數
  182. void main()
  183. {
  184.         //unsigned char TempCyc;
  185.         rst=0;           //關閉板上DS1302
  186.         LeDen=1;
  187.         P0=0XFF;
  188.         LeDen=0;            //關閉板上LED燈
  189.        
  190.         P0=0XFF;
  191.         wei=0;
  192.         P0=0X00;
  193.         duan=0;        //關閉板上數碼管
  194.        
  195.         P0=0X00;
  196.         Line=0;        //關閉板上點陣

  197.         delay(500);    //啟動等待,等LCM講入工作狀態
  198.         lcdrw=0;
  199.         init();        //LCM初始化
  200.         delay(500);    //延時片刻(可不要)
  201.         while(1)
  202.         {
  203.                 TMOD=0x11; //設T0為方式1,GATE=1;
  204. ……………………

  205. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


1602液晶版本:
單片機源程序如下:
  1. //超聲波模塊程序
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. unsigned int time;
  7. unsigned int S,s_false;
  8. unsigned long num1;
  9. uchar code xs[]={"ERROR "};
  10. uchar code disp[]={"Measuring Range:"};
  11. bit flag;

  12. sbit Trig =P3^1; //定義引腳       
  13. sbit Echo =P3^2;

  14. sbit lcdrs=P1^5;//命令數據
  15. sbit lcdrw=P1^6;//讀寫
  16. sbit lcde =P1^7;

  17. sbit duan=P1^0;        //        數碼管段控制
  18. sbit wei=P1^1;        //        數碼管位控制
  19. sbit LeDen=P1^2;        //        LED燈控制端
  20. sbit Line=P1^3;        //        點陣行控制端
  21. sbit rst=P3^4;//DS1302復位端,低電平關閉  

  22. void delay(uint z)
  23. {
  24.         uint x,y;
  25.         for(x=z;x>0;x--)
  26.                 for(y=110;y>0;y--);
  27. }

  28. void write_com(unsigned char com)
  29. {
  30.         lcdrs=0;
  31.         P0=com;
  32.         delay(5);
  33.         lcde=1;
  34.         delay(5);
  35.         lcde=0;
  36. }

  37. void write_data(unsigned char zifu)
  38. {
  39.         lcdrs=1;
  40.         P0=zifu;
  41.         delay(5);
  42.         lcde=1;
  43.         delay(5);
  44.         lcde=0;
  45. }

  46. void write_temp(uint t_emp)
  47. {
  48.         uchar qian,bai,shi,ge,i;
  49.         qian=t_emp/1000;
  50.         bai=(t_emp%1000)/100;
  51.         shi=(t_emp%100)/10;
  52.         ge=t_emp%10;

  53.         write_com(0x80);
  54.         for(i=0;i<16;i++)
  55.         {
  56.                 write_data(disp[i]);
  57.         }
  58.         delay(1);
  59.         write_com(0x80+0x40);
  60.         delay(1);
  61.         write_data(0x30+qian);
  62.         delay(1);
  63.         write_data(0x30+bai);
  64.         delay(1);
  65.         write_data(0x30+shi);
  66.         delay(1);
  67.         write_data(0x30+ge);
  68.         delay(1);
  69.         write_data('c');
  70.         delay(1);
  71.         write_data('m');
  72.         delay(1);
  73.         write_data('-');
  74.         delay(1);
  75.         write_data('-');
  76.         delay(1);
  77.         write_data('L');
  78.         delay(1);
  79.         write_data('u');
  80.         delay(1);
  81.         write_data('Z');
  82.         delay(1);
  83.         write_data('e');
  84.         delay(1);
  85.         write_data('H');
  86.         delay(1);
  87.         write_data('o');
  88.         delay(1);
  89.         write_data('n');
  90.         delay(1);
  91.         write_data('g');
  92.         delay(1);
  93.         delay(100);
  94. }

  95. void T0_time() interrupt 1 //T0中斷用來計數器溢出,超過測距范圍
  96. {
  97.         flag=0; //中斷溢出標志,失敗
  98.         TH0=0;
  99.         TL0=0;
  100.         TR0=0;//關閉計數
  101. }

  102. void T1_timer() interrupt 3 //中斷
  103. {
  104.         TH1=(65536-50000)/256;
  105.         TL1=(65536-50000)%256;
  106.         num1++;
  107. }

  108. void StartModule()//啟動模塊
  109. {
  110.         Trig=1;//啟動一次模塊
  111.         _nop_();_nop_();_nop_();_nop_();_nop_();
  112.         _nop_();_nop_();_nop_();_nop_();_nop_();
  113.         _nop_();_nop_();_nop_();_nop_();_nop_();
  114.         _nop_();_nop_();_nop_();_nop_();_nop_();
  115.         _nop_();
  116.         Trig=0;
  117. }

  118. void Count(void)
  119. {
  120.         uchar i;
  121.         time=TH0*256+TL0;
  122.         TH0=0;
  123.         TL0=0;
  124.         S=(time*1.7)/100;//算出來是CM
  125.         if(((S<5)||(S>=450))||flag==0) //超出測量范圍顯示“-”失敗
  126.         {
  127.                 //flag=1;
  128.                 s_false=1000;
  129.                 write_com(0x80+0x40);
  130.                 for(i=0;i<6;i++)
  131.                 {
  132.                         write_data(xs[i]);
  133.                 }
  134.         }
  135.         else
  136.         {
  137.                 write_temp(S);
  138.         }
  139. }

  140. void init()
  141. {
  142.         lcde=0;
  143.         write_com(0x38);
  144.         write_com(0x0c);
  145.         write_com(0x06);
  146.         write_com(0x01);
  147.         lcdrw=0;
  148. }

  149. void main()
  150. {
  151.         //unsigned char TempCyc;

  152.         rst=0;//關閉DS1302
  153.         LeDen=1;
  154.         P0=0XFF;
  155.         LeDen=0;        //關閉LED燈
  156.        
  157.         P0=0XFF;
  158.         wei=0;
  159.         P0=0X00;
  160.         duan=0;  //關閉數碼管
  161.        
  162.         P0=0X00;
  163.         Line=0; //關閉點陣

  164.         delay(500);    //啟動等待,等LCM講入工作狀態
  165.         lcdrw=0;
  166.         init();        //LCM初始化
  167.         delay(500);    //延時片刻(可不要)
  168.         while(1)
  169.         {
  170. ……………………

  171. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
51 超聲波.rar (72.98 KB, 下載次數: 274)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:140358 發表于 2017-6-5 15:58 | 顯示全部樓層
解析得挺好的,下載來學習了再來評論
回復

使用道具 舉報

ID:307925 發表于 2018-4-19 10:20 | 顯示全部樓層
這里12864引腳不用定義?
回復

使用道具 舉報

ID:400007 發表于 2018-10-8 20:09 | 顯示全部樓層
看看~
回復

使用道具 舉報

ID:395866 發表于 2019-4-27 20:25 | 顯示全部樓層
引腳定義能說明下嗎
回復

使用道具 舉報

ID:375715 發表于 2019-4-28 11:54 來自手機 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:1010439 發表于 2022-3-14 22:07 | 顯示全部樓層
不錯啊,挺好的東西
回復

使用道具 舉報

ID:1010443 發表于 2022-3-14 22:13 來自手機 | 顯示全部樓層
yjs 發表于 2017-6-5 15:58
解析得挺好的,下載來學習了再來評論

厲害啊,我都看不懂
回復

使用道具 舉報

ID:1010443 發表于 2022-3-16 23:25 來自手機 | 顯示全部樓層
已優化好,效果滿意
回復

使用道具 舉報

ID:1063683 發表于 2023-2-22 09:05 | 顯示全部樓層
對于一個初學者來說,簡直是學習模板
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区四区在线观看 | 91啪影院 | 日韩一区二区免费视频 | 日韩一区二区在线观看视频 | 一级毛片网 | 欧美 日韩 国产 在线 | 国产福利资源在线 | 国产午夜精品久久 | 国产视频久久久 | h视频免费在线观看 | 久久久精| 精品一区二区三区在线播放 | 日日操夜夜操视频 | 午夜精 | 国产日韩欧美在线观看 | 亚洲h在线观看 | 欧美日韩国产一区二区三区 | 国产午夜视频 | 韩日一区二区三区 | 91精品国产综合久久婷婷香蕉 | 亚洲成人av在线播放 | 成人夜晚看av | 最新国产精品精品视频 | 中文字幕亚洲一区二区三区 | 亚洲一区二区在线免费观看 | 成人免费精品 | 中文字幕国产精品 | 涩涩视频网站在线观看 | 中文字幕在线二区 | aaa天堂| 国产精品永久久久久 | 天天干夜夜 | 久久久久久国产免费视网址 | 欧美综合在线视频 | 国产美女福利在线观看 | 欧美一区二区三区在线 | 天天天操 | 一区二区三区四区av | 亚洲精品视频导航 | 中文字幕高清免费日韩视频在线 | 亚洲精品中文字幕 |