|
超聲波測(cè)距導(dǎo)盲系統(tǒng)帶原文仿真程序以及詳細(xì)的介紹
由于超聲波、語(yǔ)音無(wú)法仿真,只能仿真按鍵操作、液晶顯示、光控?zé)艄δ堋?br />
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
盲人由于先天或后天的生理缺陷喪失了視覺(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í)物圖如下:
Altium Designer畫(huà)的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
單片機(jī)源程序如下:
- /***********************************************************************************************************/
- #include <AT89x51.H> //器件配置文件
- #include <intrins.h>
- #define uchar unsigned char //宏定義
- #define uint unsigned int //宏定義
- sbit RX =P2^2; //接收端口
- sbit TX =P2^1; //發(fā)送端口
- sbit BEEP =P2^0; //蜂鳴器端口
- sbit LED =P3^5; //LED指示燈端口
- sbit LIGHT=P3^6; //光敏電阻端口
- sbit KEY_DIS =P1^3; //播放距離語(yǔ)音
- sbit KEY_TIME =P1^4; //播放時(shí)間語(yǔ)音
- sbit BUSY =P3^1; //語(yǔ)音芯片
- sbit DATA =P3^2; //語(yǔ)音芯片
- sbit RST =P3^3; //語(yǔ)音芯片
- unsigned int time=0; //定義發(fā)送到接收的時(shí)間
- unsigned int timer=0; //定義超聲波掃描周期
- unsigned int count=0; //中斷次數(shù),閃爍用
- unsigned long S=0; //定義距離為0
- bit flag =0; //超出距離標(biāo)志位
- bit Di_flag;
- bit Beep_flag;
- bit voice_flg; //語(yǔ)音播報(bào)標(biāo)志位
- unsigned int counter;
- uchar time_data[7];
- uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //數(shù)據(jù)的地址
- uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
- uchar code table1[]="Dis: |2000/00/00";
- uchar code table2[]="000cm|00:00:00 0";
- uchar code table3[]=" "; //清屏內(nèi)容
- uchar code table4[]=" Set Real Time ";
- uchar code table9[]="Date: 2000/00/00";
- uchar code table0[]="Time: 00:00:00 0";
- bit Adjust; //調(diào)節(jié)標(biāo)志位,=1表示進(jìn)入調(diào)節(jié)模式,=0是正常模式
- sbit rs=P1^0; //LCD1602
- sbit rw=P1^1; //LCD1602
- sbit e=P1^2; //LCD1602
- sbit sck=P2^5; //時(shí)鐘端口
- sbit io=P2^6; //時(shí)鐘端口
- sbit rst=P2^7; //時(shí)鐘端口
- sbit SELT =P1^5; //選擇鍵
- sbit ENTER=P1^6; //確認(rèn)鍵
- sbit UP =P1^7; //加鍵
- sbit DOWN =P3^0; //減鍵
- uchar Select_num; //選擇按鍵按下次數(shù)
- uchar Enter_num; //確認(rèn)按鍵按下次數(shù)
- char Year,Month,Day,Hour,Minute,Second,Week; //時(shí)間設(shè)置值
- void read_rtc();
- /****************************************LCD1602顯示*****************************************************************************/
- void delay1(uint z) //延時(shí)函數(shù)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=10;y>0;y--);
- }
- void write_com(uchar com) //寫(xiě)指令函數(shù)
- {
- rw=0;
- delay1(5);
- rs=0;
- delay1(5);
- e=1;
- delay1(5);
- P0=com;
- delay1(5);
- e=0;
- delay1(5);
- }
- void write_date(uchar date) //寫(xiě)數(shù)據(jù)函數(shù)
- {
- rw=0;
- delay1(5);
- rs=1;
- delay1(5);
- e=1;
- delay1(5);
- P0=date;
- delay1(5);
- e=0;
- delay1(5);
- }
- void init() //初始化函數(shù)
- {
- uchar num;
- Year=16;
- Month=1;
- Day=1;
- Hour=15;
- Minute=30;
- Second=50;
- Week=6;
- e=0; // 時(shí)序表e初始為0
- write_com(0x38); //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
- write_com(0x0c); //設(shè)置光標(biāo)
- write_com(0x06); //光標(biāo)自動(dòng)加1,光標(biāo)輸入方式
- write_com(0x01); //清屏
- write_com(0x80); //設(shè)置初始顯示位置
- for(num=0;num<16;num++)
- {
- write_date(table1[num]);
- delay1(5);
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(table2[num]);
- delay1(5);
- }
- }
- void SetTime_dispaly(uchar add,uchar dat) //第一個(gè):參數(shù)的地址,第二個(gè):參數(shù)的內(nèi)容
- {
- uchar shi,ge;
- shi=dat/10; //把溫度的十位提取出來(lái)
- ge=dat%10; //把溫度的個(gè)位提取出來(lái)
- write_com(add); //要寫(xiě)的地址
- write_date(0x30+shi); //十位的內(nèi)容 1602字符庫(kù)
- write_date(0x30+ge); //個(gè)位的內(nèi)容 1602字符庫(kù)
- }
- void Week_dispaly(uchar add,uchar dat) //第一個(gè):參數(shù)的地址,第二個(gè):參數(shù)的內(nèi)容
- {
- write_com(add); //要寫(xiě)的地址
- write_date(0x30+dat); //十位的內(nèi)容 1602字符庫(kù)
- }
- void Date_dispaly(uchar add,uchar dat) //第一個(gè):參數(shù)的地址,第二個(gè):參數(shù)的內(nèi)容
- {
- uchar shi,ge;
- shi=dat/16; //把十位提取出來(lái)
- ge=dat%16; //把個(gè)位提取出來(lái)
- write_com(add+3); //要寫(xiě)的地址
- write_date(0x30+shi); //十位的內(nèi)容 1602字符庫(kù)
- write_date(0x30+ge); //個(gè)位的內(nèi)容 1602字符庫(kù)
- }
- void LCD_Display_String(unsigned char line,unsigned char *string)
- { //液晶屏顯示內(nèi)容,把要顯示的內(nèi)容寫(xiě)到對(duì)應(yīng)的位置
- unsigned char i;
- unsigned char address=0;
- if(line==1)
- {
- address=0x80; //0X80是第1行的第1個(gè)位置 ,0x81第2位
- }
- else if(line==2)
- {
- address=0x80+0x40; //0X80+0x40是第2行的第1個(gè)位置 ,0X80+0x40+1是第2行第2位
- }
-
- for(i=0;i<16;i++)
- {
- write_com(address);
- write_date(string[i]);
- address++;
- }
- }
- void Display(uchar add,uint dat) //顯示避障距離
- {
- uchar bai,shi,ge;
- bai=dat%1000/100; //取出百位
- shi=dat%1000%100/10; //取出十位
- ge=dat%1000%10%10; //取出個(gè)位
- write_com(0x80+add);
- write_date(0x30+bai);
- write_date(0x30+shi);
- write_date(0x30+ge);
- }
- void Display_ASIIC(uchar add) //顯示符號(hào)
- {
- write_com(0x40+0x80+add);
- write_date(0x2d);
- write_date(0x2d);
- write_date(0x2d);
- }
- void Time_Display(void)
- {
- read_rtc();
- Date_dispaly(0x80+0x40+9,time_data[6]); //顯示秒
- Date_dispaly(0x80+0x40+6,time_data[5]); //顯示分
- Date_dispaly(0x80+0x40+3,time_data[4]); //顯示時(shí)
- Date_dispaly(0x80+11,time_data[3]); //顯示日
- Date_dispaly(0x80+8,time_data[2]); //顯示月
- Week_dispaly(0x80+0x40+15,time_data[1]); //顯示周
- Date_dispaly(0x80+5,time_data[0]); //顯示年
- // Year/10*16+Year%10
- Year=time_data[0]/16*10+time_data[0]%16;
- Week=time_data[1]/16*10+time_data[1]%16;
- Month=time_data[2]/16*10+time_data[2]%16;
- Day=time_data[3]/16*10+time_data[3]%16;
- Hour=time_data[4]/16*10+time_data[4]%16;
- Minute=time_data[5]/16*10+time_data[5]%16;
- Second=time_data[6]/16*10+time_data[6]%16;
- }
- /*********************************時(shí)間************************************************/
- void write_ds1302_byte(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- sck=0;
- io=dat&0x01; //準(zhǔn)備數(shù)據(jù),從最低位開(kāi)始
- dat=dat>>1;
- sck=1;
- }
- }
- void write_ds1302(uchar add,uchar dat)
- {
- rst=0;
- _nop_(); //CPU原地踏步
- sck=0;
- _nop_();
- rst=1;
- _nop_();
- write_ds1302_byte(add); //傳地址
- write_ds1302_byte(dat); //傳數(shù)據(jù)
- rst=0; //不受其他影響
- _nop_();
- io=1; //釋放
- sck=1;
- }
- uchar read_ds1302(uchar add)
- {
- uchar i,value;
- rst=0;
- _nop_(); //CPU原地踏步
- sck=0;
- _nop_();
- rst=1;
- _nop_();
- write_ds1302_byte(add);
- for(i=0;i<8;i++)
- {
- value=value>>1;
- sck=0;
- if(io)
- value=value|0x80;
- sck=1;
- }
- rst=0;
- _nop_();
- sck=0;
- _nop_();
- sck=1;
- io=1;
- return value;
- }
- void set_rtc() //設(shè)置時(shí)間
- {
- uchar i,j;
- for(i=0;i<7;i++) //轉(zhuǎn)換BCD碼
- {
- j=time_data[i]/10;
- time_data[i]=time_data[i]%10;
- time_data[i]=time_data[i]+j*16;
- }
- write_ds1302(0x8e,0x00); //去除寫(xiě)保護(hù)
- for(i=0;i<7;i++)
- {
- write_ds1302(write_add[i],time_data[i]);
- }
- write_ds1302(0x8e,0x80); //加寫(xiě)保護(hù)
- }
- void read_rtc()
- {
- uchar i;
- for(i=0;i<7;i++)
- {
- time_data[i]=read_ds1302(read_add[i]); //最終讀出來(lái)的數(shù) 16進(jìn)制
- }
- }
- /*************************************************按鍵****************************************************************/
- void Keyscan(void)
- {
- if(SELT==0)
- {
- delay1(2);
- if(SELT==0)
- {
- while(!SELT);
- Select_num++; //選擇鍵按下一次
- Adjust=1; //進(jìn)入調(diào)節(jié)模式
- BEEP=0; //關(guān)閉蜂鳴器再播報(bào)
- voice_flg=1; //語(yǔ)音播報(bào)標(biāo)志位置一
- }
- if(Select_num==1)
- {
- LCD_Display_String(1,table4);
- LCD_Display_String(2,table3);
- write_com(0x80+0); //寫(xiě) >>
- write_date(0x3e);
- write_com(0x80+1); //寫(xiě) >>
- write_date(0x3e);
- Enter_num=0;
- }
- if(Select_num==2)
- {
- LCD_Display_String(1,table1);
- LCD_Display_String(2,table2);
- Select_num=0;
- Enter_num=0;
- Adjust=0;
- voice_flg=0; //語(yǔ)音播報(bào)標(biāo)志清除
- }
- write_com(0x0c); //光標(biāo)不再閃爍
- Enter_num=0;
- }
-
- if(ENTER==0)
- {
- delay1(2);
- if(ENTER==0)
- {
- while(!ENTER);
- Enter_num++;
- }
- if(Select_num==1) //設(shè)置實(shí)時(shí)時(shí)間
- {
- if(Enter_num==1)
- {
- LCD_Display_String(1,table9);
- LCD_Display_String(2,table0);
- SetTime_dispaly(0x80+8,Year);
- SetTime_dispaly(0x80+11,Month);
- SetTime_dispaly(0x80+14,Day);
- SetTime_dispaly(0x80+0x40+6,Hour);
- SetTime_dispaly(0x80+0x40+9,Minute);
- SetTime_dispaly(0x80+0x40+12,Second);
- Week_dispaly(0x80+0x40+15,Week);
- write_com(0x80+8); //光標(biāo)閃爍地址,停留在年的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==2)
- {
- write_com(0x80+11); //光標(biāo)閃爍地址,停留在月的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- /********************************************************/
- void Conut(void)
- {
- time=TH0*256+TL0; //計(jì)算時(shí)間,單位是us
- TH0=0; //時(shí)間清除
- TL0=0; //時(shí)間清除
- S=(time*1.7)/100; //超聲波的速度按340m/s計(jì)算,由于路程往返,需要除以2,算出來(lái)是CM,
- if((S>=700)||(flag==1)) //超出測(cè)量范圍或超時(shí)顯示"-"
- {
- flag=0; //清除定時(shí)器T0中斷標(biāo)志位
- Display_ASIIC(0);
- Di_flag=1; //滴 語(yǔ)音
- Beep_flag=1; //蜂鳴器 標(biāo)志位
- count=0;
- BEEP=0;
- }
- else
- {
- Display(0x40+0,S); //顯示距離
- Di_flag=0;
- }
- }
- void StartModule() //啟動(dòng)模塊
- {
- TX=1; //啟動(dòng)一次模塊
- _nop_(); //啟動(dòng)模塊,發(fā)送超聲波
- _nop_(); //延時(shí)1us,至少需要發(fā)送10us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- TX=0;
- }
- /********************************************************/
- void zd0() interrupt 1 //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
- {
- flag=1; //在TMOD=0x11定義下,定時(shí)器最多定時(shí)65535us,這段時(shí)間超聲波走過(guò)的距離為:65535*1.7/100=1114095cm
- //顯然距離明顯超出范圍,因此,當(dāng)定時(shí)時(shí)間到仍未接收到超聲波,中斷溢出標(biāo)志置位,則讓其顯示"-"
- count=0;
- BEEP=0;
- }
- /********************************************************/
- void zd3() interrupt 3 //T1中斷用來(lái)掃描數(shù)碼管和啟動(dòng)模塊
- {
- TH1=(65536-2000)/256;
- TL1=(65536-2000)%256;
- timer++; //中斷次數(shù)加一
- count++; //中斷次數(shù)加一
- counter=S*2;
- if(voice_flg==0) //語(yǔ)音播報(bào)時(shí),停止蜂鳴器
- {
- if(S<=300) //判斷距離是否小于300cm
- {
- if(S>30)
- {
- if(count<S)
- BEEP=0; //啟動(dòng)蜂鳴器報(bào)警
- if(count>S)
- BEEP=1; //關(guān)閉蜂鳴器報(bào)警
- if(count>=counter)
- count=0;
- }
- else
- BEEP=1; //蜂鳴器報(bào)警
- }
- }
- if((S>300)||(Beep_flag==1))
- {
- BEEP=0; //關(guān)閉蜂鳴器報(bào)警
- Beep_flag=0;
- count=0;
- }
- if(count>=1000) //最大2s
- {
- count=0;
- BEEP=0;
- }
- if(timer>=300) //2ms*250=500ms,即每500ms發(fā)送一次超聲波(測(cè)量周期一定要大于60ms)
- {
- timer=0; //把中斷次數(shù)清除
- StartModule();
- }
- }
- /*********************************************************/
- void Timer_init(void)
- {
- TMOD=0x11; //設(shè)T0為方式1,GATE=1;
- TH0=0; //設(shè)置初值為0
- TL0=0;
- TH1=(65536-2000)/256; //2MS定時(shí)
- TL1=(65536-2000)%256;
- ET0=1; //允許T0中斷
- ET1=1; //允許T1中斷
- TR1=1; //開(kāi)啟定時(shí)器
- EA=1; //開(kāi)啟總中斷
- }
- /*********************************************************/
- void Light_Check(void)
- {
- if(LIGHT==0) //檢測(cè)到弱光
- LED=0; //開(kāi)啟LED
- else //檢測(cè)到強(qiáng)光
- LED=1; //關(guān)閉LED
- }
- /***********************************************語(yǔ)音*****************************************************************/
- void delay(uint z) //延時(shí)函數(shù)約0.8ms
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=80;y>0;y--);
- }
- void music(uchar k) //單獨(dú)播放第K段語(yǔ)音
- {
- RST=1;
- delay(2);
- RST=0; //發(fā)送復(fù)位脈沖,即起始信號(hào)
- delay(2);
- while(k>0) //發(fā)送K個(gè)脈沖,播放第K段內(nèi)容
- {
- DATA=1;
- delay(1);
- DATA=0;
- delay(1);
- k--;
- }
- }
- void Voice(void)
- {
- if(KEY_DIS==0)
- {
- delay(1);
- if(KEY_DIS==0)
- {
- if(Di_flag==0) //合理距離語(yǔ)音播報(bào)
- {
- BEEP=0; //關(guān)閉蜂鳴器再播報(bào)
- voice_flg=1; //語(yǔ)音播報(bào)標(biāo)志位置一
-
- if(S/100==0) //百位為0
- {
- if(S%100/10==0) //十位為0
- {
- if(S%10==0) //個(gè)位為0
- {
- music(1); //播放0
- while(!BUSY); //等待播完
- }
- else
- {
- music(S%10+1); //播放個(gè)位
- while(!BUSY); //等待播完
- }
- }
- else
- {
- if(S%100/10==1) //十位為1
- {
- }
- else
- {
- music(S%100/10+1); //播放十位
- while(!BUSY); //等待播完
- }
- music(11); //播放 十
- while(!BUSY); //等待播完
- if(S%10==0) //個(gè)位為0 不播放
- {
- }
- else
- {
- music(S%10+1); //播放個(gè)位
- while(!BUSY); //等待播完
- }
- }
- }
- else
- {
- music(S/100+1); //播放百位
- while(!BUSY); //等待播完
- music(12); //播放 百
- while(!BUSY); //等待播完
- if(S%100/10==0) //十位為0
- {
- if(S%10==0) //個(gè)位為0
- {
-
- }
- else
- {
- music(1); //播放 0
- while(!BUSY); //等待播完
- }
- }
- else
- {
- music(S%100/10+1); //播放十位
- while(!BUSY); //等待播完
- music(11); //播放 十
- while(!BUSY); //等待播完
- if(S%10==0) //個(gè)位為0
- {
- }
- else
- {
- music(S%10+1); //播放個(gè)位
- while(!BUSY); //等待播完
- }
- }
- }
- voice_flg=0; //語(yǔ)音播報(bào)標(biāo)志位清零
- }
- if(Di_flag==1) //超出測(cè)量播報(bào)“滴”提醒
- {
- music(32); //播放“滴”
- while(!BUSY); //等待播完
- }
- }
- }
- if(KEY_TIME==0) //按鍵按下,播放時(shí)間。
- {
- delay(5);
- if(KEY_TIME==0)
- {
- BEEP=0; //關(guān)閉蜂鳴器再播報(bào)
- voice_flg=1; //語(yǔ)音播報(bào)標(biāo)志位置一
- music(22); //播放“現(xiàn)在時(shí)刻北京時(shí)間”
- while(!BUSY); //等待播完
- music(3); //2
- while(!BUSY);
- music(1); //0
- while(!BUSY);
- music(Year/10+1); //播放年“高位”
- while(!BUSY);
- music(Year%10+1); //播放年“低位”
- while(!BUSY);
- music(16); //年
- while(!BUSY);
- if((Month/10)!=0)
- {
- music(11); //播放“十”
- while(!BUSY); //等待播完
- }
- if((Month%10)!=0)
- {
- music(Month%10+1); //播放月“低位”
- while(!BUSY); //等待播完
- }
- music(17); //播放“月”
- while(!BUSY); //等待播完
- if((Day/10)==1) //日大于10,小于20
- {
- music(11); //播放“十”
- while(!BUSY); //等待播完
- }
- if((Day/10)>1) //日大于20
- {
- music(Day/10+1); //播放日“高位”
- while(!BUSY); //等待播完
- music(11); //播放“十”
- while(!BUSY); //等待播完
- }
- if((Day%10)!=0)
- {
- music(Day%10+1); //播放日“低位”
- }
- while(!BUSY); //等待播完
- music(18); //播放“日”
- while(!BUSY); //等待播完
- if((Hour/10)==1) //小時(shí)大于10,小于20
- {
- music(11); //播放“十”
- while(!BUSY); //等待播完
- }
- if((Hour/10)>1) //小時(shí)大于20
- {
- music(Hour/10+1); //播放小時(shí)“高位”
- while(!BUSY); //等待播完
- music(11); //播放“十”
- while(!BUSY); //等待播完
- }
- if(Hour==0)
- {
- music(1); //播放時(shí)“0”
- }
- while(!BUSY); //等待播完
- if((Hour%10)!=0)
- {
- music(Hour%10+1); //播放時(shí)“低位”
- }
- while(!BUSY); //等待播完
- music(13); //播放“點(diǎn)”
- while(!BUSY); //等待播完
- if((Minute/10)==1) //分鐘大于10,小于20
- {
- music(11); //播放“十”
- while(!BUSY); //等待播完
- }
- if((Minute/10)>1) //分鐘大于20
- {
- music(Minute/10+1); //播放分鐘“高位”
- while(!BUSY); //等待播完
- music(11); //播放“十”
- while(!BUSY); //等待播完
- }
- if(Minute==0)
- {
- music(1); //播放分“0”
- }
- while(!BUSY); //等待播完
- if((Minute%10)!=0)
- {
- music(Minute%10+1); //播放分鐘“低位”
- }
- while(!BUSY); //等待播完
- music(14); //播放“分”
- while(!BUSY); //等待播完
- voice_flg=0; //語(yǔ)音播報(bào)標(biāo)志位清零
- }
- }
- if((Minute==0)&&(Second<3)) //分等于0表示整點(diǎn),秒小于3主要是保證整點(diǎn)報(bào)一次就可以,否則一分鐘內(nèi)可能報(bào)多次
- {
- if((Hour>6)&&(Hour<22)) //早上7點(diǎn)~晚上7點(diǎn) 整點(diǎn)報(bào)時(shí)
- {
- BEEP=0; //關(guān)閉蜂鳴器再播報(bào)
- voice_flg=1; //語(yǔ)音播報(bào)標(biāo)志位置一
- music(22); //播放“現(xiàn)在時(shí)刻北京時(shí)間”
- while(!BUSY); //等待播完
-
- if((Hour/10)==1) //小時(shí)大于10,小于20
- {
- music(11); //播放“十”
- while(!BUSY); //等待播完
- }
- if((Hour/10)>1) //小時(shí)大于20
- {
- music(Hour/10+1); //播放小時(shí)“高位”
- while(!BUSY); //等待播完
- music(11); //播放“十”
- while(!BUSY); //等待播完
- }
- if(Hour==0)
- {
- music(1); //播放時(shí)“0”
- }
- while(!BUSY); //等待播完
- if((Hour%10)!=0)
- {
- music(Hour%10+1); //播放時(shí)“低位”
- }
- while(!BUSY); //等待播完
- music(13); //播放“點(diǎn)”
- while(!BUSY); //等待播完
- music(26); //播放“整”
- while(!BUSY); //等待播完
- voice_flg=0; //語(yǔ)音播報(bào)標(biāo)志位清零
- }
- }
- }
- /*********************************************************/
- void main(void)
- {
- BEEP=0; //關(guān)閉蜂鳴器
- LED=1; //關(guān)閉LED燈
- init(); //液晶初始化
- Timer_init(); //定時(shí)器初始化
- while(1)
- {
- if(Adjust==0) //非調(diào)節(jié)模式下顯示時(shí)間
- {
- Time_Display(); //顯示時(shí)間
- while(!RX); //當(dāng)接收為0時(shí),表示沒(méi)接收到超聲波,此時(shí)程序停在這里,直到開(kāi)始有接收,while(1);表示停
- TR0=1; //開(kāi)始有信號(hào)傳入,開(kāi)啟定時(shí)器T0計(jì)數(shù)
- while(RX); //當(dāng)接收為1時(shí),表示接收到超聲波,此時(shí)程序停在這里,直到開(kāi)始接收結(jié)束,while(0);表示跳過(guò)
- TR0=0; //信號(hào)傳入結(jié)束,關(guān)閉定時(shí)器T0計(jì)數(shù)
- Conut(); //計(jì)算并顯示
- }
- Keyscan(); //掃描鍵盤(pán)
- Light_Check(); //光線(xiàn)檢測(cè)
- Voice(); //語(yǔ)音播報(bào)
-
- delay1(2000);
- }
- }
復(fù)制代碼
Keil5代碼與Proteus8.8仿真下載:
仿真與代碼.7z
(2.35 MB, 下載次數(shù): 64)
2022-5-5 04:01 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|