




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#include #include #include #include #include #include #include #define uchar unsigned char#define uint unsigned intsbit alout=P37;void aloutput()uchar i;for(i=0;i8;i+)if(ali.m=hour&ali.s=min) if(ali.alon=0);if(ali.alon=1)alout=0;if(ali.alon=2)alout=1; /*主函数*void main() alout=1;ini();iicread();/init_ds1302(); /每次上电写入时间,仅作为调试程序用while(1) send(); / 送数display(a0, a1, a2, a3, a4, a5, a6, a7); / 显示chuli();aloutput();if(stoptime)stoptimes();if(starttime)starttimes();if(!settime)timerup();if(saveiic)iicsave();if(readiic)iicread();if(function=1|function_al!=0)reset=0; #include #define uchar unsigned char#define uint unsigned intuchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0xb8,0xf4;/ 09, OFF, - , h. , L./*显示子程序*void display(uchar a7,uchar a6,uchar a5,uchar a4,uchar a3,uchar a2,uchar a1,uchar a0)P0=tablea0;P1=0xfe;delay(2);P0=tablea1;P1=0xfd;delay(2); P0=tablea2;P1=0xfb;delay(2); P0=tablea3;P1=0xf7;delay(2);P0=tablea4;P1=0xef;delay(2);P0=tablea5;P1=0xdf;delay(2);P0=tablea6;P1=0xbf;delay(2);P0=tablea7;P1=0x7f;delay(2);/*将数送至缓冲单元,当shan的标志位为1时,再根据此时的此时的功能标示,对该位熄灭*void send() if(function_al=0)/time a0=sec%10;a1=sec/10;a2=11;a3=min%10;a4=min/10;a5=11;a6=hour%10;a7=hour/10; if(function_al!=0) /al a0=alfunction_al-1.s%10;a1=alfunction_al-1.s/10;a2=11;a3=alfunction_al-1.m%10;a4=alfunction_al-1.m/10;a5=11;a6=alfunction_al-1.alon+add;a7=function_al;if(shan=1&next=0&(function_al!=0|function!=0) a0=10,a1=10;a2=10;a3=10,a4=10;a5=10;a6=10,a7=10;if(shan=1&next=1&(function_al!=0|function!=0) a0=10,a1=10; if(shan=1&next=2&(function_al!=0|function!=0) a3=10,a4=10; if(shan=1&next=3&(function_al!=0|function!=0) a6=10,a7=10; void display(uchar a7,uchar a6,uchar a5,uchar a4,uchar a3,uchar a2,uchar a1,uchar a0);void send();void delay(uint count);#define uchar unsigned char#define uint unsigned int#define AT24C02 0xa0 /AT24C02 地址bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);uchar reset,t0,t1,sec,min,hour,function,a0,a1,a2,a3,a4,a5,a6,a7;uchar function_al,next,stop;uchar add=11,pDat24;bit shan,stoptime,starttime,settime,saveiic,readiic;structuchar alon; uchar m; uchar s; al8; /8 AL结构数组void resets() init_ds1302();al0.m=8; al0.s=3; al0.alon=1;al1.m=12;al1.s=0; al1.alon=2;al2.m=13;al2.s=33; al2.alon=1;/al3.m=17;al3.s=30; al3.alon=2;/al4.m=18;al4.s=3; al4.alon=1;/al5.m=21;al5.s=0; al5.alon=2;/al6.m=0;al6.s=0; al6.alon=1;/al7.m=8;al7.s=0; al7.alon=2;saveiic=1;void iicsave() /保存数据uchar i;EA=0; for(i=0;i2;i+) pDati+0=ali.s; pDati+2=ali.m; pDati+4=ali.alon;ISendStr(AT24C02, 0 , &pDat0, 6);delay(20); for(i=2;i4;i+) pDati+4=ali.s; pDati+6=ali.m; pDati+8=ali.alon;ISendStr(AT24C02, 0 , &pDat0, 6); delay(20);saveiic=0;EA=1;void iicread() /读取数据uchar i;EA=0; IRcvStr(AT24C02, 0 , &pDat0, 6);for(i=0;i2;i+) ali.s=pDati+0; ali.m=pDati+2; ali.alon=pDati+4; delay(20); IRcvStr(AT24C02, 0 , &pDat0, 6);for(i=2;i4;i+) ali.s=pDati+4; ali.m=pDati+6; ali.alon=pDati+8; delay(20); readiic=0;EA=1;void stoptimes() write_ds1302(0x8e,0x00);/WP写保护关 write_ds1302(0x80,0x80|(sec/10)*16+(sec%10);/stop 秒write_ds1302(0x8e,0x80);/写保护开stoptime=0;starttime=0;void starttimes() write_ds1302(0x8e,0x00);/WP写保护关 write_ds1302(0x80,0x00|(sec/10)*16+(sec%10);/stop 秒write_ds1302(0x8e,0x80);/写保护开stoptime=0;starttime=0;void savetime() /save time write_ds1302(0x8e,0x00);write_ds1302(0x80,0x80|(sec/10)*16+(sec%10);write_ds1302(0x82,0x80|(min/10)*16+(min%10);write_ds1302(0x84,0x80|(hour/10)*16+(hour%10);write_ds1302(0x8e,0x80);/*uchar keychuli() uchar k; k=P3; /P1口内容送K k=k; /取反 k=(k&0x3f); /屏蔽高3位,如果扫描8键,屏蔽该句。 return(k); /返回键值 /* 函数原型:key();* 功 能:键盘扫描函数,函数返回值即键值。*/uchar key() uchar keyzhi,keyzhii; /电子钟键盘按键键值临时存放 keyzhi=keychuli(); /调P1口处理函数 if(keyzhi!=0) /有键动作延时去抖动,否则函数返回 send(); display(a0, a1, a2, a3, a4, a5, a6, a7); display(a0, a1, a2, a3, a4, a5, a6, a7); keyzhi=keychuli(); /再次调P1口处理函数 if(keyzhi!=0) /真正有键按下,取键值并暂存 keyzhii=keyzhi; while(keyzhi!=0) /判按键是否释放,没有释放延时去抖动等待释放 send(); display(a0, a1, a2, a3, a4, a5, a6, a7); display(a0, a1, a2, a3, a4, a5, a6, a7); keyzhi=keychuli(); keyzhi=keyzhii; /按键释放后恢复按键键值 return(keyzhi); /返回按键键值/*键值处理程序*void chuli()switch(key()case 0:break;case 1:/ function+; switch(function) case 1:if(function_al=0)settime=1;stoptime=1;starttime=0;TR1=1;shan=1; if(function_al!=0)settime=0;stoptime=0;starttime=1;TR1=0;shan=0;next=0;function=0;function_al=0;break;case 2:savetime();settime=0;stoptime=0;starttime=1;function=0;function_al=0;TR1=0;shan=0;next=0;break;/break;case 2: /+if(function_al=0&function!=0) switch(next) case 1:sec+;if(sec=60)sec=0;break;case 2:min+;if(min=60)min=0;break;case 3:hour+;if(hour=24) hour=0;break;if(function_al!=0) switch(next) case 1:alfunction_al-1.s+;if(alfunction_al-1.s=60)alfunction_al-1.s=0;break;case 2:alfunction_al-1.m+;if(alfunction_al-1.m=24)alfunction_al-1.m=0;break;case 3:alfunction_al-1.alon+;if(alfunction_al-1.alon=3)alfunction_al-1.alon=0;break; break; case 4: /-if(function_al=0&function!=0) switch(next) case 1:sec-;if(sec=255)sec=59;break;case 2:min-;if(min=255)min=59;break;case 3:hour-;if(hour=255) hour=23;break;if(function_al!=0) switch(next) case 1:alfunction_al-1.s-;if(alfunction_al-1.s=255)alfunction_al-1.s=59;break;case 2:alfunction_al-1.m-;if(alfunction_al-1.m=255)alfunction_al-1.m=23;break;case 3:alfunction_al-1.alon-;if(alfunction_al-1.alon=255)alfunction_al-1.alon=2;break; break; case 8: /alfunction_al+; switch(function_al)case 1:readiic=1;TR1=1;shan=1;break;case 2:TR1=1;shan=1;break;case 3:TR1=1;shan=1;break;/case 4:TR1=1;shan=1;break;/case 5:TR1=1;shan=1;break;/case 6:TR1=1;shan=1;break;/case 7:TR1=1;shan=1;break;/case 8:TR1=1;shan=1;break;case 4:saveiic=1;function_al=0;shan=0;next=0;break;break;case 16: /nextif(function|function_al!=0)next+; switch(next)case 1:TR1=1;shan=1;break;case 2:TR1=1;shan=1;break;case 3:TR1=1;shan=1;break;case 4:next=0;shan=1;TR1=1;break;break;case 32: /nextif(function=0&function_al=0&reset4)&0x07)*10;/秒min=(read_ds1302(0x83)&0x0f)+(read_ds1302(0x83)4)&0x07)*10;/分hour=(read_ds1302(0x85)&0x0f)+(read_ds1302(0x85)4)&0x03)*10;/时#define uchar unsigned char#define uint unsigned intsbit ACC0=ACC0;sbit ACC7=ACC7;sbit sclk=P36;sbit io=P34;sbit rst=P35; void delay1302(uint x)uint i,j;for(i=x;i0;i-)for(j=114;j0;j-);void write_ds1302byte(uchar dat) /上升沿写1字节数据uchar i;ACC=dat; /数据放入累加器中/rst=1;启动数据传送for(i=8;i0;i-)io=ACC0; /累加器数据赋给io送出sclk=0;sclk=1;sclk=0; /上升沿ACC=ACC1;/累加器数据左移一位,先写最低位 uchar read_ds1302byte()/下降沿读1字节数据uchar i;/rst=1;for(i=8;i0;i-)ACC=ACC1;/累加器数据左移一位,先读最低位ACC7=io; /把io线上的数据赋给累加器sclk=1;sclk=0;/下降沿return ACC; /返回累加器数据 void write_ds1302(uchar addr,uchar dat) /写地址,写数据rst=0;sclk=0;delay1302(1);rst=1;write_ds1302byte(addr);/写地址write_ds1302byte(dat);/写数据rst=0;sclk=1;/delay1302(1);/rst=1;/io=1;uchar read_ds1302(uchar addr) /写地址,读数据uchar da;rst=0;sclk=0;rst=1;write_ds1302byte(addr);da=read_ds1302byte();rst=0;sclk=1;return da;void init_ds1302()write_ds1302(0x8e,0x00);/WP写保护关write_ds1302(0x80,0x00);/写秒,十进制初值write_ds1302(0x82,0x00);/分write_ds1302(0x84,0x00);/时write_ds1302(0x86,0x10);/daywrite_ds1302(0x88,0x03);/monthwrite_ds1302(0x8a,0x6);/weekwrite_ds1302(0x8c,0x12);/year/write_ds1302(0x90,0x00);/涡流 _是指充电的了write_ds1302(0x8e,0x80);/写保护开#define uchar unsigned char#define uint unsigned int/*延时子程序基数为1毫秒*void delay(uint count) uint j; while(count-!=0) for(j=0;j80;j+); /#include #define NOP() _nop_() /* 定义空指令 */#define _Nop() _nop_() /*定义空指令*/sbit SCL=P33; /I2C 时钟 sbit SDA=P34; /I2C 数据 bit ack; /*应答标志位*/* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. */void Start_I2c() SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7us,延时*/ _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /*发送起始信号*/ _Nop(); /* 起始条件锁定时间大于4s*/ _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /*钳住I2C总线,准备发送或接收数据 */ _Nop(); _Nop();/* 结束总线函数 函数原型: void Stop_I2c(); 功能: 结束I2C总线,即发送I2C结束条件. */void Stop_I2c() SDA=0; /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/ SCL=1; /*结束条件建立时间大于4s*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /*发送I2C总线结束信号*/ _Nop(); _Nop(); _Nop(); _Nop();/* 字节数据发送函数 函数原型: void SendByte(UCHAR c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。*/void SendByte(unsigned char c) unsigned char BitCnt; for(BitCnt=0;BitCnt8;BitCnt+) /*要传送的数据长度为8位*/ if(cBitCnt)&0x80)SDA=1; /*判断发送位*/ else SDA=0; _Nop(); SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/ _Nop(); _Nop(); /*保证时钟高电平周期大于4s*/ _Nop(); _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA=1)ack=0; else ack=1; /*判断是否接收到应答信号*/ SCL=0; _Nop(); _Nop();/* 字节数据接收函数 函数原型: UCHAR RcvByte();功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数应答从机。 */ unsigned char RcvByte() unsigned char retc; unsigned char BitCnt; retc=0; SDA=1; /*置数据线为输入方式*/ for(BitCnt=0;BitCnt8;BitCnt+) _Nop(); SCL=0; /*置时钟线为低,准备接收数据位*/ _Nop(); _Nop(); /*时钟低电平周期大于4.7s*/ _Nop(); _Nop(); _Nop(); SCL=1; /*置时钟线为高使数据线上数据有效*/ _Nop(); _Nop(); retc=retc1; if(SDA=1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */ _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); return(retc);/* 应答子函数函数原型: void Ack_I2c(bit a);功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)*/void Ack_I2c(bit a) if(a=0)SDA=0; /*在此发出应答或非应答信号 */ else SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /*时钟低电平周期大于4s*/ _Nop(); _Nop(); _Nop(); SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/ _Nop(); _Nop(); /* 向有子地址器件发送多字节数据函数 函数原型: bit ISendStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no); 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。 如果返回1表示操作成功,否则操作有误。注意: 使用前必须已结束总线。*/bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) unsigned char i; Start_I2c(); /*启动总线*/ SendByte(sla); /*发送器件地址*/ if(ack=0)return(0); Se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中政治课程资源开发与法治教育融合研究论文
- 高中语文阅读:校园经典文学作品分析与人文素养提升论文
- 中国医用超声仪行业市场占有率及投资前景预测分析报告
- 艾炙养生馆管理制度
- 苗圃维护与管理制度
- 调直机行业相关投资计划提议
- 财务制度体系
- 艾伦心理咨询案例分析步骤
- 连锁超市安全培训教材
- 解析汇编化学-专题11化学实验基础(原卷版)
- 以DeepSeek为代表的AI在能源行业的应用前景预测
- 《钱学森》介绍课件
- 智慧树知到《中国近现代史纲要(哈尔滨工程大学)》2025章节测试附答案
- 单层泄爆屋面安装施工方案
- LY/T 3408-2024林下经济术语
- 《动物药理》课件 第9章作用于血液循环系统的药物
- 信息化建设项目质量控制措施
- 新生儿肺动脉高压个案护理汇报
- CNAS-GL052:2022 电磁兼容检测领域设备期间核查指南
- 校外培训机构安全防范制度
- KCA数据库试题库
评论
0/150
提交评论