智能电风扇程序.docx
- 文档编号:3775623
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:40
- 大小:23.66KB
智能电风扇程序.docx
《智能电风扇程序.docx》由会员分享,可在线阅读,更多相关《智能电风扇程序.docx(40页珍藏版)》请在冰点文库上搜索。
智能电风扇程序
/********************************************************************
*
* 文件名:
智能风扇2009052613.c
*
* 文件描述:
DS1302+DS18B20+12864串行
*
* 修改记录/时间:
5/14:
12864显示
5/14:
温度
5/16:
DS1302
5/17
5/18
5/19
5/20加键盘
5/21加键盘修改
5/26最终版
*
*************************头文件*******************************************/
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/*************************************************************************/
//温度传感器
sbitDQ=P0^7;//ds18B20
//12864液晶引脚定义
sbitSID=P3^6;//数据
sbitSCLK=P3^7;//时钟
//定义DS1302时钟接口
sbitclock_clk=P0^2;//ds1302_clk(时钟线)
sbitclock_dat=P0^1;//ds1302_dat(数据线)
sbitclock_Rst=P0^0;//ds1302_Rst(复位线
//定义累加器A中的各位
sbita0=ACC^0;
sbita1=ACC^1;
sbita2=ACC^2;
sbita3=ACC^3;
sbita4=ACC^4;
sbita5=ACC^5;
sbita6=ACC^6;
sbita7=ACC^7;
/***********************定义全局变量*********************************/
unsignedcharyy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)
bitw=0;//调时标志位
staticunsignedcharmenu=0;//定义静态小时更新用数据变量
staticunsignedcharkeys=0;//定义静态小时更新用数据变量
staticunsignedchartimecount=0;//定义静态软件计数器变量
unsignedcharkey;//4x4矩阵键盘
uintshuju;//红外遥控接收
unsignedcharID,IDD;//IDD:
开关机、ID:
档位
uintcount=0;//自然风、睡眠风控制
uintDDD=0;//自然风、睡眠风赋值
uintshi,fen,miao;//定时
ucharding,iiii;//
uintzz,zzz;//
/****************************************************************************/
voidDelayM(unsignedinta)
{unsignedchari;
while(--a!
=0)
{
for(i=0;i<125;i++);//一个;表示空语句,CPU空转。
}//i从0加到125,CPU大概就耗时1毫秒
}
voidDelayms(unsignedintDelayms_i)
{
unsignedintDelayms_j;
for(Delayms_j=1;Delayms_j>1;Delayms_j--)
{
for(;Delayms_i>1;Delayms_i--);
}
}
/************************函数声明*************************************/
voidlcm_w_word(unsignedchar*str);//写字符
voidlcm_w_test(bitstart,unsignedcharddata);//(0,指令)(1,数据)
voidlcm_w_byte(unsignedcharbbyte);//写一个字节给lcm
voiddelaynms(unsignedintdi);//延时
voidlcm_init(void);//lcm初始化
voidlcm_clr(void);//清屏
/*voiddays(viod)//公历节日数据库
{lcm_w_test(0,0x80);
lcm_clr();
lcm_w_test(0,0x98);
{
在此处输入要显示的内容
}
}*/
/***********************初始化LCM**************************************/
voidlcm_init(void)
{
delaynms(100);//启动等待,等LCM讲入工作状态
lcm_w_test(0,0x30);//8位介面,基本指令集
lcm_w_test(0,0x0c);//显示打开,光标关,反白关
lcm_w_test(0,0x01);//清屏,将DDRAM的地址计数器归零
delaynms(100);//启动等待,等LCM讲入工作状态
}
/******************写指令或数据(0,指令)(1,数据)*****************************************/
voidlcm_w_test(bitstart,unsignedcharddata)
{
unsignedcharstart_data,Hdata,Ldata;
if(start==0)
start_data=0xf8;//0:
写指令
else
start_data=0xfa;//1:
写数据
Hdata=ddata&0xf0;//取高四位
Ldata=(ddata<<4)&0xf0;//取低四位
lcm_w_byte(start_data);//发送起始信号
delaynms(5);//延时是必须的
lcm_w_byte(Hdata);//发送高四位
delaynms(5);//延时是必须的
lcm_w_byte(Ldata);//发送低四位
delaynms(5);//延时是必须的
}
/*********************发送一个字节(底层函数)****************************************/
voidlcm_w_byte(unsignedcharbbyte)
{
unsignedchari;
for(i=0;i<8;i++)
{
SID=bbyte&0x80;//取出最高位
SCLK=1;
SCLK=0;
bbyte<<=1;//左移
}
}
/***********************延时(LCM占用)***************************************/
voiddelaynms(unsignedintdi)
{
unsignedintda,db;
for(da=0;da for(db=0;db<10;db++); } /***********************清屏函数******************************************/ voidlcm_clr(void) { lcm_w_test(0,0x01); delaynms(40);//启动等待,等LCM讲入工作状态 } /*****************************************************************************/ //向LCM发送一个字符串,长度64字符之内。 //应用: lcm_w_word("您好! "); voidlcm_w_word(unsignedchar*str) { while(*str! ='\0') { lcm_w_test(1,*str++); } *str=0; } /******************************************************************************/ voidDelay(intnum)//延时函数 { while(num--); } /******************************************************************************/ voidInit_DS18B20(void)//初始化ds1820 { unsignedcharx=0; DQ=1;//DQ复位 Delay(8);//稍做延时 DQ=0;//单片机将DQ拉低 Delay(80);//精确延时大于480us DQ=1;//拉高总线 Delay(14); x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败 Delay(20); } /******************************************************************************/ unsignedcharReadOneChar(void)//读一个字节 { unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--) { DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; Delay(4); } return(dat); } /******************************************************************************/ voidWriteOneChar(unsignedchardat)//写一个字节 { unsignedchari=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; Delay(5); DQ=1; dat>>=1; } } /******************************************************************************/ unsignedintReadTemperature(void)//读取温度 { unsignedchara=0; unsignedcharb=0; unsignedintt=0; floattt=0; Init_DS18B20(); WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(0x44);//启动温度转换 Init_DS18B20(); WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(0xBE);//读取温度寄存器 a=ReadOneChar();//读低8位 b=ReadOneChar();//读高8位 t=b; t<<=8; t=t|a; tt=t*0.0625; t=tt*10+0.5;//放大10倍输出并四舍五入 return(t); } /**********************声明**********************************/ voidlcm_w_ss(void);voidlcm_w_mm(void); voidlcm_w_hh(void);voidlcm_w_dd(void); voidlcm_w_mo(void);voidlcm_w_yy(void);voidlcm_w_xq(void); unsignedcharclock_in(void); voidclock_out(unsignedchardd); voidInit_1302(void); unsignedcharread_clock(unsignedcharord); voidread_clockS(void); voidwrite_clock(unsignedcharord,unsignedchardd); voidupdata(void); /*****************************************************************************/ //常用时钟数据读取 voidread_clockS(void) { ss=read_clock(0x81);//读取秒数据 mm=read_clock(0x83);//读取分钟数据 hh=read_clock(0x85);//小时 dd=read_clock(0x87);//日 mo=read_clock(0x89);//月 xq=read_clock(0x8b);//星期 yy=read_clock(0x8d);//年 } /**********************调时用加1程序*************************************/ voidSet_time(unsignedcharsel,bitsel_1)//根据选择调整相应项目并写入DS1302 { signedcharaddress,item; signedcharmax,mini; lcm_w_test(0,0x8e); //lcm_w_word("调整"); //if(sel==6){lcm_w_word("秒钟");address=0x80;max=0;mini=0;}//秒7 if(sel==5){lcm_w_word("分钟");address=0x82;max=59;mini=0;}//分钟6 if(sel==4){lcm_w_word("小时");address=0x84;max=23;mini=0;}//小时5 if(sel==3){lcm_w_word("星期");address=0x8a;max=7;mini=1;}//星期4 if(sel==2){lcm_w_word("日期");address=0x86;max=31;mini=1;}//日3 if(sel==1){lcm_w_word("月份");address=0x88;max=12;mini=1;}//月2 if(sel==0){lcm_w_word("年份");address=0x8c;max=99;mini=0;}//年1 //读取1302某地址上的数值转换成10进制赋给item item=((read_clock(address+1))/16)*10+(read_clock(address+1))%16; if(sel_1==0) item++; else item--; if(item>max)item=mini; if(item write_clock(0x8e,0x00);//允许写操作 write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302 write_clock(0x8e,0x80);//写保护,禁止写操作 updata();//刷新数据 lcm_w_mm();//刷新分 } /************************设置1302的初始时间*********************************/ voidInit_1302(void) {//(2009年5月26日00时00分00秒星期一 write_clock(0x8e,0x00);//允许写操作 write_clock(0x8c,0x09);//年 write_clock(0x8a,0x02);//星期 write_clock(0x88,0x05);//月 write_clock(0x86,0x26);//日 write_clock(0x84,0x00);//小时 write_clock(0x82,0x00);//分钟 write_clock(0x80,0x00);//秒 //write_clock(0x90,0xa5);//充电 write_clock(0x8e,0x80);//禁止写操作 } /*******************DS1302写数据(底层协议)**********************************************/ voidwrite_clock(unsignedcharord,unsignedchardd) { clock_clk=0; clock_Rst=0; clock_Rst=1; clock_out(ord); clock_out(dd); clock_Rst=0; clock_clk=1; } /*******************1302驱动程序(底层协议***********************************************/ voidclock_out(unsignedchardd) { ACC=dd; clock_dat=a0;clock_clk=1;clock_clk=0; clock_dat=a1;clock_clk=1;clock_clk=0; clock_dat=a2;clock_clk=1;clock_clk=0; clock_dat=a3;clock_clk=1;clock_clk=0; clock_dat=a4;clock_clk=1;clock_clk=0; clock_dat=a5;clock_clk=1;clock_clk=0; clock_dat=a6;clock_clk=1;clock_clk=0; clock_dat=a7;clock_clk=1;clock_clk=0; } /**************************DS1302写入字节(底层协议)*******************************/ unsignedcharclock_in(void) { clock_dat=1; a0=clock_dat; clock_clk=1;clock_clk=0;a1=clock_dat; clock_clk=1;clock_clk=0;a2=clock_dat; clock_clk=1;clock_clk=0;a3=clock_dat; clock_clk=1;clock_clk=0;a4=clock_dat; clock_clk=1;clock_clk=0;a5=clock_dat; clock_clk=1;clock_clk=0;a6=clock_dat; clock_clk=1;clock_clk=0;a7=clock_dat; return(ACC); } /**************************DS1302读数据(底层协议)***************************************/ unsignedcharread_clock(unsignedcharord) { unsignedchardd=0; clock_clk=0; clock_Rst=0; clock_Rst=1; clock_out(ord); dd=clock_in(); clock_Rst=0; clock_clk=1; return(dd); } /******************向LCM中填写年数据***************************/ voidlcm_w_yy(void) { yy=read_clock(0x8d); lcm_w_test(0,0x80); lcm_w_word("20"); lcm_w_test(0,0x81); lcm_w_test(1,(yy/16)+0x30); lcm_w_test(1,yy%16+0x30); lcm_w_test(0,0x82); lcm_w_word("年"); } /*******************向LCM中填写月数据*****************************/ voidlcm_w_mo(void) { mo=read_clock(0x89); lcm_w_test(0,0x83); if(mo/16! =0){lcm_w_test(1,(mo/16)+0x30);}//十位消隐 else{lcm_w_test(1,0x20);}//同上 lcm_w_test(1,mo%16+0x30); lcm_w_test(0,0x84); lcm_w_word("月"); } /*******************星期处理并送入LCM的指定区域****************************************/ voidlcm_w_xq(void) { unsignedcharsel; xq=read_clock(0x8b); sel=(read_clock(0x8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 电风扇 程序