单片机课程设计时钟跑表.docx

上传人:b****5 文档编号:30686417 上传时间:2023-08-19 格式:DOCX 页数:33 大小:24.07KB
下载 相关 举报
单片机课程设计时钟跑表.docx_第1页
第1页 / 共33页
单片机课程设计时钟跑表.docx_第2页
第2页 / 共33页
单片机课程设计时钟跑表.docx_第3页
第3页 / 共33页
单片机课程设计时钟跑表.docx_第4页
第4页 / 共33页
单片机课程设计时钟跑表.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

单片机课程设计时钟跑表.docx

《单片机课程设计时钟跑表.docx》由会员分享,可在线阅读,更多相关《单片机课程设计时钟跑表.docx(33页珍藏版)》请在冰豆网上搜索。

单片机课程设计时钟跑表.docx

单片机课程设计时钟跑表

成绩

课程设计

课程名称

单片机原理与应用课程设计

课题名称

时钟跑表设计

专业

班级

学号

姓名

指导老师

林国汉、王迎旭、汪超、李晓秀等

2017年5月22日

电气信息学院

课程设计任务书

课题名称

时钟跑表设计

姓名

专业

班级

学号

指导老师

林国汉

课程设计时间

2017年5月22日-2017年6月3日

一、任务及要求

设计任务:

本课题要求以MCS-51系列单片机为核心,设计一个数字时钟。

(1)具有时钟和跑表功能,用LED或者液晶显示器进行显示;

(2)具有时钟调整功能

(3)*具有闹钟功能,且闹钟时间可调整。

(4)*其它功能

设计要求:

(1)确定系统设计方案;

(2)进行系统的硬件设计;

(3)完成应用程序设计;

(4)应用系统的硬件和软件的调试。

二、进度安排

第一周:

周一:

集中布置课程设计任务和相关事宜,查资料确定系统总体方案。

周二~周三:

完成硬件设计和电路连接

周四~周日:

完成软件设计

第二周:

周一~周三:

程序调试

周四~周五:

设计报告撰写。

周五进行答辩和设计结果检查。

三、参考资料

1、王迎旭等.单片机原理及及应用[M].2版.机械工业出版社,2012

2、胡汉才.单片机原理及其接口技术[M].3版.清华大学出版社,2010.

3、戴灿金.51单片机及其C语言程序设计开发实例[M].清华大学出版社,2010

1.2设计思路及系统框架图1

1.1设计任务与要求

设计任务:

本课题要求以MCS-51系列单片机为核心,设计一个数字时钟。

(1)具有时钟和跑表功能,用LED或者液晶显示器进行显示;

(2)具有时钟调整功能

(3)*具有闹钟功能,且闹钟时间可调整。

(4)*其它功能

设计要求:

(1)确定系统设计方案;

(2)进行系统的硬件设计;

(3)完成应用程序设计;

(4)应用系统的硬件和软件的调试。

1.2设计思路及系统框架图

我们采用的是AT89C51作为时钟控制芯片。

本次方案主要由时钟模块、秒表模块和闹钟模块组成,其中时钟模块包含时钟显示功能、时钟调整功能和时钟暂停功能,秒表模块包含秒表启动功能、秒表暂停功能、秒表时间存储功能和秒表回显功能,闹钟模块包含闹钟调整功能、闹钟显示功能和闹钟存储功能。

时钟通过定时器T0对时、分、秒的数值进行操作,并且秒计算到60的时候,要自己清零并向分进1,分计算到60的时候,要自己清零并向时进1,时进到24的时候,要清零,这样才能进行循环计时。

秒表模块需要重新显示一个秒表界面,同时也应该需要通过另外一个定时器T1对秒表进行操作,从而保证在秒表界面,时钟显示模块的时间还在进行。

闹钟模块则需要设计闹钟时间,当设计的闹钟时间和时钟的时间相等,蜂鸣器响起,从而达到闹钟功能,此外通过外接24c02存储芯片,将闹钟时间进行存储,且具有断电存储功能,当系统断电重新开启以后,可显示之前设定的闹钟值。

此外还要实现对时间的调整功能,AT89C51的P1口外接一个矩阵键盘,当按下K3键时,进行时钟调整,当K3按下一次时,是对时间的分钟进行调整,按下K5键数值加一,按下K6键数值减一。

当按下K12键时,进行闹钟的调整,当K3按下一次时,是对闹钟的分钟进行调整,按下K5键数值加一,按下K6键数值减一。

对于秒表模块,当按下K7键时,秒表启动,当按下K8键时,显示秒表当前值,但秒表继续走动。

