多通道百分秒表设计

更新时间:2024-06-10 15:34:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《单片机原理及应用》

课程设计报告

课题名称 学院 专业 班级 学号 姓名 时间 指导教师

多通道百分秒表设计

2016年月

目录

一、内容提要 ..................................... 5

1.设计任务 ........................................... 5 2设计要求: .......................................... 5 3设计提示: .......................................... 5

二、步骤及方案 ................................... 5 三、硬件设计 ..................................... 6

1、单片机的选择与外围电路 ............................. 6 2.单片机与显示模块电路 ................................ 7 3.键盘电路 ........................................... 8 4.显示LED电路 ....................................... 9 5.外围小灯电路 ...................................... 10 6.整体电路protuus仿真图 ............................. 11

四、软件设计 .................................... 12

1.系统主函数程序 .................................... 12 2.初始化函数程序 .................................... 12 3、显示函数程序 ..................................... 13 4.开关函数程序 ...................................... 14 5.中断函数程序 ...................................... 15

五、调试 ........................................ 16 六、课程设计心得体会 ............................ 17 参考文献 ........................................ 18

2

附录:源程序代码 ................................ 18

3

基于单片机的多通道百分秒表设计

摘要:

近年来随着科技的飞速发展,单片机的运用正在不断的走向深入,同时带动传统控制检测日新月异的更新。本秒表设计采用8051单片机为中心器件,利用其定时/计数器定时、计数的原理,结合显示电路、按键控制电路等外围电路来完成。将软、硬件有机的结合起来,使得系统能够实现4位LED显示,显示时间为00.00到99.99秒,每秒自动加一,可以用开关控制开始、停止、复位,并且能拥有多通道(两个或以上)分别计时功能。其软件系统采用C语言编写程序,包括:显示程序、中断初始化程序、中断服务程序、显示程序及开关控制程序。通过KEIL4与PROTEUS进行联合调试,使得硬件与软件有机的结合起来,达到了预期目的。

关键词:单片机,秒表,多通道

Abstract:

In recent years along with the rapid development of science and technology, the single-chip microcomputer application is constantly deepening, led the traditional control test at the same time change rapidly update. The stopwatch design using 8051 single chip as a core device, using the timer / counter timing, counting principles, combined with display circuit, control circuit and other peripheral circuit to complete. The soft, hardware of organic combination, so that the system can achieve 4 LED display, display time is 0 to 99.99 seconds, plus a second automatic, can use the switch to control start, stop, reset, and can have multiple channels ( two or more ) are functions of time. The system software using C language programming, including: display program, interrupt initialization, interrupt service routines, display and switch control procedures. Through the KEIL4 and PROTEUS joint debugging, which makes hardware and software combined with organic, to achieve the expected goal.

Key words: Single Chip Microcomputer; Stopwatch; Multi Channel

4

一、内容提要

1.设计任务

基于AT89C51设计一个5位LED数码作为“多通道百分秒表”。

2设计要求:

(1)、显示时间为00.00—99.99秒,每百分之秒自动加1。 (2)、设计一个有三个按键的键盘。K1:“开始”→“停止”→“复位”→“开始”??。K2:显示通道数“加一”。K3:显示通道数“减一”。

(3)、@ 设计每到一秒钟有声音或LED指示提醒功能,可通过按钮打开及关闭该提醒功能。

(4)、☆其他功能。D2、D3小灯按照01、02通道分别计时时间到10秒时熄灭。(定时:到某一时间有LED提醒功能)。

3设计提示:

(1)、用6位个7段LED数码管作为显示设备,最高位显示通道号,低4位显示时间。

(2)、可采用定时器,定时时间10ms。 (3)、参考Protuse仿真效果图:

二、步骤及方案

根据系统的设计要求,选择AT89C51单片机作为系统的核心来完成定时、计数的功能,用74HC245来完成数据的锁存和对LED的刷新控制,用外围开关电路实现对单片机的外围输入,用小灯来实现对于计时等功能的提示。

5

该系统的设计总体思路如下:开关K1把开始信号传输给AT89C51单片机,单片机开始计数,然后在P2口输出信号,通过74HC245后传输给LED数码管控制数码管位数是否启用,然后P0口传输相对应的信号控制启用的数码管位输出的具体信号。同理,其余开关的信号分别控制了AT89C51的停止、复位和通到的加减。外接的小灯接到P1.5、P1.6、P1.7口,分别作用于计时提示。

综上,可知7SEG-MPSX6-CC的最高2位用来显示通道,低四位用来显示时间(00.00到99.99秒),按照功能要求,确定由四个部分组成:主控制器,开关控制、小灯显示、LED显示。总体设计电路结构图如图所示:

键盘输入 单片机AT89C51 LED显示 小灯显示 通道号 秒数 图02.01总体设计电路结构图

三、硬件设计

1、单片机的选择与外围电路

AT89C51作为秒表计时系统的核心器件。该器件是INTEL公司生产的MCS-51系列单片机的基础产品,采用了可靠的CMOS工艺制造技术,具有高性能的8位单片机,属于标准的MCS-51的CMOS产品。不仅结合了HMOS的高速和高密度技术及HMOS的低功耗特征,而且继承和扩展了MCS-48单片机的体系结构和指令系统。单片机小系统的电路图如图所示。

6

图03.01 单片机的选择与外围电路

2.单片机与显示模块电路

由74HC245芯片和电阻,导线构成,控制锁存单片机输出信号。 74HC245元件的封装:

(1)第1脚DIR,为输入输出端口转换用,DIR=“1”高电平时信号由“A”端输入“B”端输出,DIR=“0”低电平时信号由“B”端输入“A”端输出。

7

(2)第2~9脚“A”信号输入输出端,A1=B1、、、、、、A8=B8,A1与B1是一组,如果DIR=“1”OE=“0”则A1输入B1输出,其它类同。如果DIR=“0”OE=“0”则B1输入A1输出,其它类同。

(3)第11~18脚“B”信号输入输出端,功能与“A”端一样,不在描述。 (4)第19脚OE,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用。

(5)第10脚GND,电源地。 (6)第20脚VCC,电源正极。

图03.02 74HC245结构图

3.键盘电路

由电源、导线、电阻、开关(K1、K2、K3、K4、K5五个开关)构成,K1连接P1.0口控制开始;K2连接P1.1口控制暂停;K3连接P1.2口控制复位清零;K4连接P1.3口控制通道减1;K5连接P1.4口控制通道加1。如图:

8

图03.03键盘电路

4.显示LED电路

由7SEG-MPSX6-CC共阴LED8段位显示器构成:

结构图为:

a b V c d 1fe19 8 7 6

g d23 4 dp b c .e f cc g h

图03.04 显示器结构图

9

表03.05显示器真值表

共阴极接法八段状态 显示字符 sp 0 1 2 3 4 5 6 7 8 9 . 0 0 0 0 0 0 0 0 0 0 1 g 0 0 1 1 1 1 1 0 1 1 0 f 1 0 0 0 1 1 1 0 1 1 0 e 1 0 1 0 0 0 1 0 1 0 0 d 1 0 1 1 0 1 1 0 1 1 0 c 1 1 0 1 1 1 1 1 1 1 0 b 1 1 1 1 1 0 0 1 1 1 0 a 1 0 1 1 0 1 1 1 1 1 0 (共阴) 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH 80H 断码 综上则可知:

显示 断码 0 3FH 06H 1 2 5BH 3 4FH 66H 4 5 6DH 6 7DH 07H 7 8 7FH 9 6FH 80H . 5.外围小灯电路

采用了3个LED小D1、D2、D3,当按钮按下后,3个LED小灯接入电路,接口为:D1端接到P1.5口、D2端接到P1.6口、D3端接到P1.7口,其中D1小灯按照当前通道隔一秒亮一次,D2、D3小灯按照01、02通道分别计时时间到10秒时熄灭。如图。

10

图03.06外围小灯电路

6.整体电路protuus仿真图

图03.07整体电路protuus仿真图

11

四、软件设计

系统程序包括:主函数程序、显示函数程序、中断函数程序、开关函数程序、系统初始化函数程序,通道设置函数程序。

主程序结构:

1.系统主函数程序

主程序程序中调用了两个子函数程序,分别是中断初始化函数程序及显示函数程序。

开始 系统初始化函数 显示函数 图04.01系统主函数程序图

2.初始化函数程序

开始 设定定时器状态 开中断 对定时器赋初值 结束 图04.02初始化函数程序图

12

初始化函数程序包括对定时器/计数器的工作方式设定、初值设定。

3、显示函数程序

开始 数码显示 判断通道标识a为1还是2 通道2数据 通道1数据 结束

图04.03显示函数程序图

显示函数程序通过识别两个通道的刷新标志位flag_1和flag_2来实现双通道显示转换。

13

4.开关函数程序

开始开始 2判断通道标志位a为几?1Flag_2=1是判断P10是否为低电平?判断P10是否为低电平?是Flag_1=1否是Flag_2=0判断P11是否为低电平?否判断P11是否为低电平?是Flag_1=0否通道2数据清零是判断P12是否为低电平?否判断P12是否为低电平?是通道1数据清零否否结束 结束

