11级自动化专业《微机原理及接口技术课程设计》任务书及指导书一、设计任务设计、调试一个具有温度检测、串行A/D和液晶显示温度值得一个温度检测系统二、设计目的1.通过实践进一步理解和掌握微机接口技术;2.掌握使用汇编及C语言开发单片机系统的方法;3.复习使用Protel制作电路板的技能;4.学会通过阅读相关器件的英文资料设计产品;5.进一步提高设计、调试单片机系统的能力。
三、设计内容本设计在Lab8000通用微控制器实验系统及由北京建筑大学研制的温度测量及控制扩展板上做。
要求手动控制加热,然后将温度检测产生的模拟量送入串行A/D转换器TLC549,转换得到的数字量送入CPU,经适当转换送液晶显示器显示温度值。
在设计和调试过程中要将设计中涉及的各部分逐个调试通过,然后再整体调试。
在逐个调试时,可使用一些模拟信号,例如在调试串行A/D时,可先将模拟量输入接一个电位器,由电位器模拟温度量输入。
1.温度测量与控制电路系统使用集成电路温度传感器AD590作为测温器,AD590是AD公司生产的一种精度和线性度较好的双端集成温度传感器,其输出电流与绝对温度有关,对于电源电压从5-10V变化只引起1A最大电流的变化或1摄氏度等效误差。
图1 温度传感部分图1给出了用于获得正比于绝对温度的输出电流的基本温度敏感电路,当温度有了10℃的变化时输出电压变化为20mV,即该电路运放1脚电压随温度变化为2mV/℃。
AD590将温度变化量转换成电压值变化量,经过LM324一级跟随后输入到电压放大电路,放大后的信号输入到A/D转换器将模拟信号转换成数字信号,利用CPU采集并存储采集到的数据。
将温度传感器输出的小信号跟随放大45倍左右后,送至8位A/D转换器换成数字量。
设定温度为0摄氏度时变换放大电路送出的模拟量为0V,此时A/D输出的数字量为00H;温度为67摄氏度时变换放大电路送出4.98V电压,此时A/D输出的数字量为FFH,即每0.3摄氏度对应1LSB变化量。
当温度超过报警温度报警67摄氏度,此时,输出电压约为5.0V左右。
通过电压比较器接通硬件报警电路报警。
输入A/D的模拟信号有过压保护,不会损坏A/D转换器。
在实验扩展板硬件中,已有安全设计,即加热温度不会超过80℃。
扩展板已依据标准调整好了放大器的增益和零位。
应注意:由于热惯性的影响及温度计显示的滞后因素,若要精确观察某温度点的测量值,在加热到观察温度点后,应停止加热,等待温度计示值稳定后,再观察记录结果。
若观察点温度较高,还应相应延长等待时间。
需要说明的是,由于温度计和温度采样芯片AD590的采样点不同,理论计算值同显示略有偏差。
温度测量电路原理参见图2。
图2 温度测量电路在上图中,可变电阻R7为测温系统零点调节,可以调节系统零点。
调节电位器R7,用万用表测量如图R4、R5、R6三个电阻相接的公共点,将该点电压调到-2.74V(注:该点电压已调到-2.74V,学生不要随意调节,可以直接做实验)。
用导线连接“温度测量”到“TLC549模拟量输入”;加热模块的“温度控制”手动接VCC(+5V)或GND,以手动控制是否加热。
2.串行A/D转换器TLC549是一种采用8位逐次逼近式工作的A/D转换器。
内部包含系统时钟、采样和保持、8位A/D转换器、数据寄存器以及控制逻辑电路。
TLC549每25uS重复一次“输入——转换——输出”。
器件有两个控制输入:I/O CLOCK和片选(CS)。
内部系统时钟和I/O CLOCK可独立使用。
应用电路的设计只需利用I/O时钟启动转换或读出转换结果。
当CS为高电平时,DATA OUT处于高阻态且I/O时钟被禁止。
当CS变为低电平时,前次转换结果的最高有效位(MSB)开始出现在DATA OUT端。
在接下来的7个I/O CLOCK周期的下降沿输出前次转换结果的后7位,至此8位数据已经输出。
然后再将第8个时钟周期加至I/O CLOCK,此时钟周期的下跳沿变使芯片进行下一轮的AD转换。
在第8个I/O CLOCK周期之后,CS必须变为高电平,并且保持高电平直至转换结束为止(>17uS),否则CS的有效高电平至低电平的转换将引起复位(其它详细资料看芯片说明)。
TLC549串行模数转换电路原理参见图3。
图3 TLC549串行模数转换电路3.液晶显示器四、设计要求1.进行总体方案设计:1)画出系统硬件原理图并用文字说明原理;2)将程序划分为若干个模块,画出框图;3)依据题意,确定各接口芯片工作于何方式下;4)确定各接口芯片的端口地址、控制字等,为初始化编程做好准备;2.画出各模块内的流程图,依据流程图编写源程序代码,并写出注释;3.将源程序汇编、连接,产生可执行文件;4.硬件与软件调试,通过实验达到设计要求。
5.硬件设计完成后,要在Protel中画出原理图及印制板图,并打印出来附在报告中。
五、实验设备1.微机一台2.Lab8000通用微控制器实验系统一套3.温度测量及控制扩展板一块六、设计过程1.液晶屏液晶显示器简称LCD显示器。
它是利用液晶经过处理后能改变光线的传输方向的特性实现显示信息。
液晶显示器按其功能可分为三类:笔段式液晶显示器、字符点阵式液晶显示器和图形点阵式液晶显示器。
前两种可显示数字、字符和符号等,而图形点阵式液晶显示器还可以显示汉字和任意图形,达到图文并茂的效果。
本次课程设计我选用字符型点阵式LCD液晶显示器RT-1602C,用作显示检测到的温度。
RT-1602C采用标准的16脚接口,各引脚情况如下:第1脚:VSS,电源地第2脚:VDD,+5V电源第3脚:V0,液晶显示偏压信号,一般加电位器调整第4脚:RS,数据/命令选择端,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W,读/写选择端,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E,端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7,为8位双向数据线。
第15脚:BLA,背光源正极第16脚:BLK,背光源负极2.TLC549(1)因测得的温度是模拟量,所以需要模数转换器,将其转换为数字量,通过单片机89C51传入液晶显示器RT-1602C,将其输出。
本次课程设计我选用A/D转换器TLC549。
(2)TLC549是 TI公司生产的一种低价位、高性能的8位A/D转换器,它以8位开关电容逐次逼近的方法实现 A/D转换,其转换速度小于 17us,最大转换速率为 40000HZ,4MHZ典型内部系统时钟,电源为3V至 6V。
它能方便地采用三线串行接口方式与各种微处理器连接,构成各种廉价的测控应用系统。
TLC549片型小,采样速度快,功耗低,价格便宜,控制简单.适用于低功耗的袖珍仪器上的单路A/D或多路并联采样。
(3)TLC549 引脚图及各引脚功能TLC549引脚图REF+:正基准电压输入 2.5V≤REF+≤Vcc+0.1。
REF-:负基准电压输入端,-0.1V≤REF-≤2.5V。
且要求:(REF+)-(REF-)≥1V。
VCC:系统电源3V≤Vcc≤6V。
GND:接地端。
/CS:芯片选择输入端,要求输入高电平VIN≥2V,输入低电平VIN≤0.8V。
DATA OUT:转换结果数据串行输出端,与 TTL 电平兼容,输出时高位在前,低位在后。
ANALOGIN:模拟信号输入端,0≤ANALOGIN≤Vcc,当ANALOGIN≥REF+电压时,转换结果为全“1”(0FFH),ANALOGIN≤REF-电压时,转换结果为全“0”(00H)。
I/O CLOCK:外接输入/输出时钟输入端,同于同步芯片的输入输出操作,无需与芯片内部系统时钟同步。
(4)应用接口及采样程序TLC549可方便地与具有串行外围接口(SPI)的单片机或微处理器配合使用,也可与51系列通用单片机连接使用。
实际应用程序清单如下:初始化:SETB P1.2 ;置CS为1。
CLR P1.0 ;置I/O CLOCK为零。
MOV R0,#00H ;移位计数为零。
A/D过程:A/DP:CLR P1.2NOP;等待1.4μs,NOP数根据晶振情况选择NXT:SETB P1.0MOV C,P1.1RLC ACLR P1.0INC R0CJNE R0,#8,NXTMOV R0,#00SETB P1.2MOV DTSVRM,A ;DTSVRM:DATA SAVE RAM.RET3.Protel设计4.温度检测器实物调试将各个元器件在电路板上焊接好,然后进行温度检测调试。
因为是初学者,又有老师的指导,所以实物调试与仿真结果基本相似。
但焊接时,要注意排列好各个元器件的位置,以免元器件过于紧凑,或是电线接错位置,或混联。
七、设计成果1.Protel原理图2. Protel印制板图3.Proteus仿真图4.程序编辑(1)汇编程序LCD_RS EQU P3.0LCD_RW EQU P3.1LCD_EN EQU P3.2LCD_DATA EQU P1DAT BIT P2.4CLK BIT P2.5CS BIT P2.3LCDDBuf EQU 40H ;显示数据缓冲SetTemp EQU 50H ;设定温度缓冲CurTemp EQU 51H ;测得温度缓冲ORG 0LJMP STARTORG 0030HSTART: LCALL SET_LCDSTART1: LCALL TLC549_ADCLCALL CONVMOV A,#80HLCALL WCOM ;写入命令mov a,LCDDBUF+1ORL A,#30HLCALL WDATAMOV A,#81HLCALL WCOM ;写入命令mov a,LCDDBUFORL A,#30HLCALL WDATALJMP START1CONV: MOV B,#67 ; ADHEX*67/256MUL ABMOV A,BMOV CurTemp,Amov b, #10 ; 拆开显示div abmov LCDDBUF+1,Amov a, bmov LCDDBUF,ARETWCOM: ;以8位控制方式将命令写至LCDMOV LCD_DATA,A ;写入命令CLR LCD_RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲 CLR LCD_RWSETB LCD_ENLCALL DECLR LCD_ENRETWDATA: ;以8位控制方式将数据写至LCDMOV LCD_DATA,A ;写入数据SETB LCD_RSCLR LCD_RWSETB LCD_ENLCALL DECLR LCD_ENLCALL DERETSET_LCD: ;8位I/O控制 LCD 接口初始化MOV A,#38H ;双列显示,字形5*7点阵LCALL WCOMLcall delay1MOV A,#38HLCALL WCOMLcall delay1MOV A,#38HLCALL WCOMLcall delay1MOV A,#0CH ;开显示,显示光标,光标不闪烁 LCALL WCOMLcall delay1MOV A,#01H ;清除 LCD 显示屏LCALL WCOMLcall delay1RETDELAY1: ;延时5MSMOV R6,#25DL2: MOV R7,#100DJNZ R7,$DJNZ R6,DL2RETDE: MOV R7,#250DJNZ R7,$RETTLC549_ADC:CLR ACLR CLKCLR CSMOV R6,#8ADLOOP:SETB CLKNOPNOPMOV C,DATRLC ACLR CLKNOPDJNZ R6,ADLOOPSETB CSSETB CLKRETEND(2)C程序#include <reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit rs=P3^0; //命令/数据选择sbit rw=P3^1; //读写口sbit e=P3^2; //锁存控制sbit CLK = P2^5;sbit DO = P2^4;sbit CS = P2^3;unsigned int Volt;unsigned char LCD[7];uchar data kaishi[16]={" wengdu "};uchar data dis1[16]={" my muxt "}; //显示两行uchar data dis2[16]={" be struggle "};delay(uint time) //int型数据为16位,所以最大值为65535 {uint i,j; //定义变量i,j,用于循环语句for(i=0;i<time;i++) //for循环,循环50*time次for(j=0;j<100;j++); //for循环,循环50次}wcode(uchar t){rs=0; // 写的是命令rw=0; // 写状态e=1; //使能P1=t; //写入命令delay(20); //等待写入,如果时间太短,会导致液晶无法显示e=0; //数据的锁定}wdata(uchar t){rs=1; // 写的是数据rw=0; // 写状态e=1; //使能P1=t; //写入数据delay(20); //等待写入,如果时间太短,会导致液晶无法显示e=0; //数据的锁定}xian1(){uchar i;wcode(0x80); //设置第一行显示地址for(i=0;i<16;i++) //循环16次,写完1行{wdata(dis1[i]); //写入该行数据}}//******************************************************************//LCD显示第二行//******************************************************************xian2(){uchar i;wcode(0xc0); //设置第二行显示地址for(i=0;i<16;i++) //循环16次,写完1行{wdata(dis2[i]); //写入该行数据}}//******************************************************************//LCD 初始化//******************************************************************InitLCD(){wcode(0x01); //清屏wcode(0x06); //输入方式控制,增量光标不移位wcode(0x0e); //显示开关控制wcode(0x38); //功能设定:设置16x2显示,5x7显示,8位数据接口}unsigned char TLC549_ADC(void){unsigned char i, tmp;CS = 1;CLK = 0;CS = 0;_nop_();_nop_();for(i = 0; i < 8; i++){tmp <<= 1;tmp |= DO;CLK = 1;_nop_();CLK = 0;}CS = 1;for(i = 17; i != 0; i--) _nop_();return (tmp);}void Volt_To_LCD(void){uchar AD_Data;AD_Data = TLC549_ADC();Volt = 5.0 / 256 * AD_Data * 1000;LCD[0] = ' ';LCD[1] = ' ';LCD[2] = ' ';LCD[3] = ' ';LCD[4] = ' ';LCD[5] = Volt / 1000 + '0'; //千位LCD[6] = Volt / 100 % 10 + '0'; //百位LCD[7] = '.'; //小数点LCD[8] = Volt / 10 % 10 + '0'; //十位LCD[9] = Volt % 10 + '0'; //个位LCD[10] = 'c';LCD[11] = '\0'; //字符串结束标志符}void xianshi(){int i;wcode(0x80);for(i=0;i<16;i++){ wdata(kaishi[i]);delay(20);}wcode(0x80+0x40);for(i=0;i<16;i++){ wdata(LCD[i]);delay(20);}}main(){uchar i;InitLCD(); //初始化1602xian1(); //显示第一行xian2(); //显示第二行while(1) //进入死循环,防止看门狗复位{for(i=0;i<16;i++){xianshi; //每输入一次码,向左移位一次delay(3000); //滚动速度设置}}}。