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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機超聲波測距語音播報系統程序

[復制鏈接]
跳轉到指定樓層
樓主


單片機源程序如下:
  1. #include <STC89C51.h>
  2.         #include   <intrins.h>
  3. #include <stdio.h>
  4.         #include"dht11.h"
  5. //引腳定義
  6.     sbit     RX    =  P1 ^ 1;
  7.     sbit     TX    =  P1 ^ 2;
  8.     sbit     CS    =  P0 ^ 7;        //片選 高電平有效 單片LCD使用時可固定高電平
  9.     sbit     SID   =  P0 ^ 6;        //數據
  10.     sbit     SCLK  =  P0 ^ 5;        //時鐘
  11.           sbit     PSB   =  P0 ^ 4;        //PSB
  12.                 sbit     FMQ   =  P0 ^ 3;//蜂鳴器
  13. //12864
  14. void Write_char(bit start, unsigned char ddata);
  15. void Send_byte(unsigned char bbyte);
  16. void Delaynms(unsigned int di);
  17. void Lcd_init(void);
  18. void lnit(unsigned int Init_Uart);
  19. void Disp_img(unsigned char *img);
  20. void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);
  21. void LCD_set_xy( unsigned char x, unsigned char y );
  22. unsigned char code num[]={"0123456789 :.-"};
  23. unsigned char code waves[]={"倒車雷達系統"};
  24. unsigned char code znwk[] ={"距離:"};
  25. unsigned char code CM[] =  {"M"};
  26. unsigned char code shidu[] = {"Tem:"};
  27. unsigned char code wendu[] =  {"Hum:"};
  28. unsigned char code baifenbi[] =  {"%"};
  29. unsigned char const sheshidu[]="℃";

  30. unsigned int  time=0;
  31.          long S=0;
  32.          bit  flag =0;
  33. unsigned char disbuff[5]           ={ 0,0,0,0,0,};
  34. /******************************************************************************/
  35. void Lcd_init(void)        //初始化LCD
  36. {
  37.         PSB = 0;
  38.         Delaynms(10); //啟動等待,等LCM講入工作狀態
  39.           CS=1;
  40.           Write_char(0,0x30);  //8 位介面,基本指令集
  41.           Write_char(0,0x0c);  //顯示打開,光標關,反白關
  42.           Write_char(0,0x01);  //清屏,將DDRAM的地址計數器歸零  
  43. }

  44. /******************************************************************************/
  45. void Write_char(bit start, unsigned char ddata) //寫指令或數據
  46. {
  47.         unsigned char start_data,Hdata,Ldata;
  48.           if(start==0)
  49.                 start_data=0xf8;         //寫指令
  50.     else   
  51.             start_data=0xfa;  //寫數據

  52.           Hdata=ddata&0xf0;                  //取高四位
  53.           Ldata=(ddata<<4)&0xf0;  //取低四位
  54.           Send_byte(start_data);          //發送起始信號
  55.           Delaynms(5); //延時是必須的
  56.           Send_byte(Hdata);              //發送高四位
  57.           Delaynms(1);  //延時是必須的
  58.           Send_byte(Ldata);                  //發送低四位
  59.           Delaynms(1);  //延時是必須的
  60. }

  61. /******************************************************************************/
  62. void Send_byte(unsigned char bbyte) //發送一個字節
  63. {
  64.         unsigned char i;
  65.          for(i=0;i<8;i++)
  66.            {
  67.                    SID=bbyte&0x80; //取出最高位
  68.                  SCLK=1;
  69.                    SCLK=0;
  70.                    bbyte<<=1; //左移
  71.            }  
  72. }

  73. /******************************************************************************/
  74. void Delaynms(unsigned int di) //延時
  75. {
  76.         unsigned int da,db;
  77.          for(da=0;da<di;da++)
  78.                    for(db=0;db<10;db++);
  79. }
  80. void delayms(unsigned int ms)
  81. {
  82.         unsigned char i=100,j;
  83.         for(;ms;ms--)
  84.         {
  85.                 while(--i)
  86.                 {
  87.                         j=10;
  88.                         while(--j);
  89.                 }
  90.         }
  91. }
  92. /******************************************************************************/
  93. void Disp_img(unsigned char  *img)        //圖形方式12864顯示字模221 橫向取膜
  94. {
  95.         unsigned char i,j;
  96.         unsigned int k = 0;

  97.         Write_char(0,0x36); //圖形方式
  98.         for(i=0;i<32;i++)
  99.           {
  100.                 Write_char(0,0x80+i);
  101.                 Write_char(0,0x80);
  102.             for(j=0;j<16;j++)
  103.                 {
  104.                         Write_char(1,img[k++]);
  105.                 }
  106.           }

  107.          for(i=0;i<32;i++)
  108.           {
  109.                 Write_char(0,0x80+i);
  110.                 Write_char(0,0x88);
  111.             for(j=0;j<16;j++)
  112.                 {
  113.                         Write_char(1,img[k++]);
  114.                   }
  115.         }
  116. }
  117.         
  118. /******************************************************************************/
  119. void Clr_Scr(void)//清屏函數
  120. {
  121.         Write_char(0,0x01);
  122. }

  123. /******************************************************************************/
  124. void LCD_set_xy( unsigned char x, unsigned char y )
  125. {        //設置LCD顯示的起始位置,X為行,Y為列
  126.     unsigned char address;
  127.         switch(x)
  128.         {
  129.                 case 0: address = 0x80 + y; break;   
  130.             case 1: address = 0x80 + y; break;
  131.                 case 2: address = 0x90 + y; break;
  132.                     case 3: address = 0x88 + y; break;
  133.                 case 4: address = 0x98 + y; break;
  134.                 default:address = 0x80 + y; break;
  135.         }
  136.     Write_char(0, address);
  137. }

  138. /******************************************************************************/
  139. void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
  140. {        //        中英文字符串顯示函數
  141.         LCD_set_xy( X, Y );

  142.     while (*s)
  143.     {
  144.                 Write_char( 1, *s );
  145.             s ++;
  146.                 Delaynms(1);
  147.         }
  148. }

  149. /******************************************************************************/
  150. void LCD_Write_number(unsigned char s)//        數字顯示函數
  151. {        
  152.         Write_char(1,num[s]);
  153.         Delaynms(1);
  154. }
  155. /******************************************************************************/
  156. void Lcd_Mark2(void)
  157. {
  158.         Clr_Scr();//清屏
  159.         LCD_Write_string(2,0,znwk);//
  160.         LCD_Write_string(1,0,waves);//        
  161.         LCD_Write_string(2,7,CM);//        
  162.         LCD_Write_string(3,0,shidu);//
  163.         LCD_Write_string(4,0,wendu);//
  164.         LCD_Write_string(3,7,sheshidu);//        
  165.         LCD_Write_string(4,7,baifenbi);//
  166. }

  167. /********************************************************/
  168.     void Conut(void)
  169.         {
  170.            time=TH0*256+TL0;
  171.            TH0=0;
  172.            TL0=0;
  173.            S=time*1.87/100;       //算出來是CM          11。0592M晶振
  174.            if(flag==1)                      //超出測量
  175.           {
  176.            flag=0;
  177.            LCD_set_xy( 2, 4 );
  178.            LCD_Write_number(13);
  179.            LCD_Write_number(12);
  180.            LCD_set_xy( 2, 5 );
  181.            LCD_Write_number(13);
  182.            LCD_Write_number(13);
  183.            }
  184.          else
  185.           {        
  186.            disbuff[1]=S%1000/100;
  187.            disbuff[2]=S%1000%100/10;
  188.            disbuff[3]=S%1000%10%10;
  189.                  //disbuff[4]=S%1000%10%10;
  190.            LCD_set_xy( 2, 4 );
  191.            LCD_Write_number(disbuff[1]);
  192.            LCD_Write_number(12);
  193.            LCD_set_xy( 2, 5 );
  194.            LCD_Write_number(disbuff[2]);
  195.            LCD_Write_number(disbuff[3]);
  196.                 // LCD_Write_number(disbuff[4]);
  197.          
  198.                 }
  199.         }

  200. void InitUART(void)//使用定時器1作為串口波特率發生器
  201. {   

  202.     TH1 = 0xFD;         //晶振11.0592mhz 波特率設為9600
  203.     TL1 = TH1;
  204.     TMOD|= 0x20;         //定時器1方式2
  205.     SCON = 0x50;         //串口接收使能
  206.     ES = 1;                         //串口中斷使能
  207.     TR1 = 1;                 //定時器1使能
  208.     TI = 1;                         //發送中斷標記位,必須設置
  209.            EA = 1;
  210. }

  211. void YYBB(void)   //語音播報函數
  212. {
  213.         if(S<10)
  214.         { printf("停車\n");//串口打印結果
  215.           delayms(50);               
  216.         }
  217. else
  218. {   //printf("<V>2");
  219.                 printf("%.2f米\n",(float)S/100);
  220.           delayms(50);
  221. }
  222. }

  223.         
  224.         
  225. /********************************************************/

  226. /********************************************************/
  227.      void zd0() interrupt 1                  //T0中斷用來計數器溢出,超過測距范圍
  228.   {
  229.     flag=1;                                                         //中斷溢出標志
  230.   }
  231. /********************************************************/
  232.    void  StartModule()                          //T1中斷用來掃描數碼管和計800MS啟動模塊
  233.   {
  234.           TX=1;                                         //800MS  啟動一次模塊
  235.           _nop_();
  236.           _nop_();
  237.           _nop_();
  238.           _nop_();
  239.           _nop_();
  240.           _nop_();
  241.           _nop_();
  242.           _nop_();
  243.           _nop_();
  244.           _nop_();
  245.           _nop_();
  246.           _nop_();
  247.           _nop_();
  248.           _nop_();
  249.           _nop_();
  250.           _nop_();
  251.           _nop_();
  252.           _nop_();
  253.           _nop_();
  254.           _nop_();
  255.           _nop_();
  256.           TX=0;
  257.   }



  258. /********************************************************/
  259. void main(void)
  260. {
  261.         
  262.         
  263.   TMOD=0x01;                   //設T0為方式1,GATE=1
  264.         TH0=0;
  265.         TL0=0;
  266.         TR0=1;         
  267.         Lcd_init();       //設置液晶顯示器
  268.         Clr_Scr();        //清屏        
  269.         //Disp_img(logo);          //顯示歡迎使用本產品LOGO
  270.         //Disp_img(1);        
  271.         //Delaynms(10000);
  272.         //Lcd_init();       //從圖形顯示狀態下返回
  273.   Lcd_Mark2();
  274.         InitUART();        //初始化串口   串口打印
  275.         while(1)
  276.         {
  277.                
  278.                
  279. //   Rec_DHT();
  280. //                Conut1();
  281. //                Conut2();                          
  282.          StartModule();        //計算                        
  283.          while(!RX);                //當RX為零時等待
  284.          TR0=1;                            //開啟計數
  285.          while(RX);                        //當RX為1計數并等待
  286.          TR0=0;                                //關閉計數
  287.          Conut();
  288.    delayms(100);                //80MS
  289.                 YYBB();

  290.         }

  291. }              
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2019-4-15 22:10 | 只看該作者
本帖需要重新編輯補全頭文件 電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

