智能仪表设计实习报告.docx

上传人:b****3 文档编号:4986001 上传时间:2022-12-12 格式:DOCX 页数:24 大小:612.10KB
下载 相关 举报
智能仪表设计实习报告.docx_第1页
第1页 / 共24页
智能仪表设计实习报告.docx_第2页
第2页 / 共24页
智能仪表设计实习报告.docx_第3页
第3页 / 共24页
智能仪表设计实习报告.docx_第4页
第4页 / 共24页
智能仪表设计实习报告.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

智能仪表设计实习报告.docx

《智能仪表设计实习报告.docx》由会员分享,可在线阅读,更多相关《智能仪表设计实习报告.docx(24页珍藏版)》请在冰豆网上搜索。

智能仪表设计实习报告.docx

智能仪表设计实习报告

河南农业大学

《智能仪表设计实习》

设计说明书

 

题目:

实时日历时钟显示系统的制作

学院:

07理学院

专业:

电子信息科学与技术

班级:

电科四班

学号:

0708101106

姓名:

指导教师:

滕红丽

成绩:

时间:

2010年11月29日至2010年12月12日

 

智能仪表设计实习报告

实时日历时钟显示系统的制作

一.《智能仪表设计实习》设计任务书:

运用所学智能仪器设计、单片机、微机原理等方面的知识,设计出一台以AT89S51为核心的单片机数据采集或测控系统,完成信息的采集、处理、输出及人机接口电路等部分的软、硬件设计。

1.分组完成实时日历时钟显示系统任务设计:

设计实时日历时钟显示系统,实现在51单片机系统中设置、获取、记录实时的日历时钟信息并通过LED显示或LCD显示。

要求能够进行长时间的记录,并且存储的时间信息在掉电情况下能长期保存。

初始的时间信息要求用户用键盘输入或通过PC机和单片机的串口通信来设置。

2.应用微机和单片机实验开发装置完成规定的实习任务;

3.系统硬件部分包括传感器、前置信号处理单元(放大器,滤波器等)、A/D转换、微处理器(MCU)、键盘、显示、报警、通信接口电路等;

4.系统软件部分包括键盘扫描、A/D转换、数字滤波、标度变换、显示、报警、通信等;

5.画出系统的硬件电路结构图和软件程序框图;

6.编写设计说明书一份,阐述系统的工作原理和软、硬件设计方法。

报告重点阐述系统组成框图、硬件原理设计和软件程序流程图。

设计说明书不得少于5000字。

二.实现功能:

实时日历时钟显示,实现在51单片机系统中设置、获取、记录实时的日历时钟信息并通过LED显示或LCD显示。

要求能够进行长时间的记录,并且存储的时间信息在掉电情况下能长期保存。

初始的时间信息要求用户用键盘输入或通过PC机和单片机的串口通信来设置。

三.实习过程:

(一)实习所使用的器件介绍:

1.芯片选择:

80c51.

实习过程中用到的器件:

编码器,keil51,splx和装有80c51芯片的单片机。

主要功能:

编码器和splx是向80c51芯片烧入数据用的,keil51是生成hex文件用的,因为只有生成的hex文件才能被烧入芯片之中。

2.显示模块的选择

使用液晶显示屏显示时间数字。

液晶显示屏(LCD)具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点。

但由于液晶是以点阵的模式显示各种符号,需要利用控制芯片创建字符库,编程工作量大,控制器的资源占用较多,其成本也偏高。

在使用时,不能有静电干扰,否则易烧坏液晶的显示芯片。

主控芯片使用51系列AT89C51单片机,时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟DS1302。

采用DS1302作为计时芯片,可以做到计时准确。

更重要的是,DS1302可以在很小电流的后备电源(2.5~5.5V电源,再2.5V时耗电小于300nA),而且DS1302可以编程选择多种充电电流来队后备电源进行慢速充电,可以保证后备电源基本不耗电。

显示驱动采用MAX7219,MAX7219是微处理器和共阴极八段八位LED数码管显示、图条/柱图显示或64点阵显示接口的小型串行输入/输出芯片。

片内包括BCD译码器、多路扫描控制器、字和位驱动器和8×8静态RAM。

外部只需要一个电阻设置所有LED显示器字段电流。

MAX7219和微处理器只需三根导线连接,每位显示数字有一个地址由微处理器写入。

允许使用者选择每位是BCD译码或不译码。