图04.04 开关函数程序图

开关函数程序主要通过P1.0、P1.1、P1.2三个引脚来操作秒表的开始、停止、清零。

14

5.中断函数程序

开始 开始判断P13是否为低电平?是通道标志位a=1否判断P14是否为低电平?是通道标志位a=2否开关程序开关程序通道刷新标识位flag1为几?10通道刷新标识位flag1为几?01通道刷新标识位flag2为几?1通道1和通道2都计时0通道1和通道2都停止计时通道1和通道2都停止计时通道2计时通道1停止计时数字显示结束结束

图04.05中断函数程

中断函数程序通过P1.3和P1.4控制用户选择的通道数,然后根据开关函数来分别对两个通道的刷新标志位flag_1和flag_2赋值,进而实现通道的互相切换。

15

五、调试

把程序从KEIL中生成HEX文件,导入单片机中,测试是否实现题目要求的各个功能。

1.由于开始计算中断初始时间不准确,故重新设置初始化时间; 2.经过调试,延时时间设为1000效果最佳; 3.由于3通道数要求过于复杂,故采用双通道设计;

4.由于难以实现一个按键具备:开始、停止及清零功能,所以只能采用三个按键分别控制。

经过耐心的调试,最终实现设计要求。PROTEUS仿真图如图:

图05.01 一通道图

16

图05.02 二通道图

六、课程设计心得体会

回顾起此次课程设计,感觉受益匪浅,从拿到题目到完成整个编程,从理论实践,学到很多很多的课堂理论中没学到过的东西,不仅对键盘的识别技术这章节的知识点有了深刻的认识,而且对这学期开设的单片机这门课程有了更全面的了解,尤其是在学习使用proteus软件片编程和仿真时收获良多。通过这次单片机课程设计,还使我懂得了实践的重要性。同时在程序调试的过程中提高己的发现问题、解决问题、实际动手和独立思考的能力。

使用软件和编写程序时一定要注意每一个细节,一个分号的遗漏也会造成错误。制作前一定要做好规划设计,反复论证和计算,防止考虑不到的地方使得做好的东西需要翻工。如果制作或使用中发现问题,既极大地打击积极性和自信心,还会极大地消耗时间,拖延项目的进度。制作硬件也一定要耐心细致,极小的失误都会造成短路等问题而直接造成大错。在设计中,如果没有考虑到哪怕何一个

17

细节,都有可能让没考虑到的情况造成失误,使各个子程序的时序和运行之间可能会互相干涉和冲突。

此外遇到问题有时候凭借一个人或一组人的智慧是不好解决的。我们周围有许多很强的同学,还有许多经验丰富,实力雄厚的学长,通过请教和讨论可以产生一种茅塞顿开的效果。事情总是越说越明白,而且好多非常有新意和实用价值的想法也是在大家的讨论中得到和发展出来的。

参考文献

[1] 刘娟,梁卫文等编著.单片机C语言与PROTEUS仿真技能实训【M】.北京:中国电力出版社,2010.

[2] 彭伟编著.单片机C语言程序设计试训100例—基于8051+Proteus仿真【M】.北京:电子工业出版社,2009.

[3] 吴亦锋、陈德为.单片机原理与接口技术.北京:电子工业出版社,2010.

[4] 边清远、王志强.MCS-51单片机运用开发实用子程序.北京:人民邮电出版社,2005. [5] 姚国林.单片机原理与应用技术.北京:清华大学出版社,2009.

附录:源程序代码

#include \

#define THC0 0xd8 #define TLC0 0xf0 void StarandStop();

unsigned char code Duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0-9段数码管,共阴极 unsigned char DataBuffer[4]={0,0,0,0},DataBuffer_1[4]={0,0,0,0},DataBuffer_2[4]={0,0,0,0};

//四个数码管显示数值,数组变量定义 unsigned int a=1;

unsigned int hdrSec_1=0,miao_1=0,hdrSec_2=0,miao_2=0; bit flag_1=0,flag_2=0;//三个通道数码管刷新标志位 sbit P10=P1^0; sbit P11=P1^1; sbit P12=P1^2;

18

sbit P13=P1^3; sbit P14=P1^4; sbit P15=P1^5; sbit P16=P1^6; sbit P17=P1^7; sbit P07=P0^7;

