基于51的电子闹钟设计报告附原理图PCB图程序.docx

上传人:b****5 文档编号:7816767 上传时间:2023-01-26 格式:DOCX 页数:44 大小:1.04MB
下载 相关 举报
基于51的电子闹钟设计报告附原理图PCB图程序.docx_第1页
第1页 / 共44页
基于51的电子闹钟设计报告附原理图PCB图程序.docx_第2页
第2页 / 共44页
基于51的电子闹钟设计报告附原理图PCB图程序.docx_第3页
第3页 / 共44页
基于51的电子闹钟设计报告附原理图PCB图程序.docx_第4页
第4页 / 共44页
基于51的电子闹钟设计报告附原理图PCB图程序.docx_第5页
第5页 / 共44页
点击查看更多>>
下载资源
资源描述

基于51的电子闹钟设计报告附原理图PCB图程序.docx

《基于51的电子闹钟设计报告附原理图PCB图程序.docx》由会员分享,可在线阅读,更多相关《基于51的电子闹钟设计报告附原理图PCB图程序.docx(44页珍藏版)》请在冰豆网上搜索。

基于51的电子闹钟设计报告附原理图PCB图程序.docx

基于51的电子闹钟设计报告附原理图PCB图程序

成都信息工程学院

第五届嵌入式创新技术大赛

 

基于MCS51的智能电子闹钟

设计报告

 

姓名

学院

班级

实物图

1.电子时钟的设计原理和方法

1.1设计原理

1.2硬件电路的设计

1.2.1STC89C51RC简介

STC89C51RC是一种带8K闪烁可编程可擦除只读存储器(FPETOM-FlashProgrammabalandErasableReadOnlyMemory)的低电压、高性能CMOS8位微型处理器,即单片机芯片。

单片机的可擦除只读存储器可以反复擦除1000次,内部FLASH擦写次数为100000次以上。

该芯片使用高密度非易失存储制造技术,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器集成在单个芯片中,使得STC89C51RC成为了一种性价比极高的微型处理器芯片,在许多电路设计中都得到了应用。

STC89C51RC单片机特点:

工作电压:

5.5V-3.4V工作频率:

0-40MHz用户应用程序空间:

8K片上集成128*8RAMISP(在系统可编程)/IAP(在应用可编程),无需专用编程器/仿真器可通过串口(P3.0/P3.1)直接下载用户程序EEPROM功能共3个16位定时器/计数器,其中定时0还可以当成2个8位定时器使用外部中断4路通用异步串行口(UART),还可用定时器软件实现多个UART工作温度范围:

0-75℃引脚说明:

VCC:

供电电压

GND:

接地

P0:

P0是一个8位漏级开路双向I/O口,低8位地址复用总线端口。

P1:

P1是一个内部提供上拉电阻的8位双向I/O口,静态通用端口。

P2:

P2是一个内部提供上拉电阻的8位双向I/O口,高8位地址总线动态端口。

P3:

P3是一个内部提供上拉电阻的8位双向I/O口,双功能静态端口。

P3口也可作为一些特殊功能口。

P3.0RXD(串行输入口)P3.1TXD(串行输出口)。

RST:

复位自输入。

XTAL1/XTAL2:

反向振荡器的输入与输出。

1.2.2键盘电路的设计

键盘采用四个个独立按键配以实现对时钟和闹钟的设定及修改。

按键未按下时,IO口为高电平,按键按下后IO口被拉低。

1.2.3蜂鸣器驱动电路

发音部分是通过三极管放大驱动蜂鸣器工作,当IO口输出低电平时,三极管导通,蜂鸣器响。

1.2.4数码管驱动电路

由于点亮数码管所需电流较大,对单片机IO口连接上拉电阻,提高IO口的电流输出能力。

1.2.5电源电路

由于系统需要在7~12V的供电下正常工作,故采用了78M05三段稳压芯片。

78M05能将7~35V的直流电源转换成5V直流电压。

1.3软件部分的设计

1.3.1主程序部分的设计

程序部分主要采用了程序结构的模块化设计,避免了一些函数的不必要的重复书写,使程序变得单间易懂。

程序在执行时,主程序要须通过调用子函数就可完成相应的功能。

1.3.2中断计时器及时间进位

数字电子钟设计中主要使用定时器T0中断ET0,利用ET0中断进行计时时间的自增,从而实现计时功能。

STC89C51RC有两个通用定时/计数器。

两者均可配置为定时器或事件计数器。