使用者还可选择停机模式、数字亮度控制、从1~8选择扫描位数和对所有LED显示器的测试模式。

显示模块采用普通的共阴极四位一体行慢速充电,可以保证后备电源基本不耗电。

3.时钟电路的选择

DS1302的性能特性:

实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行比较;用于高速数据暂存的31*8位RAM;最少引脚的串行I/O;2.5~5.5V电压工作范围;2.5V时耗小于300nA;用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据方式;简单的三线接口;可选的慢速充电(至Vcc1)的能力.

DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被访问到。

在开始8个时钟周期,把命令字节装入移位寄存器后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。

时钟脉冲的个数在单字节方式下为8+8,在多字节方式下为8+字节数,最大可达248字节数。

如果在传送过程中置RST脚为低电平,则会终止本次数据传送,并且I/O引脚变为高阻态。

上电运行时,在Vcc≥2.5V之前,RST脚必须保持低电平。

只有在SCLK为低电平时,才能将RST置为高电平。

DS1302的控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。

位6如果为0,则表示存取日历时钟数据;为1则表示存取RAM数据。

位5~1(A4~A0)指示操作单元的地址。

最低有效位(位0)如果为0,则表示药进行写操作;为1表示进行读操作。

控制字节总是从最低位开始输入/输出。

为了提高对32个地址寻址能力(地址/命令位1~5=逻辑1),可以把时钟/日历或RAM寄存器规定为多字节(burst)方式。

位6规定时钟或RAM,而位0规定读或写。

在时钟/日历寄存器中的地址9~31或RAM寄存器中的地址31不能存储数据。

在多字节方式下,读或写从地址0的位0开始。

必须按数据传送的次序写最先的8个寄存器。

但是,当以多字节方式写RAM时,为了传送数据不必写所有的31字节,不管是否谢了全部31字节,所写的每一字节都将传送至RAM。

DS1302可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V。

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个33x8的用于临时性存放数据的RAM寄存器。

DS1302是的DS1202升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。

其日历、时间寄存器及其控制字如上表所示,其中奇数为读操作,偶数为写操作。

时钟暂停:

秒寄存器的位7定义位时钟暂停位。

当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时(如进入时钟调整程序),停止振荡。

当它为0时,时钟将开始启动。

AM-PM/12-24小时方式:

小时寄存器的位7定义为12或24小时方式选择位。

它为高电平时,选择12小时方式。

在此方式下,位5为第二个10小时位(20~23h)。

DS1302时钟芯片包括实时时钟/日历和31字节的静态RAM。

它经过一个简单的串行接口与微处理器通信。

实时时钟/日历提供秒、分、时、日、周、月和年等信息。

对于小于31天的月和月末的日期自动进行调整,还包括闰年校正的功能。

时钟的运行可以采用24<小>时或带AM/PM的12小时格式。

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多字节的时钟信号或RAM数据。

DS1302的晶振选用32768Hz,电容推荐值为6pF。

因为振荡频率较低,也可以不接电容,对计时精度影响不大

4.键盘接口

键盘在单片机系统中是一个很重要的部件。

为了输入数据、查询和控制系统的工作状态,都要用到键盘,键盘是人工干预计算机的主要手段。

键盘可分为编码和非编码键盘两种。

编码键盘采用硬件线线路来实现键盘编码,每按下一个键,键盘能自动生成按键代码,键数较多,而且还具有去抖动功能。

这种键盘使用方便,但硬件较复杂,PC机所用的键盘就属于这种。

非编码键盘仅提供按键开关工作状态,其他工作由软件完成,这种键盘键数较少,硬件简单,一般在单片机应用系统中广泛使用。

此处主要介绍该类非编码键盘及其与MCS—51型单片机的接口。

(二)、实时日历时钟显示系统的设计

整个系统的设计包括电路设计和软件设计,电路的设计只须知道所需的硬件即可,因为整个电路被集中到一个模板上,只须设计出程序输入单片机中,安在模板上即可工作。

软件则须根据所要的硬件写出日历工作的程序即可。

1电路设计

电子万年历电系统由主控制器AT89C51、时钟电路DS1302、显示LCD。

2系统的软件设计

软件部分则需要DS1302的运行程序,键盘扫描的相关程序,液晶写入相关程序,还有主程序,最后把各个程序组合在一起。

软件程序方框图如下:

实时日历时钟显示系统的设计的程序如下:

#include

#defineuintunsignedint

#defineucharunsignedchar

uchara,miao,shi,fen,ri,yue,nian,week,key1n;

#defineyh0x80//LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)

#defineer0x80+0x40//LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)

//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)

sbitrs=P2^0;

sbiten=P2^2;

sbitrw=P2^1;//如果硬件上rw接地,就不用写这句和后面的rw=0了

sbitled=P2^6;//LCD背光开关

//DS1302时钟芯片与C51之间的引脚连接定义

sbitIO=P1^1;

sbitSCLK=P1^0;

sbitRST=P1^2;

sbitACC0=ACC^0;

sbitACC7=ACC^7;

/************************************************************

ACC累加器=A

ACC.0=E0H

ACC.0就是ACC的第0位。

Acc可以位寻址。

累加器ACC是一个8位的存储单元,是用来放数据的。

但是,这个存储单元有其特殊的地位,

是单片机中一个非常关键的单元,很多运算都要通过ACC来进行。

以后在学习指令时,

常用A来表示累加器。

但有一些地方例外,比如在PUSH指令中,就必须用ACC这样的名字。

一般的说法,A代表了累加器中的内容、而ACC代表的是累加器的地址。

***************************************************************///校时按键与C51的引脚连接定义

sbitkey1=P1^5;//设置键

sbitkey2=P1^6;//加键

sbitkey3=P1^7;//减键

sbitbuzzer=P1^3;//蜂鸣器,通过三极管9012驱动,端口低电平响

/**************************************************************/

ucharcodetab1[]={"20--"};//年显示的固定字符

ucharcodetab2[]={":

:

"};//时间显示的固定字符

//延时函数,后面经常调用

voiddelay(uintxms)//延时函数,有参函数

{

uintx,y;

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

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

}

/********液晶写入指令函数与写入数据函数,以后可调用

/*在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面*/

write_1602com(ucharcom)//****液晶写入指令函数****

{

rs=0;//数据/指令选择置为指令

rw=0;//读写选择置为写

P0=com;//送入数据

delay

(1);

en=1;//拉高使能端,为制造有效的下降沿做准备

delay

(1);

en=0;//en由高变低,产生下降沿,液晶执行命令

}

write_1602dat(uchardat)//***液晶写入数据函数****

{

rs=1;//数据/指令选择置为数据

rw=0;//读写选择置为写

P0=dat;//送入数据

delay

(1);

en=1;//en置高电平,为制造下降沿做准备

delay

(1);

en=0;//en由高变低,产生下降沿,液晶执行命令

}

lcd_init()//***液晶初始化函数****

{

write_1602com(0x38);//设置液晶工作模式,意思:

16*2行显示,5*7点阵,8位数据

write_1602com(0x0c);//开显示不显示光标

write_1602com(0x06);//整屏不移动,光标自动右移

write_1602com(0x01);//清显示

write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示

for(a=0;a<14;a++)

{

write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分

//delay(3);

}

write_1602com(er+2);//时间显示固定符号写入位置,从第2个位置后开始显示

for(a=0;a<8;a++)

{

write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号

//delay(3);

}

}

/***************DS1302有关子函数********************/

voidwrite_byte(uchardat)//写一个字节

{

ACC=dat;

RST=1;

for(a=8;a>0;a--)

{

IO=ACC0;

SCLK=0;

SCLK=1;

ACC=ACC>>1;

}

}

ucharread_byte()//读一个字节

{

RST=1;

for(a=8;a>0;a--)

{

ACC7=IO;

SCLK=1;

SCLK=0;

ACC=ACC>>1;

}

return(ACC);

}

//----------------------------------------

voidwrite_1302(ucharadd,uchardat)//向1302芯片写函数,指定写入地址,数据

{

RST=0;

SCLK=0;

RST=1;

write_byte(add);

write_byte(dat);

SCLK=1;

RST=0;

}

ucharread_1302(ucharadd)//从1302读数据函数,指定读取数据来源地址

{

uchartemp;

RST=0;

SCLK=0;

RST=1;

write_byte(add);

temp=read_byte();

SCLK=1;

RST=0;

return(temp);

}

ucharBCD_Decimal(ucharbcd)//BCD码转十进制函数,输入BCD,返回十进制

{

ucharDecimal;

Decimal=bcd>>4;

return(Decimal=Decimal*10+(bcd&=0x0F));

}

//--------------------------------------

voidds1302_init()//1302芯片初始化子函数(2010-01-07,12:

00:

00,week4)