在秒表计时过程中,每按下一次K9键,则对秒表当前值进行存储,每按下K10键,则对存储值进行一一回显(矩阵键盘按键标号详见电路仿真图)。

在单片机内部构建两个模块:

控制模块、定时模块,用以实现根据要求进行自动计数功能。

单片机外部构建四个电路:

矩阵键盘电路、数码管显示电路、蜂鸣器电路、24C02存储电路,用以实现对单片机内部计数选择控制、闹钟响铃、闹钟存储和时间输出的正确显示。

该电子时钟是显示分、时值,秒为数码表的DP位闪烁的一种计时装置本次计时周期设置为24小时。

为了确保时间正常校对,在系统中设有校对按钮,用以实现对数码管显示的正确调整,如图1.1所示为系统框架图。

图1.1系统框架图

第二章硬件电路设计

2.1单片机AT89C51

AT89C51是一低电压、高性能CMOS的8位微处理器,俗称单片机。

AT89C51是一种带2K字节闪存可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除1000次。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。

AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案,如图2.1所示为AT89C51的管脚图。

本次电路中用到单片机的P0、P1、P2、P3口,所示下面对这四个端口进行详细介绍。

P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P0口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。

本次课设中P0口接的是数码管的8个管脚,P0^0~P0^7依次接数码管的A~DP管脚。

P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为低八位地址接收。

本次P1课设口接的数码管的6个位选端口。

图2.189C51引脚图

P2口:

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

本次课设中P2口的P2^4~P2^7分别接的是数码管的位选W1~W4。

P3口:

本次课设中P3口的P3^3和P3^4分别接的是24C02的SCL和SDA,P3^7接的是蜂鸣器的一端。

2.2矩阵键盘电路

在本次设计中,矩阵键盘的S1~S4列分别接P1^7~P1^4引脚,H1~H4行分别接的是P1^3~P1^0引脚。

先从P1口的高四位输出高电平,低四位输出低电平,从P1口的高四位读取键盘状态。

再从P1口的高四位输出低电平,低四位输出高电平,从P1口的低四位读取键盘状态。

将两次读取结果组合起来就可以得到当前按键的特征编码。

使用上述方法我们得到16个键的特征编码。

如图2.2所示为矩阵键盘接线图。

图2.2矩阵键盘接线图

2.3蜂鸣器电路

当时钟显示的时间与闹钟存储的时间相同时,P3^7引脚输出低电平,使蜂鸣器接通,发出滴滴的响声,响声持续时间为20秒,20秒后P3^7引脚输出高电平,蜂鸣器关断,如图2.3所示为蜂鸣器接线图。

图2.3蜂鸣器接线图

2.4LED数码管显示电路

在本次的设计中,采用的4位的数码管显示器。

数码管如果按照段数分可为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多了一个小数点的显示;如果按照发光二极管单元的连接方式又可以分为共阳极数码管和共阴极数码管。

共阳极的数码管是将所有发光二极管的阳极接到一起后就形成公共阳极(COM)的数码管,共阳极数码管在应用时要将公共极(COM)接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。

共阴极数码管是将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴极数码管在应用时应将公共极(COM)接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

本次课设的数码管选用共阳极八段数码管,如图2.4所示为LED数码管接线图。

图2.4LED数码管接线图

第三章 软件设计

3.1系统主程序

先对显示单元和定时器/计数器初始化,然后重复调用数码管显示模块和按键处理模块,检测矩阵按键值,则转入相应的功能程序。

主程序流程图如图3.1所示。

图3.1主程序流程图

3.2矩阵键盘功能程序

本次设计的16个矩阵按键共用到了12个按键,每个按键都有相应的功能。

K1键为时钟启动键,按下K1键后数码管显示时钟。

此时按下K3键以后进行时钟调整,按一下进行分钟调整,按两下进行小时调整。

接着按K5键数值加一,按K6键数值减一。

每次调整分钟或小时之后都要按K1键进行确定之后才能重新按K3键进行调整。

按下K7键启动秒表,接着按下K8键,秒表暂停,但此时秒表还在走动,只是显示按键时秒表的当前值。

在秒表走动过程中,按下K9键则存储当前按下值,每按一下,存储一个值,按下K10键后则回显秒表之前存储的值,每按一下,回显一个时间,循环显示。

K11键为闹钟显示功能按键,K12为闹钟调整按键,按一下进行分钟调整,按两下进行小时调整。

接着按K5键数值加一,按K6键数值减一。

每次调整分钟或小时之后都要按K11键进行确定之后才能重新按K12键进行调整。

此外K2键为时钟暂停键,K4键为系统清零键。

