您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页温度控制系统定时测量定时控制数据记录功能扩展

温度控制系统定时测量定时控制数据记录功能扩展

来源:小侦探旅游网

电子工程设计第三阶段报告

题目4:温度控制系统的定时测量、定时控制、数据记录功能扩展

专业: 电子信息工程

12021031

指导教师:高新

完成日期:

目录


实验介绍………………………………………………3

二.根底模块介………………………………………………3

三.功能设计…………………………………………………4

四.总体设计…………………………………………………9

五.程序调试与遇到的问题…………………………………11


七.参考文献……………………………………………….12

附录………………………………………………………….13



温度控制系统的定时测量、定时控制、数据记录功能扩展

一.实验介绍

1工程简介:该工程在已经完成的闭环温度控制系统上增加一些新的功能。包括定时温度测控和数据记录二个方面。定时温度测控指的是按一定时间间隔刷新温度的测量结果显示和在规定的时间点上启动温度控制过程。数据记录指的是温度测量的文字数据存档和温度变化过程的图形数据输出。

2实验背景:实时钟电路为能够实时提供准确的日期、时间数据的专用电路,可用于以时间作为动作参考的测控系统之中。实时钟电路均带有标准的处理器接口,可以通过简单的数据访问操作实时获得所需的日期、时间信息。

非易失存储器可用于掉电数据不丧失的数据保存需要。非易失存储器常用的有EPROMEEPROMFlashROMFRAM等,其中EEPROM是低本钱、使用简单的非易失存储器,可用于几百KB规模的数据掉电不丧失存储。

3、实验要求:
微型打印机是一种低本钱记录设备,可用于文字、图形的存档记录。
用微型打印机记录测温结果与温度变化趋势曲线。

二.根底模块介绍

1、单片机C8051F023



主要连接如下列图



2、显示、键盘电路:接在cs4,地址0x8000

3AD转换电路:将模拟信号转为数字信号,负责读取温度,接在cs0

地址0x0000


4DA 转换电路:负责控制实验箱温度的上升与下降,接在cs3,地址0x2000


三.功能设计
1.时钟功能
1〕硬件设计:时钟功能我们选用ds12887芯片来实现。

DS12887Dallas半导体公司推出的实时时钟芯片,在没有外部供电的情况下,可以正确走时10年;可以计数时分秒、年月日和星期等信息。以下为其连接图。


AD0~AD7 是地址、数据复用线,跟标准的51单片机的P0口类似,在一个
读写周期里的前后两个时间段分别是作为地址线或数据线。可与f023
片机的AD0~AD7口直连。

ALE为地址锁存信号,因为DS12887数据地址线采用分时复用的形式,所以需要ALE作地址锁存信号。在一个读写周期里AD0~AD7引脚上首先出现的信号表示地址,通过ALE的下降沿将该信号锁存到DS12887的地址存放器,稍后AD0~AD7引脚上出现的信号那么表示写入或读出DS12887的数据。ALE可以直接连接至f023ALE引脚。


CS 为片选信号,为低电平时选中芯片,是DS12887的读写基地址:接在

cs3,地址0x4000

RST引脚输出有效低电平,该引脚为漏极开路输出,在外部需要加上拉电阻。复位功能在本设计中不使用,RST可以直接接高电平。

2〕程序设计
ds12887的程序分为三局部,定义、写入和读取。

定义:unsignedchar a[7]={15,4,21,7,14,0,0}//定义一个存取数据的数组,7位代表了年、月、日、星期、小时、分、秒。

#define DS12887 0x4000 //定义时钟芯片的片选基址#define DS12887_sec DS12887+0x00 //

#define DS12887_hour DS12887+0x04 //
#define DS12887_min DS12887+0x02 //

#define DS12887_Reg_C DS12887+0x0c //存放器C
#define DS12887_Reg_D DS12887+0x0d //存放器D

写入:void WriteDs12887()
{REG_ADD=DS12887_Reg_B;
*REG_ADD=0x80;
REG_ADD=DS12887_min; *REG_ADD=a[5]; //a数组的分数据放入ds12887
REG_ADD=DS12887_sec; *REG_ADD=a[6]; //a 数组的秒数据放入

ds12887
REG_ADD=DS12887_Reg_A; *REG_ADD=0x20;
REG_ADD=DS12887_Reg_B; *REG_ADD=0x06;}
读取voidReadDs127887()//12887中的数据读取到a中相应位置{ unsigned char temp;
REG_ADD=DS12887_Reg_B;
do{ temp=*REG_ADD;
}while((temp&0x80)==0x80);
REG_ADD=DS12887_min; a[5]=*REG_ADD; //读取现在的分

