8051单片机电子时钟设计.docx
- 文档编号:8261437
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:25
- 大小:349.36KB
8051单片机电子时钟设计.docx
《8051单片机电子时钟设计.docx》由会员分享,可在线阅读,更多相关《8051单片机电子时钟设计.docx(25页珍藏版)》请在冰豆网上搜索。
8051单片机电子时钟设计
单片机原理及应用综合实训报告
题目:
电子时钟的设计
院别:
自动化学院
专业:
电气工程及其自动化1
姓名:
笑嘻嘻
学号:
2009104143036
指导教师:
祁伟
答辩日期:
2011年9月19日
电子时钟制作
摘要
本实训借用实验板的MCS—51单片机定时、中断功能完成电子时钟的定时工作,应用8051对单片机I/O口驱动发光二极管、LED进行电子时钟时、分、秒显示。
应用8051P3口、8255B口完成时间的设定工作。
利用P1口加入华彩设计,如发光二极管按键指示、时钟报时等。
再根据电子时钟实际应用完成系统总体设计。
,根据系统总体设计完成编程设计工作,最后通电、软件调试、运行。
关键词:
电子时钟;8051;8051P3;8255B
目录
1电子时钟的概述1
2电子时钟的硬件电路设计1
2.1选用单片机2
2.2发光二极管8字数码管的显示3
2.3单片机I/O口扩展4
2.4独立式按键5
3电子时钟软件设计部分6
3.1程序流程图6
3.2定时中断服务程序流程图8
3.3扩展功能程序流程8
4电子时钟实用说明9
4心得体会9
5附录10
程序代码10
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所示。
图3
图2
图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所示。
图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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 8051 单片机 电子 时钟 设计