ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:19.35KB ,
资源ID:7371580      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7371580.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数字电子钟设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数字电子钟设计.docx

1、数字电子钟设计课程设计任务书专业: 学号: 学生姓名(签名): 设计题目:数字电子钟设计一、设计实验条件单片机原理实验室二、设计任务及要求采用PCF8563和AT89S52单片机及显示电路完成小时、分钟、秒的实时显示。数字钟的总体方案设计(采用PCF8563或单片机内部定时、计数方式均可)你系统总体结构芯片选择PCF8563的主要性能指标硬件电路设计AT89S52单片机最小系统PCF8563与AT89S52单片机接口电路设计显示电路与AT89S52单片机接口电路设计软件设计主程序框图PCF8563时钟程序框图显示程序框图调试与测试结果分析实验系统连线图程序调试实验结果分析程序清单和系统原理图三

2、、设计时间与安排1、设计时间: 1周2、设计时间安排: 熟悉实验设备、收集资料: 1 天设计图纸、实验、计算、程序编写调试: 2 天编写课程设计报告: 1 天答辩: 1 天9.1源程序#include#include /地址操作头文件#define uchar unsigned char#define uint unsigned intsbit deng=P17; /LED灯的端口(模拟闹钟或者闹铃)sbit shezhi=P10; /时间设置开关sbit jia=P12; /设置时间时加1开关sbit qiehuan=P11; /年月日和时分秒切换开关sbit jian=P13; /设置时间

3、时减1开关uchar duan1,duan2,duan3,duan4,duan5,duan6; /定义段选相关变量uint miao=00,fen=20,shi=10,nian=17,yue=1,ri=10; /年月日、时分秒标志变量uint t0flag=0; /闹钟时间标志位uchar timer3=10,20,50; /闹钟的初始化时间 #define wei XBYTE0xff20 /PA口地址#define duan XBYTE0xff21 /PB口地址#define control XBYTE0xff23 /控制寄存器地址uchar code table=0xc0,0xf9, 0x

4、a4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,; /数码管编码表0123456789/*-定时器初始化子程序-*/void timer_init(void) TMOD=0x11; /定时/计数器0和1使用模式1,16位定时器 TH0=0x00; /给定初值,这里使用定时器最大值从0开始计数一直到65535溢出 TL0=0x00; TH1=0x00; TL1=0x00; EA=1; /总中断打开 ET0=1; ET1=1; EX0=1; IT0=1;/*-延时子程序-*/void delayms(unsigned char ms) uchar i; while(-m

5、s!=0) for(i = 0; i 50; i+); /*-显示子程序-*/ void xianshi() wei=0xdf; /打开位选,选第一位数码管1101 1111 duan=duan1; /打开段选,显示数码关管第一位 delayms(3); wei=0xef; /打开位选,选第二位数码管1110 1111 duan=duan2; /打开段选,显示数码关管第二位 delayms(3); wei=0xf7; /打开位选,选第三位数码管/ 1111 0111 duan=duan3; /打开段选,显示数码关管第三位 delayms(3); wei=0xfb; /打开位选,选第四位数码管/

6、1111 1011 duan=duan4; /打开段选,显示数码关管第四位 delayms(3); wei=0xfd; /打开位选,选第五位数码管1111 1101 duan=duan5; /打开段选,显示数码关管第五位 delayms(3); wei=0xfe; /打开位选,选第六位数码管1111 1110 duan=duan6; /打开段选,显示数码关管第六位 delayms(3); /*-初始化子程序-*/void init_all() shezhi=1;/引脚置高电平作为输入,四个开关都设为高电平,从给定初值开始运行 jia=1; qiehuan=1; jian=1; timer_in

