8051单片机电子时钟设计.docx

上传人:b****6 文档编号:13871933 上传时间:2023-06-18 格式:DOCX 页数:28 大小:331.67KB
下载 相关 举报
8051单片机电子时钟设计.docx_第1页
第1页 / 共28页
8051单片机电子时钟设计.docx_第2页
第2页 / 共28页
8051单片机电子时钟设计.docx_第3页
第3页 / 共28页
8051单片机电子时钟设计.docx_第4页
第4页 / 共28页
8051单片机电子时钟设计.docx_第5页
第5页 / 共28页
8051单片机电子时钟设计.docx_第6页
第6页 / 共28页
8051单片机电子时钟设计.docx_第7页
第7页 / 共28页
8051单片机电子时钟设计.docx_第8页
第8页 / 共28页
8051单片机电子时钟设计.docx_第9页
第9页 / 共28页
8051单片机电子时钟设计.docx_第10页
第10页 / 共28页
8051单片机电子时钟设计.docx_第11页
第11页 / 共28页
8051单片机电子时钟设计.docx_第12页
第12页 / 共28页
8051单片机电子时钟设计.docx_第13页
第13页 / 共28页
8051单片机电子时钟设计.docx_第14页
第14页 / 共28页
8051单片机电子时钟设计.docx_第15页
第15页 / 共28页
8051单片机电子时钟设计.docx_第16页
第16页 / 共28页
8051单片机电子时钟设计.docx_第17页
第17页 / 共28页
8051单片机电子时钟设计.docx_第18页
第18页 / 共28页
8051单片机电子时钟设计.docx_第19页
第19页 / 共28页
8051单片机电子时钟设计.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

8051单片机电子时钟设计.docx

《8051单片机电子时钟设计.docx》由会员分享,可在线阅读,更多相关《8051单片机电子时钟设计.docx(28页珍藏版)》请在冰点文库上搜索。

8051单片机电子时钟设计.docx

8051单片机电子时钟设计

单片机原理及应用综合实训报告

题目:

电子时钟的设计

 

院别:

自动化学院

专业:

电气工程及其自动化1

姓名:

笑嘻嘻

学号:

26

指导教师:

祁伟

答辩日期:

2011年9月19日

电子时钟制作

摘要

本实训借用实验板的MCS—51单片机定时、中断功能完成电子时钟的定时工作,应用8051对单片机I/O口驱动发光二极管、LED进行电子时钟时、分、秒显示。

应用8051P3口、8255B口完成时间的设定工作。

利用P1口加入华彩设计,如发光二极管按键指示、时钟报时等。

再根据电子时钟实际应用完成系统总体设计。

,根据系统总体设计完成编程设计工作,最后通电、软件调试、运行。

关键词:

电子时钟;8051;8051P3;8255B

 

 

1电子时钟的概述

电子时钟功用,能利用MCS—51单片机定时、中断功能完成时间的定时工作。

整个系统具有参数设定、时间运行、报时、查询当前年、月、日等功能。

开机可显示HELLO-,按某个特定的按键后,时钟还可以开始计时,还可以通过另一些键功能,完成分,时、日、月、年参数设定。

参数设定完后,也可以通过一些键继续计时。

电子时钟常显示的是当前的时间,年、月、日还可以通过按几个特定的键切换、查询,6位LED显示查询的内容,如现在的年月日。

注意事项:

时钟计时时可进行时间查询,但不能更改参数,若要更改参数,必须先停止时钟运行。

2电子时钟的硬件电路设计

2.1选用单片机

MCS—51系统选用8051单片机,如图1所示。

8051单片机内有4KROM、256字节RAM,程序存放在4KROM。

8051单片机最小系统组成有:

1)时钟电路:

工作时钟;

2)复位电路,如图2所示;

3)RAM:

数据存储

4)ROM:

程序存储

5)I/O接口:

与外界交互

晶振电路如图3所示。

图1

2.2发光二极管8字数码管的显示

LED显示有静态显示和动态显示两种方式。

动态显示接口电路简图如图4所示。

将各位数码管的段并联接在一起,由P1口控制(字型口),每一个数码管的共阴极(共阳极)接到P2.0、P2.1作为位选信号。

虽说要显示的字型码通过P1口同时送到了每一个数码管,但它们不会同时显示同一个字符,只有控制共阴极(共阳极)的位选信号有效时,对应的数码管才会显示相应字符。

这种由字型口控制要显示字符的字形码,依此循环选通每位数码管的位选信号就得到了动态显示效果。

它主要是利用人眼的视觉暂留特性及数码管得余光特性,看上去似乎是多位数码管同时显示。

