电气工程学院
一、课程设计任务书
1.课程设计项目
电子时钟(LED显示)
2.设计内容
1)以MCS-51系列单片机为核心器件组成电子时钟控制系统;
2)利用提供单元模块构成硬件系统。
3)系统程序编制与调试;
4)电路系统的综合调试;
5)撰写课程设计论文;
6)完成课程设计论文答辩。
3.设计要求
1)以STC10F04E单片机为控制核心,用单片机内部定时器为时钟源,设计电子时钟,使用4位数码管显示时、分,后两位数码管(分)的闪烁显示秒。
2)显示格式为:“XXXX
3)用4个功能键操作来进行对时。可自行定义各键的功能,也 可按下述方式定义K1~K4键的功能如下。
K1—功能键,每按下一次对应的LED闪烁。
K2—移位键,每按下一次向后移一位。
K3—加1键。 K4—减1键。
4.参考资料
[1]李广弟,朱月秀,王秀山编著.单片机基础. 北京:北京航空航天大学出版社,2001
[2] 何立民编著.MCS-51系列单片机应用系统设计系统配置与接口技术.北京:北京航空航天大学出版社,1999
[3] 蔡美琴等编著.MCS-51 单片机系统及应用.北京:高等教育出版社.1992
5.设计进度(20##年6月13日至20## 年6月24日)
6.设计地点
新实验楼323微机实验室
二、评语及成绩
单片机原理及
应用课程设计
班 级: 自1042
姓 名:
学 号: 10号
指导教师:
撰写日期: 2013/6/13
目录
第一章 绪论... 1
课题背景... 1
课题意义... 2
第二章 课程设计内容与要求分析... 3
2.1课程设计内容... 3
2.1.1课程设计项目... 3
2.1.2课程设计目的... 3
2.1.3设计内容... 3
2.2课程设计要求分析... 3
2.2.1设计要求... 3
2.3系统单元电路组成... 5
第三章 控制系统程序设计... 6
3.1个人创意... 6
3.2调试步骤... 7
3.2.1电路调试... 7
3.2.2硬件调试... 7
3.2.3性能测试... 7
单片机原理及应用课程设计总结... 11
参考资料... 12
附录... 13
第一章 绪论
着时代的发展,生活节奏的加快,人们的时间观念愈来愈强;随自动化、智能化技术的发展,机电产品的智能度愈来愈高,用到时间提示、定时控制的地方也会愈来愈多,因此,设计开发数字时钟具有良好的应用前景。
由于单片机价格的低成本、高性能,在自动控制产品中得到了广泛的应用。本设计利用Atmel公司的STC12C5A08S2单片机对电子时钟进行开发,设计了实现所需功能的硬件电路,应用汇编语言进行软件编程,并用实验板进行演示、验证。
在介绍本单片机的发展情况基础上,说明了本设计实现的功能,以及实验板硬件情况,并对各功能电路进行了分析。主要工作放在软件编程上,用实验板实现时间、日期、定时及它们的设定功能,详细对软件编程流程以及调试进行了说明,并对计时误差进行了分析及校正,提出了定时音与显示相冲突问题及解决方案。实验证明效果良好,可以投入使用。
课题背景
单片机自1976年由Intel公司推出MCS-48开始,迄今已有二十多年了。由于单片机集成度高、功能强、可靠性高、体积小、功耗低、使用方便、价格低廉等一系列优点,目前已经渗入到人们工作和生活的方方面面,单片机的应用领域已从面向工业控制、通讯、交通、智能仪表等迅速发展到家用消费产品、办公自动化、汽车电子、PC机外围以及网络通讯等广大领域。
单片机有两种基本结构:一种是在通用微型计算机中广泛采用的,程序存储器和数据存储器共用一个存储器空间的结构,称为“冯·诺依曼”(Von Neumann)结构。另一种是将程序存储器和数据存储器截然分开,分别寻址的结构,称为“哈佛”(Harvard)结构,目前的单片机采用此种结构为多。
本文讨论的单片机多功能时钟系统的核心是目前应用极为广泛的51系列单片机,配置了外围设备,构成了一个可编程的计时定时系统,具有体积小,可靠性高,功能多等特点。不仅能满足所需要求而且还有很多功能可供扩展,有着广泛的应用领域。
课题意义
在日常生活和工作中,我们常常用到定时控制,如扩印过程中的曝光定时等。早期常用的一些时间控制单元都使用模拟电路设计制作的,其定时准确性和重复精度都不是很理想,现在基本上都是基于数字技术的新一代产品,随着单片机性价比的不断提高,新一代产品的应用也越来越广泛。大则可以构成复杂的工业过程控制系统,完成复杂的控制功能;小则可以用于家电控制,甚至可以用于儿童电子玩具。它功能强大、体积小、质量轻、灵活好用,配以适当的接口芯片,可以构成各种各样、功能各异的微电子产品。
随着电子技术的飞速发展,家用电器和办公电子设备逐渐增多,不同的设备都有自己的控制器,使用起来很不方便。这些具有人们所需要的智能化特性的产品减轻了人的劳动,扩大了数字化的范围,为家庭数字化提供了可能。
根据这种实际情况,设计了一个单片机多功能时钟系统,它有基本的时间功能,还有定时功能,既可作为闹铃,也可扩展为定时对家电等电气产品的自动控制,可以避免多种控制器的混淆,利用一个控制器对多路电器进行控制;可增加温度传感器,进行实时温度显示,进一步扩展为利用不同的温度某些电气产品进行自动控制;也可增加湿度传感器,进行实时湿度显示,以便对湿度进行控制,方便人们的生活。
第二章 课程设计内容与要求分析
2.1课程设计内容
2.1.1课程设计项目
电子时钟(LED显示)
2.1.2课程设计目的
1) 巩固和加深对单片机原理知识的理解和运用;
2) 进一步提高学生综合运用所学知识的能力;
3) 培养学生综合分析问题、发现问题和解决问题的能力。
2.1.3设计内容
1) 以MCS-51系列单片机为核心器件组成电子时钟控制系统;
2) 利用提供单元模块构成硬件系统。
3) 系统程序编制与调试;
4) 电路系统的综合调试;
5) 撰写课程设计论文;
6) 完成课程设计论文答辩。
2.2课程设计要求分析
2.2.1设计要求
1)以STC10F04E单片机为控制核心,用单片机内部定时器为时钟源,设计 电子时钟,使用4位数码管显示时、分,后两位数码管(分)的闪烁显示秒。
2)显示格式为:“XXXX
3)用4个功能键操作来进行对时。可自行定义各键的功能,也可按下述方式定义K1~K4键的功能如下。
K1—功能键,每按下一次对应的LED闪烁。
K2—移位键,每按下一次向后移一位。
K3—加1键。 K4—减1键。
2.3系统单元电路组成
第三章 控制系统程序设计
3.1个人创意
本实验的基本要求由我们组的蔡楗同学设计完成。而我在原有的基础上设计了一个整点报时功能。报时的时候由蜂鸣器的鸣叫和LED彩灯的开幕闭幕两个现象来实现。
表3.1 整点报时设计函数
3.2调试步骤
3.2.1电路调试
把相应编译好的目标程序代码加载到单片机芯片STC12C5A08S2,可接上5V电压源即开始进行硬件电路的调试工作。如果显示结果不符合设计要求,即检查电路各连接点是否正确连接,再次进行硬件电路的调试工作,或是检查代码程序是否符合硬件电路的设计,若有错即进行相应的修改,编译后,再进行硬件电路的调试工作。如此反复操作,直到调试出正确结果。
3.2.2硬件调试
(1) 在计算机上运行程序调试软件Keil,进行程序调试。
(2)利用老师给的板子以及自己的开发板进行调试。
(3)加载程序代码到单片机芯片STC12C5A08S2中,进行模拟仿真。若出现错误,查看错误后进行相应修改再进行调试与模拟仿真,直到调试出正确结果。
3.2.3性能测试
系统上电后进行功能的测试,通过测试观察到,系统上电后数码管上显示时间:00.00。通过测试,本作品设计实现了数字电子钟的基本功能,且系统工作稳定。经过全组组员一起调试及验证,计时误差为1.0秒。
然后进行本人的设计测试。本次设计成功实现:当时间到达整点时,首先让蜂鸣器想起来,然后让LED彩灯以闭幕和开幕的形式亮起来,5秒之后,蜂鸣器停止鸣叫,彩灯也全部熄灭。
注:程序详情见附录
表3.2 电子时钟课设函数列表
单片机原理及应用课程设计总结
本次课程设计的题目是LED数字显示电子时钟。经过本组同学的共同努力,终于调试成功,并经过测试数据显示, 系统的可靠性已经基本能够达到实际电子钟的设计要求,同时本单片机数字电子钟系统具有扩展性。
失败是成功之母,实验中我们当然也遇到了不少问题。
首先是分工问题。刚开始我们小组由组长进行编程,我负责整理资料和排版,小云进行收集资料。老师觉得这样的分工很不平衡,因为除了组长之外,其他两名同学根本没有参与设计,这样根本得不到锻炼,而且背离了我们这次以设计为主的课程设计主题。所以我们后来采取了每个人在原有基础之上,再额外设计一些功能的办法,让每位组员能积极投身到设计的行动中,真正做到设计的要求。
在此,先谢谢老师的用心良苦。
再就是个人设计的部分的问题。我的设计是整点报时功能。这个对我来说是力所能及的。我花了一天的时间去理解基础程序,积极向组长请教,终于弄懂了这长长程序背后的奥妙。最后我又花了一个早上的时间去添加整点报时功能。在硬件调试的过程中都会出现不少的小问题,经过反复修改程序,终于成功做出自己想要的结果。
我们组通过此次单片机课程设计不仅仅将我们一学期在单片机课程上的所学很好的应用到了实际设计中,更是将理论知识应用到了实践中,这才是真正的学习,不仅仅是读万卷书,更要行万里路,讲知识与实践有机的结合。也十分感谢老师为我们提供了这次单片机课程设计的机会,我们也通过此次课程设计,更清晰更实际的接触到了单片机。
总结人:
2013/06/13
参考资料
[1]李广弟,朱月秀,王秀山编著.单片机基础. 北京:北京航空航天大学出版社,2001
[2] 何立民编著.MCS-51系列单片机应用系统设计系统配置与接口技术.北京:北京航空航天大学出版社,1999
[3] 蔡美琴等编著.MCS-51 单片机系统及应用.北京:高等教育出版社.1992
附录
#include<reg51.h> //#include"stc10f08xe.h"
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key_function=P2^3;
sbit key_move=P2^2;
sbit key_add=P2^1;
sbit key_sub=P2^0;
sbit LED=P1^0;
sbit speaker=P3^0;
bit time_int_flag=0; //整点报时标志
bit setfinish=0; //设置完成标志
bit secflag=0; //秒闪烁标志
uchar keyfun_flag,move_flag,add_flag,sub_flag,set1_timer,set2_timer,set3_timer,set4_timer;
uchar code LED_Val[] = {0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};//0-9
uchar num[4];
uchar data led_point[4]={0xef,0xdf,0xbf,0x7f};
uint time,set_timer;
uchar sec,min,hour;
void Led();
void send_data(uchar send_dat);
void Disp(uint disp_value);
void Bcd(uint bcd_value);
void Delay_ms(uint delay);
///整点报时函数//
void Led()
{
if(time_int_flag==1)
{ P3=0XFE;
Delay_ms(100);
P1=0X7E;
Delay_ms(1000);
P1=0XBD;
Delay_ms(1000);
P1=0XDB;
Delay_ms(1000);
P1=0XE7;
Delay_ms(1000);
}
else
{ P3=0XFF;
P1=0xff;
}
}
//显示函数//
void Disp(uint disp_value)
{
uchar i;
Bcd(disp_value);
for(i=0;i<4;i++)
{
P2=led_point[i];
if((secflag==1)&&((i==2)|(i==3))) //第几个管闪烁
{
P0=0xff;
}
else
{
P0=LED_Val[num[i]];
}
Delay_ms(5);
P2=0XFF;
}
}
void Disp_ss(uint disp_value)//设置显示函数
{
uchar i;
Bcd(disp_value);
for(i=0;i<4;i++)
{
if((i==3)&&(move_flag==1))
{
P2=led_point[i];
P0=LED_Val[num[i]];
Delay_ms(1000);
P2=0xff;
Delay_ms(1000);
}
else
{
P2=led_point[i];
P0=LED_Val[num[i]];
Delay_ms(5);
}
if((i==2)&&(move_flag==2))
{
P2=led_point[i];
P0=LED_Val[num[i]];
Delay_ms(1000);
P0=0xff;
Delay_ms(1000);
}
else
{
P2=led_point[i];
P0=LED_Val[num[i]];
Delay_ms(5);
}
if((i==1)&&(move_flag==3))
{
P2=led_point[i];
P0=LED_Val[num[i]];
Delay_ms(1000);
P0=0xff;
Delay_ms(1000);
}
else
{
P2=led_point[i];
P0=LED_Val[num[i]];
Delay_ms(5);
}
if((i==0)&&(move_flag==4))
{
P2=led_point[i];
P0=LED_Val[num[i]];
Delay_ms(1000);
P0=0xff;
Delay_ms(1000);
}
else
{
P2=led_point[i];
P0=LED_Val[num[i]];
Delay_ms(5);
}
}
}
void Delay_ms(uint delay)////延时函数
{
uchar j;
while(delay--)
{
for(j=125;j>0;j--)
{;}
}
}
void Bcd(uint bcd_value)///数据分离函数
{
num[0]=bcd_value/1000; //高位
num[1]=(bcd_value%1000)/100;
num[2]=((bcd_value%1000)%100)/10;
num[3]=((bcd_value%1000)%100)%10; //低位
}
void key_scan()//键盘扫描函数
{
if(key_function==0) //功能键按下
{
Delay_ms(10);
if(key_function==0)
{
while(key_function==0);
keyfun_flag++;
}
}
//////////////
if(key_move==0) //移位键按下
{
Delay_ms(10);
if(key_move==0)
{
while(key_move==0);
move_flag++;
if(move_flag==5)
{
move_flag=1;
}
}
}
//////////////
if(key_add==0) //加一键
{
Delay_ms(10);
if(key_add==0)
{
while(key_add==0);
add_flag=1;
}
}
if(key_sub==0) //减一键
{
Delay_ms(10);
if(key_sub==0)
{
while(key_sub==0);
sub_flag=1;
}
}
}
void key_deal()///按键处理
{
if(keyfun_flag==1) //功能按下一次
{
TR0=0; //关闭定时器
if((move_flag==1)&&(add_flag==1)) //设置第一位
{
add_flag=0;
set1_timer++;
if(set1_timer==10)
{
set1_timer=0;
}
}
if((move_flag==1)&&(sub_flag==1))
{
sub_flag=0;
set1_timer--;
if(set1_timer==255)
{
set1_timer=9;
}
}
if((move_flag==2)&&(add_flag==1)) //设置第二位
{
add_flag=0;
set2_timer++;
if(set2_timer==6)
{
set2_timer=0;
}
}
if((move_flag==2)&&(sub_flag==1))
{
sub_flag=0;
set2_timer--;
if(set2_timer==255)
{
set2_timer=5;
}
}
if((move_flag==3)&&(add_flag==1)) //设置第三位
{
add_flag=0;
set3_timer++;
if(set4_timer<2)
{
if(set3_timer==10)
{
set3_timer=0;
}
}
if((set4_timer==2)&&(set3_timer==4)) //时钟十位为2
{
set3_timer=0;
}
}
if((move_flag==3)&&(sub_flag==1))
{
sub_flag=0;
set3_timer--;
if(set3_timer==255)
{
if(set4_timer<2)
{
set3_timer=9;
}
if(set4_timer==2)
{
set3_timer=3;
}
}
}
if((move_flag==4)&&(add_flag==1)) //设置第四位
{ add_flag=0;
set4_timer++;
if(set3_timer>3)
{
if(set4_timer==2)
{
set4_timer=0;
}
}
else
if(set4_timer==3)
{ set4_timer=0;
}
}
if((move_flag==4)&&(sub_flag==1))
{
sub_flag=0;
set4_timer--;
if(set4_timer==255)
{
if(set3_timer>3)
{
set4_timer=1;
}
else
{
set4_timer=2;
}
}
}
}
if(keyfun_flag==2) //功能键按下第二次
{
TR0=1;
setfinish=1; //设置完成
move_flag=0;
}
set_timer=set4_timer*1000+set3_timer*100+set2_timer*10+set1_timer; //必须放在外面
}
void system_init()///系统初始化
{
TMOD=0X01;
TH0=(65536-50000)/256; //50ms
TL0=(65536-50000)%256; //50ms
TR0=1;
ET0=1;
EA=1;
}
void timer0() interrupt 1//计时函数
{
uchar count;
TH0=(65536-50000)/256; //50ms
TL0=(65536-50000)%256; //50ms
count++;
if(setfinish==1)
{
min=min+set2_timer*10+set1_timer;
if(min>=60)
{
min=min-60;
hour++;
}
hour=hour+set4_timer*10+set3_timer;
if(hour>=24)
{
hour=hour-24;
}
setfinish=0; //读取完成,清除数据
}
if(count<=5)
{
secflag=1; //秒钟闪烁标志位
}
else
{
secflag=0;
if(count==20)
{
sec++;
count=0;
if(sec==5)
{
min++;
sec=0;
if(min==3)
{
hour++;
min=0;
if(hour==24) //24小时制
{
hour=0;
}
}
}
}
}
if((sec>=2)&&(min>=2))
{
time_int_flag=1;
}
else
{
time_int_flag=0;
}
time=hour*100+min;
}
void main()//主函数
{
SCON=0x00;
P2=0XFF;
system_init();
while(1)
{
key_scan();
key_deal();
Disp(time);
Led();
if(keyfun_flag==1)
{ break;
}
}
while(1)
{ key_scan();
key_deal();
Disp_ss(set_timer);
if(keyfun_flag==2)
{
break;
}
}
while(1)
{
Disp(time);
Led();
}
}