另外增加了定时器T0/T1,溢出时T0/T1脚自动翻转的功能选项。

用作“定时器”功能时,每经过一个机器周期,寄存器值加1。

用作“计数器”功能时,寄存器在对应的外部输入管脚T0/T1上每发生一次1到0的跳变时加1。

使用该功能时,外部输入每个机器周期被采样一次。

设计中采用了中断方式1作为定时中断,其定时计数初值的设置可由以下公式计算得到。

1.3.3闹钟子函数

闹钟时间的判别主要是通过设定时间与实时时间对逐位对比确定是否进行闹铃。

1.3.4按键扫描

这些函数主要是判断是否有按键按下,并根据相应按键按下的情况调用相关函数执行。

1.3.5时钟闹钟设置

此部分主要是通过判断flag_sw、flag_set在不同值时通过调用加1、减1子函数对时间和闹钟进行设置。

1.3.6显示数字函数

函数通过判断需要显示的数字及显示的位置进行相应显示。

1.3.7显示界面函数

函数通过判断标志位flag_sw判断需要显示的界面。

1.3.8闹钟记录及读取

STC89C51RC单片机内部集成了的EEPROM是与程序空间是分开的,利用ISP/IAP技术可将内部DataFlash当EEPROM,擦写次数在10万次以上。

EEPROM可分为若干个扇区,每个扇区包含512字节。

使用时,建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同的扇区,不一定要用满。

数据存储器的擦除操作是按扇区进行的。

EEPROM可用于保存一些需要在应用过程中修改并且掉电不丢失的参数数据。

在用户程序中,可以对EEPROM进行字节读/字节编程/扇区擦除操作。

IAP及EEPROM新增特殊功能寄存器介绍

符号

描述

地址

位地址及符号

MSBLSB

复位值

ISP_DATA

ISP/IAPFlashDataRegister

E2H

11111111B

ISP_ADDRH

ISP/IAPFlashAddressHigh

E3H

00000000B

ISP_ADDRL

ISP/IAPFlashAddressLow

E4H

00000000B

ISP_CMD

ISP/IAPFlashCommandRegister

E5H

------MS1MS0

xxxxxx00B

ISP_TRIG

ISP/IAPFlashCommandTrigger

E6H

xxxxxxxxB

ISP_CONTR

ISP/IAPControlRegister

E7H

ISPENSWBSSWRST--WT2WT1WT0

000xx000B

1.ISP/IAP数据寄存器ISP_DATA

ISP_DATA:

ISP/IAP操作时的数据寄存器。

ISP/IAP从Flash读出的数据放在此处,向Flash写的数据也需放在此处

2.ISP/IAP地址寄存器ISP_ADDRH和ISP_ADDRL

ISP_ADDRH:

ISP/IAP操作时的地址寄存器高八位。

该寄存器地址为E3H,复位后值为00H.

ISP_ADDRL:

ISP/IAP操作时的地址寄存器低八位。

该寄存器地址为E4H,复位后值为00H.

3.ISP/IAP命令寄存器ISP_CMD

ISP/IAP命令寄存器IAP_CMD格式如下:

SFRname

Address

bit

B7

B6

B5

B4

B3

B2

B1

B0

ISP_CMD

E5H

name

-

-

-

-

-

-

MS1

MS0

MS2

MS1

MS0

命令/操作模式选择

0

0

0

Standby待机模式,无ISP操作

0

0

1

从用户的应用程序区对"DataFlash/EEPROM区"进行字节读

0

1

0

从用户的应用程序区对"DataFlash/EEPROM区"进行字节编程

0

1

1

从用户的应用程序区对"DataFlash/EEPROM区"进行扇区擦除

程序在系统ISP程序区时可以对用户应用程序区/数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除;程序在用户应用程序区时,仅可以对数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除。

已经固化有ISP引导码,并设置为上电复位进入ISP

4.ISP/IA命令触发寄存器ISP_TRIG

ISP_TRIG:

ISP/IAP操作时的命令触发寄存器。

在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,再写入B9h,ISP/IAP命令才会生效。

ISP/IAP操作完成后,ISP地址高八位寄存器ISP_ADDRH、ISP地址低八位寄存器ISP_ADDRL和ISP命令寄存器ISP_CMD的内容不变。

如果接下来要对下一个地址的数据进行ISP/IAP操作,需手动将该地址的高8位和低8位分别写入ISP_ADDRH和ISP_ADDRL寄存器。

每次ISP操作时,都要对ISP_TRIG先写入46H,再写入B9H,ISP/IAP命令才会生效。