是当显示位数较多时,节省硬件,接口电路简单,但显示占用CPU时间。

静态显示占用CPU时间短,显示简单、稳定,但当显示位数较多时,占用接口资源多。

动态显示接口电路较简单,但占用CPU时间,显示亮度较静态显示差,一般说,显示位数较多时,采用动态或串并转换;显示位数较少时,采用静态显示方式。

图4

静态显示接口电路如图5所示。

选用共阴极LED,将共阴极点连接

在一起接地,每一位的段选线与一个8位并行口相

连,只要将要

显示的字符的字型

码送至并行口锁存,图5

LED显示器上便立即

显示出该字符,直到CPU送来一个新的字型码为止,由于静态显示每位数码管均有独立的段选码,耗电量大,硬件多。

如要外接6个数码管,则需要6个8位并行口。

2.3单片机I/O口扩展

当单片机构成系统时,常常I/O口不够用,此时可利用MCS—51的扩展能力,根据需要扩展相应接口,如可编程接口芯片8255与MCS—51单片机连接可扩展I/O;利用MCS-51单片机的

串行口扩展并行I/O接口。

实验板原理图的显示部分就是利用串入/并出技术实现2位数码管的显示。

2.4独立式按键

键盘是一组按钮式开关的集合,常采用软件来识别。

键盘的操作步骤:

①识键。

判断是否有键按下(键入),若有,则需进一步译键。

②译键。

在有键入的情况下,进一步识别是哪一个键,以便作进一步处理。

③键义分析。

根据识别的结果,明确相应的键义。

如果是数字键,应得出输出的数值;如果是功能键,则应知道具体的操作要求。

键盘构成:

①独立联接式非编码键盘。

特点:

每个键相互独立,各自接通一条输入数据线。

键未按下时,相应的数据线处于高电平,即为“1”态。

当某键按下时,该键所连之数据线接地,即为“0”态。

②独立联接式编码键盘。

特点:

在键数较多时,可采用独立式编码键盘,由4线-16线编码电路进行编码。

③矩阵联接式非编码。

特点:

先使一行线接地,然后检查列线。

如果某条列线也是低电位,则可判别两线相交处的某号键已按下。

假如在扫描时没有发现有列线为地电位,则说明此行中无键按下。

那么可将下一行线接地,如此逐一扫描列线,直到查完最后一行为止。

实验板中键盘电路设计可根据需要组合成独立联接式非编码键盘及矩阵联接式非编码,见图6所示。

 

3电子时钟软件设计部分

3.1程序流程图

编写程序之前先绘制程序流程图,理清思路,使之能简明、直观指示程序流向,且很容易由此编写出具体的源程序。

将程序以模块方式分割成具有相应功能的子程序。

根据系统功能,合理安排主程序任务,中断服务程序任务。

程序设计有两个分支:

参数设定及时钟运行。

静态参数设定时,定时器关闭,只完成参数“加一键”的设定工作。

时钟运行时,启动定时器开始

计时。

编写程序时,

图7

首先理清思路,即

通过流程图确定算法。

主程序框图如图7所示。

在主程序中,分别初始

化了定时器0和外部中

断0。

定时器0的中断

服务程序用于实现时钟运

行时的秒加1及进位功能。

外部中断0的中断服务程

序使r=1。

因此,当开始

运行程序时,r=0,数码管

显示HELLO-;当P3.2

按下时,进入外部中断0

中断服务程序,使r=1,

退出中断服务程序后,时

钟开始运行;在时钟

运行过程中,如果分

别按下K13、K14、K15

可设置时间,查询年、月、日。

3.2定时中断服务程序流程图

定时中断服务程序流程图

如图8所示。

 

图8

图8

图8

 

3.3扩展功能程序流程

扩展功能程序流程如图9所示。

图9

4电子时钟实用说明

1、开机时,显示HELLO-。

2、按下K16键,电子时钟开始运行,数码管显示‘时’、‘分’、‘秒’。

3、按下K13键,进入时间参数设置,此时可再次通过K13键进行‘年’、‘月日’、‘时分’的切换,并通过K12、K14可分别对‘年’、‘月’、‘日’、‘时’、‘分’加1、减1,由此完成时间的设定。

4、当数码管显示‘时’‘分’‘秒’,可通过K14、K15查询年、月、日。

4心得体会

在本次实验中重新复习了单片机实验的内容,更加深了对程序和项目的训练。

虽然开始的时候感觉比较,后来经过多天的努力和温习,终于可以把以前半懂不懂的知识比较完整的拼凑在一起。

这次实验程序的编写和调试所花时间比较多,写报告的用的时间比较少。

