超聲波模塊測距+1602顯示.,,,基于此程+軸流風(fēng)機(jī)已完美做出風(fēng)洞
0.png (55.06 KB, 下載次數(shù): 58)
下載附件
2017-4-21 01:22 上傳
單片機(jī)源程序:
- #include<reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit in=P3^3; //超聲波接收口
- sbit out=P3^4; //超聲波發(fā)射口
- //LCD1602端口定義
- sbit RS=P2^6; //寄存器選擇位,將RS位定義為P2.0引腳 //1602引腳定義
- sbit RW=P2^5; //讀寫選擇位,將RW位定義為P2.1引腳
- sbit E=P2^7; //使能信號位,將E位定義為P2.2引腳
-
- #define LCD1602data P0 //1602數(shù)據(jù)口接單片機(jī)P1口
- uint time;
- unsigned long s=0;
- bit flag; //超聲波超出測量范圍標(biāo)志位
- uint s1,s2,s3;
- /*****************************************************
- 以下為1602模塊語句
- ***************************************************/
- /*****************************************************
- 函數(shù)功能:延時1ms
- ***************************************************/
- void delay1ms()
- {
- unsigned char i,j;
- for(i=0;i<10;i++)
- for(j=0;j<33;j++);
- }
- /*****************************************************
- 函數(shù)功能:延時若干毫秒
- 入口參數(shù):n
- ***************************************************/
- void delay(unsigned int n)
- {
- unsigned int i;
- for(i=0;i<n;i++)
- delay1ms();
- }
- /*****************************************************
- 函數(shù)功能:判斷液晶模塊的忙碌狀態(tài)
- 返回值:result。result=1,忙碌;result=0,不忙
- ***************************************************/
- bit BusyTest(void)
- {
- bit result;
- RS=0;//根據(jù)規(guī)定,RS為低電平,RW為高電平時,可以讀狀態(tài)
- RW=1;
- E=1; //E=1,才允許讀寫
- _nop_(); //空操作
- _nop_();
- _nop_();
- _nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間
-
- E=0;
- return result;
- }
- /*****************************************************
- 函數(shù)功能:將模式設(shè)置指令或顯示地址寫入液晶模塊
- 入口參數(shù):dictate
- ***************************************************/
- void Write_com (unsigned char dictate)
- {
- while(BusyTest()==1); //如果忙就等待
- RS=0; //根據(jù)規(guī)定,RS和R/W同時為低電平時,可以寫入指令
- RW=0;
- E=0; //E置低電平(寫指令時,
- // 就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0"
- _nop_();
- _nop_(); //空操作兩個機(jī)器周期,給硬件反應(yīng)時間
- LCD1602data=dictate;//將數(shù)據(jù)送入P0口,即寫入指令或地址
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間
- E=1; //E置高電平
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間
- E=0; //當(dāng)E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令
- }
- /*****************************************************
- 函數(shù)功能:指定字符顯示的實(shí)際地址
- 入口參數(shù):x
- ***************************************************/
- void WriteAddress(unsigned char x)
- {
- Write_com(x|0x80); //顯示位置的確定方法規(guī)定為"80H+地址碼x"
- }
- /*****************************************************
- 函數(shù)功能:將數(shù)據(jù)(字符的標(biāo)準(zhǔn)ASCII碼)寫入液晶模塊
- 入口參數(shù):y(為字符常量)
- ***************************************************/
- void WriteData(unsigned char y)
- {
- while(BusyTest()==1);
- RS=1; //RS為高電平,RW為低電平時,可以寫入數(shù)據(jù)
- RW=0;
- E=0; //E置低電平(寫指令時,,
- // 就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0"
- LCD1602data=y; //將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間
- E=1; //E置高電平
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間
- E=0; //當(dāng)E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令
- }
- /*****************************************************
- 函數(shù)功能:對LCD的顯示模式進(jìn)行初始化設(shè)置
- ***************************************************/
- void LcdInt(void)
- {
- delay(15); //延時15ms,首次寫指令時應(yīng)給LCD一段較長的反應(yīng)時間
- Write_com(0x38); //顯示模式設(shè)置:16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口
- delay(5); //延時5ms
- Write_com(0x38);
- delay(5);
- Write_com(0x38); //3次寫 設(shè)置模式
- delay(5);
- // Write_com(0x0F); //顯示模式設(shè)置:顯示開,有光標(biāo),光標(biāo)閃爍
- // delay(5);
- Write_com(0x0c); //顯示模式設(shè)置:顯示開,不顯示光標(biāo)
- delay(5);
- Write_com(0x06); //顯示模式設(shè)置:光標(biāo)右移,字符不移
- delay(5);
- Write_com(0x01); //清屏幕指令,將以前的顯示內(nèi)容清除
- delay(5);
- }
- //add為顯示字符的位置(在第二行顯示)//x為顯示的字符
- //調(diào)用此函數(shù)請注意:此函數(shù)是為顯示數(shù)字的,display(10,9);display(10,a);
- //分別表示第二行第十位顯示數(shù)字9和a代表的數(shù)字
- //如果想把此函數(shù)改寫成顯示字母的,
- //只需把最后WriteData(0x30+x);中的
- // 0x30+ 去掉即可,調(diào)用時注意格式 display(10,'a');
- display(unsigned char add,unsigned char x)
- {
-
- WriteAddress(0x00);
-
- delay(5);
- Write_com(0x80+0x40+add);
- WriteData(0x30+x);
- }
- LCD1602()//1602初顯示
- {
-
- LcdInt(); //調(diào)用LCD初始化函數(shù)
- delay(10);
- Write_com(0x01); //清屏
- delay(5);
- WriteAddress(0x00);
- //設(shè)置顯示位置為第一行第一個字,這條語句可以不用寫,因為默認(rèn)是從第一行第一個字顯示
- delay(5);
- //第一行顯示 DISTANCE:
- WriteData('D');
- WriteData('I');
- WriteData('S');
- WriteData('T');
- WriteData('A');
- WriteData('N');
- WriteData('C');
- WriteData('E');
- WriteData(':');
- }
- /*****************************************************
- 以上為1602模塊語句
- ***************************************************/
- void FS() //發(fā)射超聲波
- {
- out=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- out=0;
- }
- void conut(void) //計算并顯示超聲波測到的距離
- {
- time=TH0*256+TL0;
- TH0=0;
- TL0=0;
-
- s=(time*1.7)/100; //算出來單位是CM
- if((s>=700)||flag==1) //超出測量范圍顯示"ERROR"
- {
- flag=0;
-
- Write_com(0x80+0x40+11);
- WriteData('E'); delay(5);
- WriteData('R'); delay(5);
- WriteData('R'); delay(5);
- WriteData('O'); delay(5);
- WriteData('R'); delay(5);
- }
- else
- {
- s1=s%1000/100;
- s2=s%1000%100/10;
- s3=s%1000%10 %10;
- display(11,s1);
- WriteData('.');
- display(13,s2);
- display(14,s3);
- WriteData('m');
- }
- }
- /********************************************************/
- void zd0() interrupt 1 //T0中斷用來計數(shù)器溢出,超過測距范圍
- {
-
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
下載:
超聲波模塊測距 1602顯示.zip
(44.62 KB, 下載次數(shù): 83)
2015-8-8 07:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|