时钟模块、秒表模块和闹钟模块对应的矩阵键盘功能程序流程图分别如图3.3、图3.4、图3.5所示。

图3.3时钟模块矩阵键盘功能流程图图3.4秒表模块矩阵键盘功能流程图

图3.5闹钟模块矩阵键盘功能流程图

3.3定时功能程序

T0用于时钟定时,定时时间设为50ms,定时时间到则中断,在中断服务程序中用一个计数器对50ms计数,计20次则对秒单元加一。

秒单元加到60则对分单元加一,同时秒单元清0;分单元加到60则对时单元加一,同时分单元清0;时单元加到24则对时单元清0,标志一天时间计满。

T1用于秒表定时,定时时间设为20ms,定时时间到则中断,在中断服务程序中用一个计数器对20ms计数,计5次则对秒表的100毫秒单元加一。

100毫秒单元加到10则对秒单元加一,同时100毫秒单元清0;秒单元加到1000则自动清0。

时钟的秒显示为数码管第四位管子的DP值闪烁,每次秒加一DP就会闪烁一次。

定时器T0功能流程图如图3.4所示,定时器T1功能流程图如图3.5所示。

图3.4定时器T0功能流程图图3.5定时器T1功能流程图

第四章 调试

4.1系统调试方法

先在电脑上使用Proteus仿真软件进行电路的仿真进行仿真,编程使用keil、调试工具并生成可执行文件加载到单片机中,在Proteus中点击运行,查看运行结果是否与预期要求相符,如果仿真成功,便可以到实验板上进行实物实验。

4.2调试结果

图4.1时钟显示调试图

图4.2秒表显示调试图

图4.3闹钟显示调试图

第五章 总结与体会

附录

附录A电路仿真原理图

附录B程序清单

#include"reg52.h"

#include"intrins.h"

#ifndef__I2C_H_

#define__I2C_H_

#defineuintunsignedint

#defineucharunsignedchar

uintxdataresultm[100];

uintxdataresultf[100];

ucharcodeduanxuan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0x83,0xc6,0xa1,0x86,0x8e,0xff};//共阳极0~f数码管编码

ucharcodeduanxuan1[]={0xc0-0x80,0xf9-0x80,0xa4-0x80,0xb0-0x80,0x99-0x80,0x92-0x80,0x82-0x80,0xf8-0x80,0x80-0x80,0x90-0x80,0x7f-0x80,0x83-0x80,0xc6-0x80,0xa1-0x80,0x86-0x80,0x8e-0x80,0xff-0x80};

ucharcodeweixuan[]={0xe0,0xd0,0xb0,0x70};

ucharflag3;

uchartemp,timer0_shi,timer0_fen,timer0_miao;

uchartimer1_fm,nao1,nao2,nao3,nao4;

uinttimer1_zm;

uchartimer1_bw,timer1_sw,timer1_gw;

ucharc,z,k;

sbitbeep=P3^7;

sbitscl=P3^4;

sbitsda=P3^5;

uintt0=0,t1=0;

//--定义使用的IO口--//

sbitI2C_SCL=P3^4;

sbitI2C_SDA=P3^5;

voidI2C_Delay10us();

voidI2C_Start();

voidI2C_Stop();

ucharI2C_SendByte(uchardat,ucharack);

ucharI2C_ReadByte();

voidAt24c02Write(unsignedcharaddr,unsignedchardat);

unsignedcharAt24c02Read(unsignedcharaddr);

#endif

voidinit(void)

{

TMOD=0x11;

TCON=0x01;

TH0=0x3c;//定时50ms

TL0=0x0b0;

TH1=0xb1;//定时20ms

TL1=0xe0;

EA=1;

EX0=1;

ET0=1;

ET1=1;

}

voiddelay(uintx)//12Mhz延时xms

{

uinti,j;

for(i=x;i>0;i--)

for(j=20;j>0;j--);

}

voidsmg_display(uchardx,ucharwx)//数码管位选

{

P0=duanxuan[dx];

P2=weixuan[wx-1];

delay

(1);

}

voidsmg_display1(uchardx,ucharwx)//数码管位选

{

P0=duanxuan1[dx];

P2=weixuan[wx-1];

delay

(1);

}

ucharkeyscan()

