stc89c52單片機+lcd1602+srf04超聲波傳感器+DS18B20溫度傳感器+無源蜂鳴器
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #include<math.h>
- #include"lcd.h"
- #include"temp.h"
- /*??????*/
- sbit Trig = P2^1;//??????????
- sbit Echo = P2^0;
- sbit DQ=P3^7; //?????
- sbit beep=P1^5; //???
- sbit key_up=P3^2;//????0?????
- sbit key_down=P3^3;//????1?????
- /*????????*/
- /*?????????*/
- unsigned char mes_temp[]="T:";//lcd???????
- unsigned char mes_dis[]="S:";
- unsigned char mes_alarmDis[]="aS:";
- unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
- /*??????*/
- float time=0;//??
- float temp;//??
- uint S=0;//??
- uint alarm_distance = 10;//????
- bit flag =0;//???????
- bit flag_temp =0;//?????? 0???,1???
- uchar disbuff[4]= { 0,0,0,0};//???????
- uchar temps[] = { 0, 0, 0, 0};//????
- uchar alarm_distances[] = { 0, 0};//??????
- /*****????****/
- void delay(uchar n){//10us
- while(n--);
- }
- void delayms(unsigned int ms){//1ms
- unsigned char i=100,j;
- for(; ms; ms--){
- while(--i){
- j=10;
- while(--j);
- }
- }
- }
- /****????*****/
- void Conut(void)
- {
- uint i=0;//????,????????????
- float v;//?????
- /*****????*****/
- time=TH0*256+TL0;//??,us
- TL0=0;//??????,???????
- TH0=0;
- if(flag_temp == 1)//????(??0)
- v=332+temp*0.6;//???????????? m/s
- else//?????
- v=332-temp*0.6;//???????????? m/s
- /* ????m/s???cm/us
- v:m/s ----> ????0.5 0.5*v*100cm/1000 000us ----> v/20 000 cm/us
- S=time*v ----> ???????
- time/100 v/200 ???????????*/
- time=time/100;
- v=v/200;
- S=time*v;//????
- /*****??????*****/
- /*****????,??????*****/
- //?????????
- LcdWriteCom(0x80+0x42);//???????2??? ????????0x80+0x40
- if((S>=700)||flag==1) {//???????? ??????700cm ??????
- flag=0;//?????????
- while(i<1200){//????
- beep = ~beep;
- delay(100);
- i++;
- }//???????????
- i=0;//???????
- beep = 0;
- //LCD????? -.--M
- LcdWriteData(ASCII[11]);//-
- LcdWriteData(ASCII[10]);//.
- LcdWriteData(ASCII[11]);//-
- LcdWriteData(ASCII[11]);//-
- LcdWriteData( ASCII[12]);//M
- }
- else //?????? ? 68cm --> 0.68M
- {
- if(S<alarm_distance){
- while(i<1200){//????
- beep = ~beep;
- delay(100);
- i++;
- }//???????????
- i=0;//???????
- beep = 0;
- }
- beep = 0;//??????
- disbuff[0]=S/100; //??
- disbuff[1]=S%100/10; //??
- disbuff[2]=S%10 %10; //??
- LcdWriteData(ASCII[disbuff[0]]);//0
- LcdWriteData(ASCII[10]); //.
- LcdWriteData(ASCII[disbuff[1]]);//6
- LcdWriteData(ASCII[disbuff[2]]);//8
- LcdWriteData(ASCII[12]); //M
- }
- LcdWriteCom(0x80+0x48);//??????
- for(i = 0 ; i < 3; i++)
- LcdWriteData(mes_alarmDis[i]);//aS:
- alarm_distances[0]=alarm_distance%100/10; //??
- alarm_distances[1]=alarm_distance%10 %10; //??
- for(i = 0 ; i < 2; i++){
- LcdWriteData(ASCII[alarm_distances[i]]);
- if(i == 1){
- LcdWriteData('c');
- LcdWriteData('m');
- }
- }
- }
- /****??????***/
- void T0_OVERFLOW() interrupt 1 //T0?????????,??????
- {
- flag=1;
- }
- void alarm_distance_up() interrupt 0 {//0?????0????
- alarm_distance +=5;
- }
- void alarm_distance_down() interrupt 2 {//2?????1????
- if(alarm_distance > 5)
- alarm_distance -=5;
- }
- /****???????****/
- void StartModule(){
- uchar i;//????
- Trig=1;//??????
- for(i=10; i>0; i--)
- _nop_(); //??10????,??
- Trig=0;
- }
- /***??????*/
- void temp_deal(int t){
- uchar i;//????
- float tp;//??????????
- uint ttp;
- if(t< 0){//?????
- flag_temp = 0;
- LcdWriteCom(0x82);//2???????
- LcdWriteData('-');
- //?????????????,????
- //?????
- t=t-1;
- t=~t;
- tp=t;
- //? 27.123 ---> 2712.3+0.5 --->2712
- ttp=tp*0.0625*100+0.5;
- temp = ttp/100;
- }
- else{
- flag_temp = 1;
- if(t > 0){
- LcdWriteCom(0x82);
- LcdWriteData('+');
- }
- tp=t;//?????????
- ttp=tp*0.0625*100+0.5;
- temp = ttp/100;
- }
- //2712/1000 -> 2
- temps[0] = ttp / 1000;
- //2712%1000 -->712 712/100-->7
- temps[1] = ttp % 1000 / 100;
- //2712%100 --> 12 12/10 -->1
- temps[2] = ttp % 100 / 10;
- temps[3] = ttp % 10;//2712%10 --> 2
- LcdWriteCom(0x83);
- for(i =0; i < 4;i++){
- if(i==2)
- LcdWriteData(ASCII[10]);
- LcdWriteData(ASCII[temps[i]]);
- }
- LcdWriteData(' ');
- LcdWriteData('C');
- }
- /*???*/
- void main(void){
- uchar i; //for?????
- TMOD=0x01; //??????
- TH0=0; TL0=0;//???0??
- IT0=1; IT1=1;//????0,1?????
- ET0=1; //??T0??
- EX0=1; EX1=1;//??????0,1
- EA=1; //????
- LcdInit(); //???1602
- LcdWriteCom(0x80);//???????
- for(i=0; i<2; i++)
- LcdWriteData(mes_temp[i]);//T:
- LcdWriteCom(0x80+0x40);//??????????
- for(i=0; i<2; i++)
- LcdWriteData(mes_dis[i]);//S:
- while(1){
- //?????????
- temp_deal(Ds18b20ReadTemp());
- StartModule();//???????
- while(!Echo); //echo=1???
- TR0=1; //????
- while(Echo); //echo=0???
- TR0=0; //????
- Conut(); //???????
- delayms(80); //??80ms
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
UltrasonicDistanceMeasurementSystem-master.zip
(148.28 KB, 下載次數(shù): 172)
2020-6-1 22:01 上傳
點擊文件名下載附件
|