89C51单片机课程设计之秒表设计实验报告

时间:2024.4.20

这里可以加学校LOGAL

单片机课程设计报告

院系: xxxxxxxxxx

班别:xxxxxxxxxx

课程名称:秒表设计

姓名:xxx

学号:xxxxxxx

指导老师: xxxxxxx

2011.12.23

目录

1课程设计的目的和任务

1.1 单片机秒表课程设计的概述

1.2课程设计思路及描述

1.3 课程设计任务和要求

2硬件与软件的设计流程

2.1系统硬件方案设计

2.2软件方案设计

3 程序编写流程及课程设计效果

3.1源程序及注释

3.2原理图分析

3.3课程设计效果

4心得体会

5相关查阅资料

1.课程设计的目的和任务

1.1单片机秒表课程设计的概述

一、课程设计题目

秒表系统设计——用STC89C52RC设计一个4位LED数码显示“秒表”,显示时间为00.00~99.99秒,每10毫秒自动加一,每1000毫秒自动加一秒。

二、增加功能

增加一个“复位”按键(即清零),一个“暂停”和“开始”按键。

三、课程设计的难点

单片机电子秒表需要解决三个主要问题,一是有关单片机定时器的使用;二是如何实现LED的动态扫描显示;三是如何对键盘输入进行编程。

四、课程设计内容提要

本课程利用单片机的定时器/计数器定时和记数的原理,结合集成电路芯片8051、LED数码管以及课程箱上的按键来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。其中本课程设计有两个开关按键:其中key1按键按下去时开始计时,即秒表开始键(同时也用作暂停键),key2按键按下去时数码管清零,复位为“00.00”.

课程设计的意义

1)通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。

2)掌握定时器、外部中断的设置和编程原理。

3)通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。

4)该课程通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义

课程设计仪器

a)集成电路芯片8051,七段数码管,89C51单片机开发板

b)MCS-51系列单片机微机仿真课程系统中的软件(Keil uvision2)。

1.2课程设计思路及描述

该课程设计要求进行计时并在数码管上显示时间,则可利用MCS-51系列单片机的芯片AT89C52的P3.2,P3.5作为按键的入口;定时器T1作为每0.01秒加一的定时器。其中“开始”按键当开关由上向下拨时开始计时,此时若再拨“开始”按键则数码管暂停;“清零”按键当开关由上向下拨时数码管清零,此时若再拨“开始”按键则又可重新开始计时。

方框图如下图1:

图1数字秒表设计导向

1.3课程设计任务和要求

1.3.1设计指标

了解8051芯片的的工作原理和工作方式 ,使用该芯片对LED数码管进行显示控制,实现用单片机的端口控制数码管,显示分、秒,并能用按钮实现秒表起动、停止、99秒、清零等功能,精确到0.01秒。

要求选用定时器的工作方式,画出使用单片机控制LED数码管显示的电路图,并实现其硬件电路,并编程完成软件部分,最后调试秒表起动、停止、清零等功能。

1.3.2设计要求

① 画出电路原理图(或仿真电路图);

② 软件编程与调试;

③ 电路仿真与调试;

2.软件与硬件设计

2.1系统硬件方案设计

单片机应用系统由硬件系统和软件系统两部分组成。硬件系统是指单片机以及扩展的存储器、I\O接口、外围扩展的功能芯片以及接口电路。软件系统包括监控程序和各种应用程序。

在单片机应用系统中,单片机是整个系统的核心,对整个系统的信息输入、处理、信息输出进行控制。与单片机配套的有相应的复位电路、时钟电路以及扩展的存储器和I\O接口,使单片机应用系统能够运行。

在一个单片机应用系统中,往往都会输入信息和显示信息,这就涉及键盘和显示器。在单片机应用系统中,一般都根据系统的要求配置相应的键盘和显示器。配置键盘和显示器一般都没有统一的规定,有的系统功能复杂,需输入的信息和显示的信息量大,配置的键盘和显示器功能相对强大,而有些系统输入/输出的信息少,这时可能用几个按键和几个LED指示灯就可以进行处理了。在单片机应用系统在中配置的键盘可以是独立键盘,也可能是矩阵键盘。

射线图

图2系统硬件结构框

2.2软件方案设计

此次选用C51来编程,首先要有初始化程序,通过初始化程序,将对主程序所用到的变量、常量以及各个参数和所调用的子函数定义。其次还有显示程序、按键扫描及处理程序、时钟程序和倒计时程序,系统软件流程图图如图 3所示:


