版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、总电路图:单片机电路图:1602接线图:1302接线图:(I/O接单片机3.5脚)按键接线图:程序清单:#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit ACC0 = ACC0;sbit ACC7 = ACC7;sbit t=P10;/进入调时按键sbit jia=P11;/加一按键sbit jian=P12;/减一按键sbit m=P13;/退出调时按键sbit BEEP=P20;/蜂鸣器sbit jtod=P14;/矩阵按键转独立按
2、键,该脚置0sbit T_CLK = P16; /*实时时钟时钟线引脚 */sbit T_IO = P35; /*实时时钟数据线引脚 */sbit T_RST = P17; /*实时时钟复位线引脚 */sbit E=P27;/1602使能引脚sbit RW=P26;/1602读写引脚sbit RS=P25;/1602数据/命令选择引脚uchar code hanzi8=0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x11,0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f
3、,0x00;void v_W1302(uchar ucAddr, uchar ucDa);uchar uc_R1302(uchar);uchar dectobcd(uchar bcd);uchar bcdtodec(uchar);void beep();void delay(uchar x) uchar i; while(x-) for(i=0;i<110;i+);/* 名称 : enable(uchar del)* 功能 : 1602命令函数* 输入 : 输入的命令值* 输出 : 无*/void enable(uchar del)RS = 0;RW = 0;P0 = del;E = 1
4、;delay(3);E=0;/* 名称 : write(uchar del)* 功能 : 1602写数据函数* 输入 : 需要写入1602的数据* 输出 : 无*/void write(uchar del)RS = 1;RW = 0;P0 = del;E = 1;delay(3);E=0;/* 名称 : L1602_init()* 功能 : 1602初始化,请参考1602的资料* 输入 : 无* 输出 : 无*/void L1602_init(void)enable(0x01);enable(0x38);enable(0x06);enable(0x0c);E=0;/装入自定义字符(汉字)voi
5、d writch() uchar i,j; enable(0x40); for(i=0;i<8;i+) for(j=0;j<8;j+) write(hanziij);/* 名称 : L1602_char(uchar hang,uchar lie,char sign)* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下 L1602_char(1,5,'b')* 输入 : 行,列,需要输入1602的数据* 输出 : 无*/void L1602_char(uchar hang,uchar lie,char sign)
6、uchar a;if(hang = 1) a = 0x80;if(hang = 2) a = 0xc0;a = a + lie - 1;enable(a);write(sign);/* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下 L1602_string(1,5,"ab cd ef;")* 输入 : 行,列,需要输入1602的数据* 输出 : 无*/void L1602_string(uchar
7、hang,uchar lie,uchar *p)uchar a;if(hang = 1) a = 0x80;if(hang = 2) a = 0xc0;a = a + lie - 1;enable(a);while(1)if(*p = '0') break;write(*p);p+;/时钟调节/void timechange() uchar a,num=1; uchar year,mon,day,hour,min,sec;/进入调时循环 while(num) if(t=0) delay(5); if(t=0) num+; beep(); while(!t); /退出调时按键m
8、if(m=0) delay(5); if(m=0) num=0; enable(0x0f); a=uc_R1302(0x81)|0x80; v_W1302(0x8e,0); v_W1302(0x80,a);/调时到年以后退出调时if(num=7)num=0;/num=1调秒if(num=1) enable(0xc0+12); if(jia=0) delay(5); if(jia=0) /秒加一 while(!jia); sec=bcdtodec(uc_R1302(0x81)&0x7f); sec+; if(sec>59) sec=0; L1602_char(2, 12, sec/
9、10%10+48); L1602_char(2, 13, sec%10 + 48); v_W1302(0x80,dectobcd(sec)|0x80); if(jian=0) /秒减一 delay(5); if(jian=0) while(!jian); sec=bcdtodec(uc_R1302(0x81); sec-; if(sec=-1) sec=59; L1602_char(2, 12, sec/10%10+48); L1602_char(2, 13, sec%10 + 48); v_W1302(0x80,dectobcd(sec)|0x80); if(num=2) /调分钟 enab
10、le(0xc0+9); if(jia=0) delay(5); if(jia=0) min = bcdtodec(uc_R1302(0x83); min+; while(!jia); if(min>59) min=0; L1602_char(2, 9, min / 10 % 10 + 48); L1602_char(2, 10, min % 10 + 48); v_W1302(0x82,dectobcd(min); if(jian=0) delay(5); if(jian=0) min = bcdtodec(uc_R1302(0x83); min-; while(!jian); if(m
11、in=-1) min=59; L1602_char(2, 9, min / 10 % 10 + 48); L1602_char(2, 10, min % 10 + 48); v_W1302(0x82,dectobcd(min); if(num=3) /调小时 enable(0xc0+6); if(jia=0) delay(5); if(jia=0) hour = bcdtodec(uc_R1302(0x85); hour+; while(!jia); if(hour>23) hour=0; L1602_char(2, 6, hour / 10 % 10 + 48); L1602_char
12、(2, 7, hour % 10 + 48); v_W1302(0x84,dectobcd(hour); if(jian=0) delay(5); if(jian=0) while(!jian); hour = bcdtodec(uc_R1302(0x85); hour-; if(hour=-1) hour=23; L1602_char(2, 6, hour / 10 % 10 + 48); L1602_char(2, 7, hour % 10 + 48); v_W1302(0x84,dectobcd(hour); if(num=4) /调日期 enable(0x80+13); if(jia=
13、0) delay(5); if(jia=0) hour = bcdtodec(uc_R1302(0x87); day+; while(!jia); if(day>31) day=0; L1602_char(1, 13, day / 10 % 10 + 48); L1602_char(1, 14, day % 10 + 48); v_W1302(0x86,dectobcd(day); if(jian=0) delay(5); if(jian=0) while(!jian); day=bcdtodec(uc_R1302(0x87); day-; if(day=-1) day=31; L160
14、2_char(1,13,day/10%10+48); L1602_char(1,14,day%10+48); v_W1302(0x86,dectobcd(day); if(num=5)/调月份 enable(0x80+10); if(jia=0) delay(5); if(jia=0) mon = bcdtodec(uc_R1302(0x89); mon+; while(!jia); if(mon>12) mon=0; L1602_char(1, 10, mon / 10 % 10 + 48); L1602_char(1, 11, mon % 10 + 48); v_W1302(0x88
15、,dectobcd(mon); if(jian=0) delay(5); if(jian=0) while(!jian); mon = bcdtodec(uc_R1302(0x89); mon-; if(mon=-1) mon=12; L1602_char(1, 10, mon / 10 % 10 + 48); L1602_char(1, 11, mon % 10 + 48); v_W1302(0x88,dectobcd(mon); if(num=6)/调年份 enable(0x80+7); if(jia=0) delay(5); if(jia=0) year = bcdtodec(uc_R1
16、302(0x8d); year+; while(!jia); if(year>20) year=0; L1602_char(1, 7, year / 10 % 10 + 48); L1602_char(1, 8, year % 10 + 48); v_W1302(0x8c,dectobcd(year); if(jian=0) delay(5); if(jian=0) while(!jian); year = bcdtodec(uc_R1302(0x8d); year-; if(year=-1) year=20; L1602_char(1, 7, year / 10 % 10 + 48);
17、 L1602_char(1, 8, year % 10 + 48); v_W1302(0x8c,dectobcd(year); if(num=0)/关闭光标闪烁enable(0x0c); v_W1302(0x80,uc_R1302(0x81)&0x7f);/开启1302记时/* 名称 : v_RTInputByte()* 功能 : 往DS1302写入1Byte数据* 输入 : ucDa 写入的数据* 输出 : 无*/void v_RTInputByte(uchar ucDa)uchar i;ACC = ucDa;T_RST = 1;for(i=8; i>0; i-)T_IO =
18、ACC0;T_CLK = 1;T_CLK = 0;ACC = ACC >> 1;/* 名称 : uc_RTOutputByte()* 功能 : 从DS1302读取1Byte数据* 输入 :无* 返回值: ACC*/uchar uc_RTOutputByte(void) uchar i;T_RST = 1;for(i=8; i>0; i-)ACC = ACC >>1;ACC7 = T_IO;T_CLK = 1;T_CLK = 0;return(ACC);/* 名称 : v_W1302(uchar ucAddr, uchar ucDa)* 功能 : 往DS1302写入
19、数据* 输入 : ucAddr: DS1302地址, ucDa: 要写的数据* 返回值 : 无*/void v_W1302(uchar ucAddr, uchar ucDa)T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(ucAddr); / 写地址 _nop_();_nop_();v_RTInputByte(ucDa); / 写1Byte数据T_CLK = 1;T_RST = 0;/* 名称 : uc_R1302(uchar ucAddr)* 功能 : 读取DS1302某地址的数据* 输入 : ucAddr: DS1302地址* 返回值 : ucDa
20、:读取的数据*/uchar uc_R1302(uchar ucAddr)uchar ucDa;T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(ucAddr); /写地址,命令_nop_();_nop_();ucDa = uc_RTOutputByte(); /读1Byte数据T_CLK = 1;T_RST = 0;return(ucDa);/* 名称 : bcdtodec(uchar bcd)* 功能 : BCD码转换为DEC码(DEC码为十进制数据:BCD:0x11->DEC为数值11(HEX:0x0b)* 输入 : bcd码* 输出 : dec
21、码*/uchar bcdtodec(uchar bcd)uchar data1; data1=(bcd&0x70)>>4)*10+(bcd&0x0f);return data1;uchar dectobcd(uchar dec) uchar dat;dat=(dec/10)<<4|(dec%10);return dat;/* 名称 : Write_DS1302Init()* 功能 : 往DS1302中写入数据。最开始显示的数据就是在这里设置的。* 输入 : 无* 输出 : 无*/void Write_DS1302Init(void)v_W1302(0x8
22、e,0);v_W1302(0x80,0x00);/写入秒v_W1302(0x8e,0);v_W1302(0x82,0x00);/写入分v_W1302(0x8e,0);v_W1302(0x84,0x00);/写入小时v_W1302(0x8e,0);v_W1302(0x86,0x00);/写入日v_W1302(0x8e,0);v_W1302(0x88,0x00);/写入月v_W1302(0x8e,0);v_W1302(0x8a,0x00);/写入星期v_W1302(0x8e,0);v_W1302(0x8c,0x00);/写入年 v_W1302(0x90,0xa6);/单二极管,2K电阻充电/* 名
23、称 : Run_DS1302(void)* 功能 : 读出DS1302中的数据,并在液晶1602上进行显示* 输入 : 无* 输出 : 无*/void Run_DS1302(void)uchar sec, min, hour, day, month, year;v_W1302(0x8f, 0);sec = bcdtodec(uc_R1302(0x81); /读出DS1302中的秒v_W1302(0x8f, 0);min = bcdtodec(uc_R1302(0x83); /读出DS1302中的分v_W1302(0x8f, 0);hour = bcdtodec(uc_R1302(0x85);
24、/读出DS1302中的小时v_W1302(0x8f, 0);day = bcdtodec(uc_R1302(0x87); /读出DS1302中的日v_W1302(0x8f, 0);month = bcdtodec(uc_R1302(0x89); /读出DS1302中的月v_W1302(0x8f, 0);year = bcdtodec(uc_R1302(0x8d); /读出DS1302中的年L1602_char(2, 6, hour / 10 % 10 + 48); /字符ASIIC码显示,0的ASIIC=48L1602_char(2, 7, hour % 10 + 48);L1602_char(2, 8, ':');L1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高尔夫概论测试题及详细答案
- 仓储物流安全的培训讲解内容
- 本田经营模式的跨文化解读
- 康明斯培训重点试题及答案分析
- 《高毒物品作业岗位职业病危害告知规范》解读
- 2025考研数学三考点精练|历年真题+模拟
- 考研数学三模拟试卷全套-2024(高频考点)
- 2025数学二历年真题(高清电子版)
- 护理业务学习课件
- 便秘查房病例讨论
- GB/T 21387-2025供水系统用轴流式止回阀
- 设备除锈与刷漆标准规范手册
- 铁路工务安全教育课件
- 前列腺疾病课件
- 2025-2030年中国药食同源行业市场现状调查及未来趋势研判报告
- 装修电话营销培训
- 2025年澳洲amc9年级竞赛题库及答案
- 晋江大神合同
- 合同支付条款补充协议
- 钢丝绳安全使用培训课件
- 马克思主义理论前沿探索
评论
0/150
提交评论