51单片机智能风扇点阵显示温度及按键控制程序(3)
- 格式:doc
- 大小:75.50 KB
- 文档页数:15
基于51单片机的温控风扇程序#include //调用单片机头文件#define uchar unsigned char //无符号字符型宏定义变量范围0~255#define uint unsigned int //无符号整型宏定义变量范围0~65535#include "eeprom52.h"//数码管段选定义 0 1 2 3 4 5 6 7 8 9uchar code smg_du[]={0x28,0xee,0x42,0x52,0xe5,0xa8,0x41,0xe7,0x20,0xa0, 0x60,0x25,0x39,0x26,0x31,0x71,0xff}; //断码//数码管位选定义uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};uchar dis_smg[8] = {0x28,0xee,0x32,0xa2,0xe4,0x92,0x82,0xf8};uchar smg_i = 3; //显示数码管的个位数sbit dq = P2^4; //18b20 IO口的定义bit flag_lj_en; //按键连加使能bit flag_lj_3_en; //按键连3次连加后使能加的数就越大了uchar key_time,key_value; //用做连加的中间变量bit key_500ms ;sbit pwm = P2^3;uchar f_pwm_l ; //越小越暗uint temperature ; //bit flag_300ms ;uchar menu_1; //菜单设计的变量uint t_high = 300,t_low = 100; //温度上下限报警值/***********************1ms延时函数*****************************/void delay_1ms(uint q){uint i,j;for(i=0;i<q;i++)for(j=0;j<120;j++);}/***********************小延时函数*****************************/void delay_uint(uint q){while(q--);}/***********************数码显示函数*****************************/void display(){static uchar i;i++;if(i >= smg_i)i = 0;P1 = 0xff; //消隐P3 = smg_we[i]; //位选P1 = dis_smg[i]; //段选}/******************把数据保存到单片机内部eepom中******************/void write_eeprom(){SectorErase(0x2000);byte_write(0x2000, t_high % 256);byte_write(0x2001, t_high / 256);byte_write(0x2002, t_low % 256);byte_write(0x2003, t_low / 256);byte_write(0x2055, a_a);}/******************把数据从单片机内部eepom中读出来*****************/void read_eeprom(){t_high = byte_read(0x2001);t_high <<= 8;t_high |= byte_read(0x2000);t_low = byte_read(0x2003);t_low <<= 8;t_low |= byte_read(0x2002);a_a = byte_read(0x2055);}/**************开机初始化保存的数据*****************/void init_eeprom()read_eeprom(); //先读if(a_a != 22) //新的单片机初始单片机内问eeprom{t_high = 320;t_low = 280;a_a = 22;write_eeprom(); //保存数据}}/***********************18b20初始化函数*****************************/void init_18b20(){bit q;dq = 1; //把总线拿高delay_uint(1); //15usdq = 0; //给复位脉冲delay_uint(80); //750usdq = 1; //把总线拿高等待delay_uint(10); //110usq = dq; //读取18b20初始化信号delay_uint(20); //200usdq = 1; //把总线拿高释放总线}/*************写18b20内的数据***************/void write_18b20(uchar dat)uchar i;for(i=0;i<8;i++)</q;i++){ //写数据是低位开始dq = 0; //把总线拿低写时间隙开始dq = dat & 0x01; //向18b20总线写数据了delay_uint(5); // 60usdq = 1; //释放总线dat >>= 1;}}/*************读取18b20内的数据***************/ uchar read_18b20(){uchar i,value;for(i=0;i<8;i++){dq = 0; //把总线拿低读时间隙开始value >>= 1; //读数据是低位开始dq = 1; //释放总线if(dq == 1) //开始读写数据value |= 0x80;delay_uint(5); //60us 读一个时间隙最少要保持60us的时间}return value; //返回数据}/*************读取温度的值读出来的是小数***************/uint read_temp(){uint value;uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序init_18b20(); //初始化18b20EA = 0;write_18b20(0xcc); //跳过64位ROMwrite_18b20(0x44); //启动一次温度转换命令EA = 1;delay_uint(50); //500usinit_18b20(); //初始化18b20EA = 0;write_18b20(0xcc); //跳过64位ROMwrite_18b20(0xbe); //发出读取暂存器命令low = read_18b20(); //读温度低字节value = read_18b20(); //读温度高字节EA = 1;value <<= 8; //把温度的高位左移8位value |= low; //把读出的温度低位放到value的低八位中value *= 0.625; //转换到温度值小数return value; //返回读出的温度带小数}/*************定时器0初始化程序***************/void time_init(){EA = 1; //开总中断TMOD = 0X11; //定时器0、定时器1工作方式1 ET0 = 1; //开定时器0中断TR0 = 1; //允许定时器0定时ET1 = 1; //开定时器0中断TR1 = 0; //允许定时器0定时}/********************独立按键程序*****************/ uchar key_can; //按键值void key() //独立按键程序{static uchar key_new;key_can = 20; //按键值还原P2 |= 0x07;if((P2 & 0x07) != 0x07) //按键按下{if(key_500ms == 1) //连加{key_500ms = 0;key_new = 1;}delay_1ms(1); //按键消抖动if(((P2 & 0x07) != 0x07) && (key_new == 1)) { //确认是按键按下key_new = 0;switch(P2 & 0x07){case 0x06: key_can = 3; break; //得到k2键值case 0x05: key_can = 2; break; //得到k3键值case 0x03: key_can = 1; break; //得到k4键值}flag_lj_en = 1; //连加使能}}else{if(key_new == 0){key_new = 1;write_eeprom(); //保存数据flag_lj_en = 0; //关闭连加使能flag_lj_3_en = 0; //关闭3秒后使能key_value = 0; //清零key_time = 0;key_500ms = 0;}}}/****************按键处理数码管显示函数***************/ void key_with(){if(key_can == 1) //设置键{f_pwm_l =30;menu_1 ++;if(menu_1 >= 3){menu_1 = 0;smg_i = 3; //数码管显示3位}}if(menu_1 == 1) //设置高温报警{smg_i = 4; //数码管显示4位if(key_can == 2){if(flag_lj_3_en == 0)t_high ++ ; //按键按下未松开自动加三次elset_high += 10; //按键按下未松开自动加三次之后每次自动加10 if(t_high > 990)t_high = 990;}if(key_can == 3){if(flag_lj_3_en == 0)t_high -- ; //按键按下未松开自动减三次elset_high -= 10; //按键按下未松开自动减三次之后每次自动减10 if(t_high <= t_low)t_high = t_low + 1;}dis_smg[0] = smg_du[t_high % 10]; //取小数显示dis_smg[1] = smg_du[t_high / 10 % 10] & 0xdf; //取个位显示dis_smg[2] = smg_du[t_high / 100 % 10] ; //取十位显示dis_smg[3] = 0x64; //H}if(menu_1 == 2) //设置低温报警{smg_i = 4; //数码管显示4位if(key_can == 2){if(flag_lj_3_en == 0)t_low ++ ; //按键按下未松开自动加三次elset_low += 10; //按键按下未松开自动加三次之后每次自动加10 if(t_low >= t_high)t_low = t_high - 1;}if(key_can == 3){if(flag_lj_3_en == 0)t_low -- ; //按键按下未松开自动减三次elset_low -= 10; //按键按下未松开自动加三次之后每次自动加10 if(t_low <= 10)t_low = 10;}dis_smg[0] = smg_du[t_low % 10]; //取小数显示dis_smg[1] = smg_du[t_low / 10 % 10] & 0xdf; //取个位显示dis_smg[2] = smg_du[t_low / 100 % 10] ; //取十位显示dis_smg[3] = 0x3D; //L}}/****************风扇控制函数***************/void fengshan_kz(){// static uchar value;if(temperature >= t_high) //风扇全开{TR1 = 1;pwm = 0;}else if((temperature < t_high) && (temperature >= t_low)) //风扇缓慢{f_pwm_l = 60;TR1 = 1;}else if(temperature < t_low) //关闭风扇{TR1 = 0;pwm = 1;}}/****************主函数***************/void main(){time_init(); //初始化定时器temperature = read_temp(); //先读出温度的值init_eeprom(); //开始初始化保存的数据delay_1ms(650);temperature = read_temp(); //先读出温度的值dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示f_pwm_l = 50;while(1){key(); //按键程序if(key_can < 10){key_with(); //设置报警温度}if(flag_300ms == 1) //300ms 处理一次温度程序{flag_300ms = 0;temperature = read_temp(); //先读出温度的值if(menu_1 == 0){smg_i = 3;dis_smg[0]= smg_du[temperature % 10]; //取温度的小数显示dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示}fengshan_kz(); //风扇控制函数}}/*************定时器0中断服务程序***************/ void time0_int() interrupt 1{static uchar value; //定时2ms中断一次TH0 = 0xf8;TL0 = 0x30; //2msdisplay(); //数码管显示函数value++;if(value >= 150){value = 0;flag_300ms = 1;}if(flag_lj_en == 1) //按下按键使能{key_time ++;if(key_time >= 250) //500ms{key_time = 0;key_500ms = 1; //500mskey_value ++;if(key_value > 3){key_value = 10;flag_lj_3_en = 1; //3次后1.5秒连加大些}}}/*******************定时器1用做单片机模拟PWM 调节***********************/void Timer1() interrupt 3 //调用定时器1{static uchar value_l;TH1=0xfe; // 定时10ms中断一次TL1=0x0c; //500usif(pwm==1){value_l+=3;if(value_l > f_pwm_l) //高电平{value_l=0;if(f_pwm_l != 0)pwm=0;}}else{value_l+=3;if(value_l > 100 - f_pwm_l) //低电平{value_l=0;pwm=1;} }。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit du=P2^0;sbit we=P2^1;sbit LCD_RS = P3^5;sbit LCD_RW = P3^6;sbit LCD_EN = P3^4;sbit LCD_PSB = P3^7;sbit dianji=P1^7;sbit jia=P3^0;sbit jian=P3^1;sbit in1=P1^4;sbit in2=P1^5;sbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uint temp;float tt;uchar num=0;show=1;gao=1;di=3;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39} ;uchar code hang3[]= {"当前温度:"};uchar code hang4[]= {"度"};uchar code hang5[]= {"当前档位:"};uchar code hang6[]= {"档"};void delay(uint i){while(i--);}void yan(uchar z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uint temp1){uchar shi,ge,wei;shi=temp1/100;ge=temp1%100/10;wei=temp1%10;P0=table[shi]; //十位;dula=1;dula=0;P0=0xff;P0=0xfe;wela=1;wela=0;yan(2);P0=table1[ge]; //个位;dula=1;dula=0;P0=0xff;P0=0xfd;wela=1;wela=0;yan(2);P0=table[wei]; //小数点一位;dula=1;dula=0;P0=0xff;P0=0xfb;wela=1;wela=0;yan(2);P0=0x39; //摄氏度;dula=1;dula=0;P0=0xff;P0=0xf7;wela=1;wela=0;yan(2);}void chushihua() //初始化函数;{ds=1;delay(2);ds=0;delay(100);ds=1;delay(15);if(ds==0){delay(90);}ds=1;}void xiehanshu(uchar dat) //写函数; {uchar i=0;for(i=8;i>0;i--){ds=0;ds=dat&0x01;delay(6);ds=1;dat>>=1;}ds=1;}uchar duhanshu(void) //读函数;{uchar i=0;uchar dat=0;for(i=8;i>0;i--){ds=0;dat>>=1;ds=1;if(ds==1)dat|=0x80;delay(3);}return(dat);}void kaishi(){uchar a=0;uchar b=0;chushihua();xiehanshu(0xcc); // 写跳过读ROM指令;xiehanshu(0x44); // 写温度转换指令;delay(30);chushihua();xiehanshu(0xcc);xiehanshu(0xbe);delay(15);a=duhanshu(); //读低八位;b=duhanshu(); //读高八位;temp=b;temp<<=8; //两个字节组合为一个字;temp=temp|a;tt=temp*0.0625; //温度在寄存器中是12位,分辨率是0.0625temp=tt*10+0.5; //乘10表示小数点后只取1位,加0.5是四折五入temp+=0.05;display(temp);if(temp>37) num=3;else if(temp>36) num=2;else if(temp>35) num=1;else if(temp>33)num=0;else if(temp<32)num=4;}void dispose(){switch(num){case 0:gao=1;di=3;break;case 1:gao=2;di=2;break;case 2:gao=3;di=1;break;case 3:gao=4;di=0;break;case 4:gao=0;di=4;}}void qudong(){ uchar i;in1=1;in2=0;if(di!=0){for(i=0;i<di;i++){dianji=0;yan(1);}}for(i=0;i<gao;i++){dianji=1;yan(2);}}void write_cmd(uchar cmd) //写指令数据到LCD;{LCD_RS=0;LCD_RW=0;LCD_EN=0;P0=cmd;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void write_dat(uchar dat) //写显示数据到LCD;{LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void lcd_pos(uchar X,uchar Y) //设定显示位置;{uchar pos;if(X==0){X=0x80;}else if(X==1){X=0x90;}else if(X==2){X=0x88;}else if(X==3){X=0x98;}pos=X+Y;write_cmd(pos);}void lcd_init() //LCD初始化设定;{LCD_PSB=1;write_cmd(0x30);delay(5);write_cmd(0x0C);delay(5);write_cmd(0x01);delay(5);}void Clear_GDRAM(void){uchar i,j,k;write_cmd(0x34);i=0x80;for(j=0;j<32;j++){write_cmd(i++);write_cmd(0x80);for(k=0;k<16;k++){write_dat(0x00);}}i=0x80;for(j=0;j<32;j++){write_cmd(i++);write_cmd(0x88);for(k=0;k<16;k++){write_dat(0x00);}}write_cmd(0x30);}/***********************************************************欢迎界面*********************************************************** */void main(){while(1){dianji=0;kaishi();dispose();qudong();}}。
51单片机的液晶显示温度计程序51单片机的液晶显示温度计程序#include<reg51.h>#include <intrins.h>sbit RST = P2^0;sbit CLK = P2^1;sbit DQ = P2^2;sbit TSOR = P2^3;sbit ALERT =P2^4;sbit RS = P2^7;sbit RW = P2^6;sbit EN = P2^5;/*------------------------------------------全局变量-------------------------------------------------------*/static unsigned char temp1,temp2; //温度值的整数部分、小数部分static unsigned char pos,posset; //数字电位器电位值、设定值static unsigned char min,sec; //分钟、秒static unsigned char count; //Timer0中断计数static unsigned char minset; //设定的分钟数static unsigned char status1,status2; //状态标志bit stop,timeover; //定时停止、结束static char line0[] =" 00:00 ";static char line1[] =" . CW";/*-------------------------------------------------------------------------------------------------------------*/void InitInterupt();void KeyboardDelay();/*-------------------------------------------LCD驱动函数------------------------------------------------*/void DelayL();void DelayS();void WriteCommand(unsigned char c);void WriteData(unsigned char c);void ShowChar(unsigned char pos,unsigned char c); void ShowString(unsigned char line,char *ptr);void InitLcd();/*----------------------------------------------键盘-程序--------------------------------------------------*/unsigned char GetKey();/*---------------------------------------------数字温度计驱动-------------------------------------------*/void ChangePos(bit sel,unsigned char pos1,unsigned char pos2);/*------------------------------------------温度传感器驱动----------------------------------------------*/void Delay15();void Delay60();void Delay100ms();void Write0TS();void Write1TS();bit ReadTS();void ResetTS();void WriteByteTS(unsigned char byte); unsigned char ReadByteTS();void InitTS();void GetTempTS();/*-------------------------------------------------主程序---------------------------------------------------*/void main (void) {char code str1[] =" Hello World! ";char code str2[] =" 2002-10-20 "; unsigned char i; SP=0x50;ALERT=0; //报警灯灭TSOR=1; //1-wire总线释放DelayL();InitLcd(); //初始化LCDDelayL();ShowString(0,str1); //启动画面ShowString(1,str2);for(i=0;i<15;i++)Delay100ms();InitInterupt(); //初始化中断设置minset=10; //缺省定时10分钟posset=0; //缺省电位器值0min=minset; //初始化数据pos=posset;sec=0;count=0;P1=0xF0;status1=0;status2=0;stop=1;timeover=0; ChangePos(0,255-pos,255-pos); //设置电位器InitTS(); //初始化温度计while(1) //循环显示温度值{GetTempTS();line1[0]=0x20;i=temp1;if(i>39) //超过40摄氏度,告警灯亮ALERT=1;if(i>99) //超过100摄氏度,显示温度的百位{line1[0]=0x31;i-=100;}line1[1]=i/10+0x30; //显示温度的十位line1[2]=i%10+0x30; //显示个位line1[4]=temp2+0x30; //显示小数位if(timeover) //若定时结束,则电位器缓慢复0{for(;pos>0;pos--){ChangePos(0,255-pos,255-pos);_nop_();_nop_();}timeover=0;posset=0;}if(pos>posset) //若按键修改电位器位置{for(;pos>posset;pos--) //则缓变到设定值{ChangePos(0,255-pos,255-pos);_nop_();_nop_();}ChangePos(0,255-pos,255-pos);}else if(pos<posset){for(;pos<posset;pos++){ChangePos(0,255-pos,255-pos);_nop_();_nop_();}ChangePos(0,255-pos,255-pos);}i=pos;line1[9]=0x20; //显示电位器等级值if(i>99){line1[9]=i/100+0x30;i=i%100;}line1[10]=i/10+0x30;line1[11]=i%10+0x30;ShowString(1,line1);line0[5]=min/10+0x30; //显示时间line0[6]=min%10+0x30;line0[8]=sec/10+0x30;line0[9]=sec%10+0x30;ShowString(0,line0);Delay100ms();}}void InitInterupt(){TMOD=0x21; //初始化中断设置TL1=0xFD;TH1=0xFD;PX0=1;EA=1;ES=1;PCON=0;TR1=1;SCON=0x50;TL0=0x00; //定时0.05mTH0=0x4C;ET0=1; EX0=1;IT0=1;}void KeyboardDelay() //按键中断延时{unsigned char i,j;i=0x40;j=0xFF;while(i--)while(j--);}/*--------------------------------------------中断处理-----------------------------------------------------*/Int0_process() interrupt 0 using 0{unsigned char key;unsigned char keycode[]= "TP";unsigned char step[3]={1,2,5};EA=0;key=GetKey(); //获得按键值switch(key){case 0:stop=!stop;min=minset;sec=0;break;case 1:case 2:case 3:if(stop){minset+=step[key-1];if(minset>60)minset=0;min=minset;}break;case 5:case 6:case 7:if(stop){minset-=step[key-5]; if(minset>60) minset=0;min=minset;}break;case 9:case 10:case 11:posset+=step[key-9];break;case 13:case 14:case 15:posset-=step[key-13];break;default:break;}TR0=!stop;KeyboardDelay();P1=0xF0;EA=1;}Timer0_process() interrupt 1 using 0{EA=0;TR0=0;TL0=0x00;TH0=0x4C;count++;if(count==20) //如果到累计定时到达1s {if(sec==0) //定时处理{if(min==0) //总定时到,则置结束标志timeover=1;else{min--;sec=59;}}elsesec--;count=0;}TR0=1;EA=1;}/*--------------------------------------LCD驱动子程序--------------------------------------------------*/void DelayL(){unsigned char i,j;i=0xF0;j=0xFF;while(i--)while(j--);}void DelayS(){unsigned char i;i=0x1F;while(i--);}void WriteCommand(unsigned char c) {DelayS();EN=0;RS=0;RW=0;_nop_();EN=1;P0=c;EN=0;}void WriteData(unsigned char c){DelayS();EN=0;RS=1;RW=0;_nop_();EN=1;P0=c;EN=0;RS=0;}void ShowChar(unsigned char pos,unsigned char c) {unsigned char p;if(pos>=0x10)p=pos+0xB0;elsep=pos+0x80;WriteCommand(p);WriteData(c);}void ShowString(unsigned char line,char *ptr){unsigned char l,i;l=line<<4;for(i=0;i<16;i++)ShowChar(l++,*(ptr+i));} void InitLcd(){DelayL();WriteCommand(0x38);WriteCommand(0x38);WriteCommand(0x06);WriteCommand(0x0C);WriteCommand(0x01);WriteCommand(0x80);}/*---------------------------------------------键盘子程序-------------------------------------------------*/ unsigned char GetKey(){unsigned k,t,i,j;k=P1;k=k&0xF0;i=0;while((k&0x10)&&i<4) {i++;k=k>>1;}k=0x01;j=0;while(j<4){P1=0xFF^k;_nop_();t=P1;t=t^0xFF;t=t&0xF0;if(t)break;j++;k=k<<1;}k=j*4+i;return k;}/*-----------------------------------------数字温度计驱动子程序--------------------------------------*/void ChangePos(bit sel,unsigned char pos1,unsigned char pos2){ unsigned char i;RST=0;DQ=0;CLK=0;RST=1;DQ=sel;_nop_();CLK=1;_nop_();CLK=0;for(i=0;i<8;i++) {if(pos1&0x80)DQ=1;elseDQ=0;_nop_();CLK=1;_nop_();CLK=0;pos1=pos1<<1; }for(i=0;i<8;i++) {if(pos2&0x80)DQ=1;elseDQ=0;_nop_();CLK=1;_nop_();CLK=0;pos2=pos2<<1;}RST=0;}/*------------------------------------------温度传感器子程序-------------------------------------------*/void Delay100ms() //延时100ms {unsigned char i,j,k;for(i=0;i<8;i++)for(j=0;j<25;j++)for(k=0;k<250;k++);}void Delay15() //延时15us{unsigned char i;for(i=0;i<8;i++);}void Delay60() //延时60us{unsigned char i;for(i=0;i<30;i++);}void Write0TS() //写bit 0 {TSOR=1;TSOR=0;Delay15();Delay15();Delay15();Delay15();TSOR=1;_nop_();_nop_();}void Write1TS() //写bit 1 {TSOR=1;TSOR=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TSOR=1;_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Delay15();Delay15();Delay15(); }bit ReadTS() {bit b;TSOR=1;TSOR=0; _nop_();_nop_();_nop_();_nop_();TSOR=1;_nop_();_nop_();_nop_();_nop_();_nop_();b=TSOR;Delay15();Delay15();Delay15();_nop_();_nop_();return b;}void ResetTS() //复位{unsigned char i; TSOR=1;TSOR=0;for(i=0;i<8;i++)Delay60();TSOR=1;while(TSOR);for(i=0;i<8;i++)Delay60();}void WriteByteTS(unsigned char byte) //写一个字节(byte){unsigned char i;for(i=0;i<8;i++){if(byte&0x01)Write1TS();elseWrite0TS();byte=byte>>1;}}unsigned char ReadByteTS() //读一个字节(byte){unsigned char i,j;bit b;j=0;for(i=0;i<8;i++){b=ReadTS();if(b)j+=1;j=_cror_(j,1);}return j;}void InitTS() //初始化温度转换{ResetTS();WriteByteTS(0xCC);WriteByteTS(0x4E);WriteByteTS(0x64);WriteByteTS(0x8A);WriteByteTS(0x1F);}void GetTempTS() //获取温度{ResetTS();WriteByteTS(0xCC);WriteByteTS(0x44);Delay100ms();ResetTS();WriteByteTS(0xCC);WriteByteTS(0xBE);temp2=ReadByteTS();temp1=ReadByteTS();ReadByteTS();ReadByteTS();ReadByteTS();ReadByteTS();ReadByteTS();ReadByteTS();ReadByteTS();temp1=temp1<<4;temp1+=(temp2&0xF0)>>4;temp2=(temp2&0x0F)?5:0;}液晶显示温度计程序。
51单片机多功能红外遥控电风扇(自然风+阵风+多档风速+定时)#include "AT89x051.H"#define uchar unsigned char#define uint unsigned int#define b1 0xe200#define b2 0xe210#define b3 0xe208#define b4 0xe218#define b5 0xe204#define b6 0xe214#define b7 0xe20c //阵风#define b8 0xe21c //自然风#define b9 0xe280 //自动档#define on_off 0xe240 //电源开关#define ch_a 0xe250 //加档#define ch_s oxe248 //减档#define time 0xe2e8 //定时#define louver 0xe24c //转页#define count_num 500 //显示次数#define time1_num 18000#define time2_num 100#define bell P3_4#define c_f 0xd4 //"F"#define c_h 0xce //"H"#define c_g 0x81 //"="uint time1=time1_num; //18000*100*2ms=1huchar time2=time2_num;uint count=count_num; //显示次数uchar sort=3; //显示offuchar dis_bit=0; //显示的位uchar code_length=16;uchar data dis[4]={0x02,0x02,0x00,0xff}; //显示数据区uchar temperature;uint code_t=0;uchar code1=0;uchar code2=0;bit bdata code_start=0; //代码起始标志bit bdata button=0; //无键按下bit bdata i_flag=0; // 有无中断标志bit bdata t_flag=0;//测温标志bit bdata bt=0; //判断是否是定时键bit bdata off=0; //为0无定时uchar code TAB[11]={0x5f,0x0a,0x9d,0x9b,0xca,0xd3,0xd7,0x5a,0xdf,0xdb,0x 75};void timer_0(void);void dis_t(void); //温度显示void dis_s(void); //档位显示void dis_h(void); //时间void dis_off(void); //关机显示void delay(uint t); //延时uchar d_code(uint t); //解码uchar begin=0; //开始补偿void c_code(void); //键号转换void off_time(void); //定时关void measure_temperature(void);void key_time(void); //定时按钮void sort_key(void); //风类按钮void mov_p1(uchar t0,t1,t2); //显示void button_process(void); //按键处理//********定时关机*********void off_time(void){if(off==1){if(time1--==0){time2--;time1=time1_num;}if(time2==0){dis[3]=dis[3]-1;time2=time2_num;}if(dis[3]==0){code_t=on_off; //关机c_code();}}}//********定时器0中断********* void timer0() interrupt 1 using 2 {off_time();if(dis_bit==0&&t_flag==0){key_time();sort_key();}switch(sort){case 0:if(count!=0){mov_p1(dis[0],dis[1],TAB[10]); //显示温度count--;}break;case 1:if(count!=0){mov_p1(c_f,c_g,TAB[dis[2]]); //显示档位count--;}break;case 2:if(count!=0){dis_h(); //显示时间count--;}break;case 3:mov_p1(0x5f,c_f,c_f);//显示关机default:break;}timer_0();if(count==0) //轮流显示{P3_0=P3_1=P3_5=1;if(i_flag==0&&t_flag==0) measure_temperature();count=count_num;sort=(sort&0x03)+1;if(sort>=3)sort=0; //完成一轮显示}}//***********定时按钮************ void key_time(void){bit i=P1_2;P1_2=1;if(P1_2==0){delay(50);if(P1_2==0) //确认有按键{bell=0;delay(100);bell=1;while(P1_2==0){;}if(dis[3]==0xff){dis[3]=1;off=0; //取反后为1,定时}else{if(dis[3]<9){dis[3]=dis[3]+1;off=0; //取反后为1,定时}elseoff=1; //取反后为0,取消定时}sort=2;code_t=time; //显示时间c_code();//bt=0; //恢复}}P1_2=i;i_flag=0; //恢复执行其它任务}//***********换档按钮************ void sort_key(void){bit i=P1_1;P1_1=1;if(P1_1==0){delay(50);if(P1_1==0){button=1;bell=0;delay(200);bell=1;while(P1_1==0){;}if(dis[2]<9){dis[2]=dis[2]+1;code2=dis[2];}else{dis[2]=0;code2=10; //power off}delay(100);sort=1;count=5000;//TF0=1;}}P1_1=i;i_flag=0; //恢复执行其它任务}//********定时器1中断测温************ void timer1() interrupt 3 using 3{uint temp;TR0=0; //计数停TR1=0; //定时停temp=TH0*256+TL0; //取温度值temperature=(7000-temp)/11; //计算温度//if(dis[2]!=0)// temperature--; //工作时补偿1度/*if(F0==0&&begin<=10) //开始温度加3度temperature+=3;if(F0==0&&begin<=60&&begin>10) temperature+=2;if(F0==0&&begin<=150&&begin>60) temperature+=1;*/dis[0]=TAB[temperature/10];dis[1]=TAB[temperature%10];IE0=0;t_flag=0;timer_0();EX0=1;}//**********判断代码************ uchar d_code(uint t){if(t<=0x220&&t>=0x190)return 0;else{if(t<=0x430&&t>=0x390)return 1;elsereturn 0xff;}}//***********键号转换************ void c_code(void){bit bdata i=0;switch(code_t){case b1:code1=1;break;case b2:code1=2;break;case b3:code1=3;break;case b4:code1=4;break;case b5:code1=5;break;case b6:code1=6;break;case b7:code1=7;break;case b8:code1=8;break;case b9:code1=9;break;case on_off:code1=10; //关机dis[3]=0xff;//#####标志复位############ button=0; //无键按下i_flag=0; // 无中断标志bt=0; //无定时键按下off=0; //无定时time1=time1_num; //定时初值复位time2=time2_num;count=count_num; //显示次数break;case time:off=~off;if(off==0)dis[3]=0xff; //取消定时i=1;bt=1;count=5000; //延长显示sort=2; //显示时间TF0=1;break;case louver:P3_3=~P3_3;code1=code2;break;default:code1=0;break;}if(bt==1&&i==0) //装载代码{if(code1<9) //定时最大9h {dis[3]=code1;bt=0;}}elseif(i==0){code2=code1;count=5000; //延长显示if(code1==10){dis[2]=0; //F=0sort=3; //显示关机}else{dis[2]=code1;sort=1; //显示风类}TF0=1;}}//*********** 接收代码中断 ************void receive_code() interrupt 0 using 1{uint temp,i;ET0=0;i_flag=1; //暂停其它任务if(TR1==0){TR1=0;TMOD=0x11;TH1=TL1=0;TR1=code_start=1;}else{TR1=code_start=0;temp=TH1*256+TL1;if((d_code(temp)==0||d_code(temp)==1)&&code_length!=0) {TH1=TL1=0;TR1=code_start=1;code_t=(code_t<<1)+d_code(temp);code_length--;}else{if(code_length==0&&((code_t&0xff00)==0xe200)) //除掉误码{code_length=16;bell=0; //正确收到,响声提示c_code(); //转换代码for(i=0;i<6000;i++){EX0=0;P3_0=P3_1=P3_5=1;if(i>800)bell=1;IE0=0;if(P3_2==0)i--;button=1; //有按键需要处理}i_flag=0; //恢复执行其它任务}else //误码{code_length=16;for(i=0;i<6000;i++){IE0=0;if(P3_2==0)i--;i_flag=0; //恢复执行其它任务}}timer_0();EX0=1;}}}//***********显示代码送P1口************ void mov_p1(uchar t0,t1,t2){switch(dis_bit){case 0:P1=t0;P3_1=P3_5=1;P3_0=0;dis_bit=1;break;case 1:P1=t1;P3_0=P3_5=1;P3_1=0;dis_bit=2;break;P1=t2;P3_1=P3_0=1;P3_5=0;dis_bit=0;break;}}//***********显示定时时间************ void dis_h(void){switch(dis_bit){case 0:P1=c_h; //"H"P3_1=P3_5=1;P3_0=0;dis_bit=1;break;case 1:P1=c_g; //"="P3_0=P3_5=1;P3_1=0;dis_bit=2;break;case 2:if(dis[3]>10) //无定时P1=TAB[0]; //显示H=0elseP1=TAB[dis[3]];P3_1=P3_0=1;P3_5=0;dis_bit=0;break;}}//********定时器0************ void timer_0(void){TMOD=0x01; //T0定时方式1 TR0=0;TH0=0xfc;TL0=0x55; //2ms ET0=1;TR0=1;}//*********** 延时 ************ void delay(uint t){uint i,j;for(i=0;iif(button==0)for(j=0;j<10;j++);}//*********** 测温度 ************void measure_temperature(void){t_flag=1;ET1=1;EX0=0;ET0=0;TMOD=0x15; //T0计数方式1,T1定时方式1 TH1=0x3c;TL1=0xb0; //置初值100msTH0=0x00;TL0=0x00; //清零TR0=1; //计数开始TR1=1;}//***********风速 ************void s1(void){P3_7=0;}void s2(void){P3_7=0;delay(230);P3_7=1;delay(25);}void s3(void){P3_7=0;delay(180); P3_7=1; delay(40);}void s4(void) {P3_7=0; delay(130); P3_7=1; delay(40);}void s5(void) {P3_7=0; delay(90);P3_7=1; delay(40);}void s6(void) {P3_7=0; delay(50);P3_7=1; delay(50);}void gust(void) //阵风{uchar i,j;if(button==1) //中止任务j=255;elsej=0;//P3_7=0;//delay(5000);for(i=j;i<50;i++)s6();P3_7=0;delay(5000);for(i=j;i<25;i++)s2();for(i=j;i<35;i++)s3();for(i=j;i<25;i++)s5();delay(6000);}void natural(void) //自然风{uchar i;uchar code *p; //随机数for(i=0;i<100;i++){if(button==0) //有键按下,中止当前任务{P3_7=0;delay((*p++)*8); //放大P3_7=1;if(*p<10)delay(7000); //低速档时间补偿elsedelay(300);}}}void automation(void) //自动档{if(temperature<=29)s6();elseif(temperature<=30)gust();elseif(temperature==31)s5();elseif(temperature==32)s4();elseif(temperature<=33)s3();if(temperature==34)s2();elses1();}//***********按键处理 ************ void button_process(void){button=0;switch(code2){case 1:s1();break;case 2:s2();break;case 3:s3();break;case 4:s4();break;case 5:s5();break;case 6:s6();case 7:gust();break;case 8:natural();break;case 9:automation();break;case 10:P3_7=1; //关风扇P3_3=1; //关转页break;default:break;}}//********************************** //***********主程序开始 ************ //**********************************void main(void){EA=1;IT0=1; //边沿触发EX0=1; //外部中断0允许measure_temperature();delay(1000);timer_0();while(1){if(F0==0&&begin<255) begin++;elseF0=1;button_process();}}。
基于51单片机的智能温控风扇系统的设计题目:基于51单片机的智能温控风扇系统的设计一、需求分析在炎热的夏天人们常用电风扇来降温,但传统电风扇多采用机械方式进行控制,存在功能单一,需要手动换挡等问题。
随着科技的发展和人们生活水平的提高,家用电器产品趋向于自动化、智能化、环保化和人性化,使得智能电风扇得以逐渐走进了人们的生活中。
智能温控风扇可以根据环境温度自动调节风扇的启停与转速,在实际生活的使用中,温控风扇不仅可以节省宝贵的电资源,也大大方便了人们的生活。
二、系统总体设计1、硬件本系统由集成温度传感器、单片机、LED数码管、及一些其他外围器件组成。
使用89C52单片机编程控制,通过修改程序可方便实现系统升级。
系统的框图结构如下:图1-1硬件系统框图其中,单片机为STC89C52,这个芯片与我开发板芯片相同,方便拷进去程序。
晶振电路和复位电路为单片机最小系统通用设置,温度采集电路,使用的是DS18B20芯片,数码管使用的是4位共阳数码管,风扇驱动芯片使用的是L298N,按键为按钮按键,指示灯为发光二级管。
2、软件要实现根据当前温度实时的控制风扇的状态,需要在程序中不时的判断当前温度值是否超过设定的动作温度值范围。
由于单片机的工作频率高达12MHz,在执行程序时不断将当前温度和设定动作温度进行比较判断,当超过设定温度值范围时及时的转去执行超温处理和欠温处理子程序,控制风扇实时的切换到关闭、低速、高速三个状态。
显示驱动程序以查七段码取得各数码管应显数字,逐位扫描显示。
主程序流程图如图4-1所示。
图1-2软件系统框图这是该系统主程序的运行流程,当运行时,程序首先初始化,然后调用DS18B20初始化函数,然后调用DS18B20温度转换函数,接着调用温度读取函数,到此,室内温度已经读取,调用按键扫描函数这里利用它设置温度上下限,然后就是调用数码管显示函数,显示温度,之后调用温度处理函数,再调用风扇控制函数使风扇转动。
基于51单片机的智能温控风扇设计各部块的设计智能温控风扇是一种能够自动根据温度变化调节风扇转速的风扇,其应用广泛,如家庭、办公室、工业生产等。
本文主要介绍基于51单片机实现智能温控风扇的各部分设计。
一、传感器模块设计温度传感器是实现智能控制的重要模块。
常用的温度传感器有NTC、PTC、热电偶、DS18B20等。
这里选用DS18B20数字温度传感器。
其具有精度高、反应速度快、与单片机通信简单等优点。
将DS18B20以三线方式连接至单片机,通过调用它的相关函数来读取温度值。
二、风扇驱动模块设计风扇驱动模块是指控制风扇正反转的电路。
这里选用H桥驱动芯片L298N。
它可以控制直流电动机、步进电机等多种负载的正反转,具有过流保护、过温保护等功能。
将H桥驱动芯片通过引脚连接至单片机,通过编写控制程序,实现控制风扇的正反转及转速控制。
三、单片机模块设计单片机模块是整个系统的控制中心,它通过编写程序控制温度传感器和风扇驱动芯片实现智能控制。
这里选用常用的STC89C52单片机,具有较强的通用性和高性价比。
编写的程序主要实现以下功能:1. 读取温度值并进行比较,根据温度值控制风扇的启停及转速。
2. 设置风扇的最低速度和最高速度。
3. 实现温度设置功能,用户可通过按钮设置所需的温度值。
4. 实现显示屏幕功能,将当前温度值及系统状态等信息显示在屏幕上。
四、供电模块设计供电模块是系统的电源模块,它通过转换器将交流电转化为所需的直流电。
为保证系统稳定工作,供电模块应具有过载保护、过压保护、过流保护等功能。
五、外壳设计外壳设计是将控制模块和风扇固定在一起,并起到保护作用的模块。
可采用塑料或金属等材质制作外壳,将控制模块、风扇和电源线等固定在外壳内部。
外壳应符合美观、实用及安全的设计原则。
以上是基于51单片机的智能温控风扇设计各部块的相关参考内容,其中传感器模块、风扇驱动模块、单片机模块、供电模块及外壳设计五个部分是实现智能温控风扇的核心部分。
基于51单片机的智能温控风扇的研究方法一、研究背景随着科技的不断发展,人们对生活质量的要求也越来越高,其中温度的控制是非常重要的一环。
而智能化的温控风扇可以帮助我们更好地控制室内温度,提高生活质量。
本文将基于51单片机进行智能温控风扇的研究。
二、研究目的本研究旨在实现基于51单片机的智能温控风扇,通过对室内温度进行检测和分析,自动调节风扇转速,以达到舒适宜人的室内环境。
三、研究内容1.硬件设计(1)传感器选择:本项目采用DS18B20数字温度传感器进行室内温度检测。
(2)电机选择:根据风扇转速调节需求,选用直流无刷电机。
(3)显示屏设计:为了方便用户观察当前室内温度和风扇状态等信息,设计了12864液晶显示屏。
(4)按键设计:为了方便用户手动调节风扇转速或开关机等操作,设计了按键模块。
2.软件设计(1)温度检测:通过DS18B20传感器实时检测室内温度,并将数据传输到单片机。
(2)控制算法:根据当前室内温度和用户设定的目标温度,自动调节风扇转速,以达到最佳的室内环境。
(3)界面设计:通过12864液晶显示屏实现用户界面,显示当前温度、目标温度、风扇状态等信息,并提供按键操作。
四、研究方法1.硬件制作(1)根据电路原理图进行连线和焊接。
(2)进行电路测试和调试,确保硬件正常工作。
2.软件编程(1)编写程序代码,实现温度检测、控制算法和界面设计等功能。
(2)通过仿真软件进行程序模拟和调试。
(3)将程序下载到单片机中,进行实际测试和调试。
五、研究结果与分析经过多次测试和调试,本项目成功实现了基于51单片机的智能温控风扇。
在室内环境变化时,可以自动调节风扇转速,使室内温度保持在用户设定的目标温度范围内。
同时,在手动操作方面也具有较好的用户体验。
六、结论与展望本研究成功实现了基于51单片机的智能温控风扇,能够有效地提高室内环境的舒适度。
未来可以进一步完善该系统,如增加遥控功能、优化控制算法等,以满足更多用户的需求。
基于51单片机的智能温控风扇的研究方法随着科技的不断发展,智能家居已经逐渐成为了人们生活中不可或缺的一部分。
其中,温控风扇作为智能家居的一种重要设备,其研究成果也越来越受到人们的关注。
本文将介绍一种基于51单片机的智能温控风扇的研究方法。
一、硬件设计智能温控风扇的核心是温度传感器和风扇控制模块。
本研究采用DS18B20数字温度传感器,通过单片机的GPIO口读取传感器数据,实现温度的实时监测。
同时,通过PWM控制风扇的转速,从而实现温度控制。
二、软件设计1. 硬件初始化通过51单片机的IO口控制DS18B20传感器进行初始化,并通过PWM控制风扇的转速,从而实现风扇的启动。
2. 温度检测在程序运行过程中,不断地读取DS18B20传感器的温度数据,并将其保存在内存中。
通过比较当前温度和设定温度的大小关系,控制风扇的转速。
3. 温度控制当当前温度高于设定温度时,通过控制PWM占空比的大小,使得风扇的转速逐渐增大,从而降低环境温度。
当当前温度低于设定温度时,PWM占空比逐渐减小,风扇的转速逐渐减小,从而保持环境温度在设定范围内。
4. 显示控制本研究采用LCD1602液晶屏对温度进行显示,实时显示当前环境温度和设定温度。
同时,通过按键对设定温度进行调整,方便用户进行操作。
三、实验结果经过实验测试,本研究所设计的基于51单片机的智能温控风扇能够准确地检测环境温度,并通过PWM控制风扇的转速,实现温度控制。
同时,LCD1602液晶屏可以实时地显示当前环境温度和设定温度,方便用户进行操作。
四、结论本研究基于51单片机设计的智能温控风扇,通过DS18B20数字温度传感器实现了温度的实时监测,并通过PWM控制风扇的转速实现温度控制。
同时,LCD1602液晶屏实时显示当前环境温度和设定温度,方便用户进行操作。
这种智能温控风扇的设计可以广泛应用于家居、办公室等场所,为人们的生活提供了更为舒适的环境。
浙江理工大学《单片机系统设计及应用实验》设计报告题目:基于51单片机的温控智能电风扇专业:机械电子工程班级:机电11(1)班姓名:叶惠芳学号:2011330300302指导教师:袁嫣红机械与自动控制学院2014 年7 月3 日目录摘要 (4)第一章课程设计的目标及主要内容 (5)1.1课程设计的目标及意义 (5)1.2温控智能电风扇的主要内容和技术关键 (5)1.2.1课程设计的主要内容 (5)1.2.2技术关键 (5)第二章温控智能电风扇控制系统硬件设计 (6)2.1课程设计总体硬件设计 (6)2.2芯片及主要器件选择 (6)2.2.1控制核心的选择 (6)2.2.2温度传感器的选用 (7)2.2.3显示电路 (7)2.3芯片及器件介绍 (7)2.3.1 AT89C51单片机 (7)2.3.2 L298芯片介绍 (8)2.3.3 DS18B20温度传感器 (9)2.3.4LED数码管简介 (11)2.4主要硬件电路 (12)2.4.1温度检测电路设计 (12)2.4.2 电机调速电路设计 (12)2.4.3 PWM调速原理 (13)2.4.4 LED数码管显示电路及按键电路 (13)第三章温控智能电风扇控制系统软件设计与实现 (14)3.1 主程序 (14)3.2 数字温度传感器模块 (14)3.3电机调速与控制子模块 (16)第四章调试结果与总结 (16)4.1 调试结果 (16)4.2 课程设计总结 (20)参考文献 (21)附录一 (23)附录二 (24)附录三 (25)摘要电风扇与空调的降温效果不同,相较于空调的迅速降低环境温度不同,电风扇更加温和,适宜于体质较弱的老人与小孩。
并且,电风扇价格实惠,使用简单。
现在市面上的电风扇大多只能手动调速,还外加一个定时功能。
对于温差较大的夜晚,若不能及时改变风速大小后停止,很容易感冒着凉。
所以本课程设计以AT89C51为核心控制系统根据外界温度的变化对电风扇进行转速控制,以实现自动换挡功能。
智能电风扇的设计学院**********************专业班级*****学生姓名****指导教师******20**年*月**日引言随着人们生活水平及科技水平的不断提高,现在家用电器在款式、功能等方面日益求精,并朝着健康、安全、多功能、节能等方向发展。
过去的电器不断的显露出其不足之处。
电风扇作为家用电器的一种,同样存在类似的问题。
现在电风扇的现状:大部分只有手动调速,再加上一个定时器,功能单一。
存在的隐患或不足:比如说人们常常离开后忘记关闭电风扇,浪费电且不说还容易引发火灾,长时间工作还容易损坏电器。
再比如说前半夜温度高电风扇调的风速较高,但到了后半夜气温下降,风速不会随着气温变化,容易着凉。
之所以会产生这些隐患的根本原因是:缺乏对环境的检测。
如果能使电风扇具有对环境进行检测的功能,当房间里面没有人时能自动的关闭电风扇;当温度下降时能自动的减小风速甚至关闭风扇,这样一来就避免了上述的不足。
本次设计就是围绕这两点对现有电风扇进行改进。
1.总体方案设计及功能描述本设计是以AT89C51单片机控制中心,主要通过提取热释电红外传感器感应到的人体红外线信息和温度传感器DS18B20得到的温度以及内部定时器设定时间长短来控制电风扇的开关及转速的变化。
功能描述:电风扇工作在四种状态:手动调速状态、自动调速状态、定时状态、停止状态。
手动状态时可以手动调节速度;自动状态时通过温度高低自动调节速度,如果出现手动现象则变为手动状态;定时状态时可以调节定时时间,并设定是否启动定时,之后可以手动退出,也可以在不操作6秒后自动退出进入手动状态;停止状态时可以被唤醒并进入自动状态。
当没有检测到人体存在超过3分钟或定时完毕时进入停止状态。
在数码管显示方面,当没有定时时,只显示气温,当定时启动时气温和定时剩余时间以3秒的速度交替显示。
系统方框图如下图所示,主要包括:输入、控制、输出三大部分8个功能模块。
图1-1系统方框图2.功能模块硬件简介与实现2.1键盘输入电路由于设计中用到的按键数目不多,所以可以直接用AT89C51的通用IO 端口且选用AT89C51的P1口(内部有上拉电阻)作为键盘接口。
51单片机温度控制程序51单片机温度控制程序(续)功能说明: 本装置的功能是对温度进行实时监测与控制。
由温度传感器DS18B20对温度进行采样和转换成数字信号送入单片机,并与设定的报警温度上、下限值进行比较,信息通过LCD显示出来。
如实时温度超过设定的上、下限值,一方面由LC51单片机温度控制程序(续)功能说明:本装置的功能是对温度进行实时监测与控制。
由温度传感器DS18B20对温度进行采样和转换成数字信号送入单片机,并与设定的报警温度上、下限值进行比较,信息通过LCD显示出来。
如实时温度超过设定的上、下限值,一方面由LCD显示信息,并发出警报声;另一方面自动控制继电器(Relay)开接通或断开,从而控制加热源的开与断,达到对温度进行实时控制的目的。
程序:LCD2402.ASM01 ; ―――――――――――――――――――――――――――――――02 ; 温度值存放单元03 TEMP_ZH EQU 24H ;实时温度值存放单元04 TEMPL EQU 25H ;低温度值存放单元05 TEMPH EQU 26H ;高温度值存放单元06 TEMP_TH EQU 27H ;高温报警值存放单元07 TEMP_TL EQU 28H ;低温报警值存放单元08 TEMPHC EQU 29H ;存十位数BCD码09 TEMPLC EQU 2AH ;存个位数BCD码10 ;―――――――――――――11 按键输入引脚定义12 K1 EQU P2.113 K2 EQU P2.214 K3 EQU P2.315 K4 EQU P2.416 ;―――――――――――――17 SPK EQU P3.4 ;蜂鸣器引脚18 RELAY EQU P2.0 ;继电器引脚19 X EQU 2FH ;LCD 地址变量20 ;―――――――――――――21 ;LCD控制引脚22 RS EQU P3.523 RW EQU P3.624 E EQU P3.725 ;―――――――――――――26 FLAG EQU 20H.0 ;DS18B20是否存在标记27 KEY_UD EQU 20H.1 ;设定KEY 的UP与DOWN 标记28 DQ EQU P2.52930 ;=============主程序==============3132 MAIN:33 ACALL SET_LCD ;LCD初始化设置子程序34 ACALL WR_THL ;将报警上下线写入暂存寄存器子程序35 TOOP: ACALL RESET_1820 ;调用18B20复位子程序36 JNB FLAG,TOOP1 ;DS1820不存在转移TOOP1处37 ACALL MEU_OK ;调用显示"OK"信息子程序38 ACALL RE_THL ;把EEROM里温度报警值拷贝回暂存器39 ACALL TEMP_BJ ;显示温度标记"℃"40 JMP TOOP241 TOOP1: ACALL MEU_ERROR ;显示"ERROR"信息42 ACALL TEMP_BJ ;显示温度标记43 JMP $ ;等待44 ;――――――――――――――45 TOOP2:46 ACALL RE_TEMP ;调用读取温度数据子程序47 ACALL SET_DATA ;调用处理显示温度数据子程序48 ACALL TEMP_COMP ;实际温度值与标记温度值比较子程序49 ACALL P_KEY ;调用按键扫描子程序50 SJMP TOOP2 ;循环5152 ;--------―― 读取温度数据子程序--------――53 RE_TEMP:54 ACALL RESET_1820 ;18B20复位子程序55 JNB FLAG,TOOP1 ;DS1820不存在56 MOV A,#0CCH ;跳过ROM匹配57 ACALL WRITE_1820 ;写入子程序58 MOV A,#44H ;发出温度转换命令59 ACALL WRITE_1820 ;调写入子程序60 ACALL RESET_1820 ;调复位子程序61 MOV A,#0CCH ;跳过ROM匹配62 ACALL WRITE_1820 ;写入子程序63 MOV A,#0BEH ;发出读温度命令64 ACALL WRITE_1820 ;写入子程序65 ACALL READ_1820 ;调用读取子程序66 RET6768 ;--------温度数据处理显示子程序----------69 SET_DATA:70 ACALL CONV_TEMP ;处理温度BCD 码子程序71 ACALL DISP_BCD ;显示区BCD 码温度值刷新子程序72 ACALL CONV ;LCD显示子程序73 RET7475;-----------按键键扫描子程序----------76 P_KEY: ;按键K1处理77 JB K1, PK1 ;K1键未按,转到PK1处78 ACALL SPK_BZ ;K1键按下,一声鸣响79 JNB K1,$ ;等按键放开80 MOV DPTR,#M_ALAX1 ;存M_ALAX1表81 MOV A,#182 ACALL LCD_PRINT ;显示字符83 ACALL LOOK_ALARM ;显示信息区子程序84 JB K3, $ ;等待K3按下85 ACALL SPK_BZ ;一声鸣响86 JMP PK2 ;转到标号PK2处87 PK1: ; 按键K2处理88 JB K2, PK3 ;K2键未按,转到PK3处89 ACALL SPK_BZ ;K2键按下,一声鸣响90 JNB K2,$ ;等按键放开91 MOV DPTR, #TA1 ;存#TA1表92 MOV A,#193 ACALL LCD_PRINT ;显示字符94 ACALL SET_ALARM ;设定报警值TH、TL95 ACALL WR_THL ;将设定的TH,TL值写入DS18B20内96 ACALL WRITE_E2 ;调用报警值拷贝EEROM子程序97 PK2:98 ACALL MEU_OK ;显示"OK"信息子程序99 ACALL TEMP_BJ ;显示温度标记子程序100 PK3:101 RET102 ;―――――――――――――103 TA1: ;菜单表104 DB "RESET ALERT CODE"105 ;―――――――――――――106107 ;---------设定报警值TH、TL子程序--------108 SET_ALARM:109 ACALL LOOK_ALARM ;调用显示信息区子程序110 A0: JB K1,A2 ;按下K1(查看键),程序向下运行111 ACALL SPK_BZ ;蜂鸣器响一声112 JNB K1,$ ;等放开113 CPL 20H.1 ;UP/DOWN 标记反向114 A2: JB 20H.1,A3 ;20H.1=1,UP,转移到A3。
51单⽚机—按键控制点阵显⽰名称:按键控制 8X8LED 点阵屏显⽰图形说明:每次按下 K1 时,会使 8X8LED 点阵屏循环显⽰不同图形。
本例同时使⽤外部中断和定时中断#include"reg52.h"#include"intrins.h"#define led P0 //宏定义typedef unsigned int u16;typedef unsigned char u8;sbit src=P3^6;//移位寄存器时钟输⼊sbit rc=P3^5;//存储寄存器时钟输⼊sbit ser=P3^4;//串⾏数据输⼊sbit key=P3^2;//按键u8 duan[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};u8 count=0;u8 i;u8 flag=0;//标志位void delay(u16 x)//延时函数1us{while(x--);}void tim_init()//定时器初始化{EA=1;//中断总允许位ET0=1;//定时计数器中断允许位TMOD=0X01;//定时器0的⽅式1 0000 0001TH0=0XD8;//⾼⼋位TL0=0XF0;//低⼋位TR0=1;//开启定时}void int0_init()//中断初始化{EX0=1;//外部中断允许位IT0=1;//下降沿触发}void c595(u8 date)//c595芯⽚初始化{u8 a;src=0;//移位寄存器时钟输⼊rc=0;//存储寄存器时钟输⼊for(a=0;a<8;a++){ser=date>>7;//选择最⾼位date<<=1;//向左移⼀位src=1;_nop_();//⼀个机器周期时间(在intrins头⽂件中)_nop_();src=0;}rc=1;_nop_();_nop_();rc=0;}void main(){led=0xcc;c595(0x00);tim_init();int0_init();while(1);}void int0() interrupt 0//中断服务函数{if(key==0){delay(4);//消抖if(key==0){while(key==0);//判断是否松⼿flag=1;}}}void tim0() interrupt 1{TH0=0XD8;TL0=0XF0;count++;if(count==50){if(flag==1){i++;c595(duan[i]);led=~led;delay(100);if(i==7){i=0;flag=0;}}count=0;}}。
基于51单片机的温控智能电风扇浙江理工大学《单片机系统设计及应用实验》设计报告题目:基于51单片机的温控智能电风扇专业:机械电子工程班级:机电11(1)班姓名:叶惠芳学号:指导教师:袁嫣红机械与自动控制学院2014 年7 月3 日目录摘要 (5)第一章课程设计的目标及主要内容 (6)1.1课程设计的目标及意义 (6)1.2温控智能电风扇的主要内容和技术关键 (6)课程设计的主要内容 (6)技术关键 (6)第二章温控智能电风扇控制系统硬件设计 (7)2.1课程设计总体硬件设计 (7)2.2芯片及主要器件选择 (8) (8) (8) (8)2.3芯片及器件介绍 (8) (8) (9) (10) (12)2.4主要硬件电路 (13) (13) (13) (14) (14)第三章温控智能电风扇控制系统软件设计与实现 (15)3.1 主程序 (15)3.2 数字温度传感器模块 (16)3.3电机调速与控制子模块 (18)第四章调试结果与总结 (18)4.1 调试结果 (18)4.2 课程设计总结 (22)参考文献 (23)附录一 (25)附录二 (26)附录三 (27)摘要电风扇与空调的降温效果不同,相较于空调的迅速降低环境温度不同,电风扇更加温和,适宜于体质较弱的老人与小孩。
并且,电风扇价格实惠,使用简单。
现在市面上的电风扇大多只能手动调速,还外加一个定时功能。
对于温差较大的夜晚,若不能及时改变风速大小后停止,很容易感冒着凉。
所以本课程设计以AT89C51为核心控制系统根据外界温度的变化对电风扇进行转速控制,以实现自动换挡功能。
除此之外,我们还设置了一个用户可以自己通过键盘设置最低温度的模块,一旦外界温度等于或是低于该设置温度,电机自动停止运行。
关键词:单片机温度传感器驱动器智能调速第一章课程设计的目标及主要内容1.1课程设计的目标及意义夏天到了,空调是现代家庭中的主流降暑电器,但是对于老人与小孩,体质相对来说较弱,空调的使用易于受凉,所以家用电风扇,风速温和,既可以达到清凉的目的,又可防止空调带来的弊端。