3 程序编写的流程及课程设计效果

3.1源程序及注释

/*-----------------------------------------------

名称:数码管显示,按键控制秒表

论坛:www.doflye.net

编写:shifang

日期:2009.5

修改:无

内容:中断按键控制,数码管显示,中断0控制计时和停止,中断1清零

------------------------------------------------*/

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

unsigned int msecond,second;//定义全局变量

bit GoFlag;//定义停止,计时标志

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换

sbit LATCH1=P2^2;//定义锁存使能端口 段锁存

sbit LATCH2=P2^3;// 位锁存

sbit KEY=P3^2;

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9

unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码

unsigned char TempData[8]; //存储显示值的全局变量

void DelayUs2x(unsigned char t);//函数声明

void DelayMs(unsigned char t);

void Display(unsigned char FirstBit,unsigned char Num);

void Init_Timer0(void);

void CLR(void);

/*------------------------------------------------

主函数

------------------------------------------------*/

void main (void)

{

unsigned char num=0;

EX0=1; //外部中断0开

IT0=1; //IT1=0表示边沿触发

EX1=1; //外部中断1开

IT1=1; //IT1=1表示边沿触发

Init_Timer0();

while (1) //主循环

{

TempData[0]=dofly_DuanMa[second/10];//分解显示信息,如要显示68,则68/10=6 68%10=8

TempData[1]=dofly_DuanMa[second%10];

TempData[2]=0x40;// "-"

TempData[3]=dofly_DuanMa[msecond/10];//分解显示信息,如要显示68,则68/10=6 68%10=8

TempData[4]=dofly_DuanMa[msecond%10];

//主循环中添加其他需要一直工作的程序

}

}

/*------------------------------------------------

显示函数,用于动态扫描数码管

输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示

如输入0表示从第一个显示。

Num表示需要显示的位数,如需要显示99两位数值则该值输入2

------------------------------------------------*/

void Display(unsigned char FirstBit,unsigned char Num)

{

static unsigned char i=0;

DataPort=0; //清空数据,防止有交替重影

LATCH1=1; //段锁存

LATCH1=0;

DataPort=dofly_WeiMa[i+FirstBit]; //取位码

LATCH2=1; //位锁存

LATCH2=0;

DataPort=TempData[i]; //取显示数据,段码

LATCH1=1; //段锁存

LATCH1=0;

i++;

if(i==Num)

i=0;

}

/*------------------------------------------------

定时器初始化子程序

------------------------------------------------*/

void Init_Timer0(void)

{

TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响

//TH0=0x00; //给定初值

//TL0=0x00;

EA=1; //总中断打开 (总中断控制开关)

ET0=1; //定时器中断打开 (允许中断0的发生)

TR0=1; //定时器开关打开 (定时器T0开始工作)

}

/*------------------------------------------------

定时器中断子程序

------------------------------------------------*/

void Timer0_isr(void) interrupt 1

{

static unsigned char num;

TH0=(65536-2000)/256; //重新赋值 2ms

TL0=(65536-2000)%256;

Display(0,8);

if(GoFlag)

{

num++;

if(num==5)

{

num=0;

msecond++;

if (msecond==100)//100进1

{

msecond=0;

second++;//秒加1

if(second==100)

second=0;

}

}

}

}

/*------------------------------------------------

外部中断0程序

------------------------------------------------*/

void ISR_INT0(void) interrupt 0

{

if(!KEY) //如果检测到低电平,说明按键按下

{

DelayMs(20); //延时去抖,一般10-20ms

if(!KEY) //再次确认按键是否按下,没有按下则退出

{

GoFlag=!GoFlag; //利用外部中断打开和关闭定时标志 用于开始和停止计时

}

}

//主循环中添加其他需要一直工作的程序

}

/*------------------------------------------------

外部中断1程序

------------------------------------------------*/

void ISR_INT1(void) interrupt 2

{

if(GoFlag==0)//停止时才可以清零

CLR();

}/*------------------------------------------------

数值清零

------------------------------------------------*/

void CLR(void)

{

second=0; //利用外部中断清零

msecond=0;

}

void DelayUs2x(unsigned char t)

{

while(--t);

}

void DelayMs(unsigned char t)

