《单片机原理及应用》
课程设计
《多功能电子秒表》
学生姓名 郭君君
学 号
所属学院 信息工程学院
专 业 计算机科学与技术
班 级 16-4班
指导教师 孟洪兵
前 言
中国使用单片机的历史只有短短的30年,在初始的短短五年时间里发展极
为迅速。纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表
的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据
处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开
单片机。以前没有单片机时,这些东西也能做,但是只能使用复杂的模拟电路,
然而这样做出来的产品不仅体积大,而且成本高,并且由于长期使用,元器件不
断老化,控制的精度自然也会达不到标准。在单片机产生后,我们就将控制这些
东西变为智能化了,我们只需要在单片机外围接一点简单的接口电路,核心部分
只是由人为的写入程序来完成。这样产品的体积变小了,成本也降低了,长期使
用也不会担心精度达不到了。所以,它的魔力不仅是在现在,在将来将会有更多
的人来受它、使用它。据统计,我国的单片机年容量已达3亿片,且每年以大约
20%的速度增长,但相对于世界市场我国的占有率还不到1%。特别是沿海地区的
玩具厂等生产产品多数用到单片机,并不断地辐射向内地。所以,学习单片机在
我国是有着广阔前景的。
目 录
摘 要.............................................................. 1
一 课程设计目的及意义............................................... 1
二 课程设计题目描述和要求........................................... 2
三 课程设计报告内容................................................. 2
3.1设计思路..................................................... 2
3.2系统总体方案及硬件设计....................................... 3
3.2.1系统总体方案 ........................................... 3
3.2.2程序流程图 ............................................. 4
四 子程序模块设计................................................... 5
五 keil软件仿真图 .................................................. 6
六 实物图........................................................... 6
总结................................................................ 7
参考文献............................................................ 7
附录............................................................... 11
摘 要
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部
件来使用,仅单片机方面的知识是不够的,还要根据具体的硬件结构,以及针对
具体的应用对象的软件结合,加以完善。秒表的出现,解决了传统的由于人为因
素造成的误差和不公平性。
本设计的多功能秒表系统采用AT89C51单片机为中心器件,利用其定时器/
计数器定时和记数的原理,结合显示电路、电源电路、LED数码管以及按键电路
来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计数,并
且结合相应的显示驱动程序,使数码管能够正确地显示时间,暂停和中断。我们
设计的秒表可以同时记录八个相对独立的时间,通过上翻下翻来查看这八个不同
的计时值,可谓功能强大。其中软件系统采用c语言编写程序,包括显示程序,
计数程序,中断,延时程序,按键消抖程序等,硬件系统利用keil强大的功能
来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。
关键字:单片机;多功能秒表
一 课程设计目的及意义
1.1设计目的
设计一个单片机控制的秒表系统。利用单片机的定时器/计数器定时和记数
的原理,结合显示电路、LED数码管以及按键来设计秒表。将软、硬件有机地结
合起来,使得系统能够正确地进行计时,同时具有开始/暂停,记录,上翻下翻,
清零等功能。
1.2设计要求
(1)共四位LED显示,显示时间为00:00~99.99
(2)共五个按键,分别是开始/暂停,记录,上翻,下翻,清零键;
(3)能同时记录多个相对独立的时间并分别显示;
(4)翻页按钮查看多个不同的计时值;
1.3设计意义
(1)通过本次课程设计可以使我们进一步熟悉和掌握单片机内部结构和工作原
理,了解单片机应用系统设计的基本步骤和方法。
(2)通过利用AT89C51单片机,理解单片机在自动化仪表中的作用以及掌握单
片机的编程方法。
(3)通过设计一个简单的实际应用输入及显示模拟系统,掌握单片机仿真软件
PROTEUS的使用方法。
(4)该实验通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系
统,拥有正确的计时、暂停、清零、功能,并能同时记录多个相对独立的时间利用
翻页按钮查看多个不同的计时值,该种秒表在现实生活中应用广泛,具有现实意
义。
二 课程设计题目描述和要求
题目描述:基于单片机的多功能秒表设计。
要求:开始时,显示“00.00”,第一次按下按钮后开始从00.00-99.99s计
时,显示精度为0.01s;对应有5个功能按键第1个按键开始/暂停按钮,第2
个按键记录按钮,第3个按键及时上翻按钮,第4个按钮下翻按钮,第5个按钮
清零按钮,可同时记录下八组数据。
三 课程设计报告内容
了解AT89C51芯片的的工作原理和工作方式 ,使用该芯片对LED数码管进
行显示控制,实现用单片机的端口控制数码管,显示秒,并能用按钮实现秒表起
动、停止、记录、清零功能,精确到0.01秒。
要求选用定时器的工作方式,画出使用单片机控制LED数码管显示的电路
图,并在实验箱实现其硬件电路,并编程完成软件部分,最后调试秒表起动、停
止、记录、清零功能。
3.1设计思路
该实验要求进行计时并在数码管上显示时间,用AT89C51单片机来实现,按
设计要求本实验要采用六个按键,其中复位按键在电路中,不需要再用程序控制,
在仿真时用不到,其他五个按键可以用I/O端口来控制,写上其对应的程序,延
时一秒钟可以用中断来控制,计算好中断次数.要加上防止按键抖动程序,选择
好数码管的显示方式,想减少I/O口的使用就用动态,想编程简单就是用静态。
3.2系统总体方案及硬件设计
3.2.1系统总体方案
本系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时计数的
原理,结合硬件电路如电源电路,晶振电路,复位电路和显示电路,以及一些按
键电路等来设计计数器,将软硬件有机结合起来,其中软件系统采用汇编语言编
写程序,包括显示程序,计数程序,中断,硬件系统利用keil强大的功能来实 现,简单易于观察,在仿真中就可以观察到实际的工作状态。
(1)单片机的选择
AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and
Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片
机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片
机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失
存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将
多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效
微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制
系统提供了一种灵活性高且价廉的方案。
主要特性:
与MCS-51 兼容;4K字节可编程FLASH存储器;寿命:1000写/擦循环;数据
保留时间:10年;全静态工作:0Hz-24MHz;三级程序存储器锁定;128×8位内
部RAM;32可编程I/O线;两个16位定时器/计数器;5个中断源;可编程串行
通道;低功耗的闲置和掉电模式;片内振荡器和时钟电路
(2)管脚说明
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当
P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储
器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入
口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接
收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1
口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH
编程和校验时,P1口作为低八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,
输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作
为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于
内部上拉的缘故。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL
门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输
入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
3.2.2程序流程图
四 子程序模块设计
1)、显示精度为0.01秒程序
本设计采用定时器/计数器T0的方式一,为16位位定时器/计数器,系统时
钟频率采用12MHZ,采用T0中断方式1:16位定时器/计数器,TMOD=0X01,
计算初值:
机器周期=1us=1×10-6
设需要装入T0的初始值为X,则有(216-X)×10-6=5×10-3;
X=15536;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
由此公可知每次中断时间是50ms,则只需要中断20次
显示位数计算:
P2=0xfe;P0=tab[sec/10];break;//显示秒十位
P2=0xfd;P0=tab1[sec%10];break; //显示秒个位
P2=0xfb;P0=tab[ms/10];break;//显示十位
P2=0xf7;P0=tab1[ms%10];break; //显示个位
2)、消除按键抖动程序
keynum=P1;
if(keynum!=0xff)
{
delay(10);
temp=P1;
if(keynum==temp)
3)、软件复位程序
软件复位不能清除中断标志位,实际效果与清零效果一样,软件复位后,直
接从程序开始运行,如果在软件复位 程序前加上关闭中断,就与硬件复位效果
一样了,还有软件复位内存中的临时数据是不会清空的。
static unsigned char num;
TH1=0xF8;//重入初值
TL1=0xf0;
五 keil软件仿真图
六 实物图
总结
单片机是我所学专业的主要课程之一,因此我认为单片机课程设计是十分必要而且十 分重要的。尽管刚刚拿到课程设计题目时有点迷惘,不知道如何着手,但通过上网和图书馆查阅相关资料,自己认真钻研以及虚心询问同学,终于解决了一个又一个的困难和障碍,成功完成了任务。
通过本次的单片机课程设计,不仅大大地丰富了我的理论知识,而且在实践过程中更令我学会了坚持、耐心和努力。此次单片机课程设计需要运用到许多之前所学过的知识,令我认识到自己以前学习的一些不足之处,例如对以前所学知识的理解不够深刻,掌握得不够牢固,运用不够灵活。这让我懂得了认真学习的重要性,以及要孜孜不倦地钻研所学过的知识,做得融会贯通,不能一览而过,不求甚解。在边学习边动手的过程中,我对电子时钟的构造以及原理有了进一步的了解,同时也加深和巩固了我对单片机汇编语言的认识。除此之外,由于是第一次做单片机,因此在此次课程设计的过程中,无论是电路绘制还是汇编语言编写都难免遇到了不少困难和障碍,例如汇编语言编写出错、电路元件无从入手等。在面对困难和障碍时,我庆幸自己没有退缩和逃避,而是通过各种方法,迎难而上,以坚持、耐心和努力勇敢无畏地面对困难,克服困难,解决困难。让我发现问题、分析问题、解决问题以及动手实践的能力都有了很大的提高,并了解到理论知识与实践相结合的重要意义。
从这次的课程设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高。本次课程设计尽管时间不长,但从中所获,将令我受益终生。
参考文献
[1] 程国钢. 51单片机应用开发案例手册。电子工业出版社.2011.11 [2] 张毅刚. 单片机原理与应用设计。电子工业出版社. 2009.12
[3] 郭天祥编著.51单片机C语言教程-入门、提高、开发、拓展全 攻略.电子工业出版社.2010.05
[4] 丁峻岭主编.C语言程序设计.中国铁道出版社.2009.12
[5] 公茂法.单片机接口实例集.北京:西安电子科技大学出版社,2004
附录
#include
code unsigned char
tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
code unsigned char
tab1[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
//共阴数码管0-9带小数点
sbit key1 = P1^0; //开始、暂停
sbit key2 = P1^1; //记数
sbit key3 = P1^2; //上翻
sbit key4 = P1^3; //下翻
sbit key5 = P1^4; //清零
static unsigned char ms,sec;
static unsigned char Sec[8],Ms[8];
static int i ,j;
void delay(unsigned int cnt) //延时程序
{
while(--cnt);
}
void main()
{
unsigned char key3_flag=0,key4_flag=0;
TMOD |=0x01;//定时器0 10ms in 12M crystal 用于计frtgtfrg时 TH0=0xd8;
TL0=0xf0;
ET0=1;
TR0=0;
TMOD |=0x10; //定时器1用于动态扫描
TH1=0xF8;
TL1=0xf0;
ET1=1;
TR1=1;
EA =1;
sec=0; //初始化
ms=0;
P1=0xff;
i=0;
j=0;
start:
while(1)
{ //开始、暂停
if(!key1) //判断是否按下
{
delay(10); //去抖
if(!key1)
while(!key1) //等待按键释放
{;}
TR0=!TR0;
}
//记录
if(!key2) //判断是否按下
{
delay(10); //去抖
if(!key2)
{
while(!key2) //等待按键释放
{;}
if(i==8) //8组数据记录完毕
{TR0=0; goto start;}
Sec[i]= sec; //将数据存入数组
Ms[i]= ms;
i++;
}
}
//上翻
if(!key3)
{
delay(10);
if(!key3)
{
while(!key3)
{;}
TR0=0;
key3_flag=1; //按键3标志
if(j==i)
goto start;
else
if(key4_flag)
j+=2;
key4_flag=0;
sec=Sec[j];ms=Ms[j]; //显示数组里的内容
j++;
}
}
//下翻
if(!key4)
{
delay(10);
if(!key4)
{
while(!key4)
{;}
TR0=0;
key4_flag=1; //按键4标志
if(j
goto start;
else
if(key3_flag)
j-=2;
key3_flag=0;
sec=Sec[j];ms=Ms[j]; //显示数组里的内容
j--;
}
}
//清零
if(!key5)
{
delay(10);
if(!key5)
while(!key5)
{;}
TR0=0;
ms=0;
sec=0;
for(i=0;i
{
Sec[i]=0;Ms[i]=0;
}
i=0;
}
}
}
/********************************/
/* 定时中断1 */
/********************************/
void time1_isr(void) interrupt 3 using 0//定时器1用来动态扫描 {
static unsigned char num;
TH1=0xF8;//重入初值
TL1=0xf0;
switch(num)
{
case 0: P2=0xfe;P0=tab[sec/10];break;//显示秒十位
case 1: P2=0xfd;P0=tab1[sec%10];break; //显示秒个位
case 2: P2=0xfb;P0=tab[ms/10];break;//显示十位
case 3: P2=0xf7;P0=tab1[ms%10];break; //显示个位
default:break;
}
num++;
if(num==4)
num=0;
}
/********************************/
/* 定时中断0 */
/********************************/
void tim(void) interrupt 1 using 1
{
TH0=0xd8;//重新赋值
TL0=0xf0;
ms++;//毫秒单元加1
if(ms==100)
{
ms=0;//等于100时归零
sec++;//秒加1
if(sec==60)
{
sec=0;//秒等于60时归零
}
}
}
《单片机原理及应用》
课程设计
《多功能电子秒表》
学生姓名 郭君君
学 号
所属学院 信息工程学院
专 业 计算机科学与技术
班 级 16-4班
指导教师 孟洪兵
前 言
中国使用单片机的历史只有短短的30年,在初始的短短五年时间里发展极
为迅速。纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表
的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据
处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开
单片机。以前没有单片机时,这些东西也能做,但是只能使用复杂的模拟电路,
然而这样做出来的产品不仅体积大,而且成本高,并且由于长期使用,元器件不
断老化,控制的精度自然也会达不到标准。在单片机产生后,我们就将控制这些
东西变为智能化了,我们只需要在单片机外围接一点简单的接口电路,核心部分
只是由人为的写入程序来完成。这样产品的体积变小了,成本也降低了,长期使
用也不会担心精度达不到了。所以,它的魔力不仅是在现在,在将来将会有更多
的人来受它、使用它。据统计,我国的单片机年容量已达3亿片,且每年以大约
20%的速度增长,但相对于世界市场我国的占有率还不到1%。特别是沿海地区的
玩具厂等生产产品多数用到单片机,并不断地辐射向内地。所以,学习单片机在
我国是有着广阔前景的。
目 录
摘 要.............................................................. 1
一 课程设计目的及意义............................................... 1
二 课程设计题目描述和要求........................................... 2
三 课程设计报告内容................................................. 2
3.1设计思路..................................................... 2
3.2系统总体方案及硬件设计....................................... 3
3.2.1系统总体方案 ........................................... 3
3.2.2程序流程图 ............................................. 4
四 子程序模块设计................................................... 5
五 keil软件仿真图 .................................................. 6
六 实物图........................................................... 6
总结................................................................ 7
参考文献............................................................ 7
附录............................................................... 11
摘 要
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部
件来使用,仅单片机方面的知识是不够的,还要根据具体的硬件结构,以及针对
具体的应用对象的软件结合,加以完善。秒表的出现,解决了传统的由于人为因
素造成的误差和不公平性。
本设计的多功能秒表系统采用AT89C51单片机为中心器件,利用其定时器/
计数器定时和记数的原理,结合显示电路、电源电路、LED数码管以及按键电路
来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计数,并
且结合相应的显示驱动程序,使数码管能够正确地显示时间,暂停和中断。我们
设计的秒表可以同时记录八个相对独立的时间,通过上翻下翻来查看这八个不同
的计时值,可谓功能强大。其中软件系统采用c语言编写程序,包括显示程序,
计数程序,中断,延时程序,按键消抖程序等,硬件系统利用keil强大的功能
来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。
关键字:单片机;多功能秒表
一 课程设计目的及意义
1.1设计目的
设计一个单片机控制的秒表系统。利用单片机的定时器/计数器定时和记数
的原理,结合显示电路、LED数码管以及按键来设计秒表。将软、硬件有机地结
合起来,使得系统能够正确地进行计时,同时具有开始/暂停,记录,上翻下翻,
清零等功能。
1.2设计要求
(1)共四位LED显示,显示时间为00:00~99.99
(2)共五个按键,分别是开始/暂停,记录,上翻,下翻,清零键;
(3)能同时记录多个相对独立的时间并分别显示;
(4)翻页按钮查看多个不同的计时值;
1.3设计意义
(1)通过本次课程设计可以使我们进一步熟悉和掌握单片机内部结构和工作原
理,了解单片机应用系统设计的基本步骤和方法。
(2)通过利用AT89C51单片机,理解单片机在自动化仪表中的作用以及掌握单
片机的编程方法。
(3)通过设计一个简单的实际应用输入及显示模拟系统,掌握单片机仿真软件
PROTEUS的使用方法。
(4)该实验通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系
统,拥有正确的计时、暂停、清零、功能,并能同时记录多个相对独立的时间利用
翻页按钮查看多个不同的计时值,该种秒表在现实生活中应用广泛,具有现实意
义。
二 课程设计题目描述和要求
题目描述:基于单片机的多功能秒表设计。
要求:开始时,显示“00.00”,第一次按下按钮后开始从00.00-99.99s计
时,显示精度为0.01s;对应有5个功能按键第1个按键开始/暂停按钮,第2
个按键记录按钮,第3个按键及时上翻按钮,第4个按钮下翻按钮,第5个按钮
清零按钮,可同时记录下八组数据。
三 课程设计报告内容
了解AT89C51芯片的的工作原理和工作方式 ,使用该芯片对LED数码管进
行显示控制,实现用单片机的端口控制数码管,显示秒,并能用按钮实现秒表起
动、停止、记录、清零功能,精确到0.01秒。
要求选用定时器的工作方式,画出使用单片机控制LED数码管显示的电路
图,并在实验箱实现其硬件电路,并编程完成软件部分,最后调试秒表起动、停
止、记录、清零功能。
3.1设计思路
该实验要求进行计时并在数码管上显示时间,用AT89C51单片机来实现,按
设计要求本实验要采用六个按键,其中复位按键在电路中,不需要再用程序控制,
在仿真时用不到,其他五个按键可以用I/O端口来控制,写上其对应的程序,延
时一秒钟可以用中断来控制,计算好中断次数.要加上防止按键抖动程序,选择
好数码管的显示方式,想减少I/O口的使用就用动态,想编程简单就是用静态。
3.2系统总体方案及硬件设计
3.2.1系统总体方案
本系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时计数的
原理,结合硬件电路如电源电路,晶振电路,复位电路和显示电路,以及一些按
键电路等来设计计数器,将软硬件有机结合起来,其中软件系统采用汇编语言编
写程序,包括显示程序,计数程序,中断,硬件系统利用keil强大的功能来实 现,简单易于观察,在仿真中就可以观察到实际的工作状态。
(1)单片机的选择
AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and
Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片
机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片
机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失
存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将
多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效
微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制
系统提供了一种灵活性高且价廉的方案。
主要特性:
与MCS-51 兼容;4K字节可编程FLASH存储器;寿命:1000写/擦循环;数据
保留时间:10年;全静态工作:0Hz-24MHz;三级程序存储器锁定;128×8位内
部RAM;32可编程I/O线;两个16位定时器/计数器;5个中断源;可编程串行
通道;低功耗的闲置和掉电模式;片内振荡器和时钟电路
(2)管脚说明
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当
P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储
器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入
口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接
收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1
口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH
编程和校验时,P1口作为低八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,
输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作
为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于
内部上拉的缘故。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL
门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输
入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
3.2.2程序流程图
四 子程序模块设计
1)、显示精度为0.01秒程序
本设计采用定时器/计数器T0的方式一,为16位位定时器/计数器,系统时
钟频率采用12MHZ,采用T0中断方式1:16位定时器/计数器,TMOD=0X01,
计算初值:
机器周期=1us=1×10-6
设需要装入T0的初始值为X,则有(216-X)×10-6=5×10-3;
X=15536;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
由此公可知每次中断时间是50ms,则只需要中断20次
显示位数计算:
P2=0xfe;P0=tab[sec/10];break;//显示秒十位
P2=0xfd;P0=tab1[sec%10];break; //显示秒个位
P2=0xfb;P0=tab[ms/10];break;//显示十位
P2=0xf7;P0=tab1[ms%10];break; //显示个位
2)、消除按键抖动程序
keynum=P1;
if(keynum!=0xff)
{
delay(10);
temp=P1;
if(keynum==temp)
3)、软件复位程序
软件复位不能清除中断标志位,实际效果与清零效果一样,软件复位后,直
接从程序开始运行,如果在软件复位 程序前加上关闭中断,就与硬件复位效果
一样了,还有软件复位内存中的临时数据是不会清空的。
static unsigned char num;
TH1=0xF8;//重入初值
TL1=0xf0;
五 keil软件仿真图
六 实物图
总结
单片机是我所学专业的主要课程之一,因此我认为单片机课程设计是十分必要而且十 分重要的。尽管刚刚拿到课程设计题目时有点迷惘,不知道如何着手,但通过上网和图书馆查阅相关资料,自己认真钻研以及虚心询问同学,终于解决了一个又一个的困难和障碍,成功完成了任务。
通过本次的单片机课程设计,不仅大大地丰富了我的理论知识,而且在实践过程中更令我学会了坚持、耐心和努力。此次单片机课程设计需要运用到许多之前所学过的知识,令我认识到自己以前学习的一些不足之处,例如对以前所学知识的理解不够深刻,掌握得不够牢固,运用不够灵活。这让我懂得了认真学习的重要性,以及要孜孜不倦地钻研所学过的知识,做得融会贯通,不能一览而过,不求甚解。在边学习边动手的过程中,我对电子时钟的构造以及原理有了进一步的了解,同时也加深和巩固了我对单片机汇编语言的认识。除此之外,由于是第一次做单片机,因此在此次课程设计的过程中,无论是电路绘制还是汇编语言编写都难免遇到了不少困难和障碍,例如汇编语言编写出错、电路元件无从入手等。在面对困难和障碍时,我庆幸自己没有退缩和逃避,而是通过各种方法,迎难而上,以坚持、耐心和努力勇敢无畏地面对困难,克服困难,解决困难。让我发现问题、分析问题、解决问题以及动手实践的能力都有了很大的提高,并了解到理论知识与实践相结合的重要意义。
从这次的课程设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高。本次课程设计尽管时间不长,但从中所获,将令我受益终生。
参考文献
[1] 程国钢. 51单片机应用开发案例手册。电子工业出版社.2011.11 [2] 张毅刚. 单片机原理与应用设计。电子工业出版社. 2009.12
[3] 郭天祥编著.51单片机C语言教程-入门、提高、开发、拓展全 攻略.电子工业出版社.2010.05
[4] 丁峻岭主编.C语言程序设计.中国铁道出版社.2009.12
[5] 公茂法.单片机接口实例集.北京:西安电子科技大学出版社,2004
附录
#include
code unsigned char
tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
code unsigned char
tab1[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
//共阴数码管0-9带小数点
sbit key1 = P1^0; //开始、暂停
sbit key2 = P1^1; //记数
sbit key3 = P1^2; //上翻
sbit key4 = P1^3; //下翻
sbit key5 = P1^4; //清零
static unsigned char ms,sec;
static unsigned char Sec[8],Ms[8];
static int i ,j;
void delay(unsigned int cnt) //延时程序
{
while(--cnt);
}
void main()
{
unsigned char key3_flag=0,key4_flag=0;
TMOD |=0x01;//定时器0 10ms in 12M crystal 用于计frtgtfrg时 TH0=0xd8;
TL0=0xf0;
ET0=1;
TR0=0;
TMOD |=0x10; //定时器1用于动态扫描
TH1=0xF8;
TL1=0xf0;
ET1=1;
TR1=1;
EA =1;
sec=0; //初始化
ms=0;
P1=0xff;
i=0;
j=0;
start:
while(1)
{ //开始、暂停
if(!key1) //判断是否按下
{
delay(10); //去抖
if(!key1)
while(!key1) //等待按键释放
{;}
TR0=!TR0;
}
//记录
if(!key2) //判断是否按下
{
delay(10); //去抖
if(!key2)
{
while(!key2) //等待按键释放
{;}
if(i==8) //8组数据记录完毕
{TR0=0; goto start;}
Sec[i]= sec; //将数据存入数组
Ms[i]= ms;
i++;
}
}
//上翻
if(!key3)
{
delay(10);
if(!key3)
{
while(!key3)
{;}
TR0=0;
key3_flag=1; //按键3标志
if(j==i)
goto start;
else
if(key4_flag)
j+=2;
key4_flag=0;
sec=Sec[j];ms=Ms[j]; //显示数组里的内容
j++;
}
}
//下翻
if(!key4)
{
delay(10);
if(!key4)
{
while(!key4)
{;}
TR0=0;
key4_flag=1; //按键4标志
if(j
goto start;
else
if(key3_flag)
j-=2;
key3_flag=0;
sec=Sec[j];ms=Ms[j]; //显示数组里的内容
j--;
}
}
//清零
if(!key5)
{
delay(10);
if(!key5)
while(!key5)
{;}
TR0=0;
ms=0;
sec=0;
for(i=0;i
{
Sec[i]=0;Ms[i]=0;
}
i=0;
}
}
}
/********************************/
/* 定时中断1 */
/********************************/
void time1_isr(void) interrupt 3 using 0//定时器1用来动态扫描 {
static unsigned char num;
TH1=0xF8;//重入初值
TL1=0xf0;
switch(num)
{
case 0: P2=0xfe;P0=tab[sec/10];break;//显示秒十位
case 1: P2=0xfd;P0=tab1[sec%10];break; //显示秒个位
case 2: P2=0xfb;P0=tab[ms/10];break;//显示十位
case 3: P2=0xf7;P0=tab1[ms%10];break; //显示个位
default:break;
}
num++;
if(num==4)
num=0;
}
/********************************/
/* 定时中断0 */
/********************************/
void tim(void) interrupt 1 using 1
{
TH0=0xd8;//重新赋值
TL0=0xf0;
ms++;//毫秒单元加1
if(ms==100)
{
ms=0;//等于100时归零
sec++;//秒加1
if(sec==60)
{
sec=0;//秒等于60时归零
}
}
}