5.ISP/IAP命令寄存器ISP_CONTR

ISP/IAP控制寄存器IAP_CONTR格式如下:

SFRname

Address

bit

B7

B6

B5

B4

B3

B2

B1

B0

IAP_CONTR

E7H

name

ISPEN

SWBS

SWRST

-

-

WT2

WT2

WT0

ISPEN:

ISP/IAP功能允许位。

0:

禁止IAP/ISP读/写/擦除DataFlash/EEPROM

1:

允许IAP/ISP读/写/擦除DataFlash/EEPROM

SWBS:

软件选择从用户应用程序区启动(送0),还是从系统ISP监控程序区启动(送1)。

要与SWRST直接配合才可以实现

SWRST:

0:

不操作;1:

产生软件系统复位,硬件自动复位。

设置等待时间

CPU等待时间(机器周期),(1个机器周期=12个CPU工作时钟)

WT2

WT1

WT0

Read/读

Program/编程

(=72uS)

SectorErase

扇区擦除

(=13.1304ms)

RecommendedSystemClock

跟等待参数对应的推荐系统时钟

0

1

1

6个机器周期

30个机器周期

5471个机器周期

5MHz

0

1

0

11个机器周期

60个机器周期

10942个机器周期

10MHz

0

0

1

22个机器周期

120个机器周期

21885个机器周期

20MHz

0

0

0

43个机器周期

240个机器周期

43769个机器周期

40MHz

STC89C51RC/RD+系列单片机EEPROM空间大小及地址

STC89C51RC/RD+系列单片机内部可用EEPROM的地址与程序空间是分开的:

程序在用户应用程序区时,可以对EEPROM行IAP/ISP操作。

具体某个型号单片机内部EEPROM大小及详细地址请参阅:

1.STC89C51RC/RD+系列单片机内部EEPROM详细地址表

2.STC89C51RC/RD+系列单片机内部EEPROM空间大小选型一览表

 

STC89C51RC系列单片机内部EEPROM详细地址表

具体某型号有多少扇区的EEPROM,参照前面的EEPROM空间大小选型一览表,每个扇区0.5K字节

第一扇区

第二扇区

第三扇区

第四扇区

起始地址

结束地址

起始地址

结束地址

起始地址

结束地址

起始地址

结束地址

2000h

21FFh

2200h

23FFh

2400h

25FFh

2600h

27FFh

第五扇区

第六扇区

第七扇区

第八扇区

起始地址

结束地址

起始地址

结束地址

起始地址

结束地址

起始地址

结束地址

2800h

29FFh

2A00h

2BFFh

2C00h

2DFFh

2E00h

2FFFh

每个扇区512字节,建议同一次修改的数据放在同一扇区,不是同一次修改的数据放在不同的扇区,不必用满,当然可全用。

2.硬件调试

PCB制作完成后,为检测其能否正常工作,我编写了将数码管全部点亮,蜂鸣器控制口置低电平的程序。

发现如下问题:

1.某一数码管右侧的所有数码管的相同段不亮;

2.数码管的小数点全部不亮;

3.蜂鸣器负极直接单片机IO口,蜂鸣器声音微小。

经检查后发现原因如下:

1.数码管板底层走线较细,钻孔时被打断,由于两块PCB已焊接到一起,拆解修补困难,故在数码管板顶层直接飞线;

2.PCB布局失误,使得固定螺丝与排孔引脚接错,而螺丝接地,使得该线路与GND短路;

3.单片机灌电流过小,使得电流无法驱动蜂鸣器,再加上三极管扩流后,问题得到了解决。

附录A:

电路原理图

附录B:

电路PCB图

附录C:

源程序

#include

#include

#definedp10

charsec,min,h,date=1,mon=1,year=12;

charh_ala=0,min_ala=1,sw_ala=1;

charflag_set,flag_sw;

charcount;

sbitnum1=P0^0;

sbitnum2=P0^4;

sbitnum3=P2^7;

sbitnum4=P2^3;

sbitnum5=P2^0;

sbitnum6=P2^1;

sbitbell=P2^2;

sbitkey_set=P3^0;

sbitkey_sw=P3^1;

sbitkey_l=P3^2;

sbitkey_down=P3^3;

sbitkey_ok=P3^4;

sbitkey_up=P3^5;

sbitkey_r=P3^6;

voidDelay(unsignedintz);

voiddisplay_num(charnum,charpo);

voiddisplay_sec(void);

voiddisplay_min(void);

