這是具體C語言文字,問下 S=(time*1.87)/10; 這是怎么轉換計算的,而且現在液晶顯示屏顯示的S是傳感器到液位的距離,怎么填寫C語言轉換成為液位的液面高度。急急急- #include<reg52.h>
- #include <intrins.h>
- #include "LCD1602.h"
- #include "STCEEPROM.h"
- sbit RX = P3^6; //定義超聲波端口
- sbit TX = P3^7;
- sbit LED = P2^0; //LED
- sbit SPEAK = P2^1; //蜂鳴器
- sbit Motor = P2^2; //水泵
- sbit KEY1 = P1^3; //設置按鍵
- sbit KEY2 = P1^4; //加按鍵
- sbit KEY3 = P1^5; //減按鍵
- unsigned int time=0;//計時變量
- unsigned int timer=0;//計時變量
- unsigned int S=0;//當前值
- unsigned int SET_H=100,SET_L=10;//最高值和最低值
- bit flag =0; //測量標志位
- unsigned char Table[3],Table1[5];//顯示數組
- unsigned char KEY_flag=0; //按鍵選擇標志
- //延時函數
- void Delay_ms(int jj) //延時函數
- {
- int ii; //延時變量
- while(jj--)//延時n毫秒
- for(ii=0;ii<116;ii++);//延時1毫秒
- }
- void Conut(void) //測量函數
- {
- time=TH0*256+TL0; //距離計數
- TH0=0; //定時器清零
- TL0=0; //定時器清零
- S=(time*1.87)/10; //算出來是CM、轉換
- if((S>=700)||flag==1) //超出測量范圍顯示“-”
- {
- flag=0; //數據無效標志
- }
- else
- {
- Table1[0]= S/1000+0X30; //顯示當前值
- Table1[1]= S/100%10+0X30; //顯示當前值
- Table1[2]= S/10/10+0X30; //顯示當前值
- Table1[3]= '.'; //顯示當前值
- Table1[4]= S%10+0X30; //顯示當前值
- LCD1602_Disp_ZF(0x88,Table1,5); //顯示當前值
- }
- }
- void main(void) //主函數
- {
- LCD1602_init();//液晶初始化
- //////////////////////0123456789ABCDEF
- LCD1602_Disp_ZF(0x80," Now S: CM ",16);
- //0123456789ABCDEF
- LCD1602_Disp_ZF(0x80+0X40,"Set H: L: ",16);
- TMOD=0x11; //設T0為方式1,GATE=1;
- TH0=0; //定時器清零
- TL0=0; //定時器清零
- TH1=0xf8; //2MS定時
- TL1=0x30; //2MS定時
- ET0=1; //允許T0中斷
- ET1=1; //允許T1中斷
- TR1=1; //開啟定時器
- EA=1; //開啟總中斷
- EA=0;//關閉中斷
- SET_H = ISP_READ(0x2c00)*256+ISP_READ(0x2c01);//讀取存儲的最大值
- SET_L = ISP_READ(0x2c02)*256+ISP_READ(0x2c03);//讀取存儲的最小值
- EA=1; //開啟總中斷
- while(1)//函數循環
- {
- while(!RX); //當RX為零時等待
- TR0=1; //開啟計數
- while(RX); //當RX為1計數并等待
- TR0=0; //關閉計數
- Conut(); //計算顯示距離函數
- /////////////////////////////////////
- if((S/10>SET_H)||(S/10>SET_H)) //水位過低過高報警,
- {
- LED=0;SPEAK=0; //報警
- }
- else
- {
- LED=1;SPEAK=1; //不報警
- }
- ////////////////////////////////
- if((S/10>SET_H)) //水位過低打開水泵
- {
- Motor; //打開
- }
- else
- {
- LED=1;SPEAK=1; //關閉
- }
- if(!KEY1) //切換設置最大值和最小值
- {
- Delay_ms(10);//延時去抖動
- if(!KEY1)//切換設置最大值和最小值
- {
- KEY_flag++; //模式選擇
- ISP_ERASE(0x2c00); //注意:字節編程時必須要先要擦除整個扇區
- ISP_PROGRAM(0x2c00, SET_H/256); //記憶存儲
- ISP_PROGRAM(0x2c01, SET_H);//記憶存儲
- ISP_PROGRAM(0x2c02, SET_L/256);//記憶存儲
- ISP_PROGRAM(0x2c03, SET_L); //記憶存儲
- }
- while(!KEY1);//等待按鍵抬起
- }
- if(!KEY2)//設置加
- {
- Delay_ms(10);//延時去抖動
- if(!KEY2) //設置加
- {
- if(KEY_flag%2==0)SET_H++; //設置加
- if(KEY_flag%2==1)SET_L++; //設置加
- }
- }
- if(!KEY3) //設置減
- {
- Delay_ms(10);//延時去抖動
- if(!KEY3) //設置減
- {
- if(KEY_flag%2==0)SET_H--; //設置減
- if(KEY_flag%2==1)SET_L--;//設置減
- }
- }
- Table[0]= SET_H/100+0X30;//顯示最大值
- Table[1]= SET_H%100/10+0X30;
- Table[2]= SET_H%10+0X30;
- LCD1602_Disp_ZF(0x86+0x40,Table,3);
- Table[0]= SET_L/100+0X30; //顯示最小值
- Table[1]= SET_L%100/10+0X30;
- Table[2]= SET_L%10+0X30;
- LCD1602_Disp_ZF(0x8C+0x40,Table,3);
- }
- }
- /********************************************************/
- void zd0() interrupt 1 //T0中斷用來計數器溢出,超過測距范圍
- {
- flag=1; //中斷溢出標志
- }
- /********************************************************/
- void zd3() interrupt 3
- {
- TH1=0xf8;//2毫秒定時初始化
- TL1=0x30;//2毫秒定時初始化
- timer++;//計數
- if(timer>=100)//計數100次,200毫秒
- {
- timer=0;
- TX=1; //200MS 啟動一次模塊
復制代碼
|