对于这次实验的不足之处还是需要更深刻的检讨,希望以后更加努力。

 

5附录

程序代码

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

//程序名shizhong.C

//功能描述:

电子时钟

//硬件电路参看实验板

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

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineCOM8255XBYTE[0xffff]

#definePA8255XBYTE[0Xfffc]

#definePB8255XBYTE[0Xfffd]

#definePC8255XBYTE[0Xfffe]

#defineOSC_FREQ12000000//12Mhz

#defineC1ms(65536-OSC_FREQ/(12000000/980))//1ms定时

sbitP1_4=P1^4;//位选控制

sbitP1_5=P1^5;

sbitP1_6=P1^6;

sbitP1_7=P1^7;

sbitP2_0=P2^0;//数码管段码控制a

sbitP2_1=P2^1;

sbitP2_2=P2^2;

sbitP2_3=P2^3;

sbitP2_4=P2^4;

sbitP2_5=P2^5;

sbitP2_6=P2^6;

sbitP2_7=P2^7;//数码管段码控制dp

sbitP3_2=P3^2;//中断、返回计时

sbites=P2^4;//更新静态显示

sbitP1_2=P1^2;//8255片选P1_2=0

sbitP1_1=P1^1;//8255片选P1_1=1

sbitP1_0=P1^0;//8255片选P1_0=0

ucharcodehello[]={0x89,0x86,0xc7,0xc7,0xfc,0x02};//HELLO-

ucharcodenumber1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//动态显示0-9

ucharcodenumber2[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};

//静态显示0-9