REG_ADD=DS12887_sec; a[6]=*REG_ADD; //读取秒
}
1
ATMEL 公司生产的 I2C 总线的EEPROM 芯片,属于最常用24C 系列。24C

系列从24C0124C512C后面的数字代表该型号的芯片有多少K的存储位。ATMEL24C存储位是K位电源,可以擦写1百万次,数据可以保持100年使用5V电源时时钟可以到达400KHz



SDA是串行数据引脚用于在芯片读写时输入或输出数据、地址等,这个引脚是双向引脚,它是漏极开路的使用时需要加上一个上拉电阻。接在P1*5

SLC 脚是器件的串行同步时钟信号,如果器件是使用在单片机系统中那么
SLC 脚应该由单片机控制根据单片机的程序要求产生串行同步时钟信号
写入状态,所制止的地址段要看各芯片的详细资料,当把WP 脚接到地线

芯片处于正常的读写状态。

A0A2为总线地址,我们由于不用总线就置于000了。

注:本来f023单片机是由专用slcsda引脚的,但由于关于f023用的总线资料不太好找,所以我们决定和打印机一样使用在Initdevice 中被定义成I/O口的P1*4-P1*7管脚了。

2〕程序局部

*start〔〕、stop〔〕等子程序在附录中可查看


写入函数:void write_m_data_24c(uchar addH,uchar addL,uchar



*m_data_24c,uchar n) //从某地址开场连续多字节写入〔前两位写入上

下地址,第四位地址相当于一页,第三位为存储写入数据的数组〕{uchar i;
start_24c();//调用启动子程序,通过控制sdaslc的输出启动24c芯片
writebyte_24c(0xa0);//写指令
writebyte_24c(addH);//写高位地址
writebyte_24c(addL);//写低位地址
if(n>32)//每页最多32字节

{n = 32;}
for(i=0;i<n;i++)


stop_24c();}

读取:voidread_m_data_24c(uchar addH,uchar addL,uchar n)//从某地址开场连续读取n个数据
{uchari;
if(n>32)//n 不能大于32,会从头覆盖字节
{n=32;}
start_24c();

writebyte_24c(0xa0);//写写指令writebyte_24c(addH);//写高位地址



writebyte_24c(addL);//写低位地址(实际上是调24c地址指针到要读取的数据的地址)
stop_24c();
start_24c();
writebyte_24c(0xa1);//写读指令
for(i=0;i<n;i++) //n个字节数据
{w[i]= readbyte_24c(0);}//将数据存入宏定义数组w中。

stop_24c();
}

1〕硬件设计:


字符,
外接口可选用标准并行接口,标准串行接口,485 接口,可选配红外无线

接口。

我们这里选择并口连接。连接图如下。



D0D7为数据传输口用于将数据信息传输到打印机,直接与单片机上

BUSY 引脚是来传送打印机的状态的,可以省略,接在P1*5.
AD0-AD7 连接。

打印时机在收到几个特定的数据作为指令后,会根据数据来打印相应的文字符号,根据指令数据的不同,可以调整打印的方式、字体、大小等。

2〕程序局部:
传送数据:voidpprint(unsigned int ch)
{while(BUSY1);当打印机忙时循环

P3=ch;//p3 位单片机AD0-AD7 STB=0; //STB 0




delay();
STB=1;//STB 1,此时p3口数据将被承受
}
文字、数字打印:
c1=c/10+48;c2=c%10+48;//将数字分为个位、十位,+48转化为ASCIIpprint(0x1b);pprint(0x38);pprint(0x00);//调用汉字出库指令for(i=0;i<strlen(zh);i++)//循环打印字符串,zh中存有“当前温度〞字样
pprint(zh[i]);pprint(c1);pprint(c2);

pprint(0x0d);//完毕标志,这样打印出“当前温度XX〞字样,XX 表示温度数字
曲线打印:

pprint(0x1b);pprint(39);pprint(2);//曲线打印指令,一次打一个点,2表示同时打两条线
pprint(30+c);pprint(30+z);cz都是温度量,+30是为了让温度起点高一些。

