|
#include <reg52.h> #include <stdio.h> #include <math.h> #include "1602.h" #include "delay.h" sbit TRIG = P1^0 ; sbit ECHO = P1^1 ; sbit TRIG1 = P1^2 ; sbit ECHO1 = P1^3 ; unsigned char DisTempData[16],TempData[16]; /*------------------------------------------------ 定時器初始化 ------------------------------------------------*/ void TIM0init(void) { TMOD=0x11;//定時器0,1工作方式1 TH0=0x00; TL0=0x00; TH1=0x00; TL1=0x00; ET0=1; ET1=1; EA=1; } /*------------------------------------------------ 主函數(shù) ------------------------------------------------*/ main() { float S; //距離變量 float c; //距離變量 TIM0init(); //初始化定時器0 LCD_Init(); //初始化LCD // LCD_Write_String(0,1,"LY-UR04 demo"); while(1) { TRIG=1; //觸發(fā)信號是高電平脈沖,寬度大于10us DelayUs2x(10); TRIG=0; while(!ECHO); //等待高電平 TR0=1; while(ECHO); //等待低電平 TR0=0; S=TH0*256+TL0;//取出定時器值高8位和低8位合并 S=S/58; //為什么除以58等于厘米, Y米=(X秒*344)/2 // X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58 TH0=0; TL0=0; //清除定時器0寄存器中的值 sprintf(DisTempData,"S=%6.2f CM ",S);//打印輸出結(jié)果 LCD_Write_String(0,0,DisTempData); //在液晶屏上顯示 // DelayMs(250); //延時決定采樣速度 TRIG1=1; //觸發(fā)信號是高電平脈沖,寬度大于10us DelayUs2x(10); TRIG1=0; while(!ECHO1); //等待高電平 TR1=1; while(ECHO1); //等待低電平 TR1=0; c=TH1*256+TL1;//取出定時器值高8位和低8位合并 c=c/58; //為什么除以58等于厘米, Y米=(X秒*344)/2 // X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58 TH1=0; TL1=0; //清除定時器0寄存器中的值 sprintf(TempData,"c=%6.2f CM ",c);//打印輸出結(jié)果 LCD_Write_String(0,1,TempData); //在液晶屏上顯示 DelayMs(250); //延時決定采樣速度 } } /*------------------------------------------------ 定時器中斷子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 { ECHO=0; } /*------------------------------------------------ 定時器1中斷子程序 ------------------------------------------------*/ void Timer1_isr(void) interrupt 3 { ECHO1=0; } -------------------------1602顯示程序---------------------------- #include "1602.h" #include "delay.h" #define CHECK_BUSY//是否使用判斷忙語句條件,后面使用條件編譯 sbit RS = P2^4; //定義端口 sbit RW = P2^5; sbit EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P0 /*------------------------------------------------ 判忙函數(shù) ------------------------------------------------*/ bit LCD_Check_Busy(void) { #ifdef CHECK_BUSY DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); #else return 0; #endif } /*------------------------------------------------ 寫入命令函數(shù) ------------------------------------------------*/ void LCD_Write_Com(unsigned char com) { while(LCD_Check_Busy()); //忙則等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; } /*------------------------------------------------ 寫入數(shù)據(jù)函數(shù) ------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) { while(LCD_Check_Busy()); //忙則等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; } /*------------------------------------------------ 清屏函數(shù) ------------------------------------------------*/ /*void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5); }*/ /*------------------------------------------------ 寫入字符串函數(shù) ------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { while (*s) { LCD_Write_Char(x,y,*s); s ++; x++; } } /*------------------------------------------------ 寫入字符函數(shù) ------------------------------------------------*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } LCD_Write_Data( Data); } /*------------------------------------------------ 初始化函數(shù) ------------------------------------------------*/ void LCD_Init(void) { LCD_Write_Com(0x38); /*顯示模式設(shè)置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*顯示關(guān)閉*/ LCD_Write_Com(0x01); /*顯示清屏*/ LCD_Write_Com(0x06); /*顯示光標(biāo)移動設(shè)置*/ DelayMs(5); LCD_Write_Com(0x0C); /*顯示開及光標(biāo)設(shè)置*/ } -----------------------------延時程序------------------------------- #include "delay.h" /*------------------------------------------------ uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值 unsigned char 是定義無符號字符變量,其值的范圍是 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時 長度如下 T=tx2+5 uS ------------------------------------------------*/ void DelayUs2x(unsigned char t) { while(--t); } /*------------------------------------------------ mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值 unsigned char 是定義無符號字符變量,其值的范圍是 0~255 這里使用晶振12M,精確延時請使用匯編 ------------------------------------------------*/ void DelayMs(unsigned char t) { while(t--) { //大致延時1mS DelayUs2x(245); DelayUs2x(245); } } |
|