ucharcodenumber3[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//动态显示0-9dp点亮

uintyear=2011,month=9,day=3,hour=15,minute=35,second=25;

uintx,y,m,n,i=0,j=0,k=0,r=0;

voidTimer_1ms(uint_1ms);//延时1ms

voidSet_Init_Timer0();//定时器0初始化函数

voidSet_Init_Xint0();//外部中断0初始化函数

voidSet_Init_8255();//8255初始化程序

voiddis_hello();//开机显示HELLO-

voiddis_year();//显示年

voiddis_month();

voiddis_day();

voiddis_hour();

voiddis_minute();

voiddis_second();

voidundis_second();//不显示秒

voidset_timer();//设置时间

voiddis_year2();//在查询状态下显示年

voiddis_day2();//在查询状态下显示日期

voidmain()

{

Set_Init_Xint0();

Set_Init_8255();

Set_Init_Timer0();

do

{

if(r==0)

{

dis_hello();

}

else

{

EX0=0;//外部中断0关中断

dis_hour();

dis_minute();

dis_second();

Set_Init_8255();

switch(PB8255)

{

case0xDF:

set_timer();break;//PB=0xDF,K13键按下切换到设置时间程序

case0xBF:

dis_day2();break;//PB=0xBF,K14键按下切换到显示日期程序

case0x7F:

dis_year2();break;//PB=0x7F,K15键按下切换到显示年的程序

}

}

}while

(1);

}

voidTimer_1ms(uint_1ms)//延时函数

{

TMOD=0x11;

TR1=1;

while(_1ms--)

{

TH1=C1ms/256;

TL1=C1ms%256;

while(!

TF1);

TF1=0;

}

TR1=0;

}

voidSet_Init_Timer0()//定时器0初始化函数

{

TMOD=0x11;//定时器0,方式一

TH0=0x3C;

TL0=0xAF;//装入初值15535设成50ms定时器

ET0=1;

TR0=1;

EA=1;

}

voidSet_Init_Xint0()//外部中断0初始化函数

{

IT0=1;//外部中断0,边沿触发方式

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

EX1=1;//打开总中断

}

voiddis_hello()//显示HELLO-

{

P1=0x70;//位选

P2=hello[0];//数码管显示H

Timer_1ms(5);

P1=0xb0;

P2=hello[1];

Timer_1ms(5);

P1=0xd0;

P2=hello[2];

Timer_1ms(5);

P1=0xe0;

P2=hello[3];

Timer_1ms(5);

SCON=0x00;

es=0;

SBUF=hello[4];

while(!

TI){}

TI=0;

SBUF=hello[5];

while(!

TI){}

TI=0;

es=1;//静态显示更新

}

//对year变量通过除法、取余运算得到各位的数值,并送到对应的数码管上

voiddis_year()

{

x=year/100;

y=x%10;//百位

x=x/10;//千位

m=year%100;

n=m%10;//个位

m=m/10;//十位

P1=0x70;

P2=number1[x];

Timer_1ms(5);

P1=0xb0;

P2=number1[y];

Timer_1ms(5);

P1=0xd0;

P2=number1[m];

Timer_1ms(5);

P1=0xe0;

P2=number1[n];

Timer_1ms(5);

undis_second();

}

//对month变量通过除法、取余运算得到十位、个位的数值,并送到对应的数码管上

voiddis_month()

{

x=month/10;

y=month%10;

P1=0x70;

P2=number1[x];

Timer_1ms(5);

P1=0xb0;

P2=number1[y];

Timer_1ms(5);

}

//对day变量通过除法、取余运算得到十位、个位的数值,并送到对应的数码管上

voiddis_day()

{

x=day/10;

y=day%10;

P1=0xd0;

P2=number1[x];

Timer_1ms(5);

P1=0xe0;

P2=number1[y];

Timer_1ms(5);

undis_second();

}

//对hour变量通过除法、取余运算得到十位、个位的数值,并送到对应的数码管上

voiddis_hour()

{

x=hour/10;

y=hour%10;

P1=0x70;

P2=number1[x];

Timer_1ms(5);

P1=0xb0;

P2=number3[y];

Timer_1ms(5);

}

//对minute变量通过除法、取余运算得到十位、个位的数值,并送到对应的数码管上

voiddis_minute()

{

uintx,y;

x=minute/10;

y=minute%10;

P1=0xd0;

P2=number1[x];

Timer_1ms(5);

P1=0xe0;

P2=number1[y];

Timer_1ms(5);

}

//对second变量通过除法、取余运算得到十位、个位的数值,并送到对应的数码管上

voiddis_second()

{

x=second/10;

y=second%10;

SCON=0x00;

es=0;

SBUF=number2[x];

while(!

TI){}

TI=0;

SBUF=number2[y];

while(!

TI){}

TI=0;

es=1;

}

//将0x00送到显示秒的数码管上,让这两个数码管不显示

voidundis_second()

{

SCON=0x00;

es=0;

SBUF=0x00;

while(!

TI){}

TI=0;

SBUF=0x00;

while(!

TI){}

TI=0;

es=1;

}

//时间设置函数,K12对变量加1K13实现变量切换(使用goto语句)K14对变量减1

voidset_timer()

{

TR0=0;//关闭定时器0

do

{

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

{

dis_year();

undis_second();

Timer_1ms(5);

}

Set_Init_8255();

switch(PB8255)

{

case0xEF:

year++;break;//PB=0xEF,K12键按下year加1

case0xBF:

year--;break;//PB=0xEF,K14键按下year减1

case0xDF:

gotomonth;break;//PB=0xDF,K13键按下切换到设置月程序

}

}while

(1);

month:

do

{

if(month==13)//判断进位

{

month=1;

}

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

{

dis_month();

dis_day();

undis_second();

}

Set_Init_8255();

switch(PB8255)

{

case0xEF:

month++;break;//PB=0xEF,K12键按下month加1

case0xBF:

month--;break;//PB=0xEF,K14键按下month减1

case0xDF:

gotoday;break;//PB=0xDF,K13键按下切换到设置日程序

}

}while

(1);

day:

do

{

if(day==31)//判断进位

{

day=1;

}

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

{

dis_month();

dis_day();

undis_second();

}

Set_Init_8255();

switch(PB8255)

{

case0xEF:

day++;break;//PB=0xEF,K12键按下day加1

case0xBF:

day--;break;//PB=0xEF,K14键按下day减1

case0xDF:

gotohour;break;//PB=0xDF,K13键按下,切换到设置时程序

}

}while

(1);

hour:

do

{

if(hour==24)//判断进位

{

hour=0;

}

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

{

dis_hour();

dis_minute();

dis_second();

}

Set_Init_8255();

switch(PB8255)

{

case0xEF:

hour++;break;//PB=0xEF,K12键按下hour加1

case0xBF:

hour--;break;//PB=0xEF,K14键按下hour减1

case0xDF:

gotominute;break;//PB=0xDF,K13键按下切换到设置分程序

}

}while

(1);

minute:

do

{

if(minute==60)//判断进位

{

minute=0;

}

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

{

dis_hour();

dis_minute();

dis_second();

}

Set_Init_8255();

switch(PB8255)

{

case0xEF:

minute++;break;//PB=0xEF,K12键按下minute加1

case0xBF:

minute--;break;//PB=0xEF,K14键按下minute减1

}

if(P3_2==0)//K16键按下P3_2=0返回

{

gotoback;

}

}while

(1);

back:

TR0=1;//开启定时器0

}

//在显示计时状态下,按下K14键时显示日期,计时仍进行

voiddis_day2()

{

for(;k<

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2