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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2364|回復(fù): 2
收起左側(cè)

單片機(jī)超聲波測(cè)距導(dǎo)盲系統(tǒng)程序與Proteus仿真原理圖設(shè)計(jì)與制作

[復(fù)制鏈接]
ID:1023728 發(fā)表于 2022-5-4 13:32 | 顯示全部樓層 |閱讀模式
超聲波測(cè)距導(dǎo)盲系統(tǒng)帶原文仿真程序以及詳細(xì)的介紹
由于超聲波、語(yǔ)音無(wú)法仿真,只能仿真按鍵操作、液晶顯示、光控?zé)艄δ堋?br /> 仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif

盲人由于先天或后天的生理缺陷喪失了視覺(jué)功能,因而在日常生活和安全行走方面受到了很大的制約。所以,為了協(xié)助盲人安全行進(jìn),提高他們的生活能力與人身安全,世界各國(guó)一直在進(jìn)行著電子導(dǎo)盲系統(tǒng)的研制。在此背景下,本文設(shè)計(jì)了一種基于超聲波測(cè)距的導(dǎo)盲系統(tǒng)。大體上可分為兩部分進(jìn)行設(shè)計(jì):測(cè)距系統(tǒng)與電源管理系統(tǒng)。
    測(cè)距系統(tǒng)通過(guò)超聲波的發(fā)送和接收來(lái)檢測(cè)盲人周?chē)鱾(gè)方向上一段距離內(nèi)的障礙物信息,并將其轉(zhuǎn)化為聲音信號(hào),使盲人從中獲知其周?chē)那闆r。本文是在基于STC89C52單片機(jī)控制的超聲波測(cè)距原理的基礎(chǔ)上,來(lái)確定目標(biāo)范圍內(nèi)障礙物的存在,同時(shí)利用光敏電阻檢測(cè)和處理電路對(duì)環(huán)境光線(xiàn)強(qiáng)度的采集,通過(guò)聲音和蜂鳴器進(jìn)行報(bào)警提示,系統(tǒng)的信息通過(guò)LCD1602進(jìn)行顯示。在軟件設(shè)計(jì)中主要包括:串行口初始化函數(shù)、超聲波發(fā)射函數(shù)、寫(xiě)字符函數(shù)、LCD1602顯示函數(shù)、光照A/D處理函數(shù)和時(shí)鐘函數(shù)。
電子導(dǎo)盲儀作為一種便攜式電子設(shè)備,電源的地位在其研究中占有十分重要的位置。電源管理系統(tǒng)會(huì)對(duì)電源電壓進(jìn)行實(shí)時(shí)監(jiān)控,為系統(tǒng)提供穩(wěn)定的電源以及根據(jù)電量的狀態(tài)作出相應(yīng)的反應(yīng),這是導(dǎo)盲儀整個(gè)系統(tǒng)穩(wěn)定可靠的重要一環(huán)。

制作出來(lái)的實(shí)物圖如下:
13.jpg 12.jpg

Altium Designer畫(huà)的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
原理圖.jpg PCB.jpg