{

uchartemp_keyvalue,temp1_keyvalue;

P1=0xf0;

delay

(1);

temp_keyvalue=P1;

if(temp_keyvalue!

=0xf0)

{delay

(2);

temp_keyvalue=P1;

if(temp_keyvalue!

=0xf0)

{temp1_keyvalue=temp_keyvalue&0xf0;

P1=0x0f;

delay

(2);

temp_keyvalue=P1;

temp1_keyvalue=temp1_keyvalue|temp_keyvalue;

}

while(temp_keyvalue!

=0x0f)

{

P1=0x0f;

temp_keyvalue=P1;

}

}

returntemp1_keyvalue;

}

voidnaozhong(uchars,ucharf)

{

if(s==timer0_shi&&f==timer0_fen)

{

if(timer0_miao<=20)

beep=0;

if(timer0_miao>20)

beep=1;

}

}

voiddisposal(void)

{ucharhour,second,timer1_ffm;

ucharzt_bw,zt_sw,zt_gw,zt_fm;

ucharnao_fen,nao_shi;

ucharnao_gsw,nao_ggw,nao_dsw,nao_dgw;

ucharkey_progress,timer0_gsw,timer0_ggw,flag1,flag2;

uchartimer0_dsw,timer0_dgw,s1,s2,f1,f2;

key_progress=keyscan();

switch(key_progress)

{case0时钟暂停

{

TR0=0;

timer0_gsw=timer0_shi/10;

timer0_ggw=timer0_shi%10;

timer0_dsw=timer0_fen/10;

timer0_dgw=timer0_fen%10;

smg_display(timer0_gsw,1);

smg_display1(timer0_ggw,2);

smg_display(timer0_dsw,3);

smg_display(timer0_dgw,4);

break;

}

case0xee:

//清零

{TR0=0;

TR1=0;

timer1_zm=0;

timer1_fm=0;

timer0_shi=0;

timer0_fen=0;

timer0_dgw=timer0_fen%10;

timer0_gsw=timer0_shi/10;

timer0_ggw=timer0_shi%10;

timer0_dsw=timer0_fen/10;

timer0_dgw=timer0_fen%10;

smg_display(timer0_gsw,1);

smg_display1(timer0_ggw,2);

smg_display(timer0_dsw,3);

smg_display(timer0_dgw,4);

break;

}

case0x7

{keyscan();

temp=P1;

nao1=At24c02Read

(1);

nao1=At24c02Read

(1);

nao2=At24c02Read

(2);

nao2=At24c02Read

(2);

while(temp==0xf0)

{TR0=1;

flag3=1;

timer0_gsw=timer0_shi/10;

timer0_ggw=timer0_shi%10;

timer0_dsw=timer0_fen/10;

timer0_dgw=timer0_fen%10;

smg_display(timer0_gsw,1);

delay(30);

smg_display1(timer0_ggw,2);

delay(30);

smg_display(timer0_dsw,3);

delay(30);

smg_display(timer0_dgw,4);

delay(30);

if((nao1||nao2)!

=0)

naozhong(nao2,nao1);

temp=P1;

}

break;

}

case0xde:

//时钟调整

{keyscan();

flag3=0;

temp=P1;

flag2=0;

flag1++;

if(flag1>2)

flag1=2;

while(temp==0xf0)

{

s1=timer0_gsw;

s2=timer0_ggw;

f1=timer0_dsw;

f2=timer0_dgw;

hour=s2+s1*10;

second=f2+f1*10;

smg_display(s1,1);

delay(50);

smg_display1(s2,2);

delay(50);

smg_display(f1,3);

delay(50);

smg_display(f2,4);

delay(50);

temp=P1;

}

break;

}

case0x7d:

//加时钟

{flag3=0;

if(flag1==1||flag2==1)

second++;

if(flag1==2||flag2==2)

hour++;

if(hour>=24)

hour=0;

if(second>=60)

second=0;

keyscan();

temp=P1;

while(temp==0xf0)

{s1=hour/10;

s2=hour%10;

f1=second/10;

f2=second%10;

smg_display(s1,1);

delay(50);

smg_display(s2,2);

delay(50);

smg_display(f1,3);

delay(50);

smg_display(f2,4);

delay(50);

nao1=f2+f1*10;

nao2=s2+s1*10;

temp=P1;

if(keyscan()==0x7e)

{

timer0_fen=f2+f1*10;

timer0_shi=s2+s1*10;

flag1=0;

flag2=0;

}

if(keyscan()==0xdb)

{

nao_fen=f2+f1*10;

nao_shi=s2+s1*10;

flag1=0;

flag2=0;

}

}

break;

}

case0xbd:

//减时钟

{flag3=0;

if(flag1==2||flag2==2)

{

if(hour<=0)

hour=24;

hour--;

}

if(flag1==1||flag2==1)

{

if(second<=0)

second=60;

second--;

}

keyscan();

temp=P1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1