基于AT89S51单片机的多功能电子万年历的设计Word文档格式.docx
- 文档编号:17061801
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:39
- 大小:73.90KB
基于AT89S51单片机的多功能电子万年历的设计Word文档格式.docx
《基于AT89S51单片机的多功能电子万年历的设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于AT89S51单片机的多功能电子万年历的设计Word文档格式.docx(39页珍藏版)》请在冰豆网上搜索。
P0.6/AD6
RST
P0.7/AD7
P2.0/A8
P2.1/A9
PSEN
P2.2/A10
P2.3/A11
ALE
P2.4/A12
EA
P2.5/A13
P2.6/A14
P2.7/A15
P1.0/T2
P3.0/RXD
P1.1/T2EX
P3.1/TXD
P1.2
P3.2/INT0
P3.3/INT1
P1.3
P1.4
P3.4/T0
P1.5
P3.5/T1
P1.6
P3.6/WR
P1.7
P3.7/RD
AT89C52
19
18
9
4
6
8
1
2
29_
30
31_
_11
_12
233
J5
17
三、硬件系统设计:
1、硬件原理图:
DNG
LM016L
X2
22pF
X1
+5V
A
n*
I0—1
U2
VCC1
VCC2
SCLK
I/O
5
3
123
XTAL1
P0.0/AD0
P0.1/AD1
P0.2/AD2
XTAL2
P2.1/A9
PSEN
P1.0
P3.0/RXD
P1.1
P3.1/TXD
P1.2
P3.2/rNT0
P1.3
P3.3/rNTT
P1.4
P1.5
P1.6
P3.6/WR
P1.7
P3.7/RD
29
30—k
21—22--23n
~25F
—27
-28
10
07
36
35
-34
32
39
V5+
flo—上工»
flo—
R-
U3
VCC
DQ
GND••
DS18B20
P0口作为6位液晶显示电路的驱动接口,这是由于P0口
它的驱动能力强,故只需外接上拉电阻便可以把LED数码
,在单片机进行动态扫描的时候不会8位LED数码管的,由一个8位的I/O口
图3硬件原理
2、硬件原理:
在硬件电路中采用输出驱动电路工作处于开漏状态管点亮。
因为共阴的LED数码管它的驱动电流是分开的影响彼此的电流,故该电路中的8位LED数码管均用共阳阴极的数码管。
位选线分别由相应的P2.0〜P2.5控制,而将其相应的段选线并联在一起控制,即P0口。
P3口与八个校时按键相连,以成功实现万年历校时的功能。
四、系统软件设计:
1、程序流程框图:
2、年调整程序流程图,
图4程序流程框图
月、日调整程序流程图类似。
图5年调整程序流程图
3、源程序代码:
#include<
REG51.H>
温度传送数据IO口
0//
intrins.h>
Command
//#include"
LCD1602.h"
voidshow_time();
//液晶
#defineLCD_DATA
DS1302.h"
显示程序
1//Data
#defineuintunsignedint
/***********1602液晶显
#define
#defineucharunsignedchar
示部分子程序
LCD_CLEAR_SCREEN
char
****************/
0x01//清屏
hide_sec,hide_min,hide_hour
#defineLCD_HOMING
hide_day,hide_week,hide_m
0x02//光
onth,hide_year;
//秒,分,时
//Port
标返回原点
到日,月,年位闪的计数
Definitions**************
voidLCD_Write(bitstyle,
***********************
unsignedcharinput)
done,count,temp,flag,Up_Ke
*********************
{
y_flag,down_flag;
sbitLcdRs=P2人5;
LcdEn=0;
uchartemp_value;
//
sbitLcdRw=P2人6;
LcdRs=style;
温度值
sbitLcdEn=P2人7;
LcdRw=0;
uchar
sfrDBPort=0x80;
_nop_();
TempBuffer[5],week_value[
//P0=0x80,P1=0x90,P2
DBPort=input;
2];
=0xA0,P3=0xB0.数据端口
//注意顺序
内部等待函数
LcdEn=1;
sbitDS1302_CLK=PIT;
//实时时钟时钟线引脚
sbitDS1302_IO=P1人6;
*****
LCD_Wait();
//实时时钟数据线引脚
unsignedchar
}
sbitDS1302_RST=P1^5;
LCD_Wait(void)
//实时时钟复位线引脚
//设置显示模式
sbitportOI=P3人0;
LcdRs=0;
sbitport02=P3人1;
LcdRw=1;
sbitport03=P3人2;
//延时一个时
**************
sbitport04=P3人3;
钟周期
#defineLCD_SHOW
sbitACC0=ACCS;
_nop_();
0x04//显示开
sbitACC7=ACC^7;
#defineLCD_HIDE
sbitSet_Key=P2人0;
0x00//显示关
//模式切换键
sbitUp_Key=P2"
;
returnDBPort;
//加法按钮
#defineLCD_CURSOR
sbitDown_Key=P2人2;
//向LCD写入命令或数据
0x02//显示光
//减法按钮
标
sbitout_Key_Key=P2人3;
#defineLCD_NO_CURSOR
//立刻跳出调整模式按钮
0x00//无光标
sbitDQ=P19//
#defineLCD_COMMAND
#defineLCD_FLASH
0x01//光标闪
闪动voidvoidLCD_Initial()
LCD_Write(LCD_CO
MMAND,0x38);
//8位数据端口,2行显示,5*7点阵
while(*str!
='
\0'
)
LCD_Write(LCD_DAT
A,*str);
str++;
LCD_Set_KeyDisplay(unsignedcharDisplayMode){
LCD_Write(LCD_COMMAND,0x08|DisplayMode);
LCD_Write(LCD_COMMAND,0x38);
LCD_Set_KeyDisplay(LCD_SHOW|LCD_NO_CURSOR);
//开启显示,无光标
//设置输入模
幵**卄*卄**卄*卄*卄*卄*
LCD_AC_UP_KEY
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);
//清屏
LCD_Set_KeyInput(LCD_AC_UP_KEY|LCD_NO_MOVE);
//AC递增,画面不动
/***********DS1302
部分子
******************/
typedef
__SYSTEMTIME
0x02
LCD_AC_DOWN
0x00
//
default
//液晶字符输入的位置
时钟
序
struct
unsignedcharSecond;
unsignedcharMinute;
unsignedcharHour;
unsignedcharWeek;
unsignedcharDay;
unsignedcharMonth;
#defineLCD_MOVE
voidGotoXY(unsignedchar
Year;
0x01//画
x,unsignedchary)
unsigned
面可平移
DateString[11];
#defineLCD_NO_MOVE
if(y==0)
TimeString[9];
//default
}SYSTEMTIME;
//定义的
MMAND,0x80|x);
时间类型
void
if(y==1)
SYSTEMTIME
LCD_Set_KeyInput(unsigne
CurrentTime;
dcharInputMode)
MMAND,0x80|(x-0x40));
#defineAM(X)
X
MMAND,0x04|InputMode);
#definePM(X)
(X+12)
//将字符输出到液晶显示
//转成24小时制
#defineDS1302_
SECOND
//初始化
Print(unsighttp:
//www.shenn
0x80
//时钟
LCD*******************
nedchar*str)
芯片的寄存器位置
存放时
//相
#defineDS1302_MINUTE
0x82
#defineDS1302_HOUR
0x84
#defineDS1302_WEEK
0x8A
#defineDS1302_DAY
0x86
#defineDS1302_MONTH0x88
#defineDS1302_YEAR
0x8Cvoid
DS1302InputByte(unsignedchard)//实时时钟写入一字节(内部函数){
unsignedchari;
ACC=d;
for(i=8;
i>
0;
i--){
DS1302_IO
ACC0;
当于汇编中的RRC
DS1302_CLK=1;
DS1302_CLK=0;
ACC=ACC>
>
1;
DS1302OutputByte(void)//实时时钟读取一字节(内部函数)
for(i=8;
i--)
1;
//相当于汇编中的RRC
ACC7
DS1302_IO;
}return(ACC);
voidWrite1302(unsignedcharucAddr,unsignedcharucDa)//ucAddr:
DS1302地址,ucData:
要写的数据{
DS1302_RST=0;
DS1302_RST=1;
DS1302InputByte(ucAddr);
//地址,命令
DS1302InputByte(ucDa);
//写1Byte数据DS1302_CLK=1;
DS1302_RST=0;
Read1302(unsigneducAddr)//读取DS1302某地址的数据
unsignedcharucData;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr|0x
01);
//地址,命令ucData
DS1302OutputByte();
//读1Byte数据DS1302_CLK=1;
return(ucData);
voidDS1302_GetTime(SYSTEMTIME*Time)//获取时钟芯片的时钟数据到自定义的结构型数组{
ReadValue;
ReadValueRead1302(DS1302_SECOND);
Time->
Second((ReadValue&
0x70)>
4)*10+(ReadValue&
0x0F);
ReadValueRead1302(DS1302_MINUTE);
Minute((ReadValue&
ReadValue
Read1302(DS1302_HOUR);
Hour((ReadValue&
4)*10
+(ReadValue&
Read1302(DS1302_DAY);
Day((ReadValue&
Read1302(DS1302_WEEK);
Week((ReadValue&
ReadValueRead1302(DS1302_MONTH);
Month((ReadValue&
Read1302(DS1302_YEAR);
Year((ReadValue&
}
DateString[5]=Time->
Month/10+'
0'
DateString[6]
=Time->
Month%10+'
else
DateString[10]='
//字符串末尾加'
判断结束字符}
DateToStr(SYSTEMTIME*Time)//将时间年,月,
日,星期数据转换成液晶显示字符串,放到数组里DateString[]
{if(hide_year<
2)//这里的if,else语句都是判断位闪烁,<
2显示数据,>
2就不显示,输出字符串为2007/07/22
DateString[0]
='
2'
DateString[1]
DateString[5]='
'
DateString[6]='
DateString[7]
if(hide_day<
2)
DateString[8]=Time->
Day/10+'
DateString[9]=Time->
Day%10+'
{voidTimeToStr(SYSTEMTIME*Time)//将时,分,秒数据转换成液晶显示字符放到数组TimeString[];
{if(hide_hour<
TimeString[0]=Time->
Hour/10+'
TimeString[1]
Hour%10+'
TimeString[0]='
DateString[2]=Time->
Year/10+'
DateString[3]=Time->
Year%10+'
DateString[0]='
DateString[1]='
DateString[2]='
DateString[3]='
DateString[4]
DateString[8]='
DateString[9]
}if(hide_week<
2){
week_value[0]=Time->
Week%10+'
//星期的数据另外放到week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示
week_value[0]Time->
TimeString[1]='
TimeString[2]
if(hide_min<
TimeString[3]=Time->
Minute/10+'
TimeString[4]=Time->
Minute%10+'
TimeString[3]='
TimeString[4]='
TimeString[5]
if(hide_month<
week_value[1]='
if(hide_sec<
TimeString[6]=Time->
Second/10+'
TimeString[7]=Time->
Second%10+'
/***********ds18b20
**/
子程
ReadOneChar(void)
TimeString[6]='
TimeString[7]='
DateString[8]
'
//时钟芯片初始化
unsignedcharSecond=Read1302(DS1302_SECOND);
if(Second&
0x80)//判断时钟芯片是否关闭
Initial_DS1302(void)
Write1302(0x8e,0x00);
//写入允许
Write1302(0x8c,0x07);
//以下写入初始化时间日
期:
07/07/25.星期:
3.时间:
23:
59:
55
Write1302(0x88,0x07);
Write1302(0x86,0x25);
Write1302(0x8a,0x07);
Write1302(0x84,0x23);
Write1302(0x82,0x59);
Write1302(0x80,0x55);
Write1302(0x8e,0x80);
//禁止写入
/***********ds18b20子函数(晶振12MHz)
***
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 AT89S51 单片机 多功能 电子 万年历 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)