{

while(t--)

{

//大致延时1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

3.2原理图分析

图4按键原理图

图5显示电路

图6电源电路原理图

3.3课程设计效果

通过最后软件对程序的编译,组建,执行,还有最终生成.hex文件,把.hex下载到TX-1C开发板的STC89C52RC单片机上的最终效果图如下:

下图: 开始运行,执行自动加1

下图:下图为复位后的显示

下图:“开始自加”运行,一直加到99秒

4心得体会

以下是我在设计这个秒表过程中所总结的心得,整个过程主要是:设计程序----修正程序 ----扩展功能----完善程序,经过自己的独立思考与查阅相关知识,最终完成这个作品.

5相关资料查阅

【1】孙育才编著.MCS-51系列单片微型计算机及其应用.东南大学出版社.2009.12

【2】郭天祥编著.51单片机C语言教程-入门、提高、开发、拓展全攻略.电子工业出版社.2010.05

【3】刘刚编著.Protel DXP 20## SP2原理图与PCB设计.电子工业出版社.2009.07

【4】丁峻岭主编.C语言程序设计.中国铁道出版社.2009.12


第二篇:单片机课程设计报告(秒表设计报告)


一、题目

作息时间表系统设计——用89C51设计一个6位LED数码显示“作息时间表系统”,显示时间为00—00—00 ~ 23时—59分—59秒,每秒自动加一。另设计4个按钮,分别是“分状态”按键、“分加1”按键、“时状态”按键,“时加1”按键。用于进行小时和分钟的调整。这就是一个完整的具有时、分、秒显示的单片机实时钟系统。

二、增加功能

在上述实时钟系统的基础上,在控制软件钟增加一个“作息时间表”,如图1 所示,并增加对该表的查询功能模块,依据对该表的查询结果,控制喇叭,进行课间打铃提示,完成单片机作息时间表系统的设计。也完成本次课程设计。

三、内容提要

本设计利用单片机的定时器/计数器定时和记数的原理,结合sl-100、sl-200系统上的集成电路芯片8052、LED数码管以及按键来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。其中本设计中的四个开关按键:其中一个按键按下去时,系统进入秒调整状态,然后,秒加1键每按一次,秒计时器加1。时状态按下时,系统进入时调整状态,时按键每按一次,时计数器加1。本设计运行开始时,各按键回到各初始位置,即都处于1状态。计时显示从00:00:00开始,依据秒加1为单位进行显示计时。

三、实验目的

1、 通过本次课程设计加深对单片机课程的全面认识复习和掌握,对嵌入式系统的应用进一步的了解。

2、 掌握定时器、外部中断的设置和编程原理。

3、 通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。

四、意义

该实验通过单片机的定时器/计数器定时和计数原理,设计单片机作息时间表系统,拥有正确的计时、显示、时间调整等功能,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义。

五、本人所做工作

根据相关的单片机材料,利用所学的单片机知识,结合sl-100单片机微机实验系统中的软件和硬件(集成电路芯片8952,七段数码管,开关电路及时钟信号电路,按键等),编写能够实现该设计的软件程序,最后将软、硬件有机的结合起来,进行有效的调试,达到完成该实验课程设计的目的要求。

六、设计内容

用AT89C51设计一个6位LED数码显示“实时钟”,显示时间为00:00:00秒,每秒自动加一。另设计一个“时状态”按键和一个“时加1 ”按键。再增加一个“分状态”按键和一个“分加1”按键。

在以上设计的基础上,在在控制软件系统中增加作息时间表功能,驱动喇叭去完成作息时间控制的功能。

七、设计思路及描述

该实验要求进行计时并在数码管上显示时间,则可利用sl-100单片机实验系统中的芯片AT89C52,中的P3管脚做为外部按键输入,并实现各个按键的功能;定时器T0作为每10~50毫秒加一的定时器。在内部RAM中开辟10~50MS计数器,秒计数器、分计数器、时计数器。单片机依据定时器T0的定时时间,进行秒、分、时的累加,并将秒、分、时数据转换为7段LED显示段码,送LED显示器,从而完成单片机实时钟系统的设计。注意,为了输出显示方便,时、分、秒的累加计时可以采用BCD码运算。 。

八、原理图

九、课程设计参考汇编程序

;*******************************

; 按键可调作息时间电子钟

;

;

; Date 2007.7.6

; Created by 李强

;*******************************

;*******************************

; 显示缓冲区定义

;*******************************

Secl equ 50h

Sech equ 51h

Minl equ 52h

Minh equ 53h

Hourl equ 54h

Hourh equ 55h

;*******************************

; 时钟计数单元定义

;*******************************

ms equ 56h

sec equ 57h

min equ 58h

hour equ 59h

flash equ 5ah

timec equ 5bh

bpcount equ 5ch

codep equ 5dh

;*******************************

; 按键定义

;*******************************

keym bit p3.0

keym1 bit p3.1

keym_1 bit p3.2

keyh bit p3.3

keyh1 bit p3.4

keyh_1 bit p3.5

;keytime bit p3.6

;按键状态标志

m_key bit 00h

h_key bit 01h

flashb bit 02h

time bit 03h

timeg bit 04h

;*******************************

; 共阳数码管段码

;*******************************

; DispTab:

; db 0c0h,0f9h,0a4h,0b0h,99h

; db 92h,82h,0f8h,80h,90h,0ffh

org 0080h

Tab:

DB 0C0H, 0F9H, 0A4H, 0B0H, 99H ; 01234

DB 92H, 82H, 0F8H, 80H, 90H ; 56789

DB 88H, 83H, 0C6H, 0A1H, 86H; ABCDE

DB 8EH,0FFh

;*******************************

; 作息时间码

;*******************************

org 00b0h

timetab:

db 00h,00h,15h

db 00h,00h,30h

db 00h,01h,00h

db 10h,00h,15h

db 00h,03h,00h

db 13h,00h,15h

db 20h,30h,00h

db 00h,00h,45h

db 0ffh,0ffh,0ffh

;*******************************

; 中断地址表设置

;*******************************

org 0000h

ajmp main

org 0003h

reti

org 000bh

ajmp intt0

org 0013h

reti

org 001bh

ajmp intt1

org 0023h

reti

;*******************************

; main程序

;*******************************

org 0100h

main:

mov sp,#60h

mov r7,#0fh

mov r0,#50h

mov a,#00h

mov 20h,a

clr m_key

clr h_key

clrd: mov @r0,a

inc r0

djnz r7,clrd

mov tmod,#11h

mov th0,#3ch

mov tl0,#0b0h

mov th1,#3ch

mov tl1,#0b0h

mov ms,#00h

mov flash,#00h

setb ea

setb et0

setb et1

setb tr0

clr timeg

clr tr1

cont: lcall display

lcall keytest

;jnb time,cont

lcall beep

ajmp cont

;*******************************

; beep程序

;*******************************

beep:

mov timec,hour

mov codep,#0fdh

mov dptr,#timetab

beph: mov a,codep

inc a

inc a

inc a

mov codep,a

movc a,@a+dptr

mov b,a

xrl a,#0ffh

jz exitb

mov a,b

cjne a,timec,beph

mov timec,min

dec codep

dec codep

bepm: mov a,codep

inc a

inc a

inc a

mov codep,a

movc a,@a+dptr

mov b,a

xrl a,#0ffh

jz exitb

mov a,b

cjne a,timec,bepm

mov timec,sec

dec codep

dec codep

bepsec: mov a,codep

inc a

inc a

inc a

mov codep,a

movc a,@a+dptr

mov b,a

xrl a,#0ffh

jz exitb

mov a,b

cjne a,timec,bepsec

setb timeg

clr codep

;ajmp exitbb

exitb: ;clr timeg

exitbb: clr codep

clr timec

ret

;*******************************

; keytest 程序

; key0--P3.0,状态键盘

; key1==P3.1,加1键

;*******************************

keytest:

setb keym

setb keym1

setb keyh

setb keyh1

setb keym_1

setb keyh_1

jnb keym,keydelay

jnb keym1,keydelay

jnb keym_1,keydelay

jnb keyh,keydelay

jnb keyh1,keydelay

jnb keyh_1,keydelay

;jnb keytime,keydelay

ajmp exitskey

keydelay:

lcall delay10ms

jnb keym,keymp

jnb keym1,keym1p

jnb keym_1,keym_1p

jnb keyh,keyhp

jnb keyh1,keyh1p

jnb keyh_1,keyh_1p

;jnb keytime,keytimep

ajmp exitskey

keymp: ajmp keympp

keym1p: ajmp keym1pp

keym_1p:ajmp keym_1pp

keyhp: ajmp keyhpp

keyh1p: ajmp keyh1pp

keyh_1p:ajmp keyh_1pp

;keytimep:ajmp timep

;timep: jnb keytime,$

; jbc m_key,exitkeyt

; jbc h_key,exitkeyt

; cpl time

; ajmp exitskey

keympp: jnb keym,$

jbc m_key,exitkeyt

jbc h_key,exitkeyt

setb m_key

setb et1

setb tr1

clr tr0

ajmp exitskey

exitkeyt:ajmp exitkey

keyhpp: jnb keyh,$

jbc m_key,exitkey

jbc h_key,exitkey

setb h_key

setb et1

setb tr1

clr tr0

ajmp exitskey

keym1pp:jnb keym1,$

jnb m_key,exitkey

mov a,min

add a,#1

da a

mov min,a

cjne a,#60h,$+3

jc exitsm

mov min,#00h

exitsm: ajmp exitskey

keym_1pp:jnb keym_1,$

jnb m_key,exitkey

mov a,min

jnz exitm_1

mov a,#60h

exitm_1:clr c

subb a,#1

mov b,a

anl a,#0fh

cjne a,#0fh,exm

mov a,b

subb a,#06h

sjmp $+3

exm: mov a,b

mov min,a

ajmp exitskey

keyh_1pp:jnb keyh_1,$

jnb h_key,exitkey

mov a,hour

jnz exith_1

mov a,#24h

exith_1:clr c

subb a,#1

mov b,a

anl a,#0fh

cjne a,#0fh,exh

mov a,b

subb a,#06h

sjmp $+3

exh: mov a,b

mov hour,a

ajmp exitskey

keyh1pp:jnb keyh1,$

jnb h_key,exitkey

mov a,hour

add a,#1

da a

mov hour,a

cjne a,#24h,$+3

jc exitsh

mov hour,#00h

exitsh: ajmp exitskey

exitkey:setb tr0

clr et1

clr tr1

exitskey:

ret

;*******************************

; display 程序

;*******************************

display:

mov a,sec ;显示缓冲区更新

mov b,a

anl a,#0fh

mov secl,a

mov a,b

anl a,#0f0h

swap a

mov sech,a

mov a,min

mov b,a

anl a,#0fh

mov minl,a

mov a,b

anl a,#0f0h

swap a

mov minh,a

mov a,hour

mov b,a

anl a,#0fh

mov hourl,a

mov a,b

anl a,#0f0h

swap a

mov hourh,a

; 显示更新

mov dptr,#Tab

mov a,secl

movc a,@a+dptr

mov p0,a

mov p2,#0feh

lcall delay1ms

mov a,sech

movc a,@a+dptr

mov p0,a

mov p2,#0fdh

lcall delay1ms

jnb m_key,dmin

jnb flashb,dmin

mov minl,#16

mov minh,#16

dmin: mov a,minl

movc a,@a+dptr

mov p0,a

mov p2,#0fbh

lcall delay1ms

mov a,minh

movc a,@a+dptr

mov p0,a

mov p2,#0f7h

lcall delay1ms

jnb h_key,dhour

jnb flashb,dhour

mov hourl,#16

mov hourh,#16

dhour:

mov a,hourl

movc a,@a+dptr

mov p0,a

mov p2,#0efh

lcall delay1ms

mov a,hourh

movc a,@a+dptr

mov p0,a

mov p2,#0dfh

lcall delay1ms

ret

;*******************************

; 延时 程序

;*******************************

delay1ms:

mov r7,#10

d1ms: mov r6,#100

djnz r6,$

djnz r7,d1ms

ret

delay10ms:

mov r7,#100

d10ms: mov r6,#100

djnz r6,$

djnz r7,d10ms

ret

;*******************************

; T0 50ms 中断 程序

;*******************************

intt0: ;lcall beep

push acc

push psw

;lcall beep

clr tr0

clr c

mov a,#0b8h

add a,tl0

mov tl0,a

mov a,#3ch

addc a,#0

mov th0,a

setb tr0

mov a,ms

inc a

mov ms,a

cjne a,#20,eout

mov ms,#00h

mov a,sec

add a,#1

da a

mov sec,a

cjne a,#60h,eout

mov sec,#00h

mov a,min

add a,#1

da a

mov min,a

cjne a,#60h,eout

mov min,#00h

mov a,hour

add a,#1

da a

mov hour,a

cjne a,#24h,eout

mov hour,#00h

eout: jnb timeg,eeout

mov tmod,#21h

mov th1,#156

mov tl1,#156

setb tr1

;cpl p3.3

inc bpcount

mov a,bpcount

cjne a,#100,eeout

mov bpcount,#0

clr timeg

clr timec

setb p3.3

mov tmod,#11h

clr tr1

clr timec

clr codep

eeout: ;lcall beep

pop psw

pop acc

reti

;*******************************

; T1 50ms 中断 程序

;*******************************

intt1:

push acc

push psw

jnb timeg,exit_int1

;mov th1,#0d8h

;mov tl1,#0f0h

cpl p3.3

;inc bpcount

;mov a,bpcount

;cjne a,#200,exitt1

;mov bpcount,#00h

;clr timeg

;clr tr1

;setb p3.3

sjmp exitnt1

exit_int1:

;mov tmod,#11h

inc flash

mov a,flash

cjne a,#5,exitnt1

mov flash,#0

cpl flashb ;闪烁标志取反

exitnt1:

mov th1,#3ch

mov tl1,#0b0h

exitt1: pop psw

pop acc

reti

end

十、课程设计C51参考程序

clock.c 文件

/*******************************

电子表C源程序

Date 2007.7.11

Created by 李强

*******************************/

#include"clock.h"

/*******************************

主程序

********************************/

main()

{

TMOD=0x11;

ET0=1;

ET1=1;

EA=1;

TH0=0x3c;

TL0=0xb0;

TH1=0x3c;

TL1=0xb0;

TR0=1;

while(1)

{

disp();

beep();

key();

}

}

clock.h 文件

#include

/*******************************

数据类型声明

********************************/

#define uint unsigned int

typedef unsigned char uchar;

/*******************************

全局数据类型声明

********************************/

typedef struct { /* structure of the time record */

uchar hour; /* hour */

uchar min; /* minute */

uchar sec; /* second */

uchar ms; /* 50 ms */

}time;

typedef struct { /* structure of the time record */

uchar hourh; /* hour */

uchar hourl;

uchar minh; /* minute */

uchar minl;

uchar sech;

uchar secl; /* second */

}timebuf;

typedef struct { /* structure of the time record */

uchar hour; /* hour */

uchar min; /* minute */

uchar sec; /* second */

}timetab;

/*******************************

函数原型声明

********************************/

void delay1ms();

void delay10ms();

void disp();

void beep();

void scankey();

void key_min_state();

void key_min_plus();

void key_min_sub();

void key_hour_state();

void key_hour_plus();

void key_hour_sub();

void key();

function.c 文件

#include"clock.h"

/*******************************

数码管共阳段码表

********************************/

uchar code DispCode[17]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e,

0xff

};

/*******************************

初始时间值

********************************/

extern timebuf data dtimebuf = { 0, 0, 0, 0, 0, 0 };

extern time data ctime = { 12, 0, 0, 0 };

uint count;

uint count_flash;

bit beeph;

bit flash_flag;

/*******************************

作息时间表

********************************/

timetab code code_time[10]={

12,30,15,

12,30,30,

12,30,45,

12,20,45,

12,03,00,

12,01,00,

0xff,0xff,0xff,

};

/*******************************

按键I/O口定义

/********************************/

sbit keymin = 0xb0;

sbit keymin_plus = 0xb1;

sbit keymin_sub = 0xb2;

sbit keyhour = 0xb3;

sbit keyhour_plus = 0xb4;

sbit keyhour_sub = 0xb5 ;

/*******************************

时间调整定义

********************************/

bit min_flag;

bit hour_flag;

/*******************************

显示函数实现

********************************/

void disp()

{

dtimebuf.secl=DispCode[ctime.sec%10];

dtimebuf.sech=DispCode[ctime.sec/10];

dtimebuf.minl=DispCode[ctime.min%10];

dtimebuf.minh=DispCode[ctime.min/10];

dtimebuf.hourl=DispCode[ctime.hour%10];

dtimebuf.hourh=DispCode[ctime.hour/10];

if(flash_flag)

{

if(min_flag)

{

P0=dtimebuf.secl;

P2=0xfe;

delay1ms();

P0=dtimebuf.sech;

P2=0xfd;

delay1ms();

P0=dtimebuf.hourl;

P2=0xef;

delay1ms();

P0=dtimebuf.hourh;

P2=0xdf;

delay1ms();

}

if (hour_flag)

{

P0=dtimebuf.secl;

P2=0xfe;

delay1ms();

P0=dtimebuf.sech;

P2=0xfd;

delay1ms();

P0=dtimebuf.minl;

P2=0xfb;

delay1ms();

P0=dtimebuf.minh;

P2=0xf7;

delay1ms();

}

}

else

{

P0=dtimebuf.secl;

P2=0xfe;

delay1ms();

P0=dtimebuf.sech;

P2=0xfd;

delay1ms();

P0=dtimebuf.minl;

P2=0xfb;

delay1ms();

P0=dtimebuf.minh;

P2=0xf7;

delay1ms();

P0=dtimebuf.hourl;

P2=0xef;

delay1ms();

P0=dtimebuf.hourh;

P2=0xdf;

delay1ms();

}

}

/*******************************

timer0 中断函数实现

********************************/

void intt0(void) interrupt 1 using 1

{

TH0=0x3c;

TL0=0xb0;

if(++ctime.ms==20)

{

ctime.ms=0;

if(++ctime.sec==60)

{

ctime.sec=0;

if(++ctime.min==60)

{

ctime.min=0;

if(++ctime.hour==24)

ctime.hour=0;

}

}

}

}

/*******************************

beep()函数实现

********************************/

void beep()

{

uchar i=0;

while(code_time[i].hour!=0xff)

{

if((ctime.hour==code_time[i].hour)&&(ctime.min==code_time[i].min)&&(ctime.sec==code_time[i].sec))

{

TMOD=0x21;

TH1=6;

TL1=6;

TR1=1;

count=0;

beeph=1;

return;

};

i++;

}

}

/*******************************

key()函数实现

********************************/

void key()

{

P3=0xff;

while(P3!=0xff)

{

delay10ms();

while(P3!=0xff)

{

switch(P3)

{

case 0xfe:key_min_state();break;

case 0xfd:key_min_plus();break;

case 0xfb:key_min_sub();break;

case 0xf7:key_hour_state();break;

case 0xef:key_hour_plus();break;

case 0xdf:key_hour_sub();break;

default:break;

}

}

}

}

void key_min_state()

{

while(!keymin);

if(hour_flag)

{

hour_flag=0;

flash_flag=0;

TR1=0;

return;

}

min_flag=!min_flag;

if(min_flag)

{

TMOD=0x11;

flash_flag=1;

TR1=1;

}

else

{

flash_flag=0;

TR1=0;

}

}

void key_min_plus()

{

while(!keymin_plus);

if(hour_flag)

{

hour_flag=0;

flash_flag=0;

TR1=0;

return;

}

if(min_flag)

{

if(++ctime.min==60)

ctime.min=0;

}

}

void key_min_sub()

{

while(!keymin_sub);

if(hour_flag)

{

hour_flag=0;

flash_flag=0;

TR1=0;

return;

}

if(min_flag)

{

if(--ctime.min==0xff)

ctime.min=59;

}

}

void key_hour_state()

{

while(!keyhour);

if(min_flag)

{

min_flag=0;

flash_flag=0;

TR1=0;

return;

}

hour_flag=!hour_flag;

if(hour_flag)

{

TMOD=0x11;

flash_flag=1;

TR1=1;

}

else

{

flash_flag=0;

TR1=0;

}

}

void key_hour_plus()

{

while(!keyhour_plus);

if(min_flag)

{

min_flag=0;

flash_flag=0;

TR1=0;

return;

}

if(hour_flag)

{

if(++ctime.hour==24)

ctime.hour=0;

}

}

void key_hour_sub()

{

if(min_flag)

{

min_flag=0;

flash_flag=0;

TR1=0;

return;

}

while(keyhour_sub);

if(hour_flag)

{

if(--ctime.hour==0xff)

ctime.hour=23;

}

}

delay.c 文件

#include"clock.h"

/*******************************

延时函数实现

********************************/

void delay10ms()

{

uint i;

for(i=0;i<10000;i++);

}

void delay1ms()

{

uint i;

for(i=0;i<500;i++);

}

十一、课程设计总体要求

1、认真审题,看懂题目的要求!选择适当的课题,不益太简单或者太难。做到既能把课题完成又能锻炼自己的能力!

2、根据课题要求,复习相关的知识,查询相关的资料。

3、根据实验条件,找到适合的方案,找到需要的元器件及工具,准备实验。

4、根据课程设计的要求和自己所要增加的功能写好程序,根据芯片的功能写出相应的程序。然后再进行程序调试和相应的修改,以达到能够实现所要求的功能的目的。

5、还要根据实验的实际情况,添加些额外程序来使系统更加的精确、稳定,如定时补偿处理等。

6、程序要尽量做到由各个子程序组成,在有些程序后面最好加注释,这样在程序出错的检查过程中可以更容易查找的到,也更简洁,更明白易懂。

7、该实验的程序可以参考sl-100系列单片机仿真实验系统中的实验例程,也可自己根据自己熟悉的方法来编程。

8、在设计控制按键程序时,注意按键的去抖动,及按键次数控制,否则就会出错。

9、这次的单片机课程设计重点是理论与实际的相结合。

10、 该设计从头到尾都要求学生自己参与,熟悉了对整个设计的过程,使学生得到更系统的锻炼。

十二、参考文献

1、sl100单片机仿真实验系统资料。

2、李群芳等编的《单片微型计算机与接口技术》 电子工业出版社 20##年11月

2、徐伟等编的《C51单片机高效入门》 机械工业出版社 20##年1月

更多相关推荐:
单片机课程设计实验报告

中国民航大学单片机课程设计报告数字温度计姓名白杨学号专业班级指导老师常美华赵淑舫所在学院航空自动化学院20xx年12月18日1概述11课程设计的意义本次课程设计是在我们学过单片机后的一次实习可增加我们的动手能力...

51单片机课程设计实验报告

51单片机课程设计报告学院:专业班级:姓名:指导教师:设计时间:51单片机课程设计一、设计任务与要求1.任务:制作并调试51单片机学习板2.要求:(1)了解并能识别学习板上的各种元器件,会读元器件标示;(2)会…

单片机课程设计数字钟实验报告

单片机课程设计电子钟一实现功能1能够实现准确计时以数字形式显示时分秒的时间2小时以24小时计时形式分秒计时为60进位能够调节时钟时间3闹钟功能一旦走时到该时间能以声或光的形式告警提示4能够实现按键启动与停止功能...

单片机课程设计实验报告封面

单片机课程设计姓名学号年级专业所在院系电气工程与自动化学院指导教师徐敏关键生提交日期1目录一课程设计任务书二设计项目简介三电路原理图及其简介四系统功能描述五程序框图六程序清单七收获与体会2单片机原理及应用课程设...

单片机课程设计实验报告

单片机原理与接口技术直流电机测速系统课程设计报告学院专业学生姓名学号指导教师时间一前言课程设计是培养学生综合运用所学知识发现提出分析和解决实际问题锻炼实践能力的重要环节是对学生实际工作能力的具体训练和考察过程随...

单片机课程设计实验报告

单片机课程设计实验报告组员20xx0109题目分析本小车是由一块8位单片机AT89S52开发板作为小车的控制器用两个360舵机作为小车的动力前轮用一个单向滚动小球构成后轮单片机开发板上前端留有一块面包板做为小车...

流水灯单片机课程设计报告

井冈山大学机电工程学院单片机课程设计报告课程名称单片机设计题目流水灯姓名覃家应陈东阳专业生物医学工程班级10级医工本一班学号100615062指导教师王佑湖20xx年11月10日目录1引言211设计任务212设...

可控流水灯单片机课程设计报告(c语言)

EDA课程设计报告流水灯专业电子信息工程学号0909054126姓名张新利20xx6271目录1引言12课题综述121课题的来源122课题的意义123预期的目标124面对的问题125课题的技术23系统分析231...

单片机课程设计报告解程翔

莱芜职业技术学院课程论文目录一引言本课程设计的目的2二八路LED跑马灯实验221设计内容222电路图223上机程序324调试结果及结论4三二位数码管循环显示0099的实验431设计内容432电路图433上机程序...

单片机课程设计实验报告

单片机应用实践课程设计任务书学生姓名专业班级指导教师陈德军工作单位武汉理工大学题目单片机应用实践设计并实现步进电机控制器初始条件1KeilProteus78STC等软件2课程设计辅导书单片机微型计算机与接口技术...

单片机电子时钟课程设计实验报告

单片机实践报告题目电子时钟设计专业学生姓名王健吉准考证号指导教师20xx年10月一课程设计的目的和意义课程设计的目的与意义在于让我们将理论与实践相结合培养我们综合运用电子课程中的理论知识解决实际性问题的能力让我...

单片机课程设计实验报告+基于单片机的数字时钟+含完整实验代码

单片机课程设计报告基于单片机的数字时钟姓名班级学号一前言利用实验板上的4个LED数码管设计带有闹铃秒表功能的数字时钟功能要求a计时并显示LED由于实验板上只有4位数码管可设计成显示时分和显示分秒并可切换b时间调...

单片机课程设计实验报告(35篇)