板凳
ID:615726 發表于 2020-3-17 18:49 來自觸屏版 | 只看該作者
這個是用什么語音芯片播報的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 好婷婷网 | 久久成人18免费网站 | 中文字幕欧美日韩 | 日韩欧美中文字幕在线观看 | 亚洲一区二区在线电影 | 欧美亚洲国产一区 | 国产91av视频| 精品自拍视频在线观看 | 亚洲国产精品久久久久秋霞不卡 | 毛片网站免费观看 | 免费国产一区二区 | 男人天堂999 | 在线免费看91 | 精品粉嫩aⅴ一区二区三区四区 | 亚洲在线免费观看 | 国产视频在线观看一区二区三区 | 九九亚洲| 欧美日韩一区二区在线播放 | 蜜桃五月天 | 日韩精品无码一区二区三区 | www.日本国产 | 国产一区不卡 | 精品国产99| 人人艹人人爽 | 亚洲一区二区在线电影 | 色偷偷人人澡人人爽人人模 | 欧美激情在线精品一区二区三区 | 91精品国产一区二区三区蜜臀 | 五月婷婷视频 | 日日干天天操 | av高清毛片| 成人亚洲精品 | 91.xxx.高清在线| 国产精品亚洲综合 | 久久久精| 成人永久免费视频 | 欧美一区免费 | 亚洲一区国产 | 麻豆国产一区二区三区四区 | 亚洲福利在线观看 | 亚洲精品久久久久久国产精华液 |