1、RTC实时时钟预约开机自动煲粥电饭煲/*文件名:RTC实时时钟预约开机自动煲粥电饭煲作者; 枫落版本: V11.11.1说明: 通过RTC实时时钟断电走时,预约开机时只需要调试CLOCK时间开机, 然后全功率加热水开后半功率熬闷,熬完之后自动间歇加热(保温 不改变普通电饭煲内部工作电路使电饭煲变智能。 1602液晶显示当前时间和开机预约时间 默认预约时间为05:30 RTC时钟DS1302芯片保证时间延续性 四按键控制简单明了 傻瓜式操作界面修改记录:2012年4月17日基本完成功能,加装无限延时程序可以使用 备份时间2012年4月18日*/*头文件*/#include#include #in
2、clude #include #define uint unsigned int#define uchar unsigned char/*1302地址定义*/#define WRITE_SECOND 0x80#define WRITE_MINUTE 0x82#define WRITE_HOUR 0x84#define READ_SECOND 0x81#define READ_MINUTE 0x83#define READ_HOUR 0x85#define WRITE_PROTECT 0x8E/*位地址*8*/sbit ACC_7 = ACC7;/管脚定义/*LCD1602设置 START* /
3、#define LCD_DB P0 sbit LCD_RS=P26; sbit LCD_RW=P25; sbit LCD_E=P27; sbit KZ=P10; /键盘控制键sbit SJ=P11; /小时加sbit FJ=P12; /分钟加sbit NKZ=P13;/闹钟控制/sbit KT=P13;sbit SCLK = P36; / DS1302时钟信号7脚sbit DIO= P34; / DS1302数据信号6脚sbit CE = P35; / DS1302片选5脚sbit ZK=P14; /高压总开关sbit MK=P30; /模式控制/*变量*/uchar duan,wei; /当
4、前显示的段数据,位数据/sbit DQ=P37;/uint templ,temph;/uint shuju=0x0000;uchar BZW=0;uchar ZKB=1,MKB=1;uchar Nfen=30,Nshi=5; /闹钟变量uchar Nfen_1,Nshi_1;/加热开水延时量uchar hc6; /数据拆分缓冲变量uchar Miao,Fen,Shi; /时分秒变量uchar code duanma=0123456789; /LED显示字段码/uchar code weima=0x05,0x04,0x03,0x02,0x01,0x00; /动态显示数据位码/*延时函数*/voi
5、d Delay(uint i) uint x,y; for(x=i;x0;x-) for(y=120;y0;y-) ; /*短延时*void TempDelay (unsigned char idata us) while(us-); */*地址、数据发送子程序 */void Write1302 ( unsigned char addr,dat ) unsigned char i,temp; CE=0; /CE引脚为低,数据传送中止 SCLK=0; /清零时钟总线 CE = 1; /CE引脚为高,逻辑控制有效 /发送地址 for ( i=8; i0; i- ) /循环8次移位 SCLK = 0
6、; temp = addr; DIO = (bit)(temp&0x01); /每次传输低字节 addr = 1;/右移一位 SCLK = 1; /发送数据 for ( i=8; i0; i- ) SCLK = 0; temp = dat; DIO = (bit)(temp&0x01); dat = 1; SCLK = 1; CE = 0;/*数据读取子程序 */unsigned char Read1302 ( unsigned char addr ) unsigned char i,temp,dat1,dat2; CE=0; SCLK=0; CE = 1;/发送地址 for ( i=8; i
7、0; i- ) /循环8次移位 SCLK = 0; temp = addr; DIO = (bit)(temp&0x01); /每次传输低字节 addr = 1;/右移一位 SCLK = 1; /读取数据 for ( i=8; i0; i- ) ACC_7=DIO; SCLK = 0; ACC=1; SCLK = 1; CE=0; dat1=ACC; dat2=dat1/16; /数据进制转换 dat1=dat1%16; /十六进制转十进制 dat1=dat1+dat2*10; return (dat1);/*数据处理*/void sjcl(uchar dat,det) /dat为待拆分数据,
8、det为即将存入缓冲数组位置 hcdet=dat%10; hcdet+1=dat/10;/*BCD码转换函数*/uchar To_BCD(uchar dat) /十进制转BCD码 uchar temp,temp1; temp=dat/10; temp1=dat%10; dat=temp*16+temp1; return (dat);/*- ;模块名称:delay_n10us(); ;功 能:延时函数,延时约n个10us ;占用资源:- ;参数说明:- ;-*/ void delay_n10us(uint n) /延时n个10us12M晶振 uint i; for(i=n;i0;i-) _nop
9、_();_nop_();_nop_();_nop_();_nop_();_nop_(); /*- ;模块名称:LCD_write_command(); ;功 能:LCD1602写指令函数 ;占用资源: P2.0-RS(LCD_RS),P2.1-RW(LCD_RW),P2.2-E(LCD_E). ;参数说明:dat 为写命令参数 ;-*/ void LCD_write_command(uchar dat) delay_n10us(10); LCD_RS=0; /指令 LCD_RW=0; /写入 LCD_E=1; /允许 LCD_DB=dat; delay_n10us(10); / LCD_E=0
10、; delay_n10us(10); / /*- ;模块名称:LCD_write_data(); ;功 能:LCD1602写数据函数 ;占用资源: P2.0-RS(LCD_RS),P2.1-RW(LCD_RW),P2.2-E(LCD_E). ;参数说明:dat 为写数据参数 ;-*/ void LCD_write_data(uchar dat) delay_n10us(10); LCD_RS=1; /数据 LCD_RW=0; /写入 LCD_E=1; /允许 LCD_DB=dat; delay_n10us(10); LCD_E=0; delay_n10us(10); /*- ;模块名称: ;功
11、 能:显示一个字符 ;占用资源:- ;参数说明: ;-*/ void LCD_disp_char(uchar x,uchar y,uchar dat) uchar address; if(y=1) address=0x80+x; else address=0xc0+x; LCD_write_command(address); LCD_write_data(dat); /*- ;模块名称: ;功 能:显示一个字符串。 ;占用资源:- ;参数说明: ;-*/ void LCD_disp_str(uchar x,uchar y,uchar *str) uchar address; if(y=1) a
12、ddress=0x80+x; else address=0xc0+x; LCD_write_command(address); while(*str!=0) LCD_write_data(*str); str+; /*- ;模块名称:LCD_init(); ;功 能:初始化LCD1602 ;占用资源:- ;参数说明:- ;-*/ void LCD_init(void) delay_n10us(10); LCD_write_command(0x38);/设置8位格式,2行,5x7 delay_n10us(10); LCD_write_command(0x0c);/整体显示,关光标,不闪烁 del
13、ay_n10us(10); LCD_write_command(0x06);/设定输入方式,增量不移位 delay_n10us(10); LCD_write_command(0x01);/清除屏幕显示 delay_n10us(100); /延时清屏,延时函数,延时约n个10us void xianshi_1(uchar xx,wei) LCD_disp_char(xx,1,0x3a); LCD_disp_char(xx+2,1,duanmahcwei); LCD_disp_char(xx+1,1,duanmahcwei+1); void xianshi_2(uchar xx,wei) LCD_
14、disp_char(xx,2,0x3a); LCD_disp_char(xx+2,2,duanmahcwei); LCD_disp_char(xx+1,2,duanmahcwei+1); /*键盘扫描*/void Keybod() uchar fen,shi; /调试RTC时钟缓冲变量 fen=Fen; shi=Shi; sjcl(fen,2); sjcl(shi,4); LCD_write_command(0x01); Delay(1); LCD_disp_str(0,1,Time); xianshi_1(4,4); xianshi_1(7,2); LCD_disp_str(14,1,T);
15、/显示调试界面 Delay(500); while(1) /进入调试模式,进行键盘扫描 if(SJ=0) /小时调试 shi+; if(shi=24) shi=0; sjcl(shi,4); xianshi_1(4,4); Delay(250); SJ=1; if(FJ=0) /分钟调试 fen+; if(fen=60) fen=0; sjcl(fen,2); xianshi_1(7,2); Delay(250); FJ=1; if(KZ=0) /调试完毕返回待机界面 Fen=fen; Shi=shi; shi=To_BCD(shi); fen=To_BCD(fen); Miao=0x00;
16、Write1302 (WRITE_PROTECT,0X00); /禁止写保护 Write1302(WRITE_SECOND,Miao); Write1302(WRITE_MINUTE,fen); Write1302(WRITE_HOUR,shi); Write1302 (WRITE_PROTECT,0x80);/允许写保护 LCD_write_command(0x01); Delay(1); LCD_disp_str(0,1,Time); LCD_disp_str(0,2,clock);/第二行显示字符串 sjcl(Nshi,4); /清平之后的闹钟显示 sjcl(Nfen,2); xians
17、hi_2(5,4); xianshi_2(8,2); sjcl(Miao,0); sjcl(Fen,2); sjcl(Shi,4); xianshi_1(4,4); xianshi_1(7,2); xianshi_1(10,0); Delay(250); KZ=1; break; /*调闹钟键盘扫描函数 */ void Keybod_N() LCD_write_command(0x01); Delay(1); LCD_disp_str(0,2,clock);/显示闹钟调试界面 sjcl(Nshi,4); sjcl(Nfen,2); xianshi_2(5,4); xianshi_2(8,2);
18、 Delay(500); while(1) /进入调试模式按键扫描 if(SJ=0) /小时调试 Nshi+; if(Nshi=24) Nshi=0; sjcl(Nshi,4); xianshi_2(5,4); Delay(250); SJ=1; if(FJ=0) /分钟调试 Nfen+; if(Nfen=60) Nfen=0; sjcl(Nfen,2); xianshi_2(8,2); Delay(250); FJ=1; if(NKZ=0) /调试完毕返回主界面 LCD_write_command(0x01); Delay(1); LCD_disp_str(0,1,Time); LCD_di
19、sp_str(0,2,clock);/第二行显示字符串 sjcl(Nshi,4); /清平之后的闹钟显示 sjcl(Nfen,2); xianshi_2(5,4); xianshi_2(8,2); sjcl(Miao,0); sjcl(Fen,2); sjcl(Shi,4); xianshi_1(4,4); xianshi_1(7,2); xianshi_1(10,0); Delay(250); Nfen_1=Nfen; Nshi_1=Nshi; NKZ=1; break; /*RTC延时加热,停机函数*/void Y_shi(uchar shijian) /改变延时闹钟变量 Nfen_1=N
20、fen_1+shijian; /定义闹钟变量 if(Nfen_1=60) Nfen_1=Nfen_1-60; /如果超过60进位 Nshi_1=Nshi_1+1; if(Nshi_1=24) Nshi_1=0; /*主函数*/void main() uchar biaozhi; LCD_init(); LCD_disp_str(0,1,Time);/显示字符串 LCD_disp_str(0,2,clock);/第二行显示字符串 sjcl(Nshi,4); sjcl(Nfen,2); xianshi_2(5,4); xianshi_2(8,2); Nfen_1=Nfen; Nshi_1=Nshi
21、; ZK=1; MK=1; while(1) if(KZ=0) Keybod(); if(NKZ=0) Keybod_N(); Miao=Read1302(0x81); /读 时 分 秒 Fen= Read1302(0x83); Shi= Read1302(0x85); if(Fen=Nfen&Shi=Nshi&ZKB=1) /全功率加热 if(ZK=1) Y_shi(10); /全功率加热10分钟 ZK=0;/总开关 开 ZKB=0; MK=1;/模式控制为1 MKB=1; if(ZKB=0&Fen=Nfen_1&Shi=Nshi_1&MKB=1&BZW=0) /半功率熬粥 MK=0; MK
22、B=0; Y_shi(10);/半功率熬粥10分钟 BZW=1; if(ZKB=0&Fen=Nfen_1&Shi=Nshi_1&BZW=1) /全功率间歇停机(保温) MK=1; MKB=1; Y_shi(5);/停机时间 ZK=1;/总开关 关 ZKB=1; if(ZKB=1&Fen=Nfen_1&Shi=Nshi_1&BZW=1) /全功率间歇加热(保温) MK=1; MKB=1; Y_shi(2); /加热时间(保温) ZK=0;/总开关 开 ZKB=0; if(biaozhi!=Miao) /判断是否走时 sjcl(Miao,0); sjcl(Fen,2); sjcl(Shi,4); biaozhi=Miao; xianshi_1(4,4); xianshi_1(7,2); xianshi_1(10,0);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1