7、it(); control=0x80; delayms(3);/*-主程序-*/ void main()uint flag=0,j=0,xuanze1=0,xuanze2=0; /定义闪烁标志变量flag,闪烁时间变量j,时分 /秒选择变量xuanze1,年月日选择变量xuanze2 init_all(); while(1) /死循环 if (qiehuan=1) /如果P1.1为高电平则执行以下显示和调整时间指令 xuanze2=0;/日期设置年月日选择变量置0,防止日期时间来回切换时发生错误 if(xuanze1=0) TR1=1; /如果时间设置时分秒选择变量为0,说明处于/运行状态,此

8、时定时器开启 flag=1; /烁标志位强制置1,不闪烁 if(shi=timer0)&(fen=timer1)&(miao=timer2) /如果时间达到/预设值,则闹钟响(LED灯亮) deng=0; /灯亮 TR0=1; /开始计时 if(fen=0)&(miao=0) /如果是整点 deng=0; /灯亮,整点提醒 delayms(2); deng=1; /灯灭,关闭闹铃 if (!shezhi) /P1.0设置按钮 xianshi(); /延时去抖,用显示子程序延时,防止按动按钮时闪烁 if (!shezhi) /再次确认按键是否按下,没有按下则退出 while(!shezhi)xi

9、anshi(); /如果确认按下按键等待按键释放,没有 /释放则一直执行数码管扫描,防止闪烁 TR1=0; xuanze1+; /确定要设定的时或分或秒 if (xuanze1=4) xuanze1=0; if (!jia) xianshi(); /延时去抖,用显示子程序延时,防止按动按钮时闪烁 if(!jia) /再次确认按键是否按下,没有按下则退出 while(!jia)xianshi(); /如果确认按下按键等待按键释放,没有释/放则一直执行数码管扫描,防止闪烁 if(xuanze1=1) /时加 shi+; if(shi=24) shi=0; if(xuanze1=2) /分加 fen

10、+; if (fen=60) fen=0; if(xuanze1=3) /秒加 miao+; if(miao=60) miao=0; if (!jian) xianshi(); /延时去抖,用显示子程序延时,防止按动按钮时闪烁 if(!jian) /再次确认按键是否按下,没有按下则退出 while(!jian)xianshi(); /如果确认按下按键等待按键释放,没 /有释放则一直执行数码管扫描,防止闪烁 if(xuanze1=1) /时减 shi-; if(shi=-1) shi=23; if(xuanze1=2) /分减 fen-; if (fen=-1) fen=59; if(xuanz

11、e1=3) /秒减 miao-; if(miao=-1) miao=59; if(flag=1) /闪烁标志位为1,所有数码管都亮,/与下面的flag=0构成闪烁程序 if (shi10) /灭零判断,如果小时数小于10则第/一位数码管熄灭 duan1=0xff; else duan1=tableshi/10; /分解显示信息 duan2=tableshi%10; duan3=tablefen/10; duan4=tablefen%10; duan5=tablemiao/10; duan6=tablemiao%10; if(flag=0) /闪烁标志位为0,对应数码管熄灭 if(xuanze1

12、=1) duan1=0xff; /当设置小时时,第一二位数码管闪烁 duan2=0xff; if(xuanze1=2) duan3=0xff; duan4=0xff; if(xuanze1=3) duan5=0xff; duan6=0xff; if (qiehuan=0) /如果P1.1为低电平则执行以下显示和调整日期指令 xuanze1=0; /时间设置时分秒选择变量置0,防止日期时间来回切换时发生错误 if (xuanze2=0) flag=1; if (!shezhi) xianshi(); if (!shezhi) while(!shezhi)xianshi(); xuanze2+;

