电子时钟实训报告.docx
《电子时钟实训报告.docx》由会员分享,可在线阅读,更多相关《电子时钟实训报告.docx(31页珍藏版)》请在冰豆网上搜索。
![电子时钟实训报告.docx](https://file1.bdocx.com/fileroot1/2022-11/22/72087ad9-9816-4e60-9448-92dcfc3d9d5f/72087ad9-9816-4e60-9448-92dcfc3d9d5f1.gif)
电子时钟实训报告
电子工艺实训报告
孔繁尧计控1401
1系统总体设计
以51单片机为核心,制作一个LCD显示的智能电子钟。
1.1系统功能要求
●具有年,月,日,时,分,秒等功能;
●具备年,月,日,时,分,秒校准功能;
1.2方案论证
1.2.1单片机芯片的选择方案和论证
方案一:
89C51芯片,采用FlashROM,内部具有4KBROM存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损失。
方案二:
AT89C52芯片,片内ROM全都FlashROM;能以3V的超低工作。
芯片内部储存器为8KBROM储存空间,同样具备89C51的功能,且具有在线编程可檫除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
方案三:
stm32f103c8t6芯片,该芯片是意法半导体所产生的32为微控制芯片,具有低功耗的特点,其内核是Cortex-M3,63kflash,2.0-3.6V供电和I/0引脚,最高可达到72Mhz,采用3级流水线,处理能力是AT89C52的几十倍,但是成本太高。
1.2.2显示模块选择方案和论证
方案一:
数码管显示。
数码管具有:
低能耗,低损耗,低压,寿命长,耐老化,防晒,防潮,防火,防高低温,对外界环境要求低,易于维护,同时其精度高,称量块,精确可靠,操作简单。
数码显示是采用BCD编码显示数字,程序编译容易,资源占用较少。
单片机I/O端口资源有限,系统如果用到多个数码管时,需采用动态显示和扩展外部电路。
方案二:
液晶屏显示。
液晶显示屏具有轻薄短少,低耗电量,无辐射危险,平面直角显示以及摄像稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强的特点。
方案三:
tft液晶显示,tft液晶价格昂贵,具有16为数据输入引脚,对于32单片机操作已是不宜,8为单片机更是给写程序带来了更大的困难,而且反应速度较慢,还占用大量的I/0口。
1.2.3时钟芯片的选择方案和论证
方案一:
直接采用单片机定时计数器提供秒信号,使用程序实现年,月,日,星期,时,分,秒计数。
采用此种方案虽然减少芯片使用,节约成本,但是,实现的时间误差较大。
方案二:
采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒,分,时,日,周,月,年以及闰年补偿的年进行计数,而且精度高,位的RAM作为数据暂存区,工作压2.5V~5.5V范围内,2.5V时耗小于300mA。
终上所述,根据实际条件,本次电子钟实训选择STC90C51单片机芯片,LCD1602、DS1302时钟芯片。
2系统硬件电路设计
2.1电子钟结构框架图
2.2电子钟PROTEUS仿真电路
本电路是由AT89C51单片机作为控制核心,能在3V超低点呀工作,AT89C51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89C51可为许多嵌入式控制应用系统提供高性价比的解决方案;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以度年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部偶一个31*8的用于临时性存放数据的RAM寄存器。
可产生年、月、日、周、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;显示部分由LCD1602液晶显示器完成,该显示器为工业字符型液晶,能够同时显示16x02即32个字符(16列2行)。
2.4DS1302时钟采集模块
2.4.1DS1302芯片介绍
DS1302是美国DALLAS公司推出的一种高性能、低消耗、带RAM的实时时钟芯片,他可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采取突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31X8的用语临时性存放数据的RAM寄存器。
DS1302是DS1201的升级产品,与DS1202兼容,但增加了主电源/后背电压双电源引脚,同时提供了对吼背电源进行涓细电流充电的能力。
2.4.2DS1302引脚封装
DS1302包含了DIP和SOIC两种封装形式,DS1302引脚功能如下:
●Vcc2:
主电源,一般接+5V电源
●Vcc1:
辅助电源,一般接3.6V可充电电源
DS1302的引脚排列,其中Vcc为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由VCC1或VCC2两者中的较大者供电。
当VCC2大于VCC1+02V,Vcc2给DS1302供电。
当Vcc1时,DS1302由VCC1供电。
●X1和X2:
晶振引脚,接32.768Khz晶振,通常该引脚上还接补偿电容
●GND:
电源地,接主电源及辅助电源的地端
●SCLK:
串行时钟输入端
●I/0:
数据I/0端
I/0为串行数据输入输出端(双向)
●RST:
复位输入端
RST是复位/片选先,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列哦送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平是,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据的传送,I/0引脚变为高阻态。
上电运行时,在Vcc>2.0V之前,RST必须保持低电平。
只有在你SCLK为低电平时,才能将RST置为高电平。
2.4.3DS1302内部结构
DS302D的内部结构图如下所示:
它包括输入移位寄存器,控制逻辑,晶振,实时时钟和31*8RAM等。
·DS1302控制字
DS1302的控制字如下图所示:
控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
·数据的输入输出
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
·DS1302内部寄存器
DS1302有12个寄存器,其中有7个寄存器与日历,时钟相关,存放的数据为BCD形式,其日历,时间寄存器及其控制字如下图所示:
此外,DS1302还有年份寄存器,控制寄存器,充电寄存器,时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:
一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为COH-FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写),FFH(读)。
2.4.4DS1302与单片机电路连接
2.5LCD1602液晶显示模块
2.5.1LCD1602液晶模块介绍
字符型液晶显示模块由字符型液晶显示屏(LCD).控制驱动主电路HD44780及其扩展驱动电路HD44100或其兼容的IC,少量阻,容元件,结构件等装配在PCB板上而成。
1)LCD液晶显示模块基本特点
●液晶显示屏是以若干个5*8或5*11点阵组成的显示字符群。
每个点阵块为一个字符位,字符间距和行距都为一个点的宽度。
●主控制驱动电路为HD44780(HITACHI)及其他公司全兼容电路,如SED1278(SEIKOEPSON),KS0066(SAMSUNG),NJU6480(NERJAPANRADIO).
●具有字符发生器ROM可显示192种字符(160个5*7点阵字符和32个5*10点阵字符)。
●具有64个字节的自定义字符RAM,可自定义8个5*8点阵字符或4个5*11点阵字符。
●具有80个字节的RAM.
●标准的接口特性,适配M6800系列MPU的操作时序。
●模块结构紧凑,轻巧,装配容易
●单+5v电源供电
●低功耗,长寿命,高可靠性。
2.5.2LCD1602液晶模块引脚说明
LCD1602是字符式液晶显示器,该液晶显示器可以显示两行字符,每行16个字符,显示容量为16*2字符,带有背光源,采用时分割驱动的形式,并行接口,可与单片机直接相连,其引脚如下:
2.5.3HD44780控制电路
HD44780是用低功耗CMOS技术制造的大规模点阵LCD控制器,具有简单而功能较强的指令集,可实现字符移动,闪烁等功能,与MCU相连能使LCD显示大小英文字母,数字和符号。
HD44780控制电路主要由DDRAM,CGROM,IR,DR,BF,AC等大规模集成电路组成。
(1)HD44780控制器内部结构图:
●DDRAM为数据显示RAM,用于存放需要LCD显示的数据,能存储80个,只要将标准的ASCCII码放入DDRAM,内部的控制线路会自动将数据传送到显示器上,并显示该ASCII码对应的字符。
●CGROM为字符产生器ROM,它存储了由8位字符码生成的192个5*7点阵字符和30种5*10点阵字符,8位字符编码和字符的对应关系,即内置字符集。
●CGRAM为字型、字符产生器,可供使用者存储特殊造型的造型码,CGRAM最多可存8个造型码。
●IR为指令寄存器,负责存储MCU要写给LED的指令码,当RS及R/W引脚信号为0切E引脚信号由1变为0时,D0~D7引脚上的数据便会存入到IR寄存器中。
●DR为数据寄存器,负责存储MCU要写到CGRAM或DDRAM的数据,或者存储MCU要从CGRAM或DDRAM读出的数据。
因此,可将DR视为一个数据缓冲区,当RS及R/W引脚信号为1且E引脚信号为1,读取信号;当RS引脚信号为1当R/W引脚信号为0时,存入数据。
●BF为忙碌信号,当BF为1时,不接受MCU送来的数据或者指令;当BF为0时,接受外部数据或指令,所以在写数据或指令到LCD前,必须查看BF是否为0。
●AC为地址计数器,负责计数写入/读出CGRAM或DDRAM的数据地址,AC依照MCU对LCD的设置值而自动修改它本身的内容。
(2)显示位与RAM的对应关系(地址映射)
1602内部带有80*8bit的RAM缓冲区,显示位与RAM的对应关系。
(3)指令操作
指令操作包括清屏、回车、输入模式控制、显示开关控制、移位控制、显示模式控制等。
●清平指令:
设置清平指令,使DDRAM的显示内容清零,数据指针AC清零,光标对到右上角的原点。
●回车指令:
设置回车指令,现实回车,数据指针AC清零,使光标和光标所在的字符回到原点,DDRAM单元内容不变。
●输入模式控制指令:
用于设置光标、显示面面移动方向。
当数据写入DDRAM(CGRAM)或从DDRAM(CGRAM)读取数据时,N控制AC自动加1或自动减1,若N为1时,AC加1;N为0时,AC减1,S控制显示内容右移或左移,S=1且数据写入DDRAM时,显示将全部右移(N=1)或(N=0)右移,此时光标看上去未动,仅显示内容移动,但读出时现实内容不移动;S=0时,显示把移动,光标左移或右移。
●显示开关控制指令:
用于设置显示、光标、闪烁开关。
D为显示控制位,当D=1时,开显示,当D=0时,关显示,此时DDRAM的内容保持不变。
C为光标控制位,当C=1时,开光标显示;C=0,关光标显示。
B为闪烁控制位,当B=1时,当光标和光标所指的字符共同以1.25HZ速率闪烁;B=0,不闪烁。
●移动控制指令:
使光标或显示画面在没有对DDRAM进行读/写操作是被左移或右移。
该指令没执行1次,屏蔽字符与光标即移动1次。
在两行显示方式下,光标为闪烁的位置从第1行移到第2行。
●显示模式控制指令:
用于设置数据总线位数、点阵方式。
●GCRAM地址设置指令:
用于设置CGRAM地址指针,地址码D5~D7被送入AD,设置此指令后,就可以将用户自己定义的现实字符数据写入CGRAM或从CGRAM中读出。
●DDRAM地址指针设置指令:
用于设置两行字符显示的起始地址。
●忙状态检查指令:
是通过读取数据的D7位是否为1来判断,若为1,表示总线正忙碌。
2.5.4LCD液晶与单片机连接电路
3系统软件设计
电子钟系统软件设计主要包括显示子程序、时钟子程序、按键子程序,现将程序流程图演呈现如下:
3.1系统主程序
3.2显示子程序
显示子程序包括LCD初始化、LCD显示初始化字符格式、LCD显示读取DSS1302时间,其中这三个字程序中分别调用LCD写命令和LCD写数据子程序,程序流程图如下:
3.3时钟子程序
时钟子程序包括设置DS1302初始时间、读时间。
其中设置DS1302初始时间程序包括DS1302写入两个字节子程序、读时间程序包括从DS1302读两个字节子程序。
4系统调试
按照电路图在万用板上进行焊接,焊接完毕后将编写好的程序下载在单片机,上电,观察结果,如果没有按要求现实需要进行硬件、软件调试。
4.1硬件调试环境
硬件调试要用到的工具有焊烙铁、万用表电源、示波器。
由于本次实训用到的LCD显示模块、DS1302模块等都是集成模块,所以整个系统焊接及调试问题不大。
上电后LCD显示屏不亮,首先确定51单片机、LCD显示模块、DS1302模块是否完好,其次是确定电路板上所有电源和地的连接是否正确,再确定单片机最小电路是否存在问题,最后确定每个模块与单片机链接是否正确。
5分析总结
本次实训综合性较强,在已有单片机知识的基础上,需要同学们掌握LCD1602及时间芯片DS1302的工作原理。
本次实训是对单片机课程的知识总结和同学们能力提高。
6附录:
程序代码清单
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineBCDHEX(X)((X&0x70)>>4)*10+(X&0x0F)
#defineLCD_DATAP0
intnian[]={31,28,31,30,31,30,31,31,30,31,30,31};
intrnian[]={31,29,31,30,31,30,31,31,30,31,30,31};
sbitkey0=P3^0;
sbitkey1=P3^1;
sbitkey2=P3^2;
unsignedcharnum,flag;
charhour,minute,second,day,month,year;
uchartable[]={0x15,0x14,0x13,0x12,0x10,0x14};
uchardigit[]={"0123456789"};
sbitLCD_EN=P2^7;
sbitLCD_RS=P2^6;
sbitLCD_RW=P2^5;
sbitSCK=P3^6;
sbitSDA=P3^4;
sbitRST=P3^5;
voiddelay_ms(uinttemp)
{
uintx,y;
for(x=temp;x>0;x--)
for(y=110;y>0;y--);
}
voidLCD_w_com(ucharcom)
{
LCD_RS=0;
LCD_RW=0;
LCD_DATA=com;
delay_ms(5);
LCD_EN=1;
delay_ms(5);
LCD_EN=0;
}
voidLCD_w_data(uchardat)
{
LCD_RS=1;
LCD_RW=0;
LCD_DATA=dat;
delay_ms(5);
LCD_EN=1;
delay_ms(5);
LCD_EN=0;
}
voidLCD_int()
{
LCD_EN=0;
LCD_w_com(0x38);
LCD_w_com(0x0c);
LCD_w_com(0x06);
LCD_w_com(0x01);
}
voidWrite_Ds1302_Byte(unsignedchartemp)
{
unsignedchari;
for(i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
voidWrite_Ds1302(unsignedcharaddress,unsignedchardat)
{
//RST=0;
//_nop_();
//SCK=0;
//_nop_();
//RST=1;
//_nop_();
//Write_Ds1302_Byte(address);
//Write_Ds1302_Byte(dat);
//RST=0;
//voidds1302_write(ucharcom,uchardat)
uinti;
RST=1;
for(i=0;i<8;i++)
{
SCK=0;
SDA=(dat&(0x01<>i;
SCK=1;
}
SCK=0;
RST=0;
}
unsignedcharRead_Ds1302(unsignedcharaddress)
{
//unsignedchari;temp=0x00;
//RST=0;
//_nop_();
//_nop_();
//SCK=0;
//_nop_();
//_nop_();
//RST=1;
//_nop_();
//_nop_();
//Write_Ds1302_Byte(address);
//for(i=0;i<8;i++)
//{
//if(SDA)
//temp|=0x80;
//SCK=0;
//temp>>=1;
//_nop_();
//_nop_();
//_nop_();
//SCK=1;
//}
//RST=0;
//_nop_();
//_nop_();
//RST=0;
//SCK=0;
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//SCK=1;
//_nop_();
//_nop_();
//SDA=0;
//_nop_();
//_nop_();
//SDA=1;
//_nop_();
//_nop_();
//return(temp);
uchari;
ucharrdat=0x00,temp;
RST=1;
for(i=0;i<8;i++)
{
SCK=0;
SDA=(address&(0x01<>i;
SCK=1;
}
for(i=0;i<8;i++)
{
rdat>>=1;
SCK=0;
if(SDA)
rdat|=0x80;
SCK=1;
}
SCK=0;
RST=0;
//tmp=rdat;
//rdat=rdat/16;
//tmp=tmp%16;
return(rdat);
}
voidset_time()
{
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x8c,table[5]);
Write_Ds1302(0x88,table[4]);
Write_Ds1302(0x86,table[3]);
Write_Ds1302(0x84,table[2]);
Write_Ds1302(0x82,table[1]);
Write_Ds1302(0x80,table[0]);
Write_Ds1302(0x8e,0x80);
}
voidread_time()
{
year=BCDHEX(Read_Ds1302(0x8d));
month=BCDHEX(Read_Ds1302(0x89));
day=BCDHEX(Read_Ds1302(0x87));
hour=BCDHEX(Read_Ds1302(0x85));
minute=BCDHEX(Read_Ds1302(0x83));
second=BCDHEX(Read_Ds1302(0x81));
}
voiddisplay(inta,ucharaddress)
{
intb,c;
b=a/10;
c=a%10;
LCD_w_com(address);
LCD_w_data(digit[b]);
LCD_w_com(address+1);
LCD_w_data(digit[c]);
}
voiddisplaychar()
{
LCD_w_com(0x80);
LCD_w_data('D');
LCD_w_data('a');
LCD_w_data('t');
LCD_w_data('a');
LCD_w_data(':
');
LCD_w_com(0x87);
LCD_w_data('-');
LCD_w_com(0x8a);
LCD_w_data('-');
LCD_w_com(0x80+0x40);
LCD_w_data('T');
LCD_w_data('i');
LCD_w_data('m');
LCD_w_data('e');
LCD_w_data(':
');
LCD_w_com(0x87+0x40);
LCD_w_data(':
');
LCD_w_com(0x8a+0x40);
LCD_w_data(':
');
}
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidkeyscan()
{
if(key0==0)
{
delay(10);
if(key0==0)
{
while(!
key0);
num++;
switch(num)
{
case1:
Write_Ds1302(0x80,0x80);
flag=1;
LCD_w_com(0x0f);
L