电子秒表课程设计Word下载.docx
《电子秒表课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《电子秒表课程设计Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
单片机电子跑表STC89C52中断数码管显示键盘扫描
电子跑表
1.设计要求
利用单片机作为控制核心,设计出电子跑表,具有以下功能:
(1)具有跑表功能;
(2)跑表显示范围0000.00秒-9999.99秒;
(3)当按下启动按钮跑表开始计时,按下停止按钮停止计时,当按下复位按钮跑表归零。
2.方案设计
数码管显示是本设计主要的部分。
根据需要,可采用两种方案实现,即静态显示法和动态显示法。
数码管显示方案一:
静态显示。
所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。
该方式每一位都需要一个8位输出口控制。
静态显示时较小的电流能获得较高的亮度,且字符不闪烁。
但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。
数码管显示方案二:
动态显示。
所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。
利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。
显示器的亮度既与导通电流有关,也与点亮时间与间隔时间的比例有关。
调整参数可以实现较高稳定度的显示。
动态显示节省了I/O口,降低了功耗。
由于静态现实法需要数据锁存器等硬件,接口复杂一些,又考虑到时钟显示只有6位,且系统没有其他的处理任务;
并且从节省I/O口和降低能耗出发,所以决定采用动态扫描法实现LED的显示,即采用方案二。
3.硬件电路设计
此电路组成包括STC89C52单片机最小系统电路,其中包括晶振电路、复位电路、电源电路;
74LS138译码器电路;
CH340USB下载电路;
8段数码管显示电路;
74LS573缓存电路。
3.189C52最小系统电路
图189C52单片机
复位电路:
上拉电阻电路:
晶振电路:
3.238译码器电路
3.38段数码管显示电路及缓存电路
3.4电源模块
3.5CH340下载电路
4.软件设计
/*
*********************************************************************
***项目名称:
电子秒表
***描述:
实现开始,暂停,重置
***日期:
2016/12/14
*/
#include"
reg51.h"
#include<
intrins.h>
#defineGPIO_LEDP1//LED显示输出端口
#definekey_down0//按键按下
#definestart0
#definestop1
#defineflush2
sbitkey=P0^3;
//按键
sbitLS138A=P0^0;
//74LS138的输入端
sbitLS138B=P0^1;
sbitLS138C=P0^2;
intkey_times=2;
longintLedNumVal=0;
//计数进入中断的次数
/**********变量区***************/
intcmd;
unsignedcharLED_Num[6];
unsignedcharcodeDIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//LED显示段码
/*****************函数声明******************************/
voiddisplay(void);
intkey_scan(void);
voidTimer0Init(void);
voidTime0_interrupt(void);
voiddelay1ms(unsignedinti);
/********************************************************************
**主函数:
main()
**功能:
时钟初始化,变量初始化,按键处理及显示
********************************************************************/
intmain(void)
{
Timer0Init();
while
(1)
{
cmd=key_scan();
LED_Num[0]=DIG_CODE[LedNumVal%10];
LED_Num[1]=DIG_CODE[LedNumVal%100/10];
LED_Num[2]=DIG_CODE[LedNumVal%1000/100]|0x80;
LED_Num[3]=DIG_CODE[LedNumVal%10000/1000];
LED_Num[4]=DIG_CODE[LedNumVal%100000/10000];
LED_Num[5]=DIG_CODE[LedNumVal%1000000/100000];
display();
}
return0;
}
voidTimer0Init(void)//10毫秒@11.0592MHz
IE=0X8A;
//设置中断
TMOD&
=0xF0;
//设置定时器模式
TMOD|=0x01;
TL0=0x00;
//设置定时初值
TH0=0xDC;
TF0=0;
//清除TF0标志
TR0=1;
//定时器0开始计时
key=1;
GPIO_LED=0x00;
/**********************************************
**按键扫描函数
**return:
0开始
**1暂停
**2重置
*********************************************/
intkey_scan(void)
inti=0;
if(key==key_down)
{
delay1ms(20);
while((i<
50)&
&
(key==key_down))//检测按键是否松开
delay1ms(10);
i++;
}
key_times++;
return(key_times%3);
/********************************************
***显示秒表
***0:
开始1:
暂停2:
重置
**********************************************/
voiddisplay(void)
inti,j=0;
switch(cmd)
casestart:
for(i=0;
i<
6;
i++)
switch(i)
case0:
LS138A=1;
LS138B=1;
LS138C=1;
break;
case1:
LS138A=0;
case2:
LS138B=0;
case3:
case4:
LS138C=0;
case5:
default:
GPIO_LED=LED_Num[i];
j=10;
while(j--);
//消隐
}break;
casestop:
//禁止中断
EA=0;
case1:
case3:
while(j--);
GPIO_LED=0x00;
//消隐
caseflush:
//重置,清零
EA=1;
LedNumVal=0;
j=10;
//消隐
}break;
default:
**外部中断10
**定时器0的中断号1
**外部中断22
**定时器1的中断号3
**串口中断4
voidTime0_interrupt(void)interrupt1
//设置定时初值
LedNumVal++;
/*************************
**延时1ms*i
*************************/
voiddelay1ms(unsignedinti)
intm,n;
for(i;
i>
0;
i--)
//以下延时1ms
_nop_();
for(m=2;
m>
0;
m--)
for(n=199;
n>
n--);
}
5.实际操作效果
操作一:
上电复位
运行过程中:
可以看到后两位数字有些不清晰,这是由于采用动态扫描的方式显示,并且小数点后的是毫秒级的,频率较快。
操作二:
暂停可以看到暂停后,小数点后两位不在闪烁。
操作三:
清零,图片同操作一。
6.总结
我在这次电子跑表的课程设计中受益匪浅。
通过对自己这一学期来所学知识的回顾,并充分发挥对所学知识的理解和对课程设计的思考及书面表达能力,最终完成了。
这对自己今后进一步深化学习,积累了一定宝贵的经验。
撰写论文的过程也是专业知识的学习过程,同时强化了自己的动手能力,对PCB软件,作图软件等软件更加熟练。
对程序和硬件电路的调试也有了很大的提高。
它使我运用已有的专业基础知识,对其进行设计,分析和解决一个理论问题或实际问题,把知识转化为能力的实际训练。
让我们知道了理论和实际的距离,也知道了理论和实际相结合的重要性。
课程设计成绩评定表
评定项目
内容
满分
评分
总分
学习态度
学习认真,态度端正,遵守纪律。
10
答疑和设计情况
认真查阅资料,勤学好问,提出的问题有一定的深度,分析解决问题的能力较强。
40
说明书质量
设计方案正确、表达清楚;
设计思路、实验(论证)方法科学合理;
达到课程设计任务书规定的要求;
图、表、文字表达准确规范,上交及时。
回答问题情况
回答问题准确,基本概念清楚,有理有据,有一定深度。
总成绩
采用五级分制:
优、良、中、及格、不及格
指导教师评语:
签名:
年月日