以前寫過的一個東西 有三檔調節 可以報警
#include <reg52.H> #include <intrins.H> #include <math.H> #define uchar unsigned char #define uint unsigned int sbit led1 = P1^2; sbit OUTPUT = P3^2; //電機驅動位1 sbit OUTPUT_0 = P3^3; //電機驅動位2 sbit RS = P1^1; //LCD命令及指令聲明 sbit LCDEN = P1^0; //LCD信號使能端聲明 sbit set_warn_temp = P1^4; //設置報警溫度 sbit KEY_F_UP = P1^5; //頻率上調按鈕; sbit KEY_F_DOWN = P1^6; //頻率下調按鈕; sbit KEY_F_auto = P1^7; //智能與手動轉換調速位 int feq,flag_c = 1,flag_auto = 1; //頻率初值相關位、檔位標志位、智能與手動轉換調速位轉換標志位 uint temp_2,warn_temp = 28; //提取溫度 void delayMs(uint a) //毫秒延時函數 { uint i, j; for(i = a; i > 0; i--) for(j = 100; j > 0; j--); } void t_init() //定時器初始化 { TMOD=0x01; //定時器0和定時器1都工作在方式1,16位計數器; TH0 = 1000/256; TL0 = 1000%256; ET0 = 1; EA = 1; TR0 = 1; } void key_scan() //按鍵掃描 { if(set_warn_temp == 0) //頻率上調鍵按下; { delayMs(5); if(set_warn_temp == 0) //增大檔位 { warn_temp++; while(set_warn_temp == 0); } } if(KEY_F_UP == 0) //頻率上調鍵按下; { delayMs(5); if(KEY_F_UP == 0) //增大檔位 { flag_c++; if(flag_c > 3) flag_c = 3; while(KEY_F_UP == 0); } } else if(KEY_F_DOWN == 0) //減小檔位 { delayMs(5); if(KEY_F_DOWN == 0) { flag_c--; if(flag_c < 0) flag_c = 0; while(KEY_F_DOWN == 0); } } else if(KEY_F_auto == 0) //智能與手動轉換; { delayMs(5); if(KEY_F_auto == 0) { flag_auto = ~flag_auto; while(KEY_F_auto == 0); } } } void flag_auto_change() //檔位隨溫度智能轉換 { if(flag_auto == 1) { if(temp_2< 25) { flag_c = 0; } else if((temp_2>=27) && (temp_2<=29)) { flag_c=1; } elseif((temp_2 >= 30) && (temp_2 <= 32)) { flag_c = 2; } elseif((temp_2 >= 33 )&&( temp_2 <= 34) ) { flag_c = 3; } } } void flag_feq() //檔位標志位與頻率的轉換 { if(flag_c == 0) { TR0 = 0; OUTPUT = 0; } else { TR0 = 1; switch(flag_c) { case 1: feq = 63000; break; case 2: feq = 33000; break; case 3: feq = 13000; break; default: break; } } } void timer0() interrupt 1 //定時器中斷函數 { TH0 = (65536-feq)/256; TL0 = (65536-feq)%256; //TR1=1; //開定時器1; OUTPUT = ~OUTPUT; } //LCD部分 void delayUs() //毫秒延時函數 { _nop_(); } void writeComm(uchar comm) //LCD命令函數 { RS = 0; P2 = comm; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(1); } void writeData(uchar dat) //寫數據:RS=1,RW=0; { RS = 1; P2 = dat; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(1); } voidinit() //LCD初始化 { // dula = wela = 0; writeComm(0x38); writeComm(0x0c); writeComm(0x06); writeComm(0x01); } void writeString(uchar * str, uchar length) //送字符函數 { uchar i; for(i = 0; i < length; i++) { writeData(str); } } /**//*****************************DS18B20溫度部分*******************************/ sbitds = P3^7; //溫度計IO引腳 void dsInit() { unsigned int i; ds = 0; i= 100; while(i>0) i--; ds = 1; i= 4; while(i>0) i--; } void dsWait() { unsigned int i; while(ds); while(~ds); i = 4; while(i > 0) i--; } bit readBit() { unsigned int i; bit b; ds = 0; i++; ds = 1; i++; i++; b= ds; i= 8; while(i>0) i--; return b; } unsigned char readByte() { unsigned int i; unsigned char j, dat; dat = 0; for(i=0; i<8; i++) { j = readBit(); dat = (j << 7) | (dat >> 1); } return dat; } void writeByte(unsigned char dat) { unsigned int i; unsigned char j; bit b; for(j = 0; j < 8; j++) { b = dat & 0x01; dat >>= 1; if(b) { ds = 0; i++; i++; ds = 1; i = 8; while(i>0)i--; } else { ds = 0; i = 8; while(i>0) i--; ds = 1; i++; i++; } } } void sendChangeCmd() { dsInit(); writeByte(0xcc); writeByte(0x44); } void sendReadCmd() { dsInit(); writeByte(0xcc); writeByte(0xbe); } int getTmpValue() { unsigned int tmpvalue; int value; float t; unsigned char low, high; sendReadCmd(); low = readByte(); high = readByte(); tmpvalue = high; tmpvalue <<= 8; tmpvalue |= low; value = tmpvalue; \ t= value * 0.0625; \ value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0減0.5 return value; } void display(int v) //LCD顯示函數 { uinta,b; unsigned char count; unsigned char datas[] = {0, 0, 0, 0, 0}; unsigned int tmp = abs(v); uchar table[] = "warning"; uchar table1[] = "safe "; datas[0] = tmp / 10000; datas[1] = tmp % 10000 / 1000; datas[2] = tmp % 1000 / 100; datas[3] = tmp % 100 / 10; datas[4] = tmp % 10; a= datas[2]; b= datas[1]; temp_2= b * 10 + a; if(temp_2 > warn_temp) { writeComm(0x80+ 9); writeString(table, 7); } if(temp_2 <= warn_temp) { writeComm(0x80 + 9); writeString(table1, 7); } writeComm(0x80+0x40); if(v < 0) { writeString("- ", 2); } else { writeString("+ ", 2); } if(datas[0] != 0) { writeData('0' + datas[0]); } for(count = 1; count != 5; count++) { writeData('0' + datas[count]); if(count == 2) { writeData('.'); } } flag_auto_change(); //檔位隨溫度智能轉換 writeComm(0x80+ 6); writeData(0x30 + flag_c); writeComm(0x80+ 0x40 + 13); writeData(0x30 + warn_temp / 10); writeData(0x30+ warn_temp % 10); } /*************************主函數部分***********************/ void main() { uchartable_lev[] = "level:" ; uchartable_set[] = "set:" ; sendChangeCmd(); init(); //LCD初始化 t_init(); //定時器初始化 OUTPUT_0= 0; //給電機驅動一端始終賦零 writeComm(0x80); writeString(table_lev, 6); writeComm(0x80 + 0x40 + 9); writeString(table_set, 4); while(1) { delayMs(1000); //溫度轉換時間需要750ms以上 key_scan(); //按鍵掃描 display(getTmpValue()); //顯示 flag_feq(); //檔位標志位與頻率的轉換 sendChangeCmd(); } } file:///C:/Users/Liu/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
|