{

RST=0;

SCLK=0;

write_1302(0x8e,0x00);//允许写,禁止写保护

//write_1302(0x80,0x00);//向DS1302内写秒寄存器80H写入初始秒数据00

//write_1302(0x82,0x00);//向DS1302内写分寄存器82H写入初始分数据00

//write_1302(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12

//write_1302(0x8a,0x04);//向DS1302内写周寄存器8aH写入初始周数据4

//write_1302(0x86,0x07);//向DS1302内写日期寄存器86H写入初始日期数据07

//write_1302(0x88,0x01);//向DS1302内写月份寄存器88H写入初始月份数据01

//write_1302(0x8c,0x10);//向DS1302内写年份寄存器8cH写入初始年份数据10

write_1302(0x8e,0x80);//打开写保护

}

//-----------------------------------

//时分秒显示子函数

voidwrite_sfm(ucharadd,uchardat)//向LCD写时分秒,有显示位置加、现示数据,两个参数

{

uchargw,sw;

gw=dat%10;//取得个位数字

sw=dat/10;//取得十位数字

write_1602com(er+add);//er是头文件规定的值0x80+0x40

write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码

write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码

}

//-------------------------------------

//年月日显示子函数

voidwrite_nyr(ucharadd,uchardat)//向LCD写年月日,有显示位置加数、显示数据,两个参数

{

uchargw,sw;

gw=dat%10;//取得个位数字

sw=dat/10;//取得十位数字

write_1602com(yh+add);//设定显示位置为第一个位置+add

write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码

write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码

}

//-------------------------------------------

voidwrite_week(ucharweek)//写星期函数

{

write_1602com(yh+0x0c);//星期字符的显示位置

switch(week)

{

case1:

write_1602dat('M');//星期数为1时,显示

write_1602dat('O');

write_1602dat('N');

break;

case2:

write_1602dat('T');//星期数据为2时显示

write_1602dat('U');

write_1602dat('E');

break;

case3:

write_1602dat('W');//星期数据为3时显示

write_1602dat('E');

write_1602dat('D');

break;

case4:

write_1602dat('T');//星期数据为4是显示

write_1602dat('H');

write_1602dat('U');

break;

case5:

write_1602dat('F');//星期数据为5时显示

write_1602dat('R');

write_1602dat('I');

break;

case6:

write_1602dat('S');//星期数据为6时显示

write_1602dat('T');

write_1602dat('A');

break;

case7:

write_1602dat('S');//星期数据为7时显示

write_1602dat('U');

write_1602dat('N');

break;

}

}

//****************键盘扫描有关函数**********************

voidkeyscan()

{

if(key1==0)//---------------key1为功能键(设置键)--------------------

{

delay(9);//延时,用于消抖动

if(key1==0)//延时后再次确认按键按下

{

buzzer=0;//蜂鸣器短响一次

delay(20);

buzzer=1;

while(!

key1);

key1n++;

if(key1n==9)

key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环

switch(key1n)

{

case1:

TR0=0;//关闭定时器

//TR1=0;

write_1602com(er+0x09);//设置按键按动一次,秒位置显示光标

write_1602com(0x0f);//设置光标为闪烁

temp=(miao)/10*16+(miao)%10;//秒数据写入DS1302

write_1302(0x8e,0x00);

write_1302(0x80,0x80|temp);//miao

write_1302(0x8e,0x80);

break;

case2:

write_1602com(er+6);//按2次fen位置显示光标

//write_1602com(0x0f);

break;

case3:

write_1602com(er+3);//按动3次,shi

//write_1602com(0x0f);

break;

case4:

write_1602com(yh+0x0e);//按动4次,week

//write_1602com(0x0f);

break;

case5:

write_1602com(yh+0x0a);//按动5次,ri

//write_1602com(0x0f);

break;

case6:

write_1602com(yh+0x07);//按动6次,yue

//write_1602com(0x0f);

break;

case7:

write_1602com(yh+0x04);//按动7次,nian

//write_1602com(0x0f);

break;

case8:

write_1602com(0x0c);//按动到第8次,设置光标不闪烁

TR0=1;//打开定时器

write_1302(0x8e,0x00);

write_1302

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

当前位置:首页 > 法律文书 > 调解书

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

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