以前写过的一个东西 有三档调节 可以报警
#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
|