单片机实验报告.docx
《单片机实验报告.docx》由会员分享,可在线阅读,更多相关《单片机实验报告.docx(30页珍藏版)》请在冰豆网上搜索。
单片机实验报告
单片机应用系统设计报告
题目单片机应用系统设计
学院信息学院
专业电气工程及自动化
班级12电气升本
学生姓名朱婉婉
学号
7月16日至7月28日共11天
13年7月18日
一、设计内容及要求
必做实验内容:
1.使用中文液晶128x64点阵LCD采用16点阵字库显示当前时间“时时:
分分:
秒秒”
2.
时钟
09年06月24日
22时33分24秒
用4个按键设置现在时间:
K1进入设置现在时间;
K2调整小时;
K3调整分;
K4设置完成。
3.增加闹铃功能,时间到了使用音乐声
可选实验内容:
4.增加闹铃功能,时间到发出声响并启动继电器
5.增加秒表计数功能,精度为秒
6.增加万年历显示“年月日”
课程设计要求
方案设计前要求完成设计报告,每个组一份;
方案实施过程中完善设计报告,每个成员独立进行;
方案实施结束,经过指导老师验收后完成设计报告,每个成员独立完成,其中设计图纸每个组只需要1份。
二、设计原始资料
单片机的C语言应用程序设计(第四版)
8051系列单片机C程序设计完全手册
三、主要参考资料
THGQC-实验指导书C8051F
串行实时时钟芯片S—3530A及其在51单片机系统中的应用
时钟芯片S-3530A与C8051F040单片机的通讯接口设计
四、进程安排
教学内容学时地点
资料查阅与学习讨论1天2--216单片机实验室
分散设计5天2--216单片机实验室
编写报告3天2--216单片机实验室
成果验收1天2--216单片机实验室
(单片机应用系统设计)设计任务书
学院:
信息学院
班级:
12电气升本
学生姓名:
朱婉婉学号
指导教师:
时间:
2013年7月16日到2013年7月26日
摘要
数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。
尽管目前市场上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于单片机的定时器功能也可以完成数字钟电路的设计,因此进行数字钟的设计是必要的。
在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起
来用于实际,来培养我们的综合分析和设计电路,写程序、调试电路的能力。
单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔
基于这种情况,我们课程设计小组两人多方查阅资料,反复论证设计出了这款既简单实用,又价格便宜的——单片机电子时钟。
关键词:
单片机时钟计时
1、总体功能1
2、实验要求1
二、硬件电路图及说明3
1、硬件电路图3
2、12864LCD液晶显示屏3
3、按键功能3
4、实时时钟芯片S-3530A3
三、电路及程序设计7
四、设计特点16
五、调试17
1、主循环程序流程3
2、关于3530读出数据的更改3
3、关于秒表的设置3
4、关于时间的设置3
5、遇到的具体问题3
6、注意事项3
六、总结及体会19
七、使用说明书21
八、程序及简单注解22
1、3
2、3
3、3
一、概述
1、总体功能
本次设计时钟电路,使用了STC89C5单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,用一扬声器来进行定时提醒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:
键盘、芯片、扬声器、显示屏即可满足设计要求。
2、实验要求
必做实验内容:
:
分分:
秒秒”
1.使用中文液晶128x64点阵LCD采用16点阵字库显示当前时间“时时2.用4个按键设置现在时间:
K1进入设置日期;(K1=1)
K2调整年;
时钟
09年06月24日
22时33分24秒
K3调整月;
K4调整日。
K1进入设置现在时间;(K1=2)
K2调整小时;
K3调整分;
K4调整秒。
K1设置完成(K仁3)
增加闹铃功能,时间到了使用音乐声(指示灯闪动10秒)可选实验内容增加闹铃功能,三次闹铃增加秒表计数功能,精度为秒-
增加万年历显示“年月曰”二月28天、29天增加星期显示
增加整点闹铃指示灯闪动5次
增加整点闹铃开关
被设置的数字闪动,其他自己认为可添加的内容课程设计要求方案设计前要求完成设计报告,每个组一份;
方案实施过程中完善设计报告,每个成员独立进行;
其中设计图纸每
方案实施结束,经过指导老师验收后完成设计报告,每个成员独立完成,
个组只需要1份
二、硬件电路图及说明
1、硬件电路图
LCD时钟控制系统利用C8051F020芯片作为控制中心,配合液晶显示128*64液晶显示模块、独立式键盘模块、实时时钟/日历芯片模块等电路,实现日历时钟实现显示年月日时
分秒。
总体设计方框图如图1所示:
图1
2、12864LCD液晶显示屏
带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128X64,内置8192个16*16点汉字,和128个16*8点ASCII字符集利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8X4行16X16点阵的汉字也可完成图形显示低电压低功耗是其又一显着特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
12864接口定义及其与C8051F02啲接口:
引脚及内部结构如图2所示:
图2液晶显示电路
3、按键电路
K1连接口,K2连接口,K3;连接口,K4连接口
键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向计算机输入指令、地址和数据。
一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。
按键开关的抖动问题,键盘与单片机的连接组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的。
当开关S未被按下时,输入为高电
平,S闭合后,输入为低电平。
而按键会有抖动现象,因此必须考虑如何去除抖动,常用的去抖动的方法有两种:
硬件方法和软件方法。
单片机中常用软件法。
软件法其实很简单,就是在单片机获得口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测口,如果仍为低,说明S1的确按下了,这实际上是避开了按键按下时的抖动时间。
而在检测到按键释放后(为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。
本次实验去抖动采用软件方式。
四个按键分别接到、、和。
对于这种键各程序可以采用不断查询的方法,功能就是:
检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入相应的键处理。
4、实时时钟芯片S-3530A
S-3530是一款低功耗的CMO实时时钟/日历芯片,它提供二个中断输出和掉电检测器,所有的地址和数据通过l2C总线接口串行传递。
最大总线速度为400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动增加。
(1)器件特性:
低工作电流:
典型值为卩A(VDD=;
世纪标志;
大工作电压范围:
~;
BCD码设置时间参数
低休眠电流;典型值为卩A(VDD=时))
稳压电路
报警和定时器;
掉电检测器;
内部集成的振荡器电容;
|2C总线从地址:
读:
0A3H写:
0A2H
三、电路与程序设计
1、程序流程图
主程序:
开始一
结束
子程序Testl2C():
开始
读取3530数
据
时间赋初值
将初值读入
3530
清屏
在16,0处显示05年01月
01日,在16,2处显示00时
00分00秒
读取3530数
据
调~用~函~数
setvalue()
分为0且秒小于11
J丫
整点报时LED灯闪
烁
调用函数
alarmcheck()
刷新显示时分
秒,刷新显示年
月日
miaobiao_on为偶且不
为0N
I丫
显示秒表
按键判断程序set_value():
根据设计原则,判断按键并作出相应反应
开始
读取按键值
有键按下且
flag1=1
按下的键为K1
flag=1;key2=1;flag仁
0;
在(112,0)显示“年”
按下的键为
K2flag=3;flag1=0;
在(112,0)显示
“闹”
按下的键为
K3
flag=7;miaobiao_on=1;flag1=0;在(16,4)显示“秒表:
XXX:
XX
flag=2;key2=1;flag1=0;
在(112,0)显示“时”
J
按下的键为K2
J
key2++;flag1=0;
J
key2=2
J
在(112,0)显示“月”
J
key2=3
J
在(112,0)显示“日”
按下的键为K3
J
key2=1
年加1,星期根据平年闰年加1或
2
将数据读入
3530
J
更新星期和年的显示
flag仁0;
J
key2=2
月加1,星期根据月的日期增加
J
将数据读入3530
J
更新星期和月的显示
flag仁0;
J
key2=3
J
月加1星期根据月的日期增加
J
将数据读入3530
J
更新星期和月的显示
flag仁0;
J
按下的键为K4
J
退出时钟设置
flag=0;flag1=0;key2=0;
清除提示字符
J
flag=2
J
按下的键为K1「
J
退出时钟设置
flag=0;flag1=0;key2=
0;
清除提示字符
J
按下的键为K2—
J
key2++;flag1=0;
J
key2=2
J
在(112,0)显示分
J
key2=3
在(112,0)显示秒
F
按下的键为K3
将更改的数据读入3530
将更改的数据读入3530
将更改的数据读入3530
刷新显示秒,flag仁0;
按下的键为K4
退出时钟设置
flag=0;flag1=0;key2=0;
清楚提示字符
alarm_num不等于0
J
flag=4;flag1=0;
在(00,6)显示“1”
在(64,6)显示第一个闹钟设置时
间
alarm_num=0;关闹钟
flag=4
flag=0;flag1=0;
退出闹钟设置,清楚提示字符
按下的键为K3
闹钟1的时加1,刷新显示闹钟时间,flag1=0;
按下的键为K4
闹钟1的秒加1,刷新显示闹钟时间,flag1=0;
alarm_num>2
flag=6;在(00,6)显示3
在(64,6)显示第二个闹钟设置时
间
flag仁0;
开闹钟在(112,6)显示“开”
flag=0;flag1=0;
退出闹钟设置,清楚提示字符
—按下的键为k3—
闹钟1的时加1,刷新显示闹钟时间,flag1=0;
IJ—
按下的键为K4
闹钟1的秒加1,刷新显示闹钟时间,flag1=0;
IJI
flag=6
J
—按下的键为kP
J
J
按下的键为K2
J
J
按下的键为K3
按下的键为K4
J
flag=7
J
按下的键为K1
J
J
按下的键为K2
J
J
按下的键为K3
J
J
按下的键为K4
J
J
闹钟判断程序alarm_check():
判断闹钟是否开,根据闹钟开启数量判断是否到设定时间,若到,则启动LED灯闪
四.设计特点:
1.该时钟由四个按键控制,按键功能分明:
K1进入设置日期;(K1=1)
K2调整年;
K3调整月;
K4调整日。
K1进入设置现在时间;(K1=2)
K2调整小时;
K3调整分;
K4调整秒。
K1设置完成(K1=3)进入闹铃设置。
2.秒表采用定时器中断控制,计时精确。
K3一次进入秒表。
K3两次开始计时。
K3三次计
时停止。
K4退出秒表。
3.显示页面结构清晰,功能明确。
平时若无设置,则只显示年月日,时分秒以及星期
4.进入设置后会出现一些提示字符,表述明了。
5.调试:
1.主循环程序流程
实验初期,原来的流程是测试按键,完成所有操作后再刷新显示,进入主循环,但是,这样在测试按键,等待操作时会造成较大的延时。
因此该方案未录取。
最后采用的方案是:
检测到一次按键,就更改flag和flag1标志位,记录按键次序后就进入主循环,然后继续检测有无按键操作,这样对于程序就基本不会造成延时,而且程序的流程也更清晰。
关于标志位:
flag用来记录之前按键次数和次序flag=0表示之前无按键操作flag=1表示K1按一下flag=2表示K1按两下flag=3表示K2按一下flag=4表示K2按两下flag=5表示K2按三下flag=6表示K2按四下flag=7表示K3按一下flag1表示之前有无按键按下flag1=1,表示无按键,flag1=0,表示已有按键按下过。
2.关于3530读出数据的更改
遇到的具体问题:
时间设置时,10以下的都能正确显示,两位数的就不会正确显示。
在设置“时”时,只能加到12,而程序中的时钟为24小时制,所以不正确。
原因:
3530中读出的数据格式为BCD码,而程序中修改则按照16进制进行。
所以会有数据错误。
解决方法:
在设置时钟时间时,要先读出3530数据,更改后再读入3530中,而3530中的数据存放为BCD码,读出后并不表示时间的真实数据,因此,我编写了两个转化函数:
change()将16进制转化为BCD码fchange()将BCD码转化为16进制读出数据后先将其转化为16进制,进行操作后再转化为BCD码,读入3530数据更改中,因为“时”的数据表示只需低4位和高4位中的低两位,所以最高2位中会有一些脏数据,在读出后应先与上0x3f再进行转化操作。
3.关于秒表设置
秒表采用定时器1,初值为(65536-18432),并利用一个计数变量miaobiao,初值为10,中断中重新赋初值,每次中断miaobiao减1,减至0时,秒表计数变量加1,miaobiao
重新赋值为10!
4.关于时间的设置
在时间设置时遇到的问题基本上是因为考虑的不够周全,冈H开始时,没考虑到闰年,大小月等情况,因此,闰年的二月不能调出29号,大小月也不能区别,遇到这个问题后
就开始更改程序的细节问题,使得设置时间时所有的日子都能设置出。
要考虑的设置:
年有闰年,平年,月有大小月,星期要随着年,月,日的更改而更改。
5.遇到的具体问题
在运行时,显示屏幕卡屏。
只要一运行秒表程序,很快就会使程序卡在某一点。
原因:
在原来的中断程序中还有加入显示代码,造成在运行时,显示屏幕卡屏。
因为屏幕
中显示的时间和秒表分别由两个计数器控制,在刷新时因为计数器冲突而造成了卡屏的现象。
那是因为屏幕中显示的时间和秒表分别由两个计数器控制,在刷新时因为计数器冲突而造
成了卡屏的现象。
更改方法:
将中断程序中的显示代码取出,直接放在主循环程序中,这样就能顺利运行了。
6.注意事项
在设计秒表时,定时器1的主要程序放在文件中,而一些显示程序则在文件中,因此,在
调用这些变量时就会出现编译错误。
为解决该现象,我在文件中先编写了一个小的调用显示程序,在需要显示时再调用该程序,就解决了变量调用问题。
6.总结及体会:
本次课程设计是用AT89S5单片机CPU及LCM160设计一个数字时钟,经过一个星期的调试,结果满足设计要求,验证无误。
通过单片机硬件电路的调试,实现了预先设定的功能,设计主要用到的元件不多,最主要的是程序也比较长比较麻烦,同时也遇到了少量困难,尤其是关于校时模块的设计实现。
关于显示模块,在以前的实验中做过,所以问题很容易解决。
学以致用,将从书本上学到的知识应用于实践,学会了初步的电子电路仿真设计虽然过程中遇到了一些困难,但是在解决这些问题的过程无疑也是对自己自身专业素质的一种提高。
当最终调试成功的时候也是对自己的一种肯定。
此次的设计作业不仅增强了自己在专
业设计方面的信心,鼓舞了自己,更是一次兴趣的培养,为自己以后的学习方向的明确了重点。
另外在这次实验中我们遇到了不少的问题针对不同的问题我们采取不同的解决方法,最终一一解决设计中遇到的问题。
在我们曾经遇到不懂的问题时,利用网上的资源,搜索查找得到需要的信息
7.使用说明书:
XX年XX月XX日XX
XX时XX分XX秒
星期X
该产品为电子时钟,能显示年月日,时分秒及星期,有秒表功能,闹钟功能(注1),会进行整点报时,有四个按键控制功能的选择使用,下文中分别称为K1,K2,K3,K4按键说明:
K1:
进入时间设置
K1按一次,设置年月日K1按两次,设置时分秒
K2移位,K3加1,K4退出
“时”“分”“秒”“年”“月
K1按三次,退出设置如右图,在时间设置时,屏幕右上角会根据按键操作而出现
“日”提示当前操作的作用对象。
K2:
进入闹钟设置
XX年XX月XX日XX
XX时XX分XX秒
星期X
XX年XX月XX日
XX时XX分XX秒
秒表:
XXX:
XX
K3选择开闹钟的次数(0-3),若开的闹钟个数为零则表示闹钟关闭K2进入闹钟时间设置,K3时加,K4分加再按K2退出闹钟操作界面如右图:
右上角会出现“闹”提示字。
最下一行显示当前设置闹钟时间,闹钟次数,及闹钟开关状况。
K3:
开启秒表K3开始/停止计时K4退出秒表.秒表界面:
注1:
闹钟功能,本产品闹钟最多能设置3个不同时间,
可选择开闹钟的次数,例如,若选择次数为1时,则只会对闹钟一设置的时间作出反应(LED灯闪),次数为2时,则对前两个闹钟设定时间作出反应因此,建议将常用的闹钟时间设在前面.
八.程序及简单注释:
1、
#include""
#include<>voidDelaylus(unsignedcharus){
while(us)
{_nop_();_nop_();_nop_();_nop_();_nop_();
--us;
}
}voidSYSCLK_lnit(void)
{inti;unsignedchar*l2CDataBuff;intn=0,i,flag=1,m=0,h,f,hm=0,s=0,bs=0,l=0,q=0,q1=1,h1,h2,f1,f2;charBYTE_NUMBER;SM_BUSY=1;
COMMAND=(CLOCK3530_ADDRESS_RESET|READ);SM_BUSY=1;
C0MMAND=(CL0CK3530_ADDRESS_DATEH0UR|WRITE);SM_BUSY=1;
C0MMAND=(CL0CK3530_ADDRESS_DATEH0UR|READ);SM_BUSY=1;
SM_BUSY=1;
EIE1|=2;var=GetRealClockStatus();
ResetRealClock();
var=GetRealClockStatus();
SetRealClockStatus(0xc2);
var=GetRealClockStatus();
GetRealClock();
SetRealClock();
GetRealClock();
LCD_WriteHZ(32,4,wu);
LCD_WriteHZ(64,4,wu);
LCD_WriteHZ(96,4,wu);
LCD_WriteHZ(32,2,wu);
LCD_WriteHZ(64,2,wu);
LCD_WriteHZ(96,2,wu);
LCD_WriteHZ(64,0,wu);
LCD_WriteHZ(80,0,wu);
LCD_WriteHZ(0,0,wu);
LCD_WriteHZ(112,0,wu);
LCD_WriteHZ(112,2,wu);
LCD_WriteHZ(112,4,wu);
LCD_WriteHZ(0,6,wu);
LCD_WriteHZ(16,6,wu);
LCD_WriteHZ(32,6,wu);
LCD_WriteHZ(112,6,wu);
LCD_WriteHZ(16,0,xiao);
LCD_WriteHZ(32,0,xin);
LCD_WriteHZ(48,0,xi);
LCD_WriteHZ(64,0,xue);
LCD_WriteHZ(80,0,yuan);
LCD_WriteHZ(96,0,xiao);
LCD_DispChar(0,2,1);
LCD_DispChar(8,2,2);
LCD_DispChar(16,2,3);
LCD_DispChar(24,2,0);
LCD_DispChar(32,2,4);
LCD_DispChar(40,2,0);
LCD_DispChar(48,2,0);
LCD_DispChar(56,2,3);
LCD_DispChar(64,2,6);
LCD_WriteHZ(80,2,wu1);
LCD_WriteHZ(96,2,xi1);
LCD_WriteHZ(112,2,zhan);
LCD_DispChar(0,4,1);
LCD_DispChar(8,4,2);
LCD_DispChar(16,4,3);
LCD_DispChar(24,4,0);
LCD_DispChar(32,4,4);
LCD_DispChar(40,4,0);
LCD_DispChar(48,4,0);
LCD_DispChar(56,4,2);
LCD_DispChar(64,4,1);
LCD_WriteHZ(80,4,zhu);
LCD_WriteHZ(96,4,wan);
LCD_WriteHZ(112,4,wan);
for(i=0;i<=30;i++)
Delay1ms(500);
InitLCD();
STA=0;
break;
I2CDataBuff++;
BYTE_NUMBER--;
}
else
{
//FreeSMBus
STO=1;SM_BUSY=0;
}
break;
//主发送器从地址+WRITE已发送收到NACK//从器件不应答发送STOP+STAR重