pprint(13);

四.总体设计
1、系统初始化
主要为在原有Init_Device()函数中Port_IO_Init()I/O口配置进展改


voidPort_IO_Init()//*I/O 口的配置为主要改动
{

//舍弃XBR1的配置,使P1*4-P1*7空闲
XBR2 = 0x42; //开启第一位的弱上位允许
//穿插开关使能,使用低端EMI
EMI0CF = 0x0F; //选择P2-P3作为总线端口,复用方式,仅使用外部RAM

EMI0TC = 0xDF; //总线访问地址建立时间3 SYS 周期
//总线访问读/写脉冲宽度8 SYS 周期,总线访问地址保持时间3 SYS
周期}
void Init_Device()

{ Reset_Sources_Init();

//复位源初始化

Port_IO_Init();

//端口初始化

Oscillator_Init();

//时钟源初始化

Voltage_Reference_Init();
ADC0_Init();
ADC1_Init();

DAC_Init()}
2、系统流程图






如下图,该程序运行开场后会直接进入定时局部,在定时局部可以通过按

键来实现年月日时分秒的实时显示与键入更改,也可以通过键入的时间进

展最大59 59 秒的定时。

定时局部按键配置如下:键盘为4 5




0

1

2

3

4

5

6

7

8

9

换位

定时分钟

定时秒钟

键入月

键入日

显示年月

显示日时

显示分钟

键入时

键入分

在定时完毕后,程序会自动跳转到控温局部的程序。在控温程序局部,首先可以通过键入的温度来进展对现有温度的,将现在温度至键入值。根据按键也可以做到开场/停顿同步打印或打印已存好的数据与现在的实时温度。右下角的两个键可以实现将当前温度存入24C芯片或从24C芯片中的数据取出并显示在数码管上,实现数据的掉电不丧失存储。

序的最开场状态。
为到达系统的完整,,也可以通过按键来重置控温程序或是返回到定时程


五.程序调试与遇到的问题



1〕时间控制局部:
由于用于控制时间的ds12887资料比拟多,可以从网上找到很完全的资料,所以在定时、计时的时间局部并没有什么困难,按照设计的步骤连接,在用程序测试一下根本就成功了。

然而在把定时的程序和控温程序放在一起时就出现了很多问题。应该是由于都是用AD0-AD7的数据口来传送数据吧,将数据写入ds12887的程序WriteDs12887()会导致整个控温局部瘫痪,显示乱码,不能进展循环等问题。对此我们经行过很多的删改测试,也都没有效果。但单独使用ds12887

的定时计时都没有问题,所以我最后决定从单独的定时局部开场重新编程,
将原有的控温程序的main 函数改名为step〔表示跳转〕函数,直接作为
子函数复制到新程序里,在定时完毕时向子程序跳转,这样定时局部和控

打印机本身比拟简单,但由于资料缺乏,研究起来十分困难。我选择
的是并口连接的方式,按照说明书的例子将BUSYSTB 连接在了P1*4P1*6

的中断口上,根据说明书的程序配置了打印机后,打印机根本还是没有反响,费了不少时间进展各存放器的尝试改动后,才明白例程无法直接使用。于是我开场研究打印机的工作方式,按例子程序理解,只要在STB的上升延时把相对应的数据从AD口送出就能控制打印机打印。但经过实验发现,P1*4P1*6管脚并不能按我的要求输出相应的上升沿,
这个问题困扰了很久也没找到方法,最后还是问的高新教师,教师告诉我只有空闲的I/O 才能实现这样的功能,在Initdevice 的初始化中,XBR0-XBR3存放器控

制了各引脚的功能控制。

在学习过XBR存放器相关的知识后,我把XBR1的配置删除以置空P1*4-P1*7,并把XBR3的首位置零,从0XC2改为0X42,使弱上位成立。

在改动后,STBBUSY都可以正常的输出,打印机也可以成功打印了。

把打印机程序放入控温局部并没有出什么问题,要注意的一点就是除了打印ASCII码以外都需要把相应的指令重新输入才能打印,例如: 打印曲线时for(i=0;i<20;i++){
ch=w[i];y1=2*z;y=2*ch;
pprint(0x1b);pprint(39);pprint(2);//打印曲线的指令程序

pprint(30+y);pprint(30+y1);pprint(13);}
如上式,指令程序必须在for 循环内,否那么依旧输出ASCII 码。
24C 的使用是我们本次课设的一大难点了,虽然有教师给的例程,但

