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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的US-100(超聲波模塊)1602顯示程序

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:289073 發(fā)表于 2018-3-8 10:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define nops {_nop_();_nop_();_nop_();_nop_();}
  4. /******************************引腳及變量的定義****************************/
  5. sbit RS = P2^0;  //寄存器選擇位
  6. sbit RW = P2^1;  //讀取選擇位
  7. sbit E = P2^2;   //使能信號位
  8. sbit BF = P0^7;  //忙碌信號位
  9. unsigned char code Tab[] = {"0123456789"};
  10. unsigned char code string[] = {"range:2cm--4.5m"};
  11. char part,ge,shi,bai;
  12. char idata GLengthLoh[2];    //接收緩沖區(qū)
  13. bit success_flag;      //定義測試成功標志位
  14. /*********************************************************/
  15. /*********函數(shù)名稱:delay1ms(void)      ******************/
  16. /*********函數(shù)功能:延時1毫秒           ******************/
  17. /*********函數(shù)參數(shù):void                ******************/
  18. /*********************************************************/
  19. void delay1ms(void)   //誤差 -0.651041666667us
  20. {
  21.     char a,b;
  22.     for(b=102;b>0;b--)
  23.         for(a=3;a>0;a--);
  24. }         
  25. /*********************************************************/
  26. /*********函數(shù)名稱:delaynms(char n)    ******************/
  27. /*********函數(shù)功能:延時n個1毫秒        ******************/
  28. /*********函數(shù)參數(shù):n                   ******************/
  29. /*********************************************************/
  30. void delaynms(char n)
  31. {
  32.     char a;
  33.         for(a = 0;a > n;a--)
  34.             delay1ms();
  35. }
  36. /*********************************************************/
  37. /*********函數(shù)名稱:BusyTest(void)      ******************/
  38. /*********函數(shù)功能:判斷液晶模塊忙碌狀態(tài)******************/
  39. /*********函數(shù)參數(shù):返回值:result  ******************/
  40. /*********************************************************/
  41. unsigned char BusyTest()
  42. {
  43.     bit result;         
  44.         RS = 0;                  
  45.         RW = 1;                  //RS為低電平,RW為高電平時,可以讀狀態(tài)
  46.         E = 1;                  //使能為高電平時可讀取信息
  47.         nops;                  //延時40us,給硬件反應時間
  48.         result = BF;     //將忙碌標志位電平賦給result
  49.         E = 0;                  //使能1到0:執(zhí)行指令
  50.         return result;
  51. }
  52. /*********************************************************/
  53. /*********函數(shù)名稱:WriteInstruction(char dictate)*******/
  54. /*********函數(shù)功能:將模式設置指令或顯示地址寫入液晶模塊**/
  55. /*********函數(shù)參數(shù):dictate             ******************/
  56. /*********************************************************/
  57. void WriteInstruction(char dictate)
  58. {
  59.     while(BusyTest() == 1);         //如果忙碌標志位忙碌則等待
  60.         RS = 0;
  61.         RW = 0;                                 //RS/RW位同時為低電平時可寫入指令
  62.         E = 0;                                 //使能0到1:寫入指令
  63.         nops;
  64.         P0 = dictate;                    //將數(shù)據(jù)送入P0口,寫入數(shù)據(jù)或地址
  65.         nops;
  66.         E = 1;                                 //使能0到1:寫入指令
  67.         nops;
  68.         E = 0;                                 //使能1到0:執(zhí)行指令
  69. }
  70. /*********************************************************/
  71. /*********函數(shù)名稱:WriteAddress(char x)          *******/
  72. /*********函數(shù)功能:指定字符顯示的實際地址     ***********/
  73. /*********函數(shù)參數(shù):x                   ******************/
  74. /*********************************************************/
  75. void WriteAddress(char x)
  76. {
  77.     WriteInstruction(x|0x80);        //80H+地址碼
  78. }
  79. /*********************************************************/
  80. /*********函數(shù)名稱:WriteData(char y)             *******/
  81. /*********函數(shù)功能:將數(shù)據(jù)(字符的標準ASCII碼)寫入液晶模塊*/
  82. /*********函數(shù)參數(shù):y                   ******************/
  83. /*********************************************************/
  84. void WriteData(char y)
  85. {
  86.     while(BusyTest() == 1);          //如果忙碌標志位忙碌則等待
  87.         RS = 1;
  88.         RW = 0;                                  //RS為高電平,RW為低電平時,可以寫入數(shù)據(jù)
  89.         E = 0;
  90.         P0 = y;
  91.         nops;
  92.         E = 1;
  93.         nops;
  94.         E = 0;
  95. }
  96. /*********************************************************/
  97. /*********函數(shù)名稱:LCDInit(void)                  *******/
  98. /*********函數(shù)功能:液晶模塊初始化        ****************/
  99. /*********函數(shù)參數(shù):void                ******************/
  100. /*********************************************************/
  101. void LCDInit(void)
  102. {
  103.     delaynms(15);    //延時15毫秒,首次寫入液晶指令應給反應時間
  104.         WriteInstruction(0x38);        //顯示模式設置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口
  105.         delaynms(5);        //延時5秒,反應時間
  106.     WriteInstruction(0x38);
  107.         delaynms(5);        //延時5秒,反應時間
  108.         WriteInstruction(0x38);
  109.         delaynms(5);        //連續(xù)三次,確保初始化成功
  110.         WriteInstruction(0x0c);   //顯示模式設置:顯示開,無光標,光標不閃爍
  111.         delaynms(5);
  112.         WriteInstruction(0x06);        //顯示模式設置:顯示光標右移,屏幕不移動
  113.         delaynms(5);
  114.         WriteInstruction(0x01);   //清屏
  115.         delaynms(5);
  116. }
  117. /*********************************************************/
  118. /*********函數(shù)名稱:UART_Send(char dat)            *******/
  119. /*********函數(shù)功能:串口發(fā)送函數(shù)          ****************/
  120. /*********函數(shù)參數(shù):dat                 ******************/
  121. /*********************************************************/
  122. void UART_Send(char dat)
  123. {
  124.     TI = 0;            // 清發(fā)送標志
  125.     SBUF = dat;        //如果TI為0等待
  126.     while (!TI);        //等待發(fā)送數(shù)據(jù)
  127. }
  128. /*********************************************************/
  129. /*********函數(shù)名稱:UART_Init()            ***************/
  130. /*********函數(shù)功能:串口初始化函數(shù)        ****************/
  131. /*********函數(shù)參數(shù):無                  ******************/
  132. /*********************************************************/
  133. void UART_Init()
  134. {   
  135.     TH1 = 0xFD;
  136.     TL1 = 0xFD;
  137.     TMOD = 0x21;            //設置定時器1為模式2;定時器0為模式1      
  138.     TH0 =(65536-2500)/256;  //約2.50MS定時器初值
  139.     TL0 =(65536-2500)%256;  //約2.50MS定時器初值
  140.     ET0 = 1;
  141.     TR0 = 1;                //啟動定時器
  142.     TR1 = 1;                //啟動定時器           SM0  SM1
  143.     SM0 = 0;                //串口通信模式設置     0      0 = 0
  144.     SM1 = 1;                                //     0      1 = 1
  145.                                             //     1      0 = 2
  146.                                             //     1      1 = 3
  147.     REN = 1;       //串口允許接收數(shù)據(jù)
  148.     ES = 1;        //開串中斷
  149.     EA = 1;
  150. }
  151. /*********************************************************/
  152. /*********函數(shù)名稱:UART_ISR(void)         ***************/
  153. /*********函數(shù)功能:串口中斷函數(shù)          ****************/
  154. /*********函數(shù)參數(shù):void                ******************/
  155. /*********************************************************/
  156. void UART_ISR(void) interrupt 4
  157. {
  158.     char temp,k;
  159.     ES = 0;             //關中斷            
  160.     if(RI)
  161.     {
  162.         RI = 0;         //清接收標志
  163.         temp = SBUF;
  164.         GLengthLoh[k] = temp;
  165.         k++;
  166.         if(k == 2) //k=數(shù)據(jù)長度
  167.         k = 0;
  168.     }   
  169.     ES = 1;      //開中斷
  170. }
  171. /*********************************************************/
  172. /*********函數(shù)名稱:timer0()               ***************/
  173. /*********函數(shù)功能:定時器函數(shù)            ****************/
  174. /*********函數(shù)參數(shù):void                ******************/
  175. /*********************************************************/
  176. timer0() interrupt 1         // 定時器0中斷是1號
  177. {
  178.     TH0 =(65536-2500)/256; //約2.50MS定時器初值
  179.     TL0 =(65536-2500)%256; //約2.50MS定時器初值    TH0 = 0xef;    TL0 = 0x94;    //寫入定時器0初始值
  180. }
  181. /*********************************************************/
  182. /*********函數(shù)名稱:conversion(int8 temp_data)     *******/
  183. /*********函數(shù)功能:數(shù)據(jù)轉(zhuǎn)換              ****************/
  184. /*********函數(shù)參數(shù):temp_data           ******************/
  185. /*********************************************************/
  186. void conversion(int temp_data)
  187. {
  188.     char part_data,ge_data,shi_data,bai_data;
  189.         bai_data = temp_data / 1000;
  190.         shi_data = (temp_data % 1000) / 100;
  191.         ge_data = (temp_data % 100) / 10;
  192.         part_data = temp_data % 10;
  193.         EA = 0;
  194.         bai = bai_data;
  195.         shi = shi_data;
  196.         ge = ge_data;
  197.         part = part_data;
  198.         EA = 1;
  199. }
  200. /*********************************************************/
  201. /*********函數(shù)名稱:main(void)                      *******/
  202. /*********函數(shù)功能:主函數(shù)                ****************/
  203. /*********函數(shù)參數(shù):void                 ******************/
  204. /*********************************************************/
  205. void main(void)
  206. {
  207.     int k;
  208.         long PreLength;                                          
  209.         LCDInit();                                           //調(diào)用液晶初始化函數(shù)
  210.         delaynms(10);
  211.     UART_Init();
  212.         PreLength = 0;
  213.         k = 0;
  214.         while(1)
  215.         {
  216.              WriteAddress(0x01);
  217.                  while(string[k] != '\0')
  218.                  {
  219.                       WriteData(string[k]);
  220.                           k++;
  221.                  }
  222.              UART_Send(0X55);
  223.                  PreLength = GLengthLoh[0] * 256 + GLengthLoh[1] - 5;
  224.          conversion(PreLength);
  225.              WriteAddress(0x41);           //從第2行第6列開始顯示
  226.                  WriteData('J');                   //將特定的字符常量寫入LCD
  227.                  WriteData('U');
  228.                  WriteData('L');
  229.                  WriteData('I');
  230.                  WriteData(':');
  231.                  if(PreLength <= 4500 && PreLength >= 20)
  232.                  {
  233.                      WriteData(Tab[bai]);           //將百位數(shù)字的字符常量寫入LCD
  234.                      WriteData(Tab[shi]);           //將十位數(shù)字的字符常量寫入LCD
  235.                      WriteData(Tab[ge]);           //將個位數(shù)字的字符常量寫入LCD
  236.                             WriteData('.');
  237.                           WriteData(Tab[part]);
  238.                  }
  239.                  else
  240.                  {
  241.                      WriteData('-');         
  242.                      WriteData('-');
  243.                      WriteData('-');         
  244.                             WriteData('-');
  245.                           WriteData('-');
  246.                  }
  247.                  WriteData(' ');
  248.                  WriteData('c');
  249.                  WriteData('m');
  250.                  
  251.         }
  252. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:313173 發(fā)表于 2018-7-10 20:38 | 只看該作者
為什么·12到25厘米之間無顯示?
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

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