单片机原理及应用课程设计
专 业: 设计题目: 电子时钟 班级:学生姓名:学号: 指导教师: 分院院长: 教研室主任:
电气工程学院
一、课程设计任务书 1.课程设计项目
电子时钟(LED显示) 2.设计内容
1)以MCS-51系列单片机为核心器件组成电子时钟控制系统; 2)利用提供单元模块构成硬件系统。 3)系统程序编制与调试; 4)电路系统的综合调试; 5)撰写课程设计论文; 6)完成课程设计论文答辩。 3.设计要求
1)以STC10F04XE单片机为控制核心,用单片机内部定时器为时钟源,设计电子时钟,使用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.设计进度(2012年6月13日至2012年6月17日)
时间 第1-2天 第3-5天 第6-8天 第9-10天
设计内容
查阅资料,方案比较、设计与论证,理论分析与计算 硬件电路调试 系统调试
书写报告、答辩
6.设计地点
实验楼323微机实验室
成绩: 指导教师:
单片机原理及 应用课程设计
班 级: 姓 名: 学 号: 指导教师: 撰写日期:
目 录
绪论 ........................................................... 1 第一章 课程设计要求与内容分析 .................................. 2
1.1课程设计要求 ............................................ 2
1.1.1课程设计项目 ...................................... 2 1.1.2设计内容 .......................................... 2 1.1.3设计要求 .......................................... 2
第二章 硬件分析与说明 .......................................... 3
2.1单片机的选择与说明 ...................................... 3 2.2 数码管显示工作原理 ..................................... 5 2.3 74LS164原理说明 ....................................... 6 第三章 控制系统的程序分析 ...................................... 8
3.1 程序分析 ............................................... 8 第四章 硬件调试问题及解决 ..................................... 11
4.1 联机说明 .............................................. 11 4.2问题及解决 ............................................. 12 课程设计总结 .................................................. 14 参考文献 ...................................................... 15 附录 .......................................................... 16
绪论
1957 年,Ventura 发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活补课缺少的工具。
现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用 LED 显示器代替指针显 示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
单片机全称为单片机微型计算机(Single Chip Microsoftcomputer)。从应用领域来看,单片机主要用来控制,所以又称为微控制器(Microcontroller Unit)或嵌入式控制器。单片机是将计算机的基本部件微型化并集成在一块芯片上的微型计算机。
我们这次的课设任务主要是要以STC10F04XE单片机为控制核心,用单片机内部定时器为时钟源,设计一个电子时钟。
第一章 课程设计要求与内容分析
1.1课程设计要求
1.1.1课程设计项目
电子时钟(LED显示)
1.1.2设计内容
1)以MCS-51系列单片机为核心器件组成电子时钟控制系统; 2)利用提供单元模块构成硬件系统。 3)系统程序编制与调试; 4)电路系统的综合调试; 5)撰写课程设计论文; 6)完成课程设计论文答辩。
1.1.3设计要求
1)以STC10F04XE单片机为控制核心,用单片机内部定时器为时钟源,设计电子时钟,使用4位数码管显示时、分,后两位数码管(分)的闪烁显示秒。
2)显示格式为:“XXXX”
3)用4个功能键操作来进行对时。可自行定义各键的功能,也可按下述方式定义K1~K4键的功能如下。
K1—功能键,每按下一次对应的LED闪烁。 K2—移位键,每按下一次向后移一位。 K3—加1键, K4—减1键。
第二章 硬件分析与说明
2.1单片机的选择与说明
以STC10F04XE单片机为控制核心,用单片机内部定时器为时钟源,设计电子时钟,使用4位数码管显示时,分,前两位显示时,后两位显示分,用数码管闪烁来显示秒。 STC10F04XE单片机介绍 :
如图为STC10F04XE单片机实物
图2-1 STC10F04XE单片机
1.STC10F04XE单片机引脚介绍:
STC10F04XE单片机引脚图:如图2-2所示
图2-2 STC10F04XE单片机引脚图 1)8位CPU·4kbytes 程序存储器(ROM) (52为8K);
2)256bytes的数据存储器(RAM) (52有384bytes的RAM);
3)32条I/O口线·111条指令,大部分为单字节指令;
21个专用寄存器;
4)2个可编程定时/计数器·5个中断源,2个优先级(52有6个); 5)一个全双工串行通信口;
6)外部数据存储器寻址空间为64kB; 7)外部程序存储器寻址空间为64kB;
8)逻辑操作位寻址功能·双列直插40PinDIP封装; 9)单一+5V电源供电;
10)CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊
功能寄存器;
11)RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
12)ROM:用以存放程序、一些原始数据和表格;
13)I/O口:四个8位并行I/O口,既可用作输入,也可用作输出; 14)T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式五个中断源的中断控制系统; 15)五个中断源的中断控制系统;
16)一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
17)片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振
荡频率为12M。 2.STC10F04XE主要性能:
1)高速:1个时钟周期/机械周期/增强型8051内核、速度比普通8051快8-12倍。
2)宽电压:5.5V-4.1V/3.7V,3.6V-2.4V/2.1V;
3)低功耗设计:空闲模式(可由任意一个中断唤醒);
4)低功耗设计:掉电模式(可由任意一个外部中断唤醒,可支持下降沿/
低电平和远程唤醒,STC10F04XE还可以通过内部专用掉电唤醒定时器唤醒)。
5)工作频率:0-35HZ,相当于普通8051:0-420HZ;
6)时钟:外部晶体或内部RC振荡器可选,在ISP下载编程用户程序时设置。
7)1/2/3/4/5/6/8/16/32/52/62K字节片内Flash程序存储器,擦写次数10万次以上;
8)1280/256字节片内RAM数据存储器。
9)芯片内EEPROM功能,擦写次数10万次以上;
10)ISP/IAP,在系统编程/在应用编程,无需编程器/仿真器。
11)2个16为定时器,兼容普通8051的定时器T0/T1;
12)1个独立波特率发生器(故无需T2做波特率发生器);
13)可编程时钟输出功能,T0在P3.4输出时钟,T1在P3.5输出时钟,BRT在P1.0输出时钟;
14)硬件看门狗(WDT);
15)全双工异步串行口(UART),兼容普通8051,可作为2个串口(串口可在P3与P1之间自由切换);
16)先进的指令集结构,兼容普通8051指令集,有硬件乘法/除法指令;
17)通用I/O口(36/40个),复位后为:准双向口/弱上拉(普通8051传统I/O口)。
2.2 数码管显示工作原理
显示:采用共阳极LED的动态显示方式,用扩展74LS164的并行输出做段选,74LS164的CLK接P3.1(TXD),数据输入端接P3.0(RXD)。P1.4~P1.7作位选。如图2-3所示。
键盘:如图2-4所示为键盘接口,采用线性键盘,P2.3,P2.2,P2.1,P2.0分别对应的K1-K4。
数码管是一种把多个 LED 显示段集成在一起的显示设备。有两种类型,一种是共阳型,一种是共阴型。本次实验采用的是共阳型,共阳型就是把多个 LED 显示段的阳极接在一起,又称为公共端。而数码管显示方法可分为静态显示和动态显示两种。本次实验采用的是动态显示。动态显示的原理是,各个数码管的相同段连接在一起,共同占用 8 位段引管线;每位数码管的阳极连在一起组成公共端。利用人眼的视觉暂留性,依次给
出各个数码管公共端加有效信号,在此同时给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速 度时,显示就会清晰显示出来。
图2-3 数码管显示原理图
图2-4 键盘显示原理图
2.3 74LS164原理说明
如图2-5为74LS164的引脚图
8位移位寄存器(串行输入,并行输出),当清除端(clear)为低电平时,输出端均为低电平。串行数据输入端(A,B)可控制数据。当A,B任意一个为低电平,则禁止新数据输入,在时钟端(clock)脉冲上升沿作用下Q0为低电平。当A,B有一个为高电平,则另一个就允许输入数据,并在clock上升沿作用下决定Q0的状态。
引出端符号
CLOCK 时钟输入端
CLEAR 同步清除输入端(低电平有效)
A,B 串行数据输入端
QA-QH 输出端
逻辑及封装图:(双列直插式封装)
图2-5 74LS164的引脚图
第三章 控制系统的程序分析
3.1 程序分析
本系统的软件系统都用到的函数主要有键盘扫描,主函数,显示函数,延时函数,计时函数,校正函数,数据分离函数等。下面对部分模块作一个简单的介绍。完整程序请参考附录1。
#include"STC10F04XE.H" ///////头文件
#define uchar unsigned char /////定义函数
#define uint unsigned int /////////定义函数
uchar keyfun_flag,flag; ///////////定义全局变量
sbit key_1f=P2^3; //////////////////定义按键
sbit key_2t=P2^2;///////////////////定义按键
sbit key_3i=P2^1; //////////////////定义按键
sbit key_4d=P2^0; /////////////////定义按键
uchar code
LED_Val[]={0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98}; ////段选0-9
uchar data num[4]; ////////////////移位寄存器
void system_init();/////////////////初始化函数
uchar data led_point[4]={0xef,0xdf,0xbf,0x7f}; ///四位位选
void Disp(uint disp_value); ///显示函数声明
void Bcd(uint bcd_value); /////数据分离函数声明
void Delay_ms(uint delay); ///延时函数声明
void Key_3iscan();////////////////按键函数声明
void Key_4dscan();///////////////按键函数声明
void Key_2tscan();///////////////按键函数声明
void Key_1fscan();///////////////按键函数声明
long int count,second,minite,hour; ////定义全局变量秒,分,时
uchar sum; ///////////////////////////显示分,时
////////////////////////////显示函数/////////////////////////////////////
void system_init()
{
TMOD=0x01;
TH0=(65536-50000)/256;////定时器初始化
TL0=(65536-50000)%256; //定时器初始化
EA=1;//中断总开关
ET0=1;//定时器T0开关
TR0=1;
}
////////// ///////////////////中断程序////////////////////////////////////
void T0_srv(void) interrupt 1 using 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
second++; //// 如果count=20的时候,归零,秒钟加1.
}
if(second==60)
{
second=0;
minite++; /// 如果秒钟=60的时候,归零,分钟加1.
}
if(minite==60)
{
minite=0;
hour++; /// 如果分钟=60的时候,归零,小时加1.
}
if(hour==24)
{
hour=0; //// 如果小时=24的时候,归零。重新计时。
}
}
//////////////////////////////////////////////////////////////////////////////////
void Disp(uint disp_value)
{
uchar i;
}
Bcd(disp_value); for(i=0;i
第四章 硬件调试问题及解决
4.1 联机说明
实验采用的是宏晶科技的STC10F04XE单片机,需要用专用的下载器进行下载操作。
1)要与单片机进行联机首先要下载驱动程序,把驱动程序安装到电脑上,如果安装完成时要求重启电脑,请重启电脑。
2)然后把该模块插到电脑的一个USB端口上,电脑上会提示新硬件,并自动开始安装新硬件。
3)硬件安装完成后,右键 我的电脑管理打开计算机管理窗口,在右侧裂变里
4)找到“设备管理器”并点击打开。选择查看刚刚安装的COM口序号,并记下(例如COM4)。
下载:
要给单片机下载程序,首先要将电脑与单片机连接好,然后使用电脑上的STC_ISP.exe下载软件。如果电脑上没有软件可以到STC公司网站下载。
打开软件后界面如4-1所示:
1)芯片选择:STC10F04XE
2)打开程序文件: 文件名.HEX
3)COM口: 硬件安装的COM口
注意事项:
STC的单片机在下载程序时需要手动上电,即再点击下载之后将电源开关键闭合。方能下载成功。
设计中采用的是STC的最小系统板外加显示设备。显示设备上带有按键。当下载成功之后可通过调试检验该程序是否符合设计的要求。
图4-1 联机说明
4.2问题及解决
在这次课设中遇到了很多问题,幸好在老师还有伙伴的团队合作下,问题终于解决了。以下为课设中遇到的只要的问题以及解决方法。 问 题1:程序下载不进去。
解决方法:波特率调节不正确,程序文件打开错误,之后经过大量实验解决问题。
问 题2:程序下载进去后计时显示的数字顺序颠倒。
解决方法:段选码交换位置,74LS164为移位寄存器,先存进去的数据最
后出来,所以将段选码顺序颠倒问题解决。
问 题3:数显出现明显闪烁,不稳定的状态。
解决方法:段选延时太长,人眼可以识别明显的闪烁感。将延时时间调小即可。
问 题4:计时功能正常使用,但是不可以调节时间。
解决方法:设置寄存器,将调节后的数据存入,之后将数据赋给显示函数进行显示。
问 题5:分钟十位和各位闪烁效果无法达到。
解决方法:在count值之后加标志位 san。没进入一次对其进行去反操作。
控制各位和十位的段选码即可实现闪烁效果。
课程设计总结
在方老师耐心的指导下,我们顺利完成了这次单片机课程设计课题中的电子时钟设计,通过这次的设计使我认识到自己对单片机方面的知识知道的太少了,对于书本上的很多知识还不能灵活运用,尤其是对程序设计语句的理解和运用,不能够充分理解每个语句的具体含义,导致编程的程序过于复杂,使得需要的存储空间增大。损耗了过多的内存资源。
本次的设计使我从中学到了一些很重要的东西,那就是如何从理论到实践的转化,怎样将我所学到的知识运用到我以后的工作中去。在大学的课堂的学习只是在给我们灌输专业知识,而我们应把所学的用到我们现实的生活中去,此次的电子时钟设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应于以后的竞争, 同时在查找资料的过程中我也学到了许多新的知识,在和同学协作过程中增进同学间的友谊,使我对团队精神的积极性和重要性有了更加充分的理解。最后,感谢方老师对我们的细心的指导,方老师一直在阴道我们,他没有直接把程序告诉我们,而是会适当的给我们编程的思路。正是由于老师的细心的辅导和他提供给我们的参考资料,使得我们的课程设计能够顺利的完成,同时在课程设计过程中,我们巩固和学习了我们的单片机知识。相信这对我以后的课程设计和毕业设计将会有很大的帮助!
总结人:
2012年6月17日
参考文献
[1]李广弟,朱月秀,王秀山编著.单片机基础. 北京:北京航空航天大学出版社,2001
[2]何立民编著.MCS-51系列单片机应用系统设计系统配置与接口技术.北京:北京航空航天大学出版社,1999
[3] 蔡美琴等编著.MCS-51 单片机系统及应用.北京:高等教育出版社.1992
附录
///======================================================== // 文件名称:电子时钟显示
// 作 者:陈秋莉
// 版 本:1.0
// 说 明:C51数据类型
// 修改记录:2012-6-17
//======================================================== #include"STC10F04XE.H"////包含头文件
#define uchar unsigned char/////无符号的字符型
#define uint unsigned int//////////定义无符号的整型
uchar keyfun_flag,flag,keyfun,m,n;
sbit key_1f=P2^3;///////定义k1键到k4键
sbit key_2t=P2^2;
sbit key_3i=P2^1;
sbit key_4d=P2^0;
uchar code
LED_Val[]={0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};// 0-9(显示从0到9)
uchar data num[4];(定义一个数组)
uchar data cod[4];
uchar data led_point[4]={0xef,0xdf,0xbf,0x7f};
uchar key1_flag,key2_flag,key3_flag,key4_flag,sum;//定义各个键的标志位 long int count,second,minite,hour;
void disp1(uint x,uint y);//////函数声明
void Bcd(uint a,uint b);
void Delay_ms(uint delay);
void system_init();
void key_scan();
void key_deal();
/=============================================================
// 函数名称:system_init()
// 函数功能:显示函数
// 入口参数:system_init()
// 出口参数:void
// 备注:无
//============================================================= void system_init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;(开中断)
ET0=1;
TR0=0;(关闭计时器)
}
////////// ///////////////////////////
void T0_srv(void) interrupt 1 using 1(中断服务子程序)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{ count=0;
second++;
}
if(second==60)
{
second=0;
minite++;
}
if(minite==60)
minite=0;
}
}
//////////////////////////////
void disp1(uint x,uint y)
{
uchar i;
}
//============================================================= // 函数名称:Bcd()
// 函数功能:数据分离函数
// 入口参数:BcdValue
// 出口参数:void
// 备注:无
//============================================================= Bcd(x,y); for(i=0;i
{
num[3]=a%10;
num[2]=a/10;
num[1]=b%10;
num[0]=b/10;
//============================================================= // 函数名称:DelayMs()
// 函数功能:延时函数
// 入口参数:Delay
// 出口参数:void
// 备注:无
//============================================================= void Delay_ms(uint delay)
{
uchar j;
}
//============================================================= // 函数名称:KeyScan()
// 函数功能:键盘扫描
// 入口参数:void
// 出口参数:void
// 备注:无
//============================================================= } while(delay--) { for(j=125;j>0;j--) {;} void KeyScan ()
{
if(key_1f==0)
{
Delay_ms(10);
if(key_1f==0)
{
while(key_1f==0);
key1_flag++;
if( key1_flag==3)
{
key1_flag=1;
}
}
}
if(key_2t==0)
{
Delay_ms(10);
if(key_2t==0)
{
while(key_2t==0);
key2_flag++;
keyfun=0;
if(key2_flag==4)
{
key2_flag=0;
}
}
}
}
///////////////////
void key_deal()
{
if(key2_flag==0) ///////jia bu fen
{
P1=led_point[0];
Delay_ms(500);
P1=0xff;
if(key_3i==0)
{ Delay_ms(10); if(key_3i==0) { while(key_3i==0); keyfun++; if(keyfun==10) {keyfun=0;} } } { Delay_ms(10); if(key_4d==0) { while(key_4d==0); keyfun--; if(keyfun==0) {keyfun=9;} } if(key_4d==0) /////jian bu fen
}
cod[0]=keyfun;
SBUF=LED_Val[cod[0]];
Delay_ms(500);
}
{
P1=led_point[1];
if(key2_flag==1) //////(加一键) Delay_ms(500); P1=0xff;
if(key_3i==0)
{ Delay_ms(10); if(key_3i==0) { while(key_3i==0); keyfun++; if(keyfun==10) {keyfun=0;} } } { Delay_ms(10); if(key_4d==0) { while(key_4d==0); keyfun--; if(keyfun==0) {keyfun=9;} } cod[1]=keyfun; SBUF=LED_Val[cod[1]]; Delay_ms(500);
}
if(key2_flag==2) ///////jia bu fen
{
P1=led_point[2];
if(key_4d==0) ////(减一键) } Delay_ms(500);
{ Delay_ms(10); if(key_3i==0) { while(key_3i==0); keyfun++; if(keyfun==10) {keyfun=0;} } } { Delay_ms(10); if(key_4d==0) { while(key_4d==0); keyfun--; if(keyfun==0) {keyfun=9;} } if(key_3i==0) if(key_4d==0) /////jian bu fen
}
cod[2]=keyfun;
SBUF=LED_Val[cod[2]];
Delay_ms(500);
}
if(key2_flag==3) ///////jia bu fen
{
P1=led_point[3];
P1=0xff; { Delay_ms(10); if(key_3i==0) { while(key_3i==0); keyfun++; if(keyfun==10) {keyfun=0;} } } { Delay_ms(10); if(key_4d==0) { while(key_4d==0); keyfun--; if(keyfun==0) {keyfun=9;} } if(key_3i==0) if(key_4d==0) /////jian bu fen
}
cod[3]=keyfun;
SBUF=LED_Val[cod[3]]; Delay_ms(500);
}
}
//=============================================================
// 函数名称:main()
// 函数功能:主函数
// 入口参数:void
// 出口参数:void
// 备注:无
//============================================================= void main()
{
SCON=0x00;(选择工作方式0)
key2_flag=0;
system_init();
while(1)
{
key_scan();
if(key1_flag==0)
{ disp1(0,0); } if(key1_flag==1) { key_deal(); TR0=0; } { TR0=1; disp1(second,minite); keyfun_flag=cod[0]*1000+cod[1]*100+cod[2]*10+cod[3]; sum=minite*100+second; while(keyfun_flag==sum) { 25 if(key1_flag==2)
m=second; n=minite; disp1(m,n); TR0=0; } }
}
}
26
单片机原理及应用课程设计
专 业: 设计题目: 电子时钟 班级:学生姓名:学号: 指导教师: 分院院长: 教研室主任:
电气工程学院
一、课程设计任务书 1.课程设计项目
电子时钟(LED显示) 2.设计内容
1)以MCS-51系列单片机为核心器件组成电子时钟控制系统; 2)利用提供单元模块构成硬件系统。 3)系统程序编制与调试; 4)电路系统的综合调试; 5)撰写课程设计论文; 6)完成课程设计论文答辩。 3.设计要求
1)以STC10F04XE单片机为控制核心,用单片机内部定时器为时钟源,设计电子时钟,使用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.设计进度(2012年6月13日至2012年6月17日)
时间 第1-2天 第3-5天 第6-8天 第9-10天
设计内容
查阅资料,方案比较、设计与论证,理论分析与计算 硬件电路调试 系统调试
书写报告、答辩
6.设计地点
实验楼323微机实验室
成绩: 指导教师:
单片机原理及 应用课程设计
班 级: 姓 名: 学 号: 指导教师: 撰写日期:
目 录
绪论 ........................................................... 1 第一章 课程设计要求与内容分析 .................................. 2
1.1课程设计要求 ............................................ 2
1.1.1课程设计项目 ...................................... 2 1.1.2设计内容 .......................................... 2 1.1.3设计要求 .......................................... 2
第二章 硬件分析与说明 .......................................... 3
2.1单片机的选择与说明 ...................................... 3 2.2 数码管显示工作原理 ..................................... 5 2.3 74LS164原理说明 ....................................... 6 第三章 控制系统的程序分析 ...................................... 8
3.1 程序分析 ............................................... 8 第四章 硬件调试问题及解决 ..................................... 11
4.1 联机说明 .............................................. 11 4.2问题及解决 ............................................. 12 课程设计总结 .................................................. 14 参考文献 ...................................................... 15 附录 .......................................................... 16
绪论
1957 年,Ventura 发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活补课缺少的工具。
现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用 LED 显示器代替指针显 示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
单片机全称为单片机微型计算机(Single Chip Microsoftcomputer)。从应用领域来看,单片机主要用来控制,所以又称为微控制器(Microcontroller Unit)或嵌入式控制器。单片机是将计算机的基本部件微型化并集成在一块芯片上的微型计算机。
我们这次的课设任务主要是要以STC10F04XE单片机为控制核心,用单片机内部定时器为时钟源,设计一个电子时钟。
第一章 课程设计要求与内容分析
1.1课程设计要求
1.1.1课程设计项目
电子时钟(LED显示)
1.1.2设计内容
1)以MCS-51系列单片机为核心器件组成电子时钟控制系统; 2)利用提供单元模块构成硬件系统。 3)系统程序编制与调试; 4)电路系统的综合调试; 5)撰写课程设计论文; 6)完成课程设计论文答辩。
1.1.3设计要求
1)以STC10F04XE单片机为控制核心,用单片机内部定时器为时钟源,设计电子时钟,使用4位数码管显示时、分,后两位数码管(分)的闪烁显示秒。
2)显示格式为:“XXXX”
3)用4个功能键操作来进行对时。可自行定义各键的功能,也可按下述方式定义K1~K4键的功能如下。
K1—功能键,每按下一次对应的LED闪烁。 K2—移位键,每按下一次向后移一位。 K3—加1键, K4—减1键。
第二章 硬件分析与说明
2.1单片机的选择与说明
以STC10F04XE单片机为控制核心,用单片机内部定时器为时钟源,设计电子时钟,使用4位数码管显示时,分,前两位显示时,后两位显示分,用数码管闪烁来显示秒。 STC10F04XE单片机介绍 :
如图为STC10F04XE单片机实物
图2-1 STC10F04XE单片机
1.STC10F04XE单片机引脚介绍:
STC10F04XE单片机引脚图:如图2-2所示
图2-2 STC10F04XE单片机引脚图 1)8位CPU·4kbytes 程序存储器(ROM) (52为8K);
2)256bytes的数据存储器(RAM) (52有384bytes的RAM);
3)32条I/O口线·111条指令,大部分为单字节指令;
21个专用寄存器;
4)2个可编程定时/计数器·5个中断源,2个优先级(52有6个); 5)一个全双工串行通信口;
6)外部数据存储器寻址空间为64kB; 7)外部程序存储器寻址空间为64kB;
8)逻辑操作位寻址功能·双列直插40PinDIP封装; 9)单一+5V电源供电;
10)CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊
功能寄存器;
11)RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
12)ROM:用以存放程序、一些原始数据和表格;
13)I/O口:四个8位并行I/O口,既可用作输入,也可用作输出; 14)T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式五个中断源的中断控制系统; 15)五个中断源的中断控制系统;
16)一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
17)片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振
荡频率为12M。 2.STC10F04XE主要性能:
1)高速:1个时钟周期/机械周期/增强型8051内核、速度比普通8051快8-12倍。
2)宽电压:5.5V-4.1V/3.7V,3.6V-2.4V/2.1V;
3)低功耗设计:空闲模式(可由任意一个中断唤醒);
4)低功耗设计:掉电模式(可由任意一个外部中断唤醒,可支持下降沿/
低电平和远程唤醒,STC10F04XE还可以通过内部专用掉电唤醒定时器唤醒)。
5)工作频率:0-35HZ,相当于普通8051:0-420HZ;
6)时钟:外部晶体或内部RC振荡器可选,在ISP下载编程用户程序时设置。
7)1/2/3/4/5/6/8/16/32/52/62K字节片内Flash程序存储器,擦写次数10万次以上;
8)1280/256字节片内RAM数据存储器。
9)芯片内EEPROM功能,擦写次数10万次以上;
10)ISP/IAP,在系统编程/在应用编程,无需编程器/仿真器。
11)2个16为定时器,兼容普通8051的定时器T0/T1;
12)1个独立波特率发生器(故无需T2做波特率发生器);
13)可编程时钟输出功能,T0在P3.4输出时钟,T1在P3.5输出时钟,BRT在P1.0输出时钟;
14)硬件看门狗(WDT);
15)全双工异步串行口(UART),兼容普通8051,可作为2个串口(串口可在P3与P1之间自由切换);
16)先进的指令集结构,兼容普通8051指令集,有硬件乘法/除法指令;
17)通用I/O口(36/40个),复位后为:准双向口/弱上拉(普通8051传统I/O口)。
2.2 数码管显示工作原理
显示:采用共阳极LED的动态显示方式,用扩展74LS164的并行输出做段选,74LS164的CLK接P3.1(TXD),数据输入端接P3.0(RXD)。P1.4~P1.7作位选。如图2-3所示。
键盘:如图2-4所示为键盘接口,采用线性键盘,P2.3,P2.2,P2.1,P2.0分别对应的K1-K4。
数码管是一种把多个 LED 显示段集成在一起的显示设备。有两种类型,一种是共阳型,一种是共阴型。本次实验采用的是共阳型,共阳型就是把多个 LED 显示段的阳极接在一起,又称为公共端。而数码管显示方法可分为静态显示和动态显示两种。本次实验采用的是动态显示。动态显示的原理是,各个数码管的相同段连接在一起,共同占用 8 位段引管线;每位数码管的阳极连在一起组成公共端。利用人眼的视觉暂留性,依次给
出各个数码管公共端加有效信号,在此同时给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速 度时,显示就会清晰显示出来。
图2-3 数码管显示原理图
图2-4 键盘显示原理图
2.3 74LS164原理说明
如图2-5为74LS164的引脚图
8位移位寄存器(串行输入,并行输出),当清除端(clear)为低电平时,输出端均为低电平。串行数据输入端(A,B)可控制数据。当A,B任意一个为低电平,则禁止新数据输入,在时钟端(clock)脉冲上升沿作用下Q0为低电平。当A,B有一个为高电平,则另一个就允许输入数据,并在clock上升沿作用下决定Q0的状态。
引出端符号
CLOCK 时钟输入端
CLEAR 同步清除输入端(低电平有效)
A,B 串行数据输入端
QA-QH 输出端
逻辑及封装图:(双列直插式封装)
图2-5 74LS164的引脚图
第三章 控制系统的程序分析
3.1 程序分析
本系统的软件系统都用到的函数主要有键盘扫描,主函数,显示函数,延时函数,计时函数,校正函数,数据分离函数等。下面对部分模块作一个简单的介绍。完整程序请参考附录1。
#include"STC10F04XE.H" ///////头文件
#define uchar unsigned char /////定义函数
#define uint unsigned int /////////定义函数
uchar keyfun_flag,flag; ///////////定义全局变量
sbit key_1f=P2^3; //////////////////定义按键
sbit key_2t=P2^2;///////////////////定义按键
sbit key_3i=P2^1; //////////////////定义按键
sbit key_4d=P2^0; /////////////////定义按键
uchar code
LED_Val[]={0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98}; ////段选0-9
uchar data num[4]; ////////////////移位寄存器
void system_init();/////////////////初始化函数
uchar data led_point[4]={0xef,0xdf,0xbf,0x7f}; ///四位位选
void Disp(uint disp_value); ///显示函数声明
void Bcd(uint bcd_value); /////数据分离函数声明
void Delay_ms(uint delay); ///延时函数声明
void Key_3iscan();////////////////按键函数声明
void Key_4dscan();///////////////按键函数声明
void Key_2tscan();///////////////按键函数声明
void Key_1fscan();///////////////按键函数声明
long int count,second,minite,hour; ////定义全局变量秒,分,时
uchar sum; ///////////////////////////显示分,时
////////////////////////////显示函数/////////////////////////////////////
void system_init()
{
TMOD=0x01;
TH0=(65536-50000)/256;////定时器初始化
TL0=(65536-50000)%256; //定时器初始化
EA=1;//中断总开关
ET0=1;//定时器T0开关
TR0=1;
}
////////// ///////////////////中断程序////////////////////////////////////
void T0_srv(void) interrupt 1 using 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
second++; //// 如果count=20的时候,归零,秒钟加1.
}
if(second==60)
{
second=0;
minite++; /// 如果秒钟=60的时候,归零,分钟加1.
}
if(minite==60)
{
minite=0;
hour++; /// 如果分钟=60的时候,归零,小时加1.
}
if(hour==24)
{
hour=0; //// 如果小时=24的时候,归零。重新计时。
}
}
//////////////////////////////////////////////////////////////////////////////////
void Disp(uint disp_value)
{
uchar i;
}
Bcd(disp_value); for(i=0;i
第四章 硬件调试问题及解决
4.1 联机说明
实验采用的是宏晶科技的STC10F04XE单片机,需要用专用的下载器进行下载操作。
1)要与单片机进行联机首先要下载驱动程序,把驱动程序安装到电脑上,如果安装完成时要求重启电脑,请重启电脑。
2)然后把该模块插到电脑的一个USB端口上,电脑上会提示新硬件,并自动开始安装新硬件。
3)硬件安装完成后,右键 我的电脑管理打开计算机管理窗口,在右侧裂变里
4)找到“设备管理器”并点击打开。选择查看刚刚安装的COM口序号,并记下(例如COM4)。
下载:
要给单片机下载程序,首先要将电脑与单片机连接好,然后使用电脑上的STC_ISP.exe下载软件。如果电脑上没有软件可以到STC公司网站下载。
打开软件后界面如4-1所示:
1)芯片选择:STC10F04XE
2)打开程序文件: 文件名.HEX
3)COM口: 硬件安装的COM口
注意事项:
STC的单片机在下载程序时需要手动上电,即再点击下载之后将电源开关键闭合。方能下载成功。
设计中采用的是STC的最小系统板外加显示设备。显示设备上带有按键。当下载成功之后可通过调试检验该程序是否符合设计的要求。
图4-1 联机说明
4.2问题及解决
在这次课设中遇到了很多问题,幸好在老师还有伙伴的团队合作下,问题终于解决了。以下为课设中遇到的只要的问题以及解决方法。 问 题1:程序下载不进去。
解决方法:波特率调节不正确,程序文件打开错误,之后经过大量实验解决问题。
问 题2:程序下载进去后计时显示的数字顺序颠倒。
解决方法:段选码交换位置,74LS164为移位寄存器,先存进去的数据最
后出来,所以将段选码顺序颠倒问题解决。
问 题3:数显出现明显闪烁,不稳定的状态。
解决方法:段选延时太长,人眼可以识别明显的闪烁感。将延时时间调小即可。
问 题4:计时功能正常使用,但是不可以调节时间。
解决方法:设置寄存器,将调节后的数据存入,之后将数据赋给显示函数进行显示。
问 题5:分钟十位和各位闪烁效果无法达到。
解决方法:在count值之后加标志位 san。没进入一次对其进行去反操作。
控制各位和十位的段选码即可实现闪烁效果。
课程设计总结
在方老师耐心的指导下,我们顺利完成了这次单片机课程设计课题中的电子时钟设计,通过这次的设计使我认识到自己对单片机方面的知识知道的太少了,对于书本上的很多知识还不能灵活运用,尤其是对程序设计语句的理解和运用,不能够充分理解每个语句的具体含义,导致编程的程序过于复杂,使得需要的存储空间增大。损耗了过多的内存资源。
本次的设计使我从中学到了一些很重要的东西,那就是如何从理论到实践的转化,怎样将我所学到的知识运用到我以后的工作中去。在大学的课堂的学习只是在给我们灌输专业知识,而我们应把所学的用到我们现实的生活中去,此次的电子时钟设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应于以后的竞争, 同时在查找资料的过程中我也学到了许多新的知识,在和同学协作过程中增进同学间的友谊,使我对团队精神的积极性和重要性有了更加充分的理解。最后,感谢方老师对我们的细心的指导,方老师一直在阴道我们,他没有直接把程序告诉我们,而是会适当的给我们编程的思路。正是由于老师的细心的辅导和他提供给我们的参考资料,使得我们的课程设计能够顺利的完成,同时在课程设计过程中,我们巩固和学习了我们的单片机知识。相信这对我以后的课程设计和毕业设计将会有很大的帮助!
总结人:
2012年6月17日
参考文献
[1]李广弟,朱月秀,王秀山编著.单片机基础. 北京:北京航空航天大学出版社,2001
[2]何立民编著.MCS-51系列单片机应用系统设计系统配置与接口技术.北京:北京航空航天大学出版社,1999
[3] 蔡美琴等编著.MCS-51 单片机系统及应用.北京:高等教育出版社.1992
附录
///======================================================== // 文件名称:电子时钟显示
// 作 者:陈秋莉
// 版 本:1.0
// 说 明:C51数据类型
// 修改记录:2012-6-17
//======================================================== #include"STC10F04XE.H"////包含头文件
#define uchar unsigned char/////无符号的字符型
#define uint unsigned int//////////定义无符号的整型
uchar keyfun_flag,flag,keyfun,m,n;
sbit key_1f=P2^3;///////定义k1键到k4键
sbit key_2t=P2^2;
sbit key_3i=P2^1;
sbit key_4d=P2^0;
uchar code
LED_Val[]={0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};// 0-9(显示从0到9)
uchar data num[4];(定义一个数组)
uchar data cod[4];
uchar data led_point[4]={0xef,0xdf,0xbf,0x7f};
uchar key1_flag,key2_flag,key3_flag,key4_flag,sum;//定义各个键的标志位 long int count,second,minite,hour;
void disp1(uint x,uint y);//////函数声明
void Bcd(uint a,uint b);
void Delay_ms(uint delay);
void system_init();
void key_scan();
void key_deal();
/=============================================================
// 函数名称:system_init()
// 函数功能:显示函数
// 入口参数:system_init()
// 出口参数:void
// 备注:无
//============================================================= void system_init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;(开中断)
ET0=1;
TR0=0;(关闭计时器)
}
////////// ///////////////////////////
void T0_srv(void) interrupt 1 using 1(中断服务子程序)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{ count=0;
second++;
}
if(second==60)
{
second=0;
minite++;
}
if(minite==60)
minite=0;
}
}
//////////////////////////////
void disp1(uint x,uint y)
{
uchar i;
}
//============================================================= // 函数名称:Bcd()
// 函数功能:数据分离函数
// 入口参数:BcdValue
// 出口参数:void
// 备注:无
//============================================================= Bcd(x,y); for(i=0;i
{
num[3]=a%10;
num[2]=a/10;
num[1]=b%10;
num[0]=b/10;
//============================================================= // 函数名称:DelayMs()
// 函数功能:延时函数
// 入口参数:Delay
// 出口参数:void
// 备注:无
//============================================================= void Delay_ms(uint delay)
{
uchar j;
}
//============================================================= // 函数名称:KeyScan()
// 函数功能:键盘扫描
// 入口参数:void
// 出口参数:void
// 备注:无
//============================================================= } while(delay--) { for(j=125;j>0;j--) {;} void KeyScan ()
{
if(key_1f==0)
{
Delay_ms(10);
if(key_1f==0)
{
while(key_1f==0);
key1_flag++;
if( key1_flag==3)
{
key1_flag=1;
}
}
}
if(key_2t==0)
{
Delay_ms(10);
if(key_2t==0)
{
while(key_2t==0);
key2_flag++;
keyfun=0;
if(key2_flag==4)
{
key2_flag=0;
}
}
}
}
///////////////////
void key_deal()
{
if(key2_flag==0) ///////jia bu fen
{
P1=led_point[0];
Delay_ms(500);
P1=0xff;
if(key_3i==0)
{ Delay_ms(10); if(key_3i==0) { while(key_3i==0); keyfun++; if(keyfun==10) {keyfun=0;} } } { Delay_ms(10); if(key_4d==0) { while(key_4d==0); keyfun--; if(keyfun==0) {keyfun=9;} } if(key_4d==0) /////jian bu fen
}
cod[0]=keyfun;
SBUF=LED_Val[cod[0]];
Delay_ms(500);
}
{
P1=led_point[1];
if(key2_flag==1) //////(加一键) Delay_ms(500); P1=0xff;
if(key_3i==0)
{ Delay_ms(10); if(key_3i==0) { while(key_3i==0); keyfun++; if(keyfun==10) {keyfun=0;} } } { Delay_ms(10); if(key_4d==0) { while(key_4d==0); keyfun--; if(keyfun==0) {keyfun=9;} } cod[1]=keyfun; SBUF=LED_Val[cod[1]]; Delay_ms(500);
}
if(key2_flag==2) ///////jia bu fen
{
P1=led_point[2];
if(key_4d==0) ////(减一键) } Delay_ms(500);
{ Delay_ms(10); if(key_3i==0) { while(key_3i==0); keyfun++; if(keyfun==10) {keyfun=0;} } } { Delay_ms(10); if(key_4d==0) { while(key_4d==0); keyfun--; if(keyfun==0) {keyfun=9;} } if(key_3i==0) if(key_4d==0) /////jian bu fen
}
cod[2]=keyfun;
SBUF=LED_Val[cod[2]];
Delay_ms(500);
}
if(key2_flag==3) ///////jia bu fen
{
P1=led_point[3];
P1=0xff; { Delay_ms(10); if(key_3i==0) { while(key_3i==0); keyfun++; if(keyfun==10) {keyfun=0;} } } { Delay_ms(10); if(key_4d==0) { while(key_4d==0); keyfun--; if(keyfun==0) {keyfun=9;} } if(key_3i==0) if(key_4d==0) /////jian bu fen
}
cod[3]=keyfun;
SBUF=LED_Val[cod[3]]; Delay_ms(500);
}
}
//=============================================================
// 函数名称:main()
// 函数功能:主函数
// 入口参数:void
// 出口参数:void
// 备注:无
//============================================================= void main()
{
SCON=0x00;(选择工作方式0)
key2_flag=0;
system_init();
while(1)
{
key_scan();
if(key1_flag==0)
{ disp1(0,0); } if(key1_flag==1) { key_deal(); TR0=0; } { TR0=1; disp1(second,minite); keyfun_flag=cod[0]*1000+cod[1]*100+cod[2]*10+cod[3]; sum=minite*100+second; while(keyfun_flag==sum) { 25 if(key1_flag==2)
m=second; n=minite; disp1(m,n); TR0=0; } }
}
}
26