基于51单片机的ds1302与LM016L液晶时钟设计

合集下载

基于51单片机DS1302LCD1602数字时钟显示

基于51单片机DS1302LCD1602数字时钟显示
delay(5);
}
void write_a_byte_tods1302(uchar x)
{
uchar i;
for(i=0;i<8;i++)
{
IO=x&0x01;
sclk=1;
sclk=0;
x=x>>1;
}
}
uchar get_a_byte_fromds1302()
{
uchar i,b=0x00;
for(i=0;i<8;i++)
dispaly_string(0x00,lcd_buffer1);
dispaly_string(0x40,lcd_buffer2);
}
}
strcpy(lcd_buffer1+13,week[datetime[5]]);
zhuanhuan(datetime[2],lcd_buffer2+5);
zhuanhuan(datetime[1],lcd_buffer2+8);
zhuanhuan(datetime[0],lcd_buffer2+11);
{
while((busy()&0x80)==0x80);
RW=0;
RS=1;
P0=dat;
EN=1;
delay(5);
EN=0;
}
void init()
{
writecmd(0x38);
delay(5);
writecmd(0x01);
delay(5);
writecmd(0x06);
delay(5);
writecmd(0x0c);
a[1]=d%10+'0';

基于51单片机的液晶时钟设计

基于51单片机的液晶时钟设计

基于51单片机的液晶时钟设计作者:苏杰来源:《价值工程》2017年第12期摘要:本设计是为中职学生在单片机课程学习中,加强理论知识的理解、提高动手操作能力、实现理论联系实际而开发的实习模块设计。

本设计是利用最基本的51系列单片机为控制核心,以数字时钟DS1302为时钟芯片,以基础的字符型液晶LCD1602为终端显示,以最简单的洞洞板为载体,以面向客户的C语言程序为控制手段,来实现电子时钟的显示、调整和自动计时。

Abstract: This design is developed for strengthening the understanding of theoretical knowledge, improving the ability to practice and integrating theory with practice of the MCU learning of the secondary vocational school students. This design takes the most basic 51 series microcontroller as the control core, takes DS1302 of digital clock as the clock chip, takes the character LCD1602 as the terminal display, takes the most simple pegboard as the carrier and takes the customer oriented C language program as a means of control to achieve the display, adjustment and automatic timing of the electronic clock.关键词:51单片机系统;洞洞板电路;C语言;电子时钟显示Key words:51 SCM system;pegboard circuit;C program;electronic clock display中图分类号:TN141.9 文献标识码:A 文章编号:1006-4311(2017)12-0101-020 引言近年来,单片机应用技术课程已经广泛进入到了我国中等职业教育的电气自动化、电工电子等相关专业的专业课程当中。

51单片机数码管时钟电路的设计

51单片机数码管时钟电路的设计

51单片机数码管时钟电路的设计设计一个51单片机数码管时钟电路,让我们开始吧。

一、设计思路该数码管时钟电路的设计主要包括以下几个方面:1.使用DS1302时钟芯片获取真实时间;2.使用I2C总线方式将DS1302时钟芯片与51单片机连接;3.使用74HC595芯片驱动数码管显示;4.使用按键控制时钟的设置和调节;5.使用蜂鸣器发出报警声;6.使用LED指示灯显示时钟状态。

二、硬件设计部分数码管显示部分:1.使用4位共阳数码管作为时分显示器,使用1位共阳数码管作为秒显示器;2.使用8片74HC595芯片级联起来,将时分秒数据传输到数码管显示;3.设置共阳数码管的通阳管为P0口,设置74HC595的DS(串行数据输入)、SH(上升沿锁存)、STCP(74HC595的8位锁存输出)引脚接到P1.2、P1.3、P1.4端口;4.设置8个控制引脚接到P1.5~P1.12端口。

实时时钟部分:1.使用DS1302时钟芯片连接到P2.0、P2.1、P2.2、P2.3、P2.4、P2.5、P2.6、P2.7端口;2.设置时钟复位引脚接到P0.1端口,时钟传输使能引脚接到P0.2端口。

按键输入部分:1.设置按键S1接到P3.2端口,按键S2接到P3.3端口;2.设置按键的上拉电阻,使其处于高电平状态;3.设置按键的下降沿触发外部中断,以便检测按键的按下事件。

其他部分:1.设置蜂鸣器接到P0.0端口,并使用普通电阻限流;2.设置LED指示灯接到P0.7端口。

三、软件设计部分1.初始化函数:初始化P0、P1、P2、P3口的状态;2.DS1302驱动函数:包括初始化DS1302芯片和读写DS1302寄存器的函数;3.74HC595驱动函数:包括初始化74HC595芯片,以及向74HC595芯片发送8位数据的函数;4.数码管显示函数:将时分秒数据按位转换为对应的数字和状态,并调用74HC595驱动函数显示;5.按键检测函数:检测按键的按下事件,并根据按键事件的不同触发不同的操作;6.报警函数:当设定时间到达时,将触发报警声,并控制LED灯闪烁;7.主函数:循环读取DS1302时间,并更新数码管显示,检测按键事件,触发报警。

51单片机万年历实验DS1302可按键设置时钟

51单片机万年历实验DS1302可按键设置时钟

*选择设置加 1。
* 注意

*******************************************************************************
/
#include<reg51.h> #include"lcd.h" #include"ds1302.h"
sbit K1=P3^1; sbit K2=P3^0; sbit K3=P3^2; sbit K4=P3^3;
LcdInit();
Ds1302Init();
while(1)
{
if(SetState==0)
{
Ds1302ReadTime();
}
else
{ if(K1==0)
//检测按键 K1 是否按下
{ Delay10ms(); //消除抖动
if(K1==0)
{
SetPlace++;
if(SetPlace>=7)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////以下是 主文件 main.c 的内容
void Int0Configuration();
void LcdDisplay();
unsigned char SetState,SetPlace; void Delay10ms(void); //误差 0us
/******************************************************************************

基于51单片机DS1302LCD1602数字时钟显示

基于51单片机DS1302LCD1602数字时钟显示
#include <reg51.h>
#include <intrins.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]="I LIKE MCU!";
sbit RS=P2^0;
dispaly_string(0x00,lcd_buffer1);
dispaly_string(0x40,lcd_buffer2);
}
}
delay(5);
}
void write_a_byte_tods1302(uchar x)
{
uchar i;
for(i=0;i<8;i++)
{
IO=x&0x01;
sclk=1;
sclk=0;
x=x>>1;
}
}
uchar get_a_byte_fromds1302()
{
uchar i,b=0x00;
for(i=0;i<8;i++)
uchar lcd_buffer2[]={"TIME 00:00:00 "};
uchar datetime[7];
void delay(uchar ms)
{
uchar i;
while(ms--)
for(i=0;i<120;i++);
}
//忙检测
uchar busy()
{
uchar test;
RW=1;
{

51单片机DS1302日历时钟程序

51单片机DS1302日历时钟程序
v_W1302(0x88,0x01); //设置月
v_W1302(0x86,0x13); //设置日
v_W1302(0x84,0x18); //设置小时
v_W1302(0x82,0x05); //设置分
v_W1302(0x80,0x00); //启动晶振,设置秒
v_W1302(0x8e,0x80); //使能
v_W1302(0x80,second);
}
if(key0_count==2)
{
minute ++;
if(60==minute)
minute = 0;
write_add(0x40+7,minute);
v_W1302(0x82,minute);
}
if(key0_count==3)
{
hour ++;
if(24==hour)
uchar reverse(uchar c);
void keyscan();
void init();
void RTC_initial ();
void wr_1302(uchar wr_data);
uchar rd_1302(void);
uchar uc_R1302(uchar ucAddr);
void v_W1302(uchar ucAddr, uchar ucDa);
delay(1);
}
}
void RTC_initial ()
{
v_W1302(0x8e,0x00); //使能
v_W1302(0x80,0x80); //停止晶振
v_W1302(0x90,0x00); //关闭充电
v_W1302(0x8c,0x07); //设置年

基于单片机的DS1302时钟芯片液晶显示时钟汇编程序

;************由1602显示ds1302时钟*********************rs bit p1.2rw bit p1.3e bit p1.4dio bit p2.6clk bit p2.5rst bit p2.7miao equ 30h ;为秒,分,时,日,月,周,年,分配储存单元fen equ 31hshi equ 32hday equ 33hyue equ 34hzhou equ 35hnian equ 36hbcd equ 37h;bcdh equ 38h;bcdl equ 39hhex equ 40horg 0000hljmp startorg 0030h;****初始化时间为:12:00:00,11年03月16日,周三***start: ;mov sp,#60hmov shi,#15h ;初始化数据mov fen,#59hmov miao,#55hmov day,#10hmov yue,#3hmov zhou,#3hmov nian,#12h;lcall r_ram ;调用读1302数据的子程序;********************初始化lcd1602************************************* mov e,#0mov p2,#0f0h ;关数码管MOV P0,#01H ;清屏并光标复位LCALL WR_CODE ;调用写入命令子程序MOV P0,#02H ;光标回车LCALL WR_CODE ;调用写入命令子程序MOV P0,#038H ;5x7的点阵字符LCALL WR_CODE ;调用写入命令子程序LCALL WR_CODE ;调用写入命令子程序MOV P0,#0cH ;开显示,光标闪烁LCALL WR_CODE ;调用写入命令子程序lcall set1302 ;调用设置1302子程序lcall r_ram ;调用读1302数据的子程序lcall xianshimain: ;mov r5,#5 ;通过定时器来设定循环扫描读1302中的数据mov tmod,#01h ;用定时器0,方式一工作mov th0,#70h ;为定时器赋初值mov tl0,#00hsetb tr0lp1:jbc tf0,lp2 ;定时器溢出跳到lp2处并将tf0清零;ljmp lp1clr tr0lp2: mov th0,#70hmov tl0,#00hlcall r_ram ;调用读1302子程序lcall xianshi ;调用显示程序setb tr0;djnz r5,lp1;mov r5,#5ljmp lp1 ;构成循环; ljmp mainset1302:clr rstclr clknopnopsetb rst ;为读写做好时序准备mov b,#8eh ;写控制命令字地址lcall w_bit ;调用写字节指令mov b,#00h ;写操作前wp=0 ,数据lcall w_bit ;调用写字节指令setb clknopnopclr rst ;写完后禁止写mov r0,#miao ;内存中的秒首地址set_loop:clr rstclr clknopnopsetb rstmov b,r1 ;写入地址lcall w_bitmov a,@r0 ;写完地址写数据mov hex,alcall hex_bcd ;转换成bcd碼mov b,alcall w_bit ;写数据inc r0 ; 秒,分,时,日,月,年,星期inc r1inc r1 ;改变地址指针setb clkclr rstdjnz r7,set_loop ;循环写入7个数据clr rstclr clknopnopsetb rstmov b,#8eh ;写控制命令字地址lcall w_bitmov b,#80h ;wp=1,写保护lcall w_bitsetb clkclr rstret;*******写一个字的节子程序*************************** w_bit: mov r2,#08hw_loop: mov a,brrc amov b,amov dio,c ;sclk上升沿时写入数据setb clknopnopclr clkdjnz r2,w_loopr_bit: ; clr a; clr cmov r4,#08hr_loop: mov c,dio ;之前的下降沿已读出的数据赋予c rrc asetb clk ;上升沿,没用到nopnopclr clk ;下降沿读出djnz r4,r_loop ;循环读8次ret;**********读ram中的数据*************************r_ram: mov r0,#miaomov r1,#81hmov r7,#7rm_loop:clr rstclr clknopnopsetb rstmov b,r1lcall w_bit ;写入地址lcall r_bit ;读出相应地址中的时间mov @r0,a ;读出的时间数据保存在内存中inc r0inc r1inc r1setb clk;nop;nopclr rstdjnz r7,rm_loopretxianshi:;************显示固定符号data,time,: ,—等********************mov p0,#080h ;写地址lcall wr_codemov a,#'d' ;写数据lcall wr_datamov a,#'a'lcall wr_datamov p0,#082hlcall wr_codemov a,#'t'lcall wr_datamov p0,#083hlcall wr_codemov a,#'a'lcall wr_data ;以上显示datamov p0,#0c0hlcall wr_codemov a,#74hlcall wr_datamov p0,#0c1hlcall wr_codemov a,#69hlcall wr_datamov p0,#0c2hlcall wr_codemov a,#6dhlcall wr_datamov p0,#0c3hlcall wr_codemov a,#65hlcall wr_data ;以上显示timemov p0,#84hlcall wr_codemov a,#3ahlcall wr_datamov p0,#0c4hlcall wr_codemov a,#3ahlcall wr_datamov p0,#0c7hlcall wr_codemov a,#3ahlcall wr_datamov p0,#0cahlcall wr_codemov a,#3ahmov a,#2dhlcall wr_datamov p0,#08chlcall wr_codemov a,#2dhlcall wr_data ;以上显示—;***********以下显示:年,月,日等******************** mov p0,#085hlcall wr_codemov a,#32hlcall wr_datamov p0,#086hlcall wr_codemov a,#30hlcall wr_data ;以上是固定数据20mov bcd,nianlcall bcd_decmov p0,#087hlcall wr_codemov dptr,#tab;mov a,hexhlcall WRITE1mov p0,#088hlcall wr_codemov dptr,#tabmov a,blcall WRITE1 ;以上显示年mov bcd,yuelcall bcd_decmov p0,#08ahlcall wr_codemov dptr,#tab;mov a,bcdhlcall WRITE1mov p0,#08bhlcall wr_codemov dptr,#tabmov a,blcall WRITE1 ;以上显示月mov dptr,#tab;mov a,bcdhlcall WRITE1mov p0,#08ehlcall wr_codemov dptr,#tabmov a,blcall WRITE1 ;以上显示日mov bcd,shilcall bcd_decmov p0,#0c5hlcall wr_codemov dptr,#tab;mov a,bcdhlcall WRITE1mov p0,#0c6hlcall wr_codemov dptr,#tabmov a,blcall WRITE1 ;以上显示时mov bcd,fenlcall bcd_decmov p0,#0c8hlcall wr_codemov dptr,#tab;mov a,bcdhlcall WRITE1mov p0,#0c9hlcall wr_codemov dptr,#tabmov a,blcall WRITE1 ;以上显示分mov bcd,miao ;秒数值赋给bcd lcall bcd_decmov p0,#0cbhlcall wr_codemov dptr,#tablcall WRITE1mov p0,#0cchlcall wr_codelcall WRITE1 ;以上显示秒ret;*********************************************************************** ; 读取数据表并将数据写入子程序;*********************************************************************** WRITE1:MOVC A,@A+DPTR ;查表LCALL WR_DATARET;*********************************************************************** ; 写数据子程序;*********************************************************************** WR_DATA:MOV P0,ASETB RS ;RS=1CLR RW ;RW=0 ;准备写入数据CLR E ;E=0 ;执行显示命令LCALL BUSY ;判断液晶模块是否忙?SETB E ;E=1 ;显示完成,程序停车RET;*********************************************************************** ; 写命令子程序;*********************************************************************** WR_CODE:CLR RS ;写入控制命令的子程序CLR RWCLR ELCALL BUSYSETB ERET;*********************************************************************** ; 判断忙碌子程序;*********************************************************************** BUSY:MOV P0,#0FFH ;判断液晶显示器是否忙的子程序CLR RSSETB RWCLR ENOPSETB EJB P0.7,BUSY ;如果P1.7为高电平表示忙就循环等待RET;****************** HEX转BCD碼****************************da aret;***************BCD碼转dec*********************************bcd_dec:mov a,bcdmov b,#16div ab ;a中放置十位,b中放置个位; swap a; add a,bretTAB:DB 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h ;0到9END当我被上帝造出来时,上帝问我想在人间当一个怎样的人,我不假思索的说,我要做一个伟大的世人皆知的人。

51单片机_DS1302时钟芯片_共阴数码管_时钟实例【中为电子科技工作室.】

read_dat |= 0x80; rtcCK = 1; _nop_(); rtcCK = 0; _nop_(); } return read_dat; }
Page: 3
E:\Demo\Keil3\IS_EB51M_V100_DEMO\12时钟\ds1302.c
//================DS1302读数据函数================// uchar Ds1302Read(uchar read_addr) {
void Ds1302Write(uchar write_addr, uchar write_dat)
{
rtcCE = 0;
rtcCK = 0;
Ds1302WriteByte(write_addr);
//先写地址
Ds1302WriteByte(write_dat);
//再写数据
rtcCK = 0;
rtcCE = 0;
CkntDisplay(ckntSeg[hourL],ckntDig[2]); CkntDisplay(ckntSeg[hourH],ckntDig[3]); }
if(isSetHour == 1) {
blinkHour++; if(blinkHour < 250) {
CkntDisplay(ckntSeg[hourL],ckntDig[2]); CkntDisplay(ckntSeg[hourH],ckntDig[3]); } else if((blinkHour >= 250) && (blinkHour < 500)) { CkntDisplay(ckntSeg[hourL],ckntDig[4]); CkntDisplay(ckntSeg[hourH],ckntDig[4]); } else

单片机时钟芯片ds1302在lcd1602上显示年月日时分秒_图文

单片机时钟芯片ds1302在lcd1602上显示年月日时分秒_图文单片机设计实验内容摘要:单片机实验是通过Proteus仿真并且与Keil相结合使用控制单片机使其在仿真中完成一系列所设计的程序。

我们这个小组所做的实验是仿真一个数字时钟,通过DS1302这个芯片从计算机上读取时间信息,再由51单片机对数据进行处理、分配,将其输出在LCD1602上,实现简单的数字时钟的功能。

设计内容及要求:(1)根据设计课题的技术指标和给定条件,在教师指导下,能够独立而正确地进行方案论证和设计计算,要求概念清楚、方案合理、方法正确、步骤完整; (2)要求学生掌握单片机的设计内容、方法和步骤;(3)要求会查阅有关参考资料和手册等;(4)要求学会选择有关元件和参数;(5)要求学会绘制有关电路图和设计流程图;(6)要求学会编写设计说明书。

系统框图:硬件选择:1、AT89C51AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。

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

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

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

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

AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

AT89C51外形及引脚排列主要特性:?与MCS-51 兼容?4K字节可编程FLASH存储器?寿命:1000写/擦循环?数据保留时间:10年?全静态工作:0Hz-24MHz?三级程序存储器锁定?128×8位内部RAM?32可编程I/O线?两个16位定时器/计数器?5个中断源?可编程串行通道?低功耗的闲置和掉电模式?片内振荡器和时钟电路特性概述:AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。

基于ds1302的51单片机简易实时时钟-1602显示-源程序

==================主程序================= #include <reg51.h>。

#include "ds1302.h"#include "LCD1602.h"void change();uchar times[9];uchar date[9];main(){LCD_init();//LCD初始化init_1302(time_1302);gotoxy(1,1);LCD_display("Time:");gotoxy(1,2);LCD_display("Date:");times[8]='\0';//date[8]='\0';while(1){get_1302(time_1302);change();gotoxy(7,1);LCD_display(times);gotoxy(7,2);LCD_display(date);}}/*=========================== 转换子程序===========================*/void change(){// 时间的转换times[0]=time_1302[2]/10+'0';times[1]=time_1302[2]%10+'0';times[2]=':';times[3]=time_1302[1]/10+'0';times[4]=time_1302[1]%10+'0';times[5]=':';times[6]=time_1302[0]/10+'0';times[7]=time_1302[0]%10+'0';// 日期的转换date[0]=time_1302[6]/10+'0';date[1]=time_1302[6]%10+'0';date[2]='-';date[3]=time_1302[4]/10+'0';date[4]=time_1302[4]%10+'0';date[5]='-';date[6]=time_1302[3]/10+'0';date[7]=time_1302[3]%10+'0';}======================================================DS1302驱动程序=============#define uchar unsigned charuchar time_1302[7]={0x00,0x00,0x00,0x03,0x07,0x03,0x08};//设置时间初始值数组// 秒分时号月份星期年sbit T_IO=P1^0; //与硬件相关的连线clk为DS1302的时钟信号线sbit T_CLK=P1^1; //DAT为DS1302的I/O数据线sbit T_RST=P1^2; //RST为DS1302的RST信号线uchar bdata datbyte;sbit datbyte0=datbyte^0;sbit datbyte7=datbyte^7;void get_1302(uchar time[]);void write_ds1302(uchar dat);uchar r_1302(uchar add);void w_1302(uchar add,uchar dat);uchar read_ds1302(void);void init_1302(uchar *time);/*==========================================D S 1 3 0 2 初始化===========================================*/void init_1302(uchar *time){uchar i, add;//uchar time_bcd[7];add=0x80;//0写入,1读出w_1302(0x8e,0x00);for(i=0;i<7;i++){w_1302(add,*time);add+=2;time++;}w_1302(0x8e,0x80);}//===========================// 读取当前时间//===========================void get_1302(uchar time[]){uchar i;uchar add=0x81;w_1302(0x8e,0x00);for(i=0;i<7;i++){time[i]=r_1302(add);add+=2;}w_1302(0x8e,0x80);}/*================================= DS1302写入一个字节(上升沿有效)=================================*/void write_ds1302(uchar dat){uchar i;datbyte=dat;for(i=0;i<8;i++){T_IO=datbyte0;T_CLK=1;T_CLK=0;datbyte=datbyte>>1;}}/*======================================= DS1302读取一个字节(下降沿有效)=======================================*/uchar read_ds1302(void){uchar i;for(i=0;i<8;i++){datbyte=datbyte>>1;datbyte7=T_IO;T_CLK=1;T_CLK=0;}return(datbyte);}/*========================================= 指定位置读取数据=========================================*/uchar r_1302(uchar add){uchar temp,dat1,dat2;T_RST=0;T_CLK=0;T_RST=1;write_ds1302(add);temp=read_ds1302();T_CLK=1;T_RST=0;dat1=temp/16;dat2=temp%16;temp=dat1*10+dat2;return(temp);}/*========================================== 指定位置写入数据==========================================*/void w_1302(uchar add,uchar dat){T_RST=0;T_CLK=0;T_RST=1;write_ds1302(add);write_ds1302(dat/10<<4|dat%10);T_CLK=1;T_RST=0;}=========================================== =============LCD1602驱动程序================#define LCD_DB P0//定义LCD的数据端口sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_E=P2^2;#define uchar unsigned char#define uint unsigned int//===========延时子函数======================== void delay_lcd(uint x){uint i,j;for(i=x;i>0;i--)for(j=0;j<2;j++);}//==================写指令函数================= void LCD_write_command(uchar command){LCD_DB=command;LCD_RS=0;//指令LCD_RW=0;//写入LCD_E=1;LCD_E=0;delay_lcd(1);//等待执行完毕。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51单片机的时钟设计 一. 基本功能 利用AT89c51作为主控器与时钟芯片DS1302组成一个时钟系统,并由LM016L液晶显示。

二. 硬件设计

图1.总设计图 XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C52C110uR110kC233pFC333pFX1CRYSTAL23456789

1RP1

RESPACK-8RST5SCLK7

I/O6X12X23

VCC18VCC21

U2

DS1302

D714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3

LCD2LM016L

RV11k1. 单片机最小系统 1.1选用AT89C51的引脚功能

图2. AT89C51 XTAL1:单芯片系统时钟的反向放大器输入端。

XTAL2:系统时钟的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英震荡晶体系统就可以工作了,此外可以在两引脚与地之间加入20PF的小电容,可以使系统更稳定,避免噪音干扰而死机。 RESET:重置引脚,高电平动作,当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其周期以上的时间便能完成系统重置的各项动作,使得内部特殊功能寄存器内容均被设成已知状态。

XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435

P0.5/AD534

P0.6/AD633

P0.7/AD732

P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11

P3.2/INT012

P3.3/INT113

P3.4/T014

P3.7/RD17P3.6/WR16P3.5/T115

P2.7/A1528P2.0/A821P2.1/A922

P2.2/A1023

P2.3/A1124

P2.4/A1225

P2.5/A1326

P2.6/A1427

U2

AT89C521.2复位电路 如图所示,当按下按键时,就能完成整个系统的复位,使得程序从新运行。

图3.复位电路 1.3时钟电路

时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。 在AT89C51芯片内部有一个高增益反相放大器,其输入端为芯片引脚X1,输出端为引脚X2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。 此电路采用12MHz的石英晶体。

图4.时钟电路

RSTC410u

R1010k

XTAL2XTAL1C433pFC5

33pF

X2CRYSTAL2. 时钟芯片部分 2.1 DS1302引脚说明

图.5 1)Vcc1:后备电源,VCC2:主电源。在主电源关闭的情况下,也能保持时钟的连续运行。

DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。2)X1、X2:振荡源,外接32.768kHz晶振。 3)RST:复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。 4)I/O为串行数据输入输出端(双向)。 5)SCLK为时钟输入端。

2.2 时钟电路

图.6 P3.5P3.7P3.6RST5

SCLK7

I/O6X12X23

VCC18VCC21

U3

DS13023. LM016L液晶 图7.LM016L引脚图 LM016L与1602使用方法相同。 引脚说明: 引脚 符号 功能说明 1 VSS 一般接地 2 VDD 接电源(+5V)

3 V0 液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

4 RS RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

5 R/W R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 6 E E(或EN)端为使能(enable)端,下降沿使能。 7 DB0 底4位三态、 双向数据总线 0位(最低位) 8 DB1 底4位三态、 双向数据总线 1位 9 DB2 底4位三态、 双向数据总线 2位 10 DB3 底4位三态、 双向数据总线 3位 11 DB4 高4位三态、 双向数据总线 4位 12 DB5 高4位三态、 双向数据总线 5位 13 DB6 高4位三态、 双向数据总线 6位 14 DB7 高4位三态、 双向数据总线 7位(最高位)(也是busy flang) 电路接口说明: AT889C51 的P0口作为数据的输出端,P3.5和P3.6, P3.7 作为控制信号的输出端。

D714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3

LCD1LM016L三. 软件设计 3.1编程语言及编程软件的选择 本设计选择C语言作为编程语言。C语言虽然执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。 而汇编语言使用起来并没有这么方便。 本设计选用了Keil作为编程软件,.Keil C51生成的目标代码效率非常之

高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

3.2时间的显示 ML016L和1602一样,都是两行十六列的液晶显示屏。通过程序对ML016L进行初始化后,通过写指令和写数据的操作就可以再液晶屏上显示出对应的数据,而时钟数据则是从DS1302获取。这样可以显示出时间。

四. 程序 #include #include #define uchar unsigned char #define uint unsigned int sbit rs=P2^0; //1602命令\数据选择端 sbit e=P2^1; //1602使能端 sbit sck=P3^6; //DS1302 sbit io=P3^7; //DS1302数据端 sbit rst=P3^5; //DS1302 CE端 RST的功能 uint temp; //定义整型的温度数据 float f_temp; uchar code num[]="0123456789"; // 定义浮点型的温度数据 uchar code nian[]="20 - - "; uchar code shi[]=" : : "; uchar read_add[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; //DS1302读数据地址端 uchar write_add[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //DS1302写数据地址端

相关文档
最新文档