这里可以加学校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月