单片机课程设计报告1Word格式.docx
《单片机课程设计报告1Word格式.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告1Word格式.docx(79页珍藏版)》请在冰豆网上搜索。
方案一:
采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以不用此种作为显示。
方案二:
采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,所以也不用此种作为显示。
方案三:
采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,与普通数码管相比功耗较小,硬件连接简单。
所以显示部分采用1602液晶显示。
1.2.3时钟芯片的选择方案和论证
直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。
采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。
所以不采用此方案。
采用DS1302时钟芯片实现时钟,DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×
8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
结构
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址命令序列送入移位寄存器;
其次,RST提供终止单字节或多字节数据传送的方法。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,IO引脚变为高阻态。
上电运行时,在Vcc>
2.0V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
IO为串行数据输入输出端(双向),后面有详细说明。
SCLK为时钟输入端。
下图为DS1302的引脚功能图:
DS1302封装图控制字节
DS1302的控制字如图2所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;
位5至位1指示操作单元的地址;
最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
数据流
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:
一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;
另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
DS1302与CPU的连接需要三条线,即SCLK(7)、IO(6)、RST(5)。
CPU连接实际上,在调试程序时可以不加电容器,只加一个32.768kHz的晶振即可。
只是选择晶振时,不同的晶振,误差也较大。
问题说明DS1302与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位WriteProtect(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;
D6=0,指定时钟数据,D6=1,指定RAM数据;
D5~D1指定输入或输出的特定寄存器;
最低位LSB(D0)为逻辑0,指定写操作(输入),D0=1,指定读操作(输出)。
在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。
若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。
DS1302与RAM相关的寄存器分为两类:
再一类为突发方式下的RAM寄存器,在此方式下可一次性读、写所有的RAM的31个字节。
要特别说明的是备用电源B1,可以用电池或者超级电容器(0.1F以上)。
虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。
可以用老式电脑主板上的3.6V充电电池。
如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。
100μF就可以保证1小时的正常走时。
DS1302在第一次加电后,必须进行初始化操作。
初始化后就可以按正常方法调整时间。
结论DS1302存在时钟精度不高,易受环境影响,出现时钟混乱等缺点。
DS1302可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录。
这种记录对长时间的连续测控系统结果的分析及对异常数据出现的原因的查找具有重要意义。
传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此,只能记录数据而无法准确记录其出现的时间;
若采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且,某些测控系统可能不允许。
但是,如果在系统中采用时钟芯片DS1302,则能很好地解决这个问题。
1.3电路设计最终方案决定
综上各方案所述,对此次作品的方案选定:
采用STC89C52作为主控制系统;
DS1302提供时钟;
LCD1602液晶作为显示
第2章系统的硬件设计与实现
2.1电路设计框图
图1电路设计框图
2.2系统硬件概述
本电路是由STC89C52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;
时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。
可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能,本电路采用DS1302单字节传送方式实现与主控机之间数据的传送;
显示部分由1602构成。
2.3主要单元电路的设计
2.3.1单片机主控制模块的设计
STC89C52单片机为40引脚双列直插芯片,有四个IO口P0,P1,P2,P3,MCS-51单片机共有4个8位的IO口(P0、P1、P2、P3),每一条IO线都能独立地作输出或输入。
单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,如图
图2最小系统
2.3.2时钟电路DS1302
1.DS1302的性能特性
图3示出DS1302的引脚排列图,其中Vcc1为后备电源,Vcc2为主电源。
X1和X2是振荡源,外接32.768KHz晶振。
首先,RST接通控制逻辑,允许地址命令序列送入移位寄存器;
其次,RST提供终止单字节或多字节数据的传送手段。
上电动行时,在Vcc大于等于2.5V之前,RST必须保持低电平。
中有在SCLK为低电平时,才能将RST置为高电平,IO为串行数据输入端(双向)。
SCLK始终是输入端。
图3DS1302的引脚图
2.DS1302数据操作原理
DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲。
DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。
对于位6,若对程序进行读写时RAM=1,对时间进行读写时,CK=0。
位1至位5指操作单元的地址。
位0是读写操作位,进行读操作时,该位为1;
该位为0则表示进行的是写操作。
控制字节总是从最低位开始输入输出的。
DS1302的日历、时间寄存器内容:
“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;
当该位为0时,时钟开始运行。
“WP”是写保护位,在任何的对时钟和RAM的写操作之前,“WP”必须为0。
当“WP”为1时,写保护位防止对任一寄存器的写操作。
2.3.3显示模块的设计
1.1602介绍
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。
下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。
一般1602字符型液晶显示器实物如图-4:
图41602字符型液晶显示器实物图
2.1602LCD的基本参数及引脚功能
1602LCD分为背光和不带背光两种,基控制大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表1所示:
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
3
VL
液晶显示偏压
11
D4
4
RS
数据命令选择
12
D5
5
RW
读写选择
13
D6
6
E
使能信号
14
D7
7
D0
15
BLA
背光源正极
8
D1
16
BLK
背光源负极
表1:
引脚接口说明表
图5LCD液晶显示
2.3.4按键模块的设计
根据设计要求需要选择三个独立按键分别为功能键、加、减,
按键模块如图6所示:
图6按键模块设计
第3章系统的软件设计
3.1主程序流程图
主程序流程图
主程序:
voidmain()
{
TMOD=0x01;
定时器初始化
TH0=0x3c;
TL0=0xb0;
IE=0x82;
init_lcd1602();
初始化显示器
init_ds1302();
初始化DS1302
while
(1)
{
ds1302();
display1602();
gengxin();
key_scan();
}
}
3.2按键扫描子程序
调整时间用3个调整按钮,1个作为功能键,另外2个分别作为加调整,减调整。
时间调整程序流程图如图-B所示:
是
是
否
是是
时间调整程序流程图
voidkey_scan(void)
if(menu==0)
delay(3);
TR0=1;
启动定时器,调时闪烁
while(menu==0)
show();
***********调年****************************
while
(1)
{
if(add==0)
{
delay(3);
if(add==0)
year=add_1(year);
if(year==0x51)
year=0x00;
write1302(0x8c,year);
写入年寄存器
gengxin();
while(add==0)
show();
}
if(dec==0)
if(dec==0)
year=dec_1(year,0x51);
while(dec==0)
if(menu==0)
if(menu==0)
break;
if(time>
=10)大于500MS,则闪烁
display[2]='
'
;
display[3]='
show();
else
****************调月********************
month=add_1(month);
if(month==0x13)
month=0x01;
write1302(0x88,month);
写入月寄存器
month=dec_1(month,0x13);
if(month==0x00)
month=0x12;
=10)
display[5]='
display[6]='
*******************调日*****************
day=add_1(day);
if(day==0x32)
day=0x01;
write1302(0x86,day);
写入日寄存器
day=dec_1(day,0x32);
if(day==0x00)
day=0x31;
display[8]='
display[9]='
*******************调周*****************
week=add_1(week);
if(week==0x07)
week=0x00;
write1302(0x8a,week);
写入周寄存器
week=dec_1(week,0x07);
display[14]='
*******************调时******************
();
xiaohui[0]='
xiaohui[1]='
***********************调分*************
mintue=add_1(mintue);
if(mintue==0x60)
mintue=0x00;
write1302(0x82,mintue);
写入分寄存器
mintue=dec_1(mintue,0x60);
=10