电子秒表课程设计.docx
- 文档编号:6991358
- 上传时间:2023-01-15
- 格式:DOCX
- 页数:14
- 大小:696.80KB
电子秒表课程设计.docx
《电子秒表课程设计.docx》由会员分享,可在线阅读,更多相关《电子秒表课程设计.docx(14页珍藏版)》请在冰豆网上搜索。
电子秒表课程设计
郑州轻工业学院
课程设计说明书
题目:
单片机原理及应用课程设计
姓名:
熊金齐
院(系):
电子信息工程学院
专业班级:
电子信息工程13-01
学号:
541301030141
指导教师:
张勇
成绩:
时间:
2016年12月12日至2015年12月16日
摘要
单片机即单片微型计算机。
由RAM,ROM,CPU构成定时、计数和多种接口于一体的微控制器。
它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。
而51系列单片机是各单片机最典型和最有代表性的一种。
本设计通过对它的学习、应用,以STC89C52芯片为核心,辅以必要的电路,设计了一个简易的电子跑表,具有电子时钟和秒表的功能。
它由5V直流电源供电,通过数码管能够准确显示时间,充当秒表计时,按键即可对它进行控制,从而达到学习、设计、开发软、硬件的能力。
关键词:
单片机电子跑表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
#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);
if(key==key_down)
{
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;LS138B=1;LS138C=1;break;
case2:
LS138A=1;LS138B=0;LS138C=1;break;
case3:
LS138A=0;LS138B=0;LS138C=1;break;
case4:
LS138A=1;LS138B=1;LS138C=0;break;
case5:
LS138A=0;LS138B=1;LS138C=0;break;
default:
break;
}
GPIO_LED=LED_Num[i];
j=10;while(j--);
GPIO_LED=0x00;//消隐
}
}break;
casestop:
//禁止中断
{
EA=0;
for(i=0;i<6;i++)
{
switch(i)
{
case0:
LS138A=1;LS138B=1;LS138C=1;break;
case1:
LS138A=0;LS138B=1;LS138C=1;break;
case2:
LS138A=1;LS138B=0;LS138C=1;break;
case3:
LS138A=0;LS138B=0;LS138C=1;break;
case4:
LS138A=1;LS138B=1;LS138C=0;break;
case5:
LS138A=0;LS138B=1;LS138C=0;break;
default:
break;
}
GPIO_LED=LED_Num[i];
j=10;while(j--);GPIO_LED=0x00;//消隐
}
}break;
caseflush:
//重置,清零
{
EA=1;LedNumVal=0;
for(i=0;i<6;i++)
{
switch(i)
{
case0:
LS138A=1;LS138B=1;LS138C=1;break;
case1:
LS138A=0;LS138B=1;LS138C=1;break;
case2:
LS138A=1;LS138B=0;LS138C=1;break;
case3:
LS138A=0;LS138B=0;LS138C=1;break;
case4:
LS138A=1;LS138B=1;LS138C=0;break;
case5:
LS138A=0;LS138B=1;LS138C=0;break;
default:
break;
}
GPIO_LED=LED_Num[i];
j=10;while(j--);
GPIO_LED=0x00;//消隐
}
}break;
default:
break;
}
}
/*
**外部中断10
**定时器0的中断号1
**外部中断22
**定时器1的中断号3
**串口中断4
*/
voidTime0_interrupt(void)interrupt1
{
TL0=0x00;//设置定时初值
TH0=0xDC;//设置定时初值
LedNumVal++;
}
/*************************
**延时1ms*i
*************************/
voiddelay1ms(unsignedinti)
{
intm,n;
for(i;i>0;i--)
{
//以下延时1ms
_nop_();
for(m=2;m>0;m--)
for(n=199;n>0;n--);
}
}
5.实际操作效果
操作一:
上电复位
运行过程中:
可以看到后两位数字有些不清晰,这是由于采用动态扫描的方式显示,并且小数点后的是毫秒级的,频率较快。
操作二:
暂停可以看到暂停后,小数点后两位不在闪烁。
操作三:
清零,图片同操作一。
6.总结
我在这次电子跑表的课程设计中受益匪浅。
通过对自己这一学期来所学知识的回顾,并充分发挥对所学知识的理解和对课程设计的思考及书面表达能力,最终完成了。
这对自己今后进一步深化学习,积累了一定宝贵的经验。
撰写论文的过程也是专业知识的学习过程,同时强化了自己的动手能力,对PCB软件,作图软件等软件更加熟练。
对程序和硬件电路的调试也有了很大的提高。
它使我运用已有的专业基础知识,对其进行设计,分析和解决一个理论问题或实际问题,把知识转化为能力的实际训练。
让我们知道了理论和实际的距离,也知道了理论和实际相结合的重要性。
课程设计成绩评定表
评定项目
内容
满分
评分
总分
学习态度
学习认真,态度端正,遵守纪律。
10
答疑和设计情况
认真查阅资料,勤学好问,提出的问题有一定的深度,分析解决问题的能力较强。
40
说明书质量
设计方案正确、表达清楚;设计思路、实验(论证)方法科学合理;达到课程设计任务书规定的要求;图、表、文字表达准确规范,上交及时。
40
回答问题情况
回答问题准确,基本概念清楚,有理有据,有一定深度。
10
总成绩
采用五级分制:
优、良、中、及格、不及格
指导教师评语:
签名:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 秒表 课程设计