电子工程设计第三阶段报告
题目4:温度控制系统的定时测量、定时控制、数据记录功能扩展
专业: 电子信息工程 |
12021031
指导教师:高新
完成日期:
目录
一.实验介绍………………………………………………3
二.根底模块介………………………………………………3
三.功能设计…………………………………………………4
四.总体设计…………………………………………………9
五.程序调试与遇到的问题…………………………………11
七.参考文献……………………………………………….12
附录………………………………………………………….13
温度控制系统的定时测量、定时控制、数据记录功能扩展
一.实验介绍
1、工程简介:该工程在已经完成的闭环温度控制系统上增加一些新的功能。包括定时温度测控和数据记录二个方面。定时温度测控指的是按一定时间间隔刷新温度的测量结果显示和在规定的时间点上启动温度控制过程。数据记录指的是温度测量的文字数据存档和温度变化过程的图形数据输出。
2、实验背景:实时钟电路为能够实时提供准确的日期、时间数据的专用电路,可用于以时间作为动作参考的测控系统之中。实时钟电路均带有标准的处理器接口,可以通过简单的数据访问操作实时获得所需的日期、时间信息。
非易失存储器可用于掉电数据不丧失的数据保存需要。非易失存储器常用的有EPROM、EEPROM、FlashROM、FRAM等,其中EEPROM是低本钱、使用简单的非易失存储器,可用于几百KB规模的数据掉电不丧失存储。
3、实验要求: |
二.根底模块介绍
1、单片机C8051F023
主要连接如下列图
2、显示、键盘电路:接在cs4,地址0x8000
3、AD转换电路:将模拟信号转为数字信号,负责读取温度,接在cs0,
地址0x0000 | |
4、DA 转换电路:负责控制实验箱温度的上升与下降,接在cs3,地址0x2000 |
三.功能设计
1.时钟功能
〔1〕硬件设计:时钟功能我们选用ds12887芯片来实现。
DS12887是Dallas半导体公司推出的实时时钟芯片,在没有外部供电的情况下,可以正确走时10年;可以计数时分秒、年月日和星期等信息。以下为其连接图。
AD0~AD7 是地址、数据复用线,跟标准的51单片机的P0口类似,在一个
读写周期里的前后两个时间段分别是作为地址线或数据线。可与f023单
片机的AD0~AD7口直连。
ALE为地址锁存信号,因为DS12887数据地址线采用分时复用的形式,所以需要ALE作地址锁存信号。在一个读写周期里AD0~AD7引脚上首先出现的信号表示地址,通过ALE的下降沿将该信号锁存到DS12887的地址存放器,稍后AD0~AD7引脚上出现的信号那么表示写入或读出DS12887的数据。ALE可以直接连接至f023的ALE引脚。
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_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; //读取秒 |
系列从24C01到24C512,C后面的数字代表该型号的芯片有多少K的存储位。ATMEL的24C存储位是K位电源,可以擦写1百万次,数据可以保持100年使用5V电源时时钟可以到达400KHz。
SDA是串行数据引脚用于在芯片读写时输入或输出数据、地址等,这个引脚是双向引脚,它是漏极开路的使用时需要加上一个上拉电阻。接在P1*5。
SLC 脚是器件的串行同步时钟信号,如果器件是使用在单片机系统中那么 |
芯片处于正常的读写状态。
A0到A2为总线地址,我们由于不用总线就置于000了。
注:本来f023单片机是由专用slc与sda引脚的,但由于关于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();//调用启动子程序,通过控制sda、slc的输出启动24c芯片
writebyte_24c(0xa0);//写指令
writebyte_24c(addH);//写高位地址
writebyte_24c(addL);//写低位地址
if(n>32)//每页最多32字节
{n = 32;} | |
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〕硬件设计: | |
字符, |
接口。
我们这里选择并口连接。连接图如下。
D0到D7为数据传输口用于将数据信息传输到打印机,直接与单片机上
BUSY 引脚是来传送打印机的状态的,可以省略,接在P1*5. |
打印时机在收到几个特定的数据作为指令后,会根据数据来打印相应的文字符号,根据指令数据的不同,可以调整打印的方式、字体、大小等。
〔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转化为ASCII码pprint(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);c、z都是温度量,+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 周期 | |
{ Reset_Sources_Init(); | //复位源初始化 |
Port_IO_Init(); | //端口初始化 |
Oscillator_Init(); | //时钟源初始化 |
Voltage_Reference_Init();
ADC0_Init();
ADC1_Init();
DAC_Init();} | |
如下图,该程序运行开场后会直接进入定时局部,在定时局部可以通过按
键来实现年月日时分秒的实时显示与键入更改,也可以通过键入的时间进
展最大59 分59 秒的定时。 定时局部按键配置如下:键盘为4 行5 列 | |
0 | 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 |
换位 | 定时分钟 | 定时秒钟 | 键入月 | 键入日 |
显示年月 | 显示日时 | 显示分钟 | 键入时 | 键入分 |
在定时完毕后,程序会自动跳转到控温局部的程序。在控温程序局部,首先可以通过键入的温度来进展对现有温度的,将现在温度至键入值。根据按键也可以做到开场/停顿同步打印或打印已存好的数据与现在的实时温度。右下角的两个键可以实现将当前温度存入24C芯片或从24C芯片中的数据取出并显示在数码管上,实现数据的掉电不丧失存储。
序的最开场状态。 | |
五.程序调试与遇到的问题 | |
〔1〕时间控制局部:
由于用于控制时间的ds12887资料比拟多,可以从网上找到很完全的资料,所以在定时、计时的时间局部并没有什么困难,按照设计的步骤连接,在用程序测试一下根本就成功了。
然而在把定时的程序和控温程序放在一起时就出现了很多问题。应该是由于都是用AD0-AD7的数据口来传送数据吧,将数据写入ds12887的程序WriteDs12887()会导致整个控温局部瘫痪,显示乱码,不能进展循环等问题。对此我们经行过很多的删改测试,也都没有效果。但单独使用ds12887
的定时计时都没有问题,所以我最后决定从单独的定时局部开场重新编程, |
的中断口上,根据说明书的程序配置了打印机后,打印机根本还是没有反响,费了不少时间进展各存放器的尝试改动后,才明白例程无法直接使用。于是我开场研究打印机的工作方式,按例子程序理解,只要在STB的上升延时把相对应的数据从AD口送出就能控制打印机打印。但经过实验发现,P1*4、P1*6管脚并不能按我的要求输出相应的上升沿,
这个问题困扰了很久也没找到方法,最后还是问的高新教师,教师告诉我只有空闲的I/O口 才能实现这样的功能,在Initdevice 的初始化中,XBR0-XBR3存放器控
制了各引脚的功能控制。
在学习过XBR存放器相关的知识后,我把XBR1的配置删除以置空P1*4-P1*7,并把XBR3的首位置零,从0XC2改为0X42,使弱上位成立。
在改动后,STB、BUSY都可以正常的输出,打印机也可以成功打印了。
把打印机程序放入控温局部并没有出什么问题,要注意的一点就是除了打印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);} |
使用并不成功,之后我从网上也搜集了很多资料,花了两次课的时间也没有成功存入数据。
后来是在完成了打印局部后才有了进展,我按照网上用51单片机驱动24C的原理改良线路,放弃了f023单片机原本自带的SLC、SDA管脚,改接在P1*5、P1*7两个在连接打印机电路时初始化为I/O口的管脚。然后就可以普通的使用51单片机I/O口驱动24C的原理进展存取了,经过之前尝试过的程序,很快就完成了掉电存储的局部。
六.实验心得与体会 | |
在这次的实验过程中,硬件电路局部并不难,我们在焊接时,适时检查有无漏接,错接,分模块检查,而不是都焊完后检查。同样地,我们检查硬件电路时,从电源,接地查起,进而检查数据线等等。另外,我们在焊接时尽量防止了串线跨线等不良的焊线方法,按照一定的顺序来焊接以方便查线和改接。不过由于新增的线路并不多,所以根本上从两端进展通断检测就可以发现大局部问题。
电子工程第三阶段对于我们来说是一个新的实验内容,我们在此次实践中学到了更多的知识,并通过第二阶段设计单片机系统的经历和编程经历进展了进一步的尝试,有了一定的经历积累。我们做到了自己思考设计
原理,从网上寻找,可见这是对知识的一次深层理解。理论的学习流于纸 |
的过程中有所出入,但通过对C8051F系列单片机的头文件以与Init-device库函数的研究,我们最终解决了这些问题。在这次实验中,我们锻炼了实践能力,懂得了即使资料十分有限的情况下,只要能根据工作原理、细化问题,研究好每个细节的局部,也总能把东西吃透,理解其相关的工作方法。在理论上可以计算出来的电路,在焊接到板子上之后又是另一种情况。同时,我们在编程的过程中,实践的过程中,了解了更多 不断通过实践来提高自己的能力,的单片机的知识。
今后我们要培养耐心, 加深自己的认知。最后感谢高新教师对我们的耐心教诲。
七.参考文献
〔1〕?电子工程设计任务书?
〔2〕其他元器件参数与简介书目
附录
1、 | 课设结果 | |
|
上图左边为实时打印的温度与要求温度,文字右侧为保存的温度,由于保 |
存点数不够,所以前10 个点被新进入的数据改写了,导致图像的开场点 |
位于中间。
2、24c相关子程序
ucharreadbyte_24c(uchar ack) //ack 应答位,ack=1,MCU不应答〔不继续承受数据〕
{ //ack=0,MCU应答,继续承受数据
uchari,data_from_24c;
scl_24c= 0;
for(i=0;i<8;i++)
{data_from_24c<<=1;
scl_24c = 1;Delay_xus(1); | |
} | |
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();} |
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);
为高电平 } |
}
Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务