13、/确定要设定的年或月或日 if (xuanze2=4) xuanze2=0; if (!jia) xianshi(); /延时去抖,用显示子程序延时,防止按 /动按钮时闪烁 if(!jia) /再次确认按键是否按下,没有按下则退出 while(!jia)xianshi(); /如果确认按下按键等待按键释放,没有 /释放则一直执行数码管扫描,防止闪烁 if(xuanze2=1) /年加 nian+; if(nian=100) nian=0; if(xuanze2=2) /月加 yue+; if (yue=13) yue=1; if(xuanze2=3) /日加 ri+; if(yue=1|yue

14、=3|yue=5|yue=7|yue=8|yue=10|yue=12)/月份判断 if(ri=32) ri=1; if(yue=4|yue=6|yue=9|yue=11) if(ri=31) ri=1; if(yue=2) if(ri=29) ri=1; if (!jian) xianshi(); /延时去抖,用显示子程序延时防止/按动按钮时闪烁 if(!jian) /再次确认按键是否按下,没有按下则退出 while(!jian)xianshi(); /如果确认按下按键等待按键释放,没/有释放则一直执行数码管扫描,防止闪烁 if(xuanze2=1) /年减 nian-; if(nian=-1

15、) nian=99; if(xuanze2=2) /月减 yue-; if (yue=0) yue=12; if(xuanze2=3) /日减 ri-; if(yue=1|yue=3|yue=5|yue=7|yue=8|yue=10|yue=12)/月份判断 if(ri=0) ri=31; if(yue=4|yue=6|yue=9|yue=11) if(ri=0) ri=30; if(yue=2) if(ri=0) ri=28; if(flag=1) duan1=tablenian/10; /分解显示信息 duan2=tablenian%10; duan3=tableyue/10; duan4

16、=tableyue%10; duan5=tableri/10; duan6=tableri%10; if(flag=0) if(xuanze2=1) duan1=0xff; /调整时间时,年时间值闪烁 duan2=0xff; if(xuanze2=2) duan3=0xff; /调整时间时,月时间值闪烁 duan4=0xff; if(xuanze2=3) duan5=0xff; /调整时间时,日值闪烁 duan6=0xff; xianshi(); j+; if(20=j) /延时闪烁时间 j=0; flag=!flag; /闪烁标志变量 /*-外部中断0中断子程序-*/void int_x0(

17、)interrupt 0 /手动关闭闹钟 deng=1;/*-定时/计数器0中断子程序-*/void timer0()interrupt 1 uint t; TH0=(65536-10851)/256; /重新赋值 11.0592M晶振计算,指令周期1.0851uS TL0=(65536-10851)%256; /最大值65536 即60.398ms 所以 t+; /直接定时器不够用,需要用循环处理, if(t=1000) /计数到10s后,自动关闭闹钟 /定时10ms,然后循环1000次后输出 10x1000=1000ms=10s t=0; deng=1; /*-定时/计数器1中断子程序-*

18、/void timer1(void) interrupt 3 static unsigned int i; TH1=(65536-10851)/256; /重新赋值 11.0592M晶振计算,指令周期1.0851uS /最大值65536 即60.398ms 所以 TL1=(65536-10851)%256; /直接定时器不够用,需要用循环处理, i+; if(i=100) /定时10ms,然后循环100次后输出 10x100=1000ms=1s i=0; miao+; if(miao=60) /秒达到60s miao=0; /秒清零 fen+; /分加1 if(fen=60) /分达到60 f

19、en=0; /分清零 shi+; /时加1 if(shi=24) shi=0; ri+; if(yue=1|yue=3|yue=5|yue=7|yue=8|yue=10|yue=12) if(ri=32) /31天的月达到32, ri=1; /日回归到1, yue+; /月份加1 if(yue=4|yue=6|yue=9|yue=11) if(ri=31) /30天的月达到31 ri=1; /日回归到1, yue+; /月份加1 if(yue=2) if(ri=29) /默认2月为28天,此处是有一个缺陷,以为只有六个数码管,所以不能进行闰年还是平年 ri=1; /日回归到1 yue+; /月份加1 if(yue=13) /月达到13 yue=1; /月回归到1 nian+; /年加1 if(nian=100) /年达到100 nian=0; /年回归到0,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1