|
接線圖:
原理圖.PNG (50.91 KB, 下載次數(shù): 125)
下載附件
2017-6-14 13:13 上傳
單片機(jī)程序:
- #include <AT89X52.h> //調(diào)用51單片機(jī)的頭文件
- #include <intrins.h>
- #include <math.h>
- //---------------------------------------
- //1602液晶相關(guān)I/O設(shè)置
- sbit E=P2^3; //1602液晶的E腳接在P2.3口上
- sbit RW=P2^4; //1602液晶的RW腳接在P2.4口上
- sbit RS=P2^5; //1602液晶的RS腳接在P2.5口上
- //---------------------------------------
- //---------------------------------------
- //HC-SR04相關(guān)I/O設(shè)置
- sbit TIRG=P3^4; //定義IO口,具體可以去查看原理圖
- sbit ECHO=P3^2; //定義IO口,具體可以去查看原理圖
- //---------------------------------------
- bit flag =0;
- unsigned char k;
- //---------------------------------------
- //名稱:1602液晶用延時(shí)函數(shù)
- //---------------------------------------
- void Delay1602(unsigned int t)
- {
- unsigned int k; //定義一個(gè)16位寄存器用來(lái)做延時(shí)用
- for(k=0;k<t;k++); //延時(shí)
- }
- //---------------------------------------
- //名稱:1602液晶忙檢測(cè)函數(shù)
- //---------------------------------------
- void LCD1602_busy(void)
- {
- P0_7=1; //將P0.7置1,為讀狀態(tài)做準(zhǔn)備
- RS=0; //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
- RW=1; //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
- E=1; //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
- while(P0_7==1); //由P0.7讀入1,表示1602液晶忙,需要等待
- E=0; //讀完以后,恢復(fù)E的電平
- }
- //---------------------------------------
- //名稱:1600寫命令函數(shù)
- //---------------------------------------
- void LCD1602_Write_com(unsigned char combuf)
- {
- RS=0; //選擇指令寄存器
- RW=0; //選擇寫狀態(tài)
- P0=combuf; //將命令字通過(guò)P0口送至DB
- E=1; //E高電平將命令字寫入1602液晶
- E=0; //寫完以后,恢復(fù)E的電平
- }
- //---------------------------------------
- //名稱:1602寫命令函數(shù)(帶忙檢測(cè))
- //---------------------------------------
- void LCD1602_Write_com_busy(unsigned char combuf)
- {
- LCD1602_busy(); //調(diào)用忙檢測(cè)函數(shù)
- LCD1602_Write_com(combuf); //調(diào)用忙檢測(cè)函數(shù)
- }
- //---------------------------------------
- //名稱:1602寫數(shù)據(jù)函數(shù)(帶忙檢測(cè))
- ------------------------
- void LCD1602_Write_data_busy(unsigned char databuf)
- {
- LCD1602_busy(); //調(diào)用忙檢測(cè)函數(shù)
- RS=1; //選擇數(shù)據(jù)寄存器
- RW=0; //選擇寫狀態(tài)
- P0=databuf; //將命令字通過(guò)P0口送至DB
- E=1; //E高電平將命令字寫入1602液晶
- E=0; //寫完以后,恢復(fù)E的電平
- }
- //---------------------------------------
- //名稱:1602液晶顯示地址寫函數(shù)
- //---------------------------------------
- void LCD1602_Write_address(unsigned char x,unsigned char y)
- {
- x&=0x0f; //列地址限制在0-15間
- y&=0x01; //行地址限制在0-1間
- if(y==0) //如果是第一行
- LCD1602_Write_com_busy(x|0x80); //將列地址寫入
- else //如果是第二行
- LCD1602_Write_com_busy((x+0x40)|0x80); //將列地址寫入
- }
- //---------------------------------------
- //名稱:1602液晶初始化函數(shù)
- //---------------------------------------
- void LCD1602_init(void)
- {
- Delay1602(1500); //調(diào)用延時(shí)函數(shù)
- LCD1602_Write_com(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
- Delay1602(500); //調(diào)用延時(shí)函數(shù)
- LCD1602_Write_com(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
- Delay1602(500); //調(diào)用延時(shí)函數(shù)
- LCD1602_Write_com(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
- LCD1602_Write_com_busy(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
- LCD1602_Write_com_busy(0x08); //顯示功能關(guān),無(wú)光標(biāo)
- LCD1602_Write_com_busy(0x01); //清屏
- LCD1602_Write_com_busy(0x06); //寫入新的數(shù)據(jù)后,光標(biāo)右移,顯示屏不移動(dòng)
- LCD1602_Write_com_busy(0x0C); //顯示功能開(kāi),無(wú)光標(biāo)
- }
- //---------------------------------------
- //名稱:1602液晶指定地址顯示函數(shù)
- //---------------------------------------
- void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
- {
- LCD1602_Write_address(x,y); //先將地址信息寫入
- LCD1602_Write_data_busy(buf); //再寫入要顯示的數(shù)據(jù)
- }
- //---------------------------------------
- //名稱:定時(shí)器0中斷服務(wù)程序
- //---------------------------------------
- void Timer0(void) interrupt 1
- {
- //***此處用戶自行添加定時(shí)器T0中斷處理程序***
- flag=0;
- //******************************************
- }
- //---------------------------------------
- //名稱: 主函數(shù)
- -----------------------
- void main(void) //主函數(shù),單片機(jī)開(kāi)機(jī)后就是從這個(gè)函數(shù)開(kāi)始運(yùn)行
- {
- long S;
- unsigned int i;
- unsigned int Timeout;
- LCD1602_init(); //調(diào)用1602液晶初始化函數(shù)
- //***定時(shí)器Timer0初始化***
- TMOD&=0xF0; //將TMOD的低4位定時(shí)器0控制部分清零
- TMOD|=0x01; //設(shè)置定時(shí)器0為方式1
- TMOD=0x01;
- TL0=0; //設(shè)置定時(shí)器0初值低8位
- TH0=0; //設(shè)置定時(shí)器0初值高8位
- TR0=0; //停止定時(shí)器0
- ET0=1; //Timer0中斷允許
- //**********************
- //***開(kāi)全局中斷設(shè)置****
- //定時(shí)器Timer0設(shè)置了中斷允許,此處要開(kāi)全局中斷
- EA=1; //開(kāi)全局中斷
- //*********************
- while(1)
- {
- TIRG=1; //發(fā)一個(gè)脈沖觸發(fā)信號(hào)
- i=4; //維持約17US,符合不低于10US的要求
- while(i>0) //維持約17US,符合不低于10US的要求
- i--; //維持約17US,符合不低于10US的要求
- TIRG=0; //撤銷觸發(fā)信號(hào)
- TR0=0; //關(guān)閉定時(shí)器
- TL0=0; //設(shè)置定時(shí)器0初值低8位為0
- TH0=0; //設(shè)置定時(shí)器0初值高8位為0
- k=0; //清除溢出標(biāo)志
- flag=0;
- Timeout=0;
- while((ECHO==0)&&((Timeout++)<50000)); //等待回響高電平
- TR0=1; //回響高電平來(lái)后啟動(dòng)定時(shí)器
- Timeout=0;
- while((ECHO==1)&&((Timeout++)<50000)); //等待回響高電平結(jié)束后
- TR0=0; //關(guān)閉定時(shí)器
- S=((TH0*256+TL0)*0.5425)/58;
- if(flag==1||S>400) //超出測(cè)量范圍顯示“-”
- {
- LCD1602_Disp(0, 0, '-'); //顯示百位-
- LCD1602_Disp(1, 0, '-'); //顯示十位-
- LCD1602_Disp(2, 0, '-'); //顯示個(gè)位-
- LCD1602_Disp(3, 0, 'C'); //顯示C
- LCD1602_Disp(4, 0, 'M'); //顯示M
- }
- else
- {
- LCD1602_Disp(0, 0, S%1000/100+'0'); //顯示百位
- LCD1602_Disp(1, 0, S%1000%100/10+'0'); //顯示十位
- LCD1602_Disp(2, 0, S%1000%100%10+'0'); //顯示個(gè)位
- LCD1602_Disp(3, 0, 'C'); //顯示C
- LCD1602_Disp(4, 0, 'M'); //顯示M
- }
- i=18000; //維持約77400US,符合不低于60MS的要求
- while(i>0) //維持約77400US,符合不低于60MS的要求
- i--; //維持約77400US,符合不低于60MS的要求
- }
- }
復(fù)制代碼
|
|