全部通过测试花了几天的时间把一个单纯的机械风扇做成一个51单片机控制的智能风扇。附电路图和完整程序。欢迎下载,并希望在我的基础上加以更多的功能。功能:开机密码、一档、二档、三档、定时、摇头、照明、自然风、睡眠风、温控风(ds18b20控制)、自动关机、汉字移动。#includereg52.h#includestdio.h#defineucharunsignedchar#defineuintunsignedint/***********************定义数据接口**************************/sbitsound=P2^2;//将sound位定义为P2.2sbitlcden=P2^7;//E12864使能端sbitlcdrs=P2^6;//Rs12864写入端sbitwd=P2^0;//温度传感器信号线sbitS6=P1^1;//将S6位定义为P1.1引脚sbitS5=P1^2;//将S5位定义为P1.2引脚sbitS4=P1^3;//将S4位定义为P1.3引脚sbitS3=P1^4;//将S3位定义为P1.4引脚sbitS2=P1^5;//将S2位定义为P1.5引脚sbitS1=P1^6;//将S1位定义为P1.6引脚sbitK1=P3^3;//一档sbitK2=P3^4;//二档sbitK3=P3^5;//三档sbitK4=P3^7;//摇头sbitK5=P3^6;//彩灯sbitK6=P2^5;//彩灯/***********************定义全局变量**************************/ucharfen,dd,ee,KG,dw,yt,ds,cd,i,yd,li,miao,MS,zr,SD,sm,sm1,sm2,sm3;charx,bz,count,second,minute,hour;uinttemp;floatf_temp;/***********************定义数组字符串************************/ucharcodechu7[]={欢迎使用};ucharcodechu6[]={国家免检产品};ucharcodechu0[]={密码:_________};ucharcodechu8[]={请注意周围的环境};ucharcodechu9[]={};ucharcodechu10[]={WindowsXP专业版};ucharcodechu11[]={启动中};ucharcodechu12[]={};ucharcodechu2[]={档位风摇头灯};ucharcodechu3[]={档位0OFFOFF};ucharcodechu4[]={00时00分00.0℃};ucharcodechu5[]={2011应用电子技术};/***********************功能:延时函数0*************************************/voiddelay(uchard){ucharx,y;for(x=d;x0;x--)for(y=5;y0;y--);}/***********************功能:延时函数1*************************************/voiddelay1(uintz){uinti,j;for(i=0;i2;i++)for(j=0;jz;j++);}/***********************功能:蜂鸣器响应*************************************/voidfengmingqi(){uchari;for(i=10;i0;i--){sound=0;delay(1);sound=1;delay(1);}}/**********************功能:液晶12864写,写数据函数********************************/voidxieling_shu(ucharqq,ucharshu){if(qq==1){lcdrs=0;}//qq等于1时是写指令if(qq==0){lcdrs=1;}//qq等于0时是写数据P0=shu;delay(5);lcden=1;delay(5);lcden=0;}/***********************功能:液晶12864写入地址*************************************/voidxieludizhi(ucharx,uchary){switch(x){case1:xieling_shu(1,0x80+y);return;//return返回的意思case2:xieling_shu(1,0x90+y);return;case3:xieling_shu(1,0x88+y);return;case4:xieling_shu(1,0x98+y);return;}}/**********************功能:液晶12864写入字符串***********************************/voidxiezifuchuan(uchar*dd){while(*dd!='\0'){xieling_shu(0,*dd++);}}/**********************功能:液晶12864清屏函数*************************************/voidqingping(){xieling_shu(1,0x01);//清屏xieling_shu(1,0x01);//清屏xieling_shu(1,0x01);//清屏delay(5);}/********************功能:液晶12864初始化显示函数********************************/voidinit_12864(){xieling_shu(1,0x30);//基本指令操作xieling_shu(1,0x30);//基本指令操作xieling_shu(1,0x0C);//0x0c:无光标,OXOF:光标反白显示xieling_shu(1,0x01);//清屏xieling_shu(1,0x06);}/*******************功能:液晶12864初始化字串显示************************************/voidinit_zifu(){xieludizhi(1,0);xiezifuchuan(chu7);//xieludizhi(2,0);xiezifuchuan(chu6);//xieludizhi(3,0);xiezifuchuan(chu0);//请输入密码xieludizhi(4,0);xiezifuchuan(chu8);///******************第一个密码S4**************************/while(S4!=0);/******************第二个密码S5**************************/while(S5!=0);/******************第三个密码S6**************************/while(S6!=0);/******************第四个密码S4**************************/while(S4!=0);/******************密码全部正确,进入欢迎使用**************************/delay1(5000);qingping();delay(5);xieludizhi(1,0);xiezifuchuan(chu9);xieludizhi(2,0);xiezifuchuan(chu10);xieludizhi(3,0);xiezifuchuan(chu11);xieludizhi(4,0);xiezifuchuan(chu12);//进入第2关for(i=3;i0;i--){xieludizhi(3,4);xiezifuchuan(.);delay1(10000);xieludizhi(3,4);xiezifuchuan(..);delay1(10000);xieludizhi(3,5);xiezifuchuan(.);delay1(10000);xieludizhi(3,5);xiezifuchuan(..);delay1(10000);xieludizhi(3,6);xiezifuchuan(.);delay1(10000);xieludizhi(3,6);xiezifuchuan(..);delay1(10000);xieludizhi(3,4);xiezifuchuan();delay1(10000);}/*******************WindowsXP专业版启动成功*********************/qingping();//清屏xieludizhi(1,0);xiezifuchuan(chu2);delay(5);xieludizhi(2,0);xiezifuchuan(chu3);delay(5);xieludizhi(3,0);xiezifuchuan(chu4);delay(5);xieludizhi(4,0);xiezifuchuan(chu5);delay(5);}/**********************************************************************************************************************功能:18B20所有函数************************************//*******************18B20复位,初始化函数**************************/voiddsreset(void){uinti;wd=0;i=103;while(i0)i--;wd=1;i=4;while(i0)i--;}/*******************18B20读1位函数**************************/bittempreadbit(void){uinti;bitdat;wd=0;i++;//i++起延时作用wd=1;i++;i++;dat=wd;i=8;while(i0)i--;return(dat);}/*******************18B20读1个字节函数**************************/uchartempread(void){uchari,j,dat;dat=0;for(i=1;i=8;i++){j=tempreadbit();dat=(j7)|(dat1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);}/*******************18B20写一个字节数据函数**************************/voidtempwritebyte(uchardat){uinti;ucharj;bittestb;for(j=1;j=8;j++){testb=dat&0x01;dat=dat1;if(testb)//写1{wd=0;i++;i++;wd=1;i=8;while(i0)i--;}else{wd=0;//写0i=8;while(i0)i--;wd=1;i++;i++;}}}/*******************18B20开始获取温度并转换函数**************************/voidtempchange(void){dsreset();delay(5);tempwritebyte(0xcc);//写跳过读ROM指令t