單片機(jī)源程序如下:
  1. /***********************************************************************************************************/            
  2. #include <AT89x51.H>                                                        //器件配置文件
  3. #include <intrins.h>
  4. #define uchar unsigned char                           //宏定義
  5. #define uint unsigned int                           //宏定義
  6. sbit   RX   =P2^2;                                                                //接收端口
  7. sbit   TX   =P2^1;                                                                //發(fā)送端口
  8. sbit   BEEP =P2^0;                                                                //蜂鳴器端口
  9. sbit   LED  =P3^5;                                                                //LED指示燈端口
  10. sbit   LIGHT=P3^6;                                                                //光敏電阻端口
  11. sbit   KEY_DIS  =P1^3;                                                           //播放距離語(yǔ)音
  12. sbit   KEY_TIME =P1^4;                                                           //播放時(shí)間語(yǔ)音
  13. sbit   BUSY =P3^1;                                                                   //語(yǔ)音芯片
  14. sbit   DATA =P3^2;                                                                   //語(yǔ)音芯片
  15. sbit   RST  =P3^3;                                                                   //語(yǔ)音芯片
  16. unsigned int  time=0;                                                        //定義發(fā)送到接收的時(shí)間
  17. unsigned int  timer=0;                                                        //定義超聲波掃描周期
  18. unsigned int  count=0;                                                        //中斷次數(shù),閃爍用
  19. unsigned long S=0;                                                                //定義距離為0
  20. bit      flag =0;                                                                //超出距離標(biāo)志位
  21. bit      Di_flag;
  22. bit      Beep_flag;
  23. bit          voice_flg;                                                                //語(yǔ)音播報(bào)標(biāo)志位
  24. unsigned int counter;

  25. uchar time_data[7];
  26. uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};       //數(shù)據(jù)的地址
  27. uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};

  28. uchar code table1[]="Dis: |2000/00/00";
  29. uchar code table2[]="000cm|00:00:00 0";
  30. uchar code table3[]="                ";                         //清屏內(nèi)容
  31. uchar code table4[]="  Set Real Time ";
  32. uchar code table9[]="Date: 2000/00/00";
  33. uchar code table0[]="Time: 00:00:00 0";

  34. bit Adjust;                          //調(diào)節(jié)標(biāo)志位,=1表示進(jìn)入調(diào)節(jié)模式,=0是正常模式
  35. sbit rs=P1^0;                  //LCD1602
  36. sbit rw=P1^1;                   //LCD1602
  37. sbit e=P1^2;                  //LCD1602
  38. sbit sck=P2^5;                  //時(shí)鐘端口
  39. sbit io=P2^6;                  //時(shí)鐘端口
  40. sbit rst=P2^7;                  //時(shí)鐘端口
  41. sbit SELT =P1^5;          //選擇鍵
  42. sbit ENTER=P1^6;          //確認(rèn)鍵
  43. sbit UP   =P1^7;          //加鍵
  44. sbit DOWN =P3^0;          //減鍵

  45. uchar Select_num;          //選擇按鍵按下次數(shù)
  46. uchar Enter_num;          //確認(rèn)按鍵按下次數(shù)
  47. char Year,Month,Day,Hour,Minute,Second,Week;                //時(shí)間設(shè)置值
  48. void read_rtc();
  49. /****************************************LCD1602顯示*****************************************************************************/
  50. void delay1(uint z)                          //延時(shí)函數(shù)
  51. {
  52.         uint x,y;
  53.         for(x=z;x>0;x--)
  54.                 for(y=10;y>0;y--);
  55. }

  56. void write_com(uchar com)                         //寫(xiě)指令函數(shù)
  57. {
  58.         rw=0;
  59.         delay1(5);
  60.         rs=0;
  61.         delay1(5);
  62.         e=1;
  63.         delay1(5);
  64.         P0=com;
  65.         delay1(5);
  66.         e=0;
  67.         delay1(5);        
  68. }

  69. void write_date(uchar date)                        //寫(xiě)數(shù)據(jù)函數(shù)
  70. {                                                                        
  71.         rw=0;
  72.         delay1(5);
  73.         rs=1;
  74.         delay1(5);
  75.         e=1;
  76.         delay1(5);
  77.         P0=date;
  78.         delay1(5);
  79.         e=0;
  80.         delay1(5);        
  81. }

  82. void init()                                                    //初始化函數(shù)
  83. {        
  84.         uchar num;
  85.         Year=16;
  86.         Month=1;
  87.         Day=1;
  88.         Hour=15;
  89.         Minute=30;
  90.         Second=50;
  91.         Week=6;
  92.         e=0;                                                    // 時(shí)序表e初始為0
  93.         write_com(0x38);                        //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  94.         write_com(0x0c);                                //設(shè)置光標(biāo)
  95.         write_com(0x06);                                //光標(biāo)自動(dòng)加1,光標(biāo)輸入方式
  96.         write_com(0x01);                                //清屏
  97.         write_com(0x80);                                //設(shè)置初始顯示位置
  98.         for(num=0;num<16;num++)
  99.         {
  100.                 write_date(table1[num]);
  101.                 delay1(5);
  102.         }
  103.         write_com(0x80+0x40);
  104.         for(num=0;num<16;num++)
  105.         {
  106.                 write_date(table2[num]);
  107.                 delay1(5);
  108.         }                                          
  109. }

  110. void SetTime_dispaly(uchar add,uchar dat)         //第一個(gè):參數(shù)的地址,第二個(gè):參數(shù)的內(nèi)容
  111. {
  112.         uchar shi,ge;
  113.         shi=dat/10;                                                        //把溫度的十位提取出來(lái)
  114.         ge=dat%10;                                                        //把溫度的個(gè)位提取出來(lái)
  115.         write_com(add);                                                    //要寫(xiě)的地址
  116.         write_date(0x30+shi);                                //十位的內(nèi)容   1602字符庫(kù)
  117.         write_date(0x30+ge);                                //個(gè)位的內(nèi)容   1602字符庫(kù)
  118. }
  119. void Week_dispaly(uchar add,uchar dat)        //第一個(gè):參數(shù)的地址,第二個(gè):參數(shù)的內(nèi)容
  120. {
  121.         write_com(add);                                                //要寫(xiě)的地址
  122.         write_date(0x30+dat);                                //十位的內(nèi)容   1602字符庫(kù)
  123. }

  124. void Date_dispaly(uchar add,uchar dat)         //第一個(gè):參數(shù)的地址,第二個(gè):參數(shù)的內(nèi)容
  125. {
  126.         uchar shi,ge;
  127.         shi=dat/16;                                                        //把十位提取出來(lái)
  128.         ge=dat%16;                                                        //把個(gè)位提取出來(lái)
  129.         write_com(add+3);                                            //要寫(xiě)的地址
  130.         write_date(0x30+shi);                                //十位的內(nèi)容   1602字符庫(kù)
  131.         write_date(0x30+ge);                                //個(gè)位的內(nèi)容   1602字符庫(kù)                                   
  132. }

  133. void LCD_Display_String(unsigned char line,unsigned char *string)
  134. {                                                                                 //液晶屏顯示內(nèi)容,把要顯示的內(nèi)容寫(xiě)到對(duì)應(yīng)的位置
  135.         unsigned char i;
  136.         unsigned char address=0;
  137.         if(line==1)
  138.         {
  139.                 address=0x80;                                         //0X80是第1行的第1個(gè)位置  ,0x81第2位
  140.         }
  141.         else if(line==2)
  142.         {
  143.                 address=0x80+0x40;                          //0X80+0x40是第2行的第1個(gè)位置  ,0X80+0x40+1是第2行第2位
  144.         }
  145.         
  146.         for(i=0;i<16;i++)
  147.         {
  148.                 write_com(address);
  149.                 write_date(string[i]);
  150.                 address++;
  151.         }
  152. }
  153. void Display(uchar add,uint dat)        //顯示避障距離
  154. {
  155.         uchar bai,shi,ge;
  156.         bai=dat%1000/100;                                        //取出百位
  157.         shi=dat%1000%100/10;                                //取出十位
  158.         ge=dat%1000%10%10;                                        //取出個(gè)位
  159.         write_com(0x80+add);
  160.         write_date(0x30+bai);
  161.         write_date(0x30+shi);
  162.         write_date(0x30+ge);
  163. }

  164. void Display_ASIIC(uchar add)                   //顯示符號(hào)
  165. {
  166.         write_com(0x40+0x80+add);
  167.         write_date(0x2d);
  168.         write_date(0x2d);
  169.         write_date(0x2d);
  170. }
  171. void Time_Display(void)
  172. {
  173.         read_rtc();
  174.         Date_dispaly(0x80+0x40+9,time_data[6]);  //顯示秒
  175.         Date_dispaly(0x80+0x40+6,time_data[5]);         //顯示分
  176.         Date_dispaly(0x80+0x40+3,time_data[4]);         //顯示時(shí)
  177.         Date_dispaly(0x80+11,time_data[3]);                 //顯示日
  178.         Date_dispaly(0x80+8,time_data[2]);                 //顯示月
  179.         Week_dispaly(0x80+0x40+15,time_data[1]); //顯示周
  180.         Date_dispaly(0x80+5,time_data[0]);                 //顯示年
  181.                                            //        Year/10*16+Year%10
  182.         Year=time_data[0]/16*10+time_data[0]%16;
  183.         Week=time_data[1]/16*10+time_data[1]%16;
  184.         Month=time_data[2]/16*10+time_data[2]%16;
  185.         Day=time_data[3]/16*10+time_data[3]%16;
  186.         Hour=time_data[4]/16*10+time_data[4]%16;
  187.         Minute=time_data[5]/16*10+time_data[5]%16;
  188.         Second=time_data[6]/16*10+time_data[6]%16;
  189. }

  190. /*********************************時(shí)間************************************************/
  191. void write_ds1302_byte(uchar dat)
  192. {
  193.         uchar i;
  194.         for(i=0;i<8;i++)
  195.         {
  196.                 sck=0;
  197.                 io=dat&0x01;                                           //準(zhǔn)備數(shù)據(jù),從最低位開(kāi)始
  198.                 dat=dat>>1;
  199.                 sck=1;
  200.         }
  201. }

  202. void write_ds1302(uchar add,uchar dat)
  203. {
  204.         rst=0;
  205.         _nop_();                                                  //CPU原地踏步
  206.         sck=0;
  207.         _nop_();
  208.         rst=1;
  209.         _nop_();
  210.         write_ds1302_byte(add);                    //傳地址
  211.         write_ds1302_byte(dat);                    //傳數(shù)據(jù)
  212.         rst=0;                                                     //不受其他影響
  213.         _nop_();
  214.         io=1;                                                   //釋放
  215.         sck=1;
  216. }

  217. uchar read_ds1302(uchar add)
  218. {
  219.         uchar i,value;
  220.         rst=0;
  221.         _nop_();  //CPU原地踏步
  222.         sck=0;
  223.         _nop_();
  224.         rst=1;
  225.         _nop_();
  226.         write_ds1302_byte(add);
  227.         for(i=0;i<8;i++)
  228.         {
  229.                 value=value>>1;
  230.                 sck=0;
  231.                 if(io)
  232.                 value=value|0x80;
  233.                 sck=1;
  234.         }
  235.         rst=0;
  236.         _nop_();
  237.         sck=0;
  238.         _nop_();
  239.         sck=1;
  240.         io=1;
  241.         return value;
  242. }

  243. void set_rtc()                                  //設(shè)置時(shí)間
  244. {
  245.         uchar i,j;
  246.         for(i=0;i<7;i++)                         //轉(zhuǎn)換BCD碼
  247.         {
  248.                 j=time_data[i]/10;
  249.                 time_data[i]=time_data[i]%10;
  250.                 time_data[i]=time_data[i]+j*16;
  251.         }
  252.         write_ds1302(0x8e,0x00);          //去除寫(xiě)保護(hù)
  253.         for(i=0;i<7;i++)
  254.         {
  255.                 write_ds1302(write_add[i],time_data[i]);
  256.         }
  257.         write_ds1302(0x8e,0x80);      //加寫(xiě)保護(hù)
  258. }

  259. void read_rtc()
  260. {
  261.         uchar i;
  262.         for(i=0;i<7;i++)
  263.         {
  264.                 time_data[i]=read_ds1302(read_add[i]);        //最終讀出來(lái)的數(shù) 16進(jìn)制
  265.         }
  266. }

  267. /*************************************************按鍵****************************************************************/
  268. void Keyscan(void)
  269. {
  270.         if(SELT==0)
  271.         {
  272.                 delay1(2);
  273.                 if(SELT==0)
  274.                 {
  275.                         while(!SELT);
  276.                         Select_num++;                                        //選擇鍵按下一次
  277.                         Adjust=1;                                                //進(jìn)入調(diào)節(jié)模式
  278.                         BEEP=0;                                                        //關(guān)閉蜂鳴器再播報(bào)
  279.                         voice_flg=1;                                        //語(yǔ)音播報(bào)標(biāo)志位置一                        
  280.                 }
  281.                 if(Select_num==1)
  282.                 {
  283.                         LCD_Display_String(1,table4);
  284.                         LCD_Display_String(2,table3);
  285.                         write_com(0x80+0);                                //寫(xiě) >>
  286.                         write_date(0x3e);
  287.                         write_com(0x80+1);                                //寫(xiě) >>
  288.                         write_date(0x3e);
  289.                         Enter_num=0;
  290.                 }
  291.                 if(Select_num==2)
  292.                 {
  293.                         LCD_Display_String(1,table1);
  294.                         LCD_Display_String(2,table2);
  295.                         Select_num=0;
  296.                         Enter_num=0;                                       
  297.                         Adjust=0;
  298.                         voice_flg=0;                                        //語(yǔ)音播報(bào)標(biāo)志清除
  299.                 }
  300.                 write_com(0x0c);                                                                        //光標(biāo)不再閃爍
  301.                 Enter_num=0;
  302.         }
  303.         
  304.         if(ENTER==0)
  305.         {
  306.                 delay1(2);
  307.                 if(ENTER==0)
  308.                 {
  309.                         while(!ENTER);
  310.                         Enter_num++;
  311.                 }
  312.                 if(Select_num==1)                                        //設(shè)置實(shí)時(shí)時(shí)間
  313.                 {
  314.                         if(Enter_num==1)
  315.                         {
  316.                                 LCD_Display_String(1,table9);
  317.                                 LCD_Display_String(2,table0);
  318.                                 SetTime_dispaly(0x80+8,Year);
  319.                                 SetTime_dispaly(0x80+11,Month);
  320.                                 SetTime_dispaly(0x80+14,Day);
  321.                                 SetTime_dispaly(0x80+0x40+6,Hour);
  322.                                 SetTime_dispaly(0x80+0x40+9,Minute);
  323.                                 SetTime_dispaly(0x80+0x40+12,Second);
  324.                                 Week_dispaly(0x80+0x40+15,Week);
  325.                                 write_com(0x80+8);                        //光標(biāo)閃爍地址,停留在年的位置上                                       
  326.                                 write_com(0x0f);                        //光標(biāo)閃爍
  327.                         }
  328.                         if(Enter_num==2)
  329.                         {
  330.                                 write_com(0x80+11);                        //光標(biāo)閃爍地址,停留在月的位置上                                       
  331.                                 write_com(0x0f);                        //光標(biāo)閃爍
  332.                         }

  333. /********************************************************/
  334. void Conut(void)
  335. {
  336.         time=TH0*256+TL0;                                                        //計(jì)算時(shí)間,單位是us
  337.         TH0=0;                                                                                //時(shí)間清除
  338.         TL0=0;                                                                                //時(shí)間清除
  339.         S=(time*1.7)/100;                                                        //超聲波的速度按340m/s計(jì)算,由于路程往返,需要除以2,算出來(lái)是CM,
  340.         if((S>=700)||(flag==1))                                         //超出測(cè)量范圍或超時(shí)顯示"-"
  341.         {         
  342.                 flag=0;                                                                        //清除定時(shí)器T0中斷標(biāo)志位
  343.                 Display_ASIIC(0);
  344.                 Di_flag=1;                                                                //滴 語(yǔ)音
  345.                 Beep_flag=1;                                                        //蜂鳴器 標(biāo)志位
  346.                 count=0;
  347.                 BEEP=0;
  348.         }
  349.         else
  350.         {
  351.                 Display(0x40+0,S);                                                //顯示距離
  352.                 Di_flag=0;
  353.         }
  354. }
  355. void  StartModule()                          //啟動(dòng)模塊
  356. {
  357.         TX=1;                                         //啟動(dòng)一次模塊
  358.         _nop_();                                                  //啟動(dòng)模塊,發(fā)送超聲波
  359.         _nop_();                                                  //延時(shí)1us,至少需要發(fā)送10us
  360.         _nop_();
  361.         _nop_();
  362.         _nop_();
  363.         _nop_();
  364.         _nop_();
  365.         _nop_();
  366.         _nop_();
  367.         _nop_();
  368.         _nop_();
  369.         _nop_();
  370.         _nop_();
  371.         _nop_();
  372.         _nop_();
  373.         _nop_();
  374.         _nop_();
  375.         _nop_();
  376.         _nop_();
  377.         _nop_();
  378.         _nop_();  
  379.         TX=0;
  380. }
  381. /********************************************************/
  382. void zd0() interrupt 1                                   //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
  383. {
  384.         flag=1;                                                         //在TMOD=0x11定義下,定時(shí)器最多定時(shí)65535us,這段時(shí)間超聲波走過(guò)的距離為:65535*1.7/100=1114095cm
  385.                                                                          //顯然距離明顯超出范圍,因此,當(dāng)定時(shí)時(shí)間到仍未接收到超聲波,中斷溢出標(biāo)志置位,則讓其顯示"-"
  386.         count=0;
  387.         BEEP=0;
  388. }
  389. /********************************************************/
  390. void  zd3()  interrupt 3                      //T1中斷用來(lái)掃描數(shù)碼管和啟動(dòng)模塊
  391. {
  392.         TH1=(65536-2000)/256;
  393.         TL1=(65536-2000)%256;
  394.         timer++;                                                 //中斷次數(shù)加一
  395.         count++;                                                 //中斷次數(shù)加一
  396.         counter=S*2;
  397.         if(voice_flg==0)                                 //語(yǔ)音播報(bào)時(shí),停止蜂鳴器
  398.         {
  399.                 if(S<=300)                                                                        //判斷距離是否小于300cm
  400.                 {
  401.                         if(S>30)
  402.                         {
  403.                                 if(count<S)
  404.                                 BEEP=0;                                                                //啟動(dòng)蜂鳴器報(bào)警
  405.                                 if(count>S)
  406.                                 BEEP=1;                                                                //關(guān)閉蜂鳴器報(bào)警
  407.                                 if(count>=counter)
  408.                                 count=0;
  409.                         }
  410.                         else
  411.                         BEEP=1;                                                                        //蜂鳴器報(bào)警
  412.                 }
  413.         }
  414.         if((S>300)||(Beep_flag==1))
  415.         {
  416.                 BEEP=0;                                                                        //關(guān)閉蜂鳴器報(bào)警
  417.                 Beep_flag=0;
  418.                 count=0;
  419.         }
  420.         if(count>=1000)                                         //最大2s
  421.         {
  422.                 count=0;
  423.                 BEEP=0;         
  424.         }
  425.         if(timer>=300)                                         //2ms*250=500ms,即每500ms發(fā)送一次超聲波(測(cè)量周期一定要大于60ms)
  426.         {
  427.                 timer=0;                                         //把中斷次數(shù)清除
  428.                 StartModule();
  429.         }
  430. }

  431. /*********************************************************/

  432. void Timer_init(void)
  433. {
  434.         TMOD=0x11;                                    //設(shè)T0為方式1,GATE=1;
  435.         TH0=0;                                        //設(shè)置初值為0
  436.         TL0=0;         
  437.         TH1=(65536-2000)/256;   //2MS定時(shí)
  438.         TL1=(65536-2000)%256;
  439.         ET0=1;                             //允許T0中斷
  440.         ET1=1;                                           //允許T1中斷
  441.         TR1=1;                                           //開(kāi)啟定時(shí)器
  442.         EA=1;                                           //開(kāi)啟總中斷
  443. }

  444. /*********************************************************/
  445. void Light_Check(void)
  446. {
  447.         if(LIGHT==0)                        //檢測(cè)到弱光
  448.         LED=0;                                        //開(kāi)啟LED
  449.         else                                        //檢測(cè)到強(qiáng)光
  450.         LED=1;                                        //關(guān)閉LED
  451. }
  452. /***********************************************語(yǔ)音*****************************************************************/
  453. void delay(uint z)                                                    //延時(shí)函數(shù)約0.8ms
  454. {
  455.         uint x,y;
  456.         for(x=z;x>0;x--)
  457.                 for(y=80;y>0;y--);
  458. }
  459. void music(uchar k)                                                  //單獨(dú)播放第K段語(yǔ)音
  460. {
  461.         RST=1;
  462.         delay(2);
  463.         RST=0;                                                                  //發(fā)送復(fù)位脈沖,即起始信號(hào)
  464.         delay(2);
  465.         while(k>0)                                                          //發(fā)送K個(gè)脈沖,播放第K段內(nèi)容
  466.         {
  467.                 DATA=1;
  468.                 delay(1);
  469.                 DATA=0;
  470.                 delay(1);
  471.                 k--;
  472.         }
  473. }

  474. void Voice(void)
  475. {
  476.         if(KEY_DIS==0)                                                                  
  477.         {
  478.                 delay(1);
  479.                 if(KEY_DIS==0)
  480.                 {
  481.                         if(Di_flag==0)                                                //合理距離語(yǔ)音播報(bào)
  482.                         {
  483.                                 BEEP=0;                                                        //關(guān)閉蜂鳴器再播報(bào)
  484.                                 voice_flg=1;                                        //語(yǔ)音播報(bào)標(biāo)志位置一
  485.         
  486.                                 if(S/100==0)                                        //百位為0
  487.                                 {
  488.                                         if(S%100/10==0)                                //十位為0
  489.                                         {
  490.                                                 if(S%10==0)                                //個(gè)位為0
  491.                                                 {
  492.                                                         music(1);                           //播放0
  493.                                                         while(!BUSY);                //等待播完
  494.                                                 }
  495.                                                 else
  496.                                                 {
  497.                                                         music(S%10+1);                   //播放個(gè)位
  498.                                                         while(!BUSY);                //等待播完
  499.                                                 }
  500.                                         }
  501.                                         else
  502.                                         {
  503.                                                 if(S%100/10==1)                        //十位為1
  504.                                                 {
  505.                                                 }
  506.                                                 else
  507.                                                 {
  508.                                                         music(S%100/10+1);        //播放十位
  509.                                                         while(!BUSY);                //等待播完
  510.                                                 }
  511.                                                 music(11);                                   //播放 十
  512.                                                 while(!BUSY);                        //等待播完
  513.                                                 if(S%10==0)                                //個(gè)位為0 不播放
  514.                                                 {
  515.                                                 }
  516.                                                 else
  517.                                                 {
  518.                                                         music(S%10+1);                   //播放個(gè)位
  519.                                                         while(!BUSY);                //等待播完
  520.                                                 }
  521.                                         }
  522.                                 }
  523.                                 else
  524.                                 {
  525.                                         music(S/100+1);                                   //播放百位
  526.                                         while(!BUSY);                                   //等待播完
  527.                                         music(12);                                           //播放 百
  528.                                         while(!BUSY);                                   //等待播完
  529.                                         if(S%100/10==0)                                //十位為0
  530.                                         {
  531.                                                 if(S%10==0)                                //個(gè)位為0
  532.                                                 {
  533.                                                         
  534.                                                 }
  535.                                                 else
  536.                                                 {
  537.                                                         music(1);                           //播放 0
  538.                                                         while(!BUSY);                //等待播完
  539.                                                 }
  540.                                         }
  541.                                         else
  542.                                         {
  543.                                                 music(S%100/10+1);                //播放十位
  544.                                                 while(!BUSY);                        //等待播完
  545.                                                 music(11);                                   //播放 十
  546.                                                 while(!BUSY);                        //等待播完
  547.                                                 if(S%10==0)                                //個(gè)位為0
  548.                                                 {
  549.                                                 }
  550.                                                 else
  551.                                                 {
  552.                                                         music(S%10+1);                   //播放個(gè)位
  553.                                                         while(!BUSY);                //等待播完
  554.                                                 }
  555.                                         }
  556.                                 }        
  557.                                 voice_flg=0;                                        //語(yǔ)音播報(bào)標(biāo)志位清零
  558.                         }
  559.                         if(Di_flag==1)                                                 //超出測(cè)量播報(bào)“滴”提醒
  560.                         {         
  561.                                 music(32);                                                   //播放“滴”
  562.                                 while(!BUSY);                                           //等待播完
  563.                         }
  564.                 }
  565.         }
  566.         if(KEY_TIME==0)                                                           //按鍵按下,播放時(shí)間。
  567.         {
  568.                 delay(5);
  569.                 if(KEY_TIME==0)
  570.                 {
  571.                         BEEP=0;                                                        //關(guān)閉蜂鳴器再播報(bào)
  572.                         voice_flg=1;                                        //語(yǔ)音播報(bào)標(biāo)志位置一
  573.                         music(22);                                           //播放“現(xiàn)在時(shí)刻北京時(shí)間”
  574.                         while(!BUSY);                                   //等待播完
  575.                         music(3);                                           //2
  576.                         while(!BUSY);
  577.                         music(1);                                           //0
  578.                         while(!BUSY);
  579.                         music(Year/10+1);                              //播放年“高位”
  580.                         while(!BUSY);
  581.                         music(Year%10+1);                              //播放年“低位”
  582.                         while(!BUSY);
  583.                         music(16);                                                 //年
  584.                         while(!BUSY);

  585.                         if((Month/10)!=0)
  586.                         {
  587.                                 music(11);                                   //播放“十”
  588.                                 while(!BUSY);                           //等待播完
  589.                         }
  590.                         if((Month%10)!=0)
  591.                         {
  592.                                 music(Month%10+1);                      //播放月“低位”
  593.                                 while(!BUSY);                           //等待播完
  594.                         }
  595.                         music(17);                                           //播放“月”
  596.                         while(!BUSY);                                   //等待播完

  597.                         if((Day/10)==1)                                   //日大于10,小于20
  598.                         {
  599.                                 music(11);                                   //播放“十”
  600.                                 while(!BUSY);                           //等待播完
  601.                         }
  602.                         if((Day/10)>1)                                   //日大于20
  603.                         {
  604.                                 music(Day/10+1);                      //播放日“高位”
  605.                                 while(!BUSY);                           //等待播完
  606.                                 music(11);                                   //播放“十”
  607.                                 while(!BUSY);                           //等待播完
  608.                         }
  609.                         if((Day%10)!=0)
  610.                         {
  611.                                 music(Day%10+1);                      //播放日“低位”
  612.                         }
  613.                         while(!BUSY);                                   //等待播完
  614.                         music(18);                                              //播放“日”
  615.                         while(!BUSY);                                      //等待播完

  616.                         if((Hour/10)==1)                           //小時(shí)大于10,小于20
  617.                         {
  618.                                 music(11);                                   //播放“十”
  619.                                 while(!BUSY);                           //等待播完
  620.                         }
  621.                         if((Hour/10)>1)                                   //小時(shí)大于20
  622.                         {
  623.                                 music(Hour/10+1);                      //播放小時(shí)“高位”
  624.                                 while(!BUSY);                           //等待播完
  625.                                 music(11);                                   //播放“十”
  626.                                 while(!BUSY);                           //等待播完
  627.                         }
  628.                         if(Hour==0)
  629.                         {
  630.                                 music(1);                                         //播放時(shí)“0”
  631.                         }
  632.                         while(!BUSY);                                   //等待播完
  633.                         if((Hour%10)!=0)
  634.                         {
  635.                                 music(Hour%10+1);                      //播放時(shí)“低位”
  636.                         }                        
  637.                         while(!BUSY);                                   //等待播完
  638.                         music(13);                                              //播放“點(diǎn)”
  639.                         while(!BUSY);                                      //等待播完

  640.                         if((Minute/10)==1)                           //分鐘大于10,小于20
  641.                         {
  642.                                 music(11);                                   //播放“十”
  643.                                 while(!BUSY);                           //等待播完
  644.                         }
  645.                         if((Minute/10)>1)                           //分鐘大于20
  646.                         {
  647.                                 music(Minute/10+1);                      //播放分鐘“高位”
  648.                                 while(!BUSY);                           //等待播完
  649.                                 music(11);                                   //播放“十”
  650.                                 while(!BUSY);                           //等待播完
  651.                         }
  652.                         if(Minute==0)
  653.                         {
  654.                                 music(1);                                         //播放分“0”
  655.                         }
  656.                         while(!BUSY);                                   //等待播完
  657.                         if((Minute%10)!=0)
  658.                         {
  659.                                 music(Minute%10+1);                      //播放分鐘“低位”
  660.                         }
  661.                         while(!BUSY);                                   //等待播完
  662.                         music(14);                                              //播放“分”
  663.                         while(!BUSY);                                      //等待播完
  664.                         voice_flg=0;                                        //語(yǔ)音播報(bào)標(biāo)志位清零
  665.                 }
  666.         }
  667.         if((Minute==0)&&(Second<3))                           //分等于0表示整點(diǎn),秒小于3主要是保證整點(diǎn)報(bào)一次就可以,否則一分鐘內(nèi)可能報(bào)多次
  668.         {
  669.                 if((Hour>6)&&(Hour<22))                           //早上7點(diǎn)~晚上7點(diǎn) 整點(diǎn)報(bào)時(shí)
  670.                 {
  671.                         BEEP=0;                                                        //關(guān)閉蜂鳴器再播報(bào)
  672.                         voice_flg=1;                                        //語(yǔ)音播報(bào)標(biāo)志位置一
  673.                         music(22);                                           //播放“現(xiàn)在時(shí)刻北京時(shí)間”
  674.                         while(!BUSY);                                   //等待播完
  675.                         
  676.                         if((Hour/10)==1)                           //小時(shí)大于10,小于20
  677.                         {
  678.                                 music(11);                                   //播放“十”
  679.                                 while(!BUSY);                           //等待播完
  680.                         }
  681.                         if((Hour/10)>1)                                   //小時(shí)大于20
  682.                         {
  683.                                 music(Hour/10+1);                      //播放小時(shí)“高位”
  684.                                 while(!BUSY);                           //等待播完
  685.                                 music(11);                                   //播放“十”
  686.                                 while(!BUSY);                           //等待播完
  687.                         }
  688.                         if(Hour==0)
  689.                         {
  690.                                 music(1);                                         //播放時(shí)“0”
  691.                         }
  692.                         while(!BUSY);                                   //等待播完
  693.                         if((Hour%10)!=0)
  694.                         {
  695.                                 music(Hour%10+1);                      //播放時(shí)“低位”
  696.                         }                        
  697.                         while(!BUSY);                                   //等待播完
  698.                         music(13);                                              //播放“點(diǎn)”
  699.                         while(!BUSY);                                      //等待播完

  700.                         music(26);                                              //播放“整”
  701.                         while(!BUSY);                                      //等待播完
  702.                         voice_flg=0;                                        //語(yǔ)音播報(bào)標(biāo)志位清零
  703.                 }
  704.         }
  705. }
  706. /*********************************************************/
  707. void  main(void)
  708. {  
  709.         BEEP=0;                                                        //關(guān)閉蜂鳴器
  710.         LED=1;                                                        //關(guān)閉LED燈
  711.         init();                                                        //液晶初始化
  712.         Timer_init();                                        //定時(shí)器初始化
  713.         while(1)
  714.         {
  715.                 if(Adjust==0)                                 //非調(diào)節(jié)模式下顯示時(shí)間
  716.                 {
  717.                         Time_Display();                         //顯示時(shí)間
  718.                         while(!RX);                                //當(dāng)接收為0時(shí),表示沒(méi)接收到超聲波,此時(shí)程序停在這里,直到開(kāi)始有接收,while(1);表示停
  719.                         TR0=1;                                    //開(kāi)始有信號(hào)傳入,開(kāi)啟定時(shí)器T0計(jì)數(shù)
  720.                         while(RX);                                //當(dāng)接收為1時(shí),表示接收到超聲波,此時(shí)程序停在這里,直到開(kāi)始接收結(jié)束,while(0);表示跳過(guò)
  721.                         TR0=0;                                        //信號(hào)傳入結(jié)束,關(guān)閉定時(shí)器T0計(jì)數(shù)
  722.                         Conut();                                //計(jì)算并顯示
  723.                 }
  724.                 Keyscan();                                         //掃描鍵盤(pán)
  725.                 Light_Check();                                //光線(xiàn)檢測(cè)
  726.                 Voice();                                        //語(yǔ)音播報(bào)
  727.                
  728.                 delay1(2000);
  729.         }               
  730. }
復(fù)制代碼

Keil5代碼與Proteus8.8仿真下載:
仿真與代碼.7z (2.35 MB, 下載次數(shù): 64)

1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
11.jpg
14.jpg
15.jpg

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

無(wú)效樓層,該帖已經(jīng)被刪除
無(wú)效樓層,該帖已經(jīng)被刪除
ID:309376 發(fā)表于 2022-5-12 10:22 | 顯示全部樓層
過(guò)來(lái)學(xué)習(xí)一下,感覺(jué)很有用啊
回復(fù)

使用道具 舉報(bào)

ID:309376 發(fā)表于 2022-5-12 10:22 | 顯示全部樓層
實(shí)物圖做出來(lái),效果應(yīng)該不錯(cuò)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 激情久久久久 | 精彩视频一区二区三区 | 久久精品国产一区二区电影 | 本地毛片 | 电影在线| 91亚洲国产成人久久精品网站 | 午夜视频在线 | 国产一区二区 | 国产超碰人人爽人人做人人爱 | 黄片毛片免费看 | 国产精品无码专区在线观看 | 国产精品亚洲欧美日韩一区在线 | 一级高清免费毛片 | 99国内精品久久久久久久 | 欧美中文字幕一区 | 天天干视频网 | 国产亚洲一区二区三区在线 | 国产乱码精品一区二区三区五月婷 | 又黑又粗又长的欧美一区 | 久久av网 | 亚洲精品性视频 | 国产农村一级国产农村 | 在线观看日韩精品视频 | a级大片免费观看 | 毛片大全| 日韩国产中文字幕 | 91亚洲一区 | av大片| 天天躁日日躁狠狠很躁 | 久久久一区二区三区 | 国产精品毛片一区二区三区 | 久久精品久久久久久 | 麻豆亚洲 | 日产久久 | 国内自拍第一页 | 国产欧美精品一区二区 | 99re视频在线| 亚洲一区 中文字幕 | 欧美日韩久久久 | 黄色91在线 | 欧美一极视频 |