




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*寄存器宏定义*/#define WRITE_DS1302_SECOND 0X80 /写入“秒”寄存器#defineWRITE_DS1302_MINUTE 0X82 /写入“分”寄存器#defineWRITE_DS1302_HOUR 0X84 /写入“小时”寄存器#defineWRITE_DS1302_DAY 0X86 /写入“日”寄存器#defineWRITE_DS1302_MONTH 0X88 /写入“月”寄存器#defineWRITE_DS1302_WEEK 0X8A /写入“星期”寄存器#defineWRITE_DS1302_YEAR 0X8C /写入“年”寄存器#define WRITE_DS1302_REINIT_ADDR 0XC0 /写入上电判断RAM寄存器#defineREAD_DS1302_SECOND 0X81 /读出“秒”寄存器#defineREAD_DS1302_MINUTE 0X83 /读出“分”寄存器#defineREAD_DS1302_HOUR 0X85 /读出“小时”寄存器#defineREAD_DS1302_DAY 0X87 /读出“日期”寄存器#defineREAD_DS1302_MONTH 0X89 /读出“月”寄存器#defineREAD_DS1302_WEEK 0X8B /读出“星期”寄存器#defineREAD_DS1302_YEAR 0X8D /读出“年”寄存器#define READ_DS1302_REINIT_ADDR 0XC1 /读出上电判断RAM寄存器#define WRITE_DS1302_Timing_Hour1 0XC2#define WRITE_DS1302_Timing_Min1 0XC4#define WRITE_DS1302_Timing_Hour2 0XC6#define WRITE_DS1302_Timing_Min2 0XC8 #define WRITE_MODE_STA 0XCA#define WRITE_WIN_STA 0XCC#define READ_DS1302_Timing_Hour1 0XC3#define READ_DS1302_Timing_Min1 0XC5#define READ_DS1302_Timing_Hour2 0XC7#define READ_DS1302_Timing_Min2 0XC9#define READ_MODE_STA 0XCB#define READ_WIN_STA 0XCD#defineDS1302_WRITE_PROTECT 0X8E /写保护寄存器#define DS1302_Trickl_Charge 0X90 /慢速充电寄存器/*初始化日期时间宏定义*/初始日期时间为“2011年10月09日星期日12点00分00秒”/ 注意:此处是十进制,下面“地址,数据发送子程序”中有转换#define INIT_SECONGD 50#define INIT_MINUTE 59#define INIT_HOUR 22#define INIT_DAY 9#define INIT_MONTH 10#define INIT_WEEK 7#define INIT_YEAR 11/*写保护设置宏定义*/ 注意:此处是十进制,下面“地址,数据发送子程序”中有转换#defineDS1302_WRITE_PROTECT_NO 0 /写保护禁止#defineDS1302_WRITE_PROTECT_OFF 128 /写保护允许/*DS1302端口定义*/sbit DS1302_SCLK=P15; /DS1302时钟信号sbit DS1302_DIO=P16; /DS1302数据信号sbit DS1302_CE=P17; /DS1302片选信号/*充电方式宏定义*/ TCS TCS TCS TCS DS DS RS RS/慢速充电选择(TCS)位(位47)控制快速充电器的选择,只有1010模式才能使慢速充电器工作/所有其它模式将禁止慢速充电器工作/DS1302上电时,慢速充电器被禁止/(DS)位(位23)选择是一个二极管(01)还是两个二极管(10),如果DS为“00”或“11”,则充电器被禁止/RS位(位01)选择连接在VCC2与VCC1之间的电阻:“00” 无;“01” 2K; “10” 4K; “11” 8K。/如果RS为00,充电器被禁止,与TCS无关/最大充电电流计算:Imax=(5.0V-二极管压降)/R#define Hold_DS1302_Charge 160/ =0XA5 即 1010 0101使用慢速充电器,选择一个二极管、一个电阻/*重新上电判断宏定义*/#define DS1302_REINIT_DATA 3/=0x55 即 0101 0101/*标示位定义*/bit DS1302_CH_flog=0;/1302时钟暂停标示位 “=0”运行 “=1”暂停bit DS1302_CLK_WAY=0;/1302时钟工作方式标示位 “=0”24小时方式 “=1”12小时方式extern void delayms(unsigned int xms);/*地址,数据发送子程序*/void WRITE_DS1302(unsigned char addr,dat) /注意:为了方便此处的dat为十进制unsigned char i,temp;dat=(dat/10)*16+dat%10;/十进制转化成十六进制DS1302_CE=0; /没有先前的低电平不能工作。,DS1302_CE的高电平启动一次数据的传输 DS1302_SCLK=0;DS1302_CE=1;/DS1302片选上跳变打开数据传输for(i=0;i1; /右移一位delayms(1);DS1302_SCLK=1;for(i=0;i1; /右移一位delayms(1);DS1302_SCLK=1;DS1302_CE=0; /DS1302片选下跳变关闭数据传输/*数据读取子程序*/unsigned char READ_DS1302(unsigned char addr)unsigned char i,temp,dat;DS1302_CE=0; /没有先前的低电平不能工作。,DS1302_CE的高电平启动一次数据的传输 DS1302_SCLK=0;DS1302_CE=1;/DS1302片选上跳变打开数据传输for(i=0;i1; /右移一位delayms(1);DS1302_SCLK=1;for(i=0;i1;delayms(1);DS1302_SCLK=0;DS1302_CE=0; /DS1302片选下跳变关闭数据传输dat=(dat/16)*10+dat%16; /十六进制转化成十进制return dat; /注意:为了方便此处返回的值为十进制/*初始化DS1302子程序*/void INIT_DS1302() if(READ_DS1302(READ_DS1302_REINIT_ADDR)!=DS1302_REINIT_DATA) /判断是否是重新上电 WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_NO); /禁止写保护 WRITE_DS1302(WRITE_DS1302_SECOND,INIT_SECONGD); /秒 WRITE_DS1302(WRITE_DS1302_MINUTE,INIT_MINUTE); /分 WRITE_DS1302(WRITE_DS1302_HOUR,INIT_HOUR); /小时 WRITE_DS1302(WRITE_DS1302_DAY,INIT_DAY); /日期 WRITE_DS1302(WRITE_DS1302_MONTH,INIT_MONTH); /月份 WRITE_DS1302(WRITE_DS1302_WEEK,INIT_WEEK); /星期 WRITE_DS1302(WRITE_DS1302_YEAR,INIT_YEAR); /年 WRITE_DS1302(DS1302_Trickl_Charge,Hold_DS1302_Charge); /充电方式设置 WRITE_DS1302(WRITE_DS1302_REINIT_ADDR,DS1302_REINIT_DATA); /用于主控制器重新上电判断 WRITE_DS1302(WRITE_DS1302_Timing_Hour1,6); WRITE_DS1302(WRITE_DS1302_Timing_Min1,30); WRITE_DS1302(WRITE_DS1302_Timing_Hour2,18); WRITE_DS1302(WRITE_DS1302_Timing_Min2,20); WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_OFF); /允许写保护 else WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_NO); /禁止写保护 WRITE_DS1302(DS1302_Trickl_Charge,Hold_DS1302_Charge); /充电方式设置 WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_OFF); /允许写保护 #define uchar unsigned char#define uint unsigned int sbit EN=P26;sbit RS=P24;sbit RW=P25;uchar LCD1602_Table=0123456789;/LCD1602显示标尺 /0123456789abcdefuchar code DIS_TIM16 = 2000/00/00 00:00; /时间日期显示 2000/00/00 00:00 uchar code DIS_STA16 = M:Auto WIN:OFF; /系统工作状态显示uchar code DIS_SET_TIM16= Set the timer: ;uchar code DIS_THE_TIM16=O:-:- C:-:-;extern void delayms(uint xms);void WRITE_LCD1602_DAT(uchar date)EN=0;RS=1;P0=date;EN=0;delayms(5);EN=1;void WRITE_LCD1602_COM(uchar date)EN=0;RS=0;P0=date;EN=0;delayms(5);EN=1;void init_1602() unsigned char i;RW=0;WRITE_LCD1602_COM(0x38);WRITE_LCD1602_COM(0x0c);WRITE_LCD1602_COM(0x06);WRITE_LCD1602_COM(0x01);WRITE_LCD1602_COM(0x80);for(i=0;i16;i+)WRITE_LCD1602_DAT(DIS_TIMi);WRITE_LCD1602_COM(0x80+0x40);for(i=0;i16;i+)WRITE_LCD1602_DAT(DIS_STAi);#include#includeDS1302.H#includeLCD1602.H#define uchar unsigned char#define uint unsigned int#define Motor_Step 400#define HIGH 1#define LOW 0#define KEY_NO_NUM 0#define KEY_TIM_SET_NUM 1#define KEY_MODE_SET_NUM 2#define KEY_ADD_NUM 3#define KEY_MIN_NUM 4#define Auto_MODE 0#define Manual_MODE 1#define Timing_MODE 2unsigned char speed=8; /步进电机的转速uchar Tim_red_tab6=0;/记录年月日时分秒和系统状态信息uchar Timing_tab22=12,30,15,20;/记录定时间uchar Time_num1,Time_num2;uchar time1_num=0;uint time2_num=0;uchar Win_Sta=0; /窗帘状态 0打开 1关闭uchar SET_TIM_FLAG=0;/时间设置标志位uchar MODE_FLAG=0; /工作模式标志位uchar WIN_STA_FLAG=0;/窗帘状态标志位bit Action_FLAG=0;/窗帘动作标志位bit Again_flag=0;sbit KEY_TIM_SET=P10;/时间设置按键sbit KEY_MODE_SET=P11;/定时时间设置按键sbit KEY_ADD=P12;/时间设置加/手动模式开窗帘sbit KEY_MIN=P13;/时间设置减/手动模式关窗帘sbit WIR_KEY_TIM_SET=P22;/时间设置按键sbit WIR_KEY_MODE_SET=P20;/定时时间设置按键sbit WIR_KEY_ADD=P23;/时间设置加/手动模式开窗帘sbit WIR_KEY_MIN=P21;/时间设置减/手动模式关窗帘/*sbit MOTOR_IN1=P30;sbit MOTOR_IN2=P31;sbit MOTOR_EN=P32;*/*#define MOTOR_Init MOTOR_IN1=1; MOTOR_IN2=1#define MOTOR_Forward MOTOR_IN1=0; MOTOR_IN2=1#define MOTOR_Reversion MOTOR_IN1=1; MOTOR_IN2=0#define MOTOR_ENABLE MOTOR_EN=0#define MOTOR_DISABLE MOTOR_EN=1 */*八拍方式驱动,顺序为A AB B BC C CD D DA*/unsigned char code clockWise=0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09; unsigned char code clockWise1=0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08; sbit Light_IO=P14;void delayms(uint xms);void Time0_init(void);void Sys_init(void);void Main_display(void);void keycsan(void);void Control(void);void Timing_display(void);/* 主程序*/void main()Sys_init();while(1)if(MODE_FLAG=Timing_MODE&SET_TIM_FLAG!=0)Again_flag=1;Timing_display();else Main_display();keycsan();Control();/* 延时子程序延时时间(xms*1)ms*/void delayms(uint xms)uint x,y;for(x=xms;x0;x-)for(y=110;y0;y-);/*定时器0初始化子程序*/void Time0_init(void)TMOD=0X01;TH0=(65536-2000)/256;TL0=(65536-2000)%256;ET0=1;TR0=0;EA=1;/*系统初始化*/void Sys_init(void)/MOTOR_Init;/MOTOR_DISABLE;Time0_init(); /初始化定时器0INIT_DS1302(); /初始化DS1302init_1602(); /初始化LCD1602WIN_STA_FLAG=READ_DS1302(READ_WIN_STA);if(WIN_STA_FLAG1) WIN_STA_FLAG=0;MODE_FLAG=READ_DS1302(READ_MODE_STA);if(MODE_FLAG3)MODE_FLAG=0;Timing_tab00=READ_DS1302(READ_DS1302_Timing_Hour1);if(Timing_tab0023)Timing_tab00=0;Timing_tab01=READ_DS1302(READ_DS1302_Timing_Min1);if(Timing_tab0159)Timing_tab01=0;Timing_tab10=READ_DS1302(READ_DS1302_Timing_Hour2);if(Timing_tab1023)Timing_tab10=0;Timing_tab11=READ_DS1302(READ_DS1302_Timing_Min2);if(Timing_tab1159)Timing_tab11=0;WRITE_LCD1602_COM(0x80+0x40+13); /指定显示字符的地址if(WIN_STA_FLAG=0) WRITE_LCD1602_DAT(O); WRITE_LCD1602_DAT(F); WRITE_LCD1602_DAT(F);else WRITE_LCD1602_DAT(O); WRITE_LCD1602_DAT(N); WRITE_LCD1602_DAT( );WRITE_LCD1602_COM(0x80+0x40+2); /指定显示字符的地址if(MODE_FLAG=Auto_MODE)WRITE_LCD1602_DAT(A);WRITE_LCD1602_DAT(u);WRITE_LCD1602_DAT(t);WRITE_LCD1602_DAT(o);WRITE_LCD1602_DAT( );WRITE_LCD1602_DAT( );else if(MODE_FLAG=Manual_MODE)WRITE_LCD1602_DAT(M);WRITE_LCD1602_DAT(a);WRITE_LCD1602_DAT(n);WRITE_LCD1602_DAT(u);WRITE_LCD1602_DAT(a);WRITE_LCD1602_DAT(l);elseWRITE_LCD1602_DAT(T);WRITE_LCD1602_DAT(i);WRITE_LCD1602_DAT(m);WRITE_LCD1602_DAT(i);WRITE_LCD1602_DAT(n);WRITE_LCD1602_DAT(g);/*主界面*/void Main_display(void)static uchar Year=0,Month=0,Day=0,Hour=0,Min=0,Sec=0;static uchar i;if(Again_flag)Again_flag=0;Year=0;Month=0;Day=0;Hour=0;Min=0;Sec=0;if(SET_TIM_FLAG=0)Tim_red_tab0=READ_DS1302(READ_DS1302_YEAR);Tim_red_tab1=READ_DS1302(READ_DS1302_MONTH);Tim_red_tab2=READ_DS1302(READ_DS1302_DAY);Tim_red_tab3=READ_DS1302(READ_DS1302_HOUR);Tim_red_tab4=READ_DS1302(READ_DS1302_MINUTE);Tim_red_tab5=READ_DS1302(READ_DS1302_SECOND);if(Year!=Tim_red_tab0)Year=Tim_red_tab0;WRITE_LCD1602_COM(0x80+2); /指定显示字符的地址WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab0/10); /年WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab0%10); /年if(Month!=Tim_red_tab1)Month=Tim_red_tab1;WRITE_LCD1602_COM(0x80+5); /指定显示字符的地址WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab1/10); /月WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab1%10); /月if(Day!=Tim_red_tab2)Day=Tim_red_tab2;WRITE_LCD1602_COM(0x80+8); /指定显示字符的地址WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab2/10); /日WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab2%10); /日if(Hour!=Tim_red_tab3)Hour=Tim_red_tab3;WRITE_LCD1602_COM(0x80+11); /指定显示字符的地址WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab3/10); /时WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab3%10); /时if(Min!=Tim_red_tab4)Min=Tim_red_tab4;WRITE_LCD1602_COM(0x80+14); /指定显示字符的地址WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab4/10); /分WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab4%10); /分WRITE_LCD1602_COM(0x80+13); /指定显示字符的地址if(Sec=Tim_red_tab5)WRITE_LCD1602_DAT(:); /秒elseWRITE_LCD1602_DAT( ); /秒Sec=Tim_red_tab5;elsei+;if(i10)i=0;WRITE_LCD1602_COM(0x80+13); /指定显示字符的地址WRITE_LCD1602_DAT(:);WRITE_LCD1602_COM(0x80+2); /指定显示字符的地址if(i5&SET_TIM_FLAG=1)WRITE_LCD1602_DAT( );WRITE_LCD1602_DAT( );elseWRITE_LCD1602_DAT(LCD1602_TableTim_red_tab0/10);WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab0%10);WRITE_LCD1602_COM(0x80+5); /指定显示字符的地址if(i5&SET_TIM_FLAG=2)WRITE_LCD1602_DAT( );WRITE_LCD1602_DAT( );elseWRITE_LCD1602_DAT(LCD1602_TableTim_red_tab1/10);WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab1%10);WRITE_LCD1602_COM(0x80+8); /指定显示字符的地址if(i5&SET_TIM_FLAG=3)WRITE_LCD1602_DAT( );WRITE_LCD1602_DAT( );elseWRITE_LCD1602_DAT(LCD1602_TableTim_red_tab2/10);WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab2%10);WRITE_LCD1602_COM(0x80+11); /指定显示字符的地址if(i5&SET_TIM_FLAG=4)WRITE_LCD1602_DAT( );WRITE_LCD1602_DAT( );elseWRITE_LCD1602_DAT(LCD1602_TableTim_red_tab3/10);WRITE_LCD1602_DAT(LCD1602_TableTim_red_tab3%10);WRITE_LCD1602_COM(0x80+14); /指定显示字符的地址if(i10)i=0;WRITE_LCD1602_COM(0x80+0x40+2); /指定显示字符的地址if(i5&SET_TIM_FLAG=1)WRITE_LCD1602_DAT( );WRITE_LCD1602_DAT( );elseWRITE_LCD1602_DAT(LCD1602_TableTiming_tab00/10);WRITE_LCD1602_DAT(LCD1602_TableTiming_tab00%10);WRITE_LCD1602_COM(0x80+0x40+5); /指定显示字符的地址if(i5&SET_TIM_FLAG=2)WRITE_LCD1602_DAT( );WRITE_LCD1602_DAT( );elseWRITE_LCD1602_DAT(LCD1602_TableTiming_tab01/10);WRITE_LCD1602_DAT(LCD1602_TableTiming_tab01%10);WRITE_LCD1602_COM(0x80+0x40+11); /指定显示字符的地址if(i5&SET_TIM_FLAG=3)WRITE_LCD1602_DAT( );WRITE_LCD1602_DAT( );elseWRITE_LCD1602_DAT(LCD1602_TableTiming_tab10/10);WRITE_LCD1602_DAT(LCD1602_TableTiming_tab10%10);WRITE_LCD1602_COM(0x80+0x40+14); /指定显示字符的地址if(i5) SET_TIM_FLAG=0; switch(SET_TIM_FLAG) case 1:TIM_DAT=READ_DS1302(READ_DS1302_YEAR); break;case 2:TIM_DAT=READ_DS1302(READ_DS1302_MONTH); break;case 3:TIM_DAT=READ_DS1302(READ_DS1302_DAY); break;case 4:TIM_DAT=READ_DS1302(READ_DS1302_HOUR); break;case 5:TIM_DAT=READ_DS1302(READ_DS1302_MINUTE); break;default: break; else/处于定时模式 SET_TIM_FLAG+; if(SET_TIM_FLAG4) SET_TIM_FLAG=0;WRITE_LCD1602_COM(0x80); for(i=0;i16;i+)WRITE_LCD1602_DAT(DIS_TIMi);WRITE_LCD1602_COM(0x80+0x40);for(i=0;i2;i+)WRITE_LCD1602_DAT(DIS_STAi);WRITE_LCD1602_DAT(T);WRITE_LCD1602_DAT(i);WRITE_LCD1602_DAT(m);WRITE_LCD1602_DAT(i);WRITE_LCD1602_DAT(n);WRITE_LCD1602_DAT(g);WRITE_LCD1602_COM(0x80+0x40+9); /指定显示字符的地址WRITE_LCD1602_DAT(W);WRITE_LCD1602_DAT(I);WRITE_LCD1602_DAT(N);WRITE_LCD1602_DAT(:);if(WIN_STA_FLAG)WRITE_LCD1602_DAT(O);WRITE_LCD1602_DAT(N);WRITE_LCD1602_DAT( );elseWRITE_LCD1602_DAT(O);WRITE_LCD1602_DAT(F);WRITE_LCD1602
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年保安技师考试大题及答案
- 哲学漫画类试题专项突破导学案 高考政治一轮复习统编版必修四
- 2025年安装计量计价考试及答案
- 2025年xyz考试题及答案
- 2025年衡水教师招聘真题及答案
- 泥绒网铺挂施工方案
- 项目草皮种植方案范本
- 2025合同解除协议范本-终止劳动合同协议
- 街道栏杆拆除方案范本
- 商丘水包水建筑施工方案
- 承包商全流程安全培训
- 养生店国庆节活动方案
- 古代文学史杜牧课件
- 7.1促进民族团结 课件 2025-2026学年统编版道德与法治九年级上册
- 西宁市供热管理暂行办法
- 静脉血栓护理课件
- 造口患者叙事护理
- 二年级数学上册100道口算题(全册11份)
- 中医学专业职业生涯规划书2300字数
- 租赁沐足店合同协议书
- 中西医结合导论第一章中西医结合导论
评论
0/150
提交评论