使用并不成功,之后我从网上也搜集了很多资料,花了两次课的时间也没有成功存入数据。

后来是在完成了打印局部后才有了进展,我按照网上用51单片机驱动24C的原理改良线路,放弃了f023单片机原本自带的SLCSDA管脚,改接在P1*5P1*7两个在连接打印机电路时初始化为I/O口的管脚。然后就可以普通的使用51单片机I/O口驱动24C的原理进展存取了,经过之前尝试过的程序,很快就完成了掉电存储的局部。



六.实验心得与体会



在这次的实验过程中,硬件电路局部并不难,我们在焊接时,适时检查有无漏接,错接,分模块检查,而不是都焊完后检查。同样地,我们检查硬件电路时,从电源,接地查起,进而检查数据线等等。另外,我们在焊接时尽量防止了串线跨线等不良的焊线方法,按照一定的顺序来焊接以方便查线和改接。不过由于新增的线路并不多,所以根本上从两端进展通断检测就可以发现大局部问题。

电子工程第三阶段对于我们来说是一个新的实验内容,我们在此次实践中学到了更多的知识,并通过第二阶段设计单片机系统的经历和编程经历进展了进一步的尝试,有了一定的经历积累。我们做到了自己思考设计

原理,从网上寻找,可见这是对知识的一次深层理解。理论的学习流于纸
面,通过实际应用对知识的理解又深了一层。在编程与设计方面,可以说
方法。在调试环节,我们也遇到了一些问题,比方在定义管脚和实验板子

的过程中有所出入,但通过对C8051F系列单片机的头文件以与Init-device库函数的研究,我们最终解决了这些问题。在这次实验中,我们锻炼了实践能力,懂得了即使资料十分有限的情况下,只要能根据工作原理、细化问题,研究好每个细节的局部,也总能把东西吃透,理解其相关的工作方法。在理论上可以计算出来的电路,在焊接到板子上之后又是另一种情况。同时,我们在编程的过程中,实践的过程中,了解了更多 不断通过实践来提高自己的能力,的单片机的知识。
今后我们要培养耐心, 加深自己的认知。最后感谢高新教师对我们的耐心教诲。


七.参考文献
1?电子工程设计任务书?

2〕其他元器件参数与简介书目

附录

1

课设结果








上图左边为实时打印的温度与要求温度,文字右侧为保存的温度,由于保


存点数不够,所以前10 个点被新进入的数据改写了,导致图像的开场点



位于中间。

224c相关子程序
ucharreadbyte_24c(uchar ack) //ack 应答位,ack=1MCU不应答〔不继续承受数据〕
{ //ack=0MCU应答,继续承受数据
uchari,data_from_24c;
scl_24c= 0;
for(i=0;i<8;i++)
{data_from_24c<<=1;

scl_24c = 1;Delay_xus(1);
data_from_24c |= sda_24c;

}


sda_24c = ack;
scl_24c = 1;
scl_24c = 0;
sda_24c= 1;
return data_from_24c;
}
voidwritebyte_24c(uchar data_to_24c)//写入数据
{uchari;

scl_24c= 0;
for(i=0;i<8;i++)
{if(data_to_24c&0x80){
sda_24c= 1; }
else{sda_24c = 0;}
scl_24c= 1; //时钟线低变高,发数据
Delay_xus(1);
scl_24c= 0;
data_to_24c<<=1;}

ask_24c();}
void ask_24c() //写数据应答,第九个脉冲sda_24c为低,那么24c
scl_24c = 0;

scl_24c= 1;
Delay_xus(1);
while(sda_24c&&k--);//结合写数据发第九个脉冲,检查应答位,假设无应答,一定时间后退
scl_24c= 0;}

voidstop_24c()

{ sda_24c = 0;scl_24c = 1; Delay_xus(1);




sda_24c= 1;
Delay_xus(1);
scl_24c= 0;}

voidstart_24c()
{ sda_24c = 1;
scl_24c= 1;
Delay_xus(1);//也可不用延时,怕你单片机快;
sda_24c= 0;
Delay_xus(1);

为高电平 }
scl_24c = 0;//控制时钟线,防止数据误入// I2C 总线空闲时,sdascl

{while(i--);

}



Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务