/*************************程序初始化**************************************/ void timer1_init() { TMOD=0x11;//初始化两个定时器 TR0=1; //启动定时器0 ET0=1; //允许定时器中断 EA=1; //总中断打开 TH0=THC0; TL0=TLC0; }

/*********显示程序****************************/ void display() { unsigned char b; int x; while(1) { if(miao_1==10)P16=0; if(miao_2==10)P17=0; if(a==1) { if(miao_1%2==1)P15=0; else if(miao_1%2==0) P15=1; DataBuffer[0]=DataBuffer_1[0]; DataBuffer[1]=DataBuffer_1[1]; DataBuffer[2]=DataBuffer_1[2]; DataBuffer[3]=DataBuffer_1[3]; } if(a==2) { if(miao_2%2==1)P15=0; else if(miao_2%2==0)P15=1; DataBuffer[0]=DataBuffer_2[0]; DataBuffer[1]=DataBuffer_2[1]; DataBuffer[2]=DataBuffer_2[2]; DataBuffer[3]=DataBuffer_2[3]; } for(b=0;b<6;b++)

19

{ P2=0xFF; switch(b) { case 0:P2 = 0xFE;P0 = 0x3F;break; case 1:P2 = 0xFD;P0 = Duan[a];break; case 2:P2 = 0xFB;P0 = Duan[DataBuffer[0]];break; case 3:P2 = 0xF7;P0 = Duan[DataBuffer[1]];P07=0x80;break; case 4:P2 = 0xEF;P0 = Duan[DataBuffer[2]];break; case 5:P2 = 0xDF;P0 = Duan[DataBuffer[3]];break; } for(x=1000;x>1;x--); } } }

/************************中断程序***********************************/ void timer0() interrupt 1 { TMOD=0x11;//初始化两个定时器 TH0=THC0; TL0=TLC0;

/*********************通道设置*****************************************/ if(P13==0) { a=1; } if(P14==0) { a=2; } StarandStop();

if(flag_1==1&&flag_2==1) { hdrSec_1++; hdrSec_2++; if(hdrSec_2>=99) { hdrSec_2=0; miao_2++; } if(miao_2>=99) miao_2=0; DataBuffer_2[0]=miao_20/10; //前两位显示秒表 DataBuffer_2[1]=miao_2;

20

DataBuffer_2[2]=hdrSec_20/10; //后两位显示百分秒表 DataBuffer_2[3]=hdrSec_2; if(hdrSec_1>=99) { hdrSec_1=0; miao_1++; } if(miao_1>=99) miao_1=0; DataBuffer_1[0]=miao_10/10; //前两位显示秒表 DataBuffer_1[1]=miao_1; DataBuffer_1[2]=hdrSec_10/10; //后两位显示百分秒表 DataBuffer_1[3]=hdrSec_1; }

if(flag_1==1&&flag_2==0) { hdrSec_1++; if(hdrSec_1>=99) { hdrSec_1=0; miao_1++; } if(miao_1>=99) miao_1=0; DataBuffer_1[0]=miao_10/10; //前两位显示秒表 DataBuffer_1[1]=miao_1; DataBuffer_1[2]=hdrSec_10/10; //后两位显示百分秒表 DataBuffer_1[3]=hdrSec_1; DataBuffer_2[0]=miao_20/10; //前两位显示秒表 DataBuffer_2[1]=miao_2; DataBuffer_2[2]=hdrSec_20/10; //后两位显示百分秒表 DataBuffer_2[3]=hdrSec_2; } if(flag_1==0&&flag_2==1) { hdrSec_2++; if(hdrSec_2>=99) { hdrSec_2=0; miao_2++; } if(miao_2>=99) miao_2=0; DataBuffer_2[0]=miao_20/10; //前两位显示秒表

21

DataBuffer_2[1]=miao_2; DataBuffer_2[2]=hdrSec_20/10; //后两位显示百分秒表 DataBuffer_2[3]=hdrSec_2; DataBuffer_1[0]=miao_10/10; //前两位显示秒表 DataBuffer_1[1]=miao_1; DataBuffer_1[2]=hdrSec_10/10; //后两位显示百分秒表 DataBuffer_1[3]=hdrSec_1; } if(flag_1==0&&flag_2==0) { DataBuffer_2[0]=miao_20/10; //前两位显示秒表 DataBuffer_2[1]=miao_2; DataBuffer_2[2]=hdrSec_20/10; //后两位显示百分秒表 DataBuffer_2[3]=hdrSec_2; DataBuffer_1[0]=miao_10/10; //前两位显示秒表 DataBuffer_1[1]=miao_1; DataBuffer_1[2]=hdrSec_10/10; //后两位显示百分秒表 DataBuffer_1[3]=hdrSec_1; } }

/**************************开关程序***********************************/

22

本文来源:https://www.bwwdw.com/article/60a6.html

Top