- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define NOP() {_nop_();_nop_();_nop_();_nop_();}
- //------LCD引腳-----
- sbit lcd_rs=P0^6;
- sbit lcd_en=P0^7;
- //------超聲波引腳-------
- sbit Tx=P3^3; //觸發(fā)控制信號輸入
- sbit Rx=P3^2; //回響信號輸出
- uchar xuehao[]={" 17110201138 "};
- uchar xingming[]={"NAME:zhaolongda"};
- uchar code table[]={" Distance Test:"}; //LCD第一行顯示
- uchar temp_dis[]= {" 000.0 cm"}; //LCD第二行
- long int t,distance;
- uchar cache[4]={0,0,0,0};
- //--------延時(shí)-------
- void delay(uint ms)
- {
- uint t;
- while(ms--)
- for(t=0;t<30;t++);
- }
- void write_com(uchar com);//init_lcd()函數(shù)需要用到,所以先提前聲明
- //************LCD1602初始化函數(shù)************************
- void init_lcd()
- {
- write_com(0x38); //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
- write_com(0x08); //寫一個(gè)字符后地址指針加1
- write_com(0x01); //顯示清零,數(shù)據(jù)指針清零
- write_com(0x06); //寫一個(gè)字符后地址指針加1
- write_com(0x0c); //關(guān)顯示,光標(biāo)不顯示不閃爍
- }
- //************LCD1602寫指令函數(shù)************************
- void write_com(uchar com) //lcd1602寫指令:rs低電平,rw低電平,en從高電平變?yōu)榈碗娖?li>{
- delay(5);
- lcd_rs = 0; // 選擇寫指令
- lcd_en = 0; // 將使能端置0
- P2 = com; // 將要寫的命令送到數(shù)據(jù)總線上
- delay(5); // 延時(shí)5ms,待數(shù)據(jù)穩(wěn)定
- lcd_en = 1; // 由于初始化已將lcd_en置為0,使能端給一個(gè)高脈沖,
- delay(5); // 延時(shí)5ms,待數(shù)據(jù)穩(wěn)定
- lcd_en = 0; // 將使能端置0以完成脈沖
- }
- //************LCD1602寫數(shù)據(jù)函數(shù)************************
- void write_data(uchar date)//lcd1602寫數(shù)據(jù):rs高電平,rw低電平,en從高電平變低電平
- {
- delay(5);
- lcd_rs = 1; // 選擇寫數(shù)據(jù)
- lcd_en = 0; // 將使能端置0
- P2 = date; // 將要寫的數(shù)據(jù)送到數(shù)據(jù)總線上
- delay(5); // 延時(shí)5ms,待數(shù)據(jù)穩(wěn)定
- lcd_en = 1; // 由于初始化已將lcd_en置為0,使能端給一個(gè)高脈沖,
- delay(5); // 延時(shí)5ms,待數(shù)據(jù)穩(wěn)定
- lcd_en = 0; // 將使能端置0以完成脈沖
- }
- //************LCD1602顯示函數(shù)******************
- void lcd1602_display(uchar *q,uchar *p)//*通過指針p和q分別指向兩個(gè)數(shù)組的第一個(gè)數(shù),然后進(jìn)行數(shù)組掃描顯示,一次性顯示兩行字符
- {
- write_com(0x80); // 現(xiàn)將數(shù)據(jù)指針定位到第一行第一個(gè)字處
- while(*q!='\0')
- {
- write_data(*q);
- q++;
- delay(1);
- }
- write_com(0xc0); // 現(xiàn)將數(shù)據(jù)指針定位到第二行第一個(gè)字處
- while(*p!='\0')
- {
- write_data(*p);
- p++;
- delay(1);
- }
- }
- //************LCD1602顯示歡迎函數(shù)******************
- void welcome() //掃描顯示學(xué)號加姓名,幾秒延時(shí)后結(jié)束
- {
- init_lcd();
- lcd1602_display(xuehao,xingming);
- delay(200);
- }
- void HC05_Init() //超聲波模塊初始化函數(shù)
- {
- Tx=1; //觸發(fā)脈沖
- NOP();NOP();NOP();NOP();
- Tx=0;
- distance=0.1725*t; //距離計(jì)算
- }
- void distance_convert(long int dat) //距離計(jì)算函數(shù)
- {
- cache[0]=dat/1000;
- cache[1]=dat/100%10;
- cache[2]=dat/10%10;
- cache[3]=dat%10;
- temp_dis[4]=cache[0]+'0';
- temp_dis[5]=cache[1]+'0';
- temp_dis[6]=cache[2]+'0';
- temp_dis[8]=cache[3]+'0';
- }
- //------------主程序-----------
- void main()
- {
- welcome();
- init_lcd();
- delay(5);
- TMOD=0x09; //定時(shí)器T0工作方式1 GATE0=1
- EA=1; //開總中斷
- TR0=1; //啟動(dòng)定時(shí)器
- EX0=1; //開外部中斷
- IT0=1; //設(shè)置為下降沿中斷方式
- while(1)
- {
- HC05_Init();
- distance_convert(distance);
- lcd1602_display(table,temp_dis);
- }
- }
- //外部中斷0
- void int0() interrupt 0
- {
- t=(TH0*256+TL0); //計(jì)算高電平持續(xù)的時(shí)間,上升沿到來時(shí)候開始計(jì)時(shí),下降沿到來進(jìn)入外部中斷,關(guān)閉計(jì)時(shí)器,停止計(jì)時(shí)
- TH0=0;
- TL0=0;
- }
|