voiddisplay_h(void);

voiddisplay_year(void);

voiddisplay_mon(void);

voiddisplay_date(void);

voiddisplay_time(void);

voiddisplay_dates(void);

voiddisplay_h_ala(void);

voiddisplay_min_ala(void);

voiddisplay_sw_ala(void);

voiddisplay_alarm(void);

voiddisplay(void);

voidcarry(void);

voidkey_swscan(void);

voidkey_setscan(void);

voidset(void);

voidalarm(void);

voidInitTimer0(void);

 

#defineRdCommand0x01//定义ISP的操作命令

#definePrgCommand0x02

#defineEraseCommand0x03

#defineError1

#defineOk0

#defineWaitTime0x01//定义CPU等待时间

sfrISP_DATA=0xe2;

sfrISP_ADDRH=0xe3;

sfrISP_ADDRL=0xe4;

sfrISP_CMD=0xe5;

sfrISP_TRIG=0xe6;

sfrISP_CONTR=0xe7;

voidISP_IAP_enable(void);

voidISP_IAP_disable(void);

voidISPgoon(void);

unsignedcharbyte_read(unsignedintbyte_addr);

voidSectorErase(unsignedintsector_addr);

voidbyte_write(unsignedintbyte_addr,unsignedcharoriginal_data);

voidread_ala(void);

voidrecord_ala(void);

voidmain(void)

{

read_ala();//读取闹铃

InitTimer0();//定时器0初始化

while

(1)

{

carry();//进位

display();//显示

alarm();//闹钟

key_swscan();//切换界面按键扫描

key_setscan();//设置按键(改变设置标志位)扫描

if(flag_set!

=0)//设置标志位不为'0',开始设置

{

set();

}

}

}

//================延时函数================

voidDelay(unsignedintz)

{

unsignedintx,y;

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

for(y=120;y>0;y--);

}

//================显示数字================

voiddisplay_num(charnum,charpo)

{

unsignedcharcodeTab[]={0x77,0x14,0xB3,0xB6,0xD4,0xE6,0xE7,0x34,0xF7,0xF6,0x08};

if(!

(num==0&&(po==1||po==3||po==5))||(flag_sw==1&&po==1))

{

switch(po)

{

case1:

P1=Tab[num];

num1=0;

Delay

(1);

num1=1;

break;

case2:

P1=Tab[num];

num2=0;

Delay

(1);

num2=1;

break;

case3:

P1=Tab[num];

num3=0;

Delay

(1);

num3=1;

break;

case4:

P1=Tab[num];

num4=0;

Delay

(1);

num4=1;

break;

case5:

P1=Tab[num];

num5=0;

Delay

(1);

num5=1;

break;

default:

P1=Tab[num];

num6=0;

Delay

(1);

num6=1;

}

}

}

//================显示秒================

voiddisplay_sec(void)

{

if(flag_set==3&&count>10||flag_set!

=3)

{

display_num(sec/10,5);

display_num(sec%10,6);

}

}

//================显示分================

voiddisplay_min(void)

{

if(flag_set==2&&count>10||flag_set!

=2)

{

display_num(min/10,3);

display_num(min%10,4);

}

display_num(dp,4);

}

//================显示时================

voiddisplay_h(void)

{

if(flag_set==1&&count>10||flag_set!

=1)

{

display_num(h/10,1);

display_num(h%10,2);

}

display_num(dp,2);

}

//================显示日================

voiddisplay_date(void)

{

if(flag_set==3&&count>10||flag_set!

=3)

{

display_num(date/10,5);

display_num(date%10,6);

}

}

//================显示月================

voiddisplay_mon(void)

{

if(flag_set==2&&count>10||flag_set!

=2)

{

display_num(mon/10,3);

display_num(mon%10,4);

}

display_num(dp,4);

}

//================显示年================

voiddisplay_year(void)

{

if(flag_set==1&&count>10||flag_set!

=1)

{

display_num(year/10,1);

display_num(year%10,2);

}

display_num(dp,2);

}

//================显示时间================

voiddisplay_time(void)

{

display_sec();

display_min();

display_h();

}

//================显示日期================

voiddisplay_dates(void)

{

display_date();

display_mon();

display_year();

}

//================显示闹钟时================

voiddisplay_h_ala(void)

{

if(flag_set==1&&count>10||flag_set!

=1)

{

display_num(h_ala/10,1);

display_num(h_ala%10,2);

}

displ

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

当前位置:首页 > 农林牧渔 > 林学

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

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