- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单片机及嵌入式系统
本 科 实 验 报 告
课程名称:
实验项目: 自动报时数字钟
实验目的
通过设计一个自动报时数字钟,提高单片机系统综合应用能力,了解单片机工作原理及开发流程,熟练掌握51单片机开发环境及下载软件的应用。
实验内容
(一)、基本部分
使用数码管的低六位分别显示时、分秒。
使用第七位指示上午下午,符号‘A’表示上午,符号‘P’表示下午。
可以通过按键分别调整小时位和分钟位。
整点报时:到达整点时以第八位数码管闪烁的方式报时,使用‘8’作为闪烁的内容,闪烁频率为2Hz,持续时间从xx.00.00到xx.00.05。
发挥部分
闹钟功能:在以上基础上考虑增加定时闹铃功能。
12/24小时制转换:通过一个按键设置时钟显示模式为12小时或24小时制。
万年历:增加万年历功能,可以按键选择或循环显示年、月、日、星期。
可以通过按键调整年、月、日、星期。
采用LCD12864或LCD1602液晶进行显示及其他(如计算器等)。
计算机
单片机开发软件、下载工具
单片机最小系统实验板
部分子程序模块流程图
硬件介绍
实物图:
本实验硬件部分使用KDMCU-51开发板仿真平台进行设计,通过开发板自带键盘进行输入控制,通过数码管进行显示输出,同时运用单片机的定时器、寄存器功能,对软件部分进行定时,存储操作。
硬件的选择
1、8位7段码数码管:7段码数码管为共阳极显示器。本系统中采用硬件实现地址译码,每一位数码管均分配一个独立地址,操作控制简单。并且,数码管的功能已经可以满足本实验的要求的功能。液晶显示,虽说也能满足需求,但由于液晶还有其他功能,如汉字显示等。如果使用液晶,会造成功能的浪费,以及成本的价格的上升,同时反应速度相对的缓慢。
2、矩阵式键盘:键位置判别方法为扫描法。扫描法是先使列(行)线全输出低电平,然后判断行(列)线状态,若行线全为高电平,表示无键被按下;若行线不全为高电平表示有键按下,然后依次使列线为低电平,再判断行线状态,当行线全为高电平时,表示按下的键不在本列;当行线不全为高电平时,表示按下的键在本列,把此时的行线状态与列线状态和在一起即为被按下的键的位置。
USB接口:通用串行总线,是一种快速、灵活的总线接口。与其他通信接口比较,USB接口的最大特点是易于使用。
五、设计思路:
基本的时钟显示:
首先要解决实现1秒的问题,我们采用了2ms的定时器中断时间间隔
根据2*10^-3=(65536-T0)*1/(12*10^6)*12
得到To=63536=F830H
=THO=F8H;TL0=30H
总共用了5个计数器完成了时间的进位和表示。
上下午与24小时制:
时钟本身为24小时制;
设置了布尔变量timechange;
=1时24进制;
=0时12进制,显示A或P,并在下午进行转换(-12)运算。
调整时间:
加一减一……无须解释。
整点报时:
一秒内闪烁两次,要产生2hz脉冲,周期=0.5s,因此在程序中体现为对0.5s取模
万年历和日期的显示和调整:
与时间的现实和调整本质一样,在日期中加入了闰年的判断,非2月30或31天的判断。
附加:秒表
取最低位计数器(0.01s),不显示时,显示分、秒、毫秒。
缺点:在本次试验中我们尽取了最低位计数器,通过累加和除法算出分和秒,由于用的
是int类型(-32768~32767),因此时间过长会有溢出。
9
初始化T0
getkey==1?
getkey==0
用户定义的键盘
和显示处理
主程序
main()
NO
YES
装载TH0、TL0
调用leddisp();
更新显示
control_readkey==1?
调用readkey();
扫描一次键盘
control_readkey取反
中断返回
T0中断
intT0()
每4ms更新
一位显示
NO
YES
每8ms扫描
一次键盘
lednum==?
lednum==0?
显
示
led1
显
示
led2
显
示
led8
显
示
led5
显
示
led7
显
示
led6
显
示
led3
显
示
led4
lednum==7
子程序返回
lednum--
显示更新函数
leddisp()
4
5
3
2
1
7
0
6
YES
NO
first_row=0;
second_row=0;
M_key=KEY;
读键盘
M_key==0xff?
判断是否有按键
first_getkey==0?
是不是第一次按
first_getkey=1
first_getkey=0;
keyon=0;
子程序返回
first_row=0;
s
文档评论(0)