综合任务温度报警器的设计与制作.ppt_第1页
综合任务温度报警器的设计与制作.ppt_第2页
综合任务温度报警器的设计与制作.ppt_第3页
综合任务温度报警器的设计与制作.ppt_第4页
综合任务温度报警器的设计与制作.ppt_第5页
已阅读5页,还剩157页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

综合任务 温度报警器的 设计与制作,教学导航 任务单 任务准备 案例示范 知识梳理与总结 任务作业 综合实训,教学导航,任务单,任务准备,8.1 液晶显示器显示 8.2 键盘与单片机的连接 8.3 A/D接口技术 8.4 D/A接口技术 8.5 数字温度传感器,8.1 液晶显示器显示,LCD(Liquid Crystal Display)是液晶显示器的缩写,液晶显示器是一种被动式的显示器,即液晶本身并不发光,而是利用液晶经过处理后能改变光线通过方向的特性,而达到白底黑字或黑底白字显示的目的。液晶显示器具有功耗低、抗干扰能力强等优点,因此被广泛应用。例如我们在手机、BP机、笔记本电脑和计算器上看到的都是液晶显示屏幕。由于LCD的控制必须使用专用的驱动电路,且LCD面板的接线需要采用特殊技巧,再加上LCD面板十分脆弱,因此一般不会单独使用,而是将LCD面板、驱动与控制电路组合成LCM模块(Liquid Crystal Display Mould,LCM)一起使用。 LCM的种类繁多,可以根据不同的场合、不同的需要选择不同类型的LCM,本书主要介绍1602字符型LCM(即两行显示,每行可显示16个字符)。,8.1.1 1602字符型LCM的特性及引脚功能,1字符型LCM的特性 (1)具有字符发生器ROM (Character Generate ROM, CG ROM),可显示192个57点阵字符,LCM显示的数字和字母部分的码值,刚好与ACSII码表中的数字和字母相同,所以在需要显示数字和字母时,只需要向LCM送入ASCII码即可。 (2)具有64B的自定义字符RAM (Character Generate RAM, CG RAM),可自行定义8个57点阵字符。 (3)具有80B的数据显示存储器(Data Display RAM,DD RAM)。,2字符型LCM的引脚功能,字符型LCM通常有16个引脚,也有14个引脚,当选用14个引脚的LCM时,该LCM没有背光。,8.1.2 1602字特型LCM与单片机的连接,1直接访问方式连接 该连接是由单片机的读(RD引脚)、写(WR引脚)和高位地址线共同控制LCM的E端,由高位地址线其中的两条分别与RS端和R/W端相连,由单片机的P0口LCM的DB0-DB7相连这样就构成了三总线(数据DB、地址总线AB和控制总线CB)的连接方式,如图所示。由于构成了三总线的结构,所以在软件控制上比较简单,用通过访问外部地址的方式就能访问LCM。但是,在使用这种连接方式时需要注意单片机的控制总线时序和地址总线时序必须要与LCM所需要的时序相匹配,否则将无法访问。,LCM与单片机的直接访问方式连接电路,2间接控制方式连接,是利用HD44780所具有的4位数据总线的功能,简化电路接口的一种连接方式,如图8-2所示。直接访问方式连接电路中需要增加与非门和反相器,从原理图上看很简单,但在实际焊接时,增加两个器件就增加了很多麻烦,另外增加器件也意味着增加了故障点,所以在实际使用时并不采用此电路。在图中,省去了4位数据线,电路连接十分简单,也没有多余的器件,对于参加比赛来说非常方便。,LCM与单片机的间接控制方式连接,2间接控制方式连接,但是由于LCM本身为速度较慢的器件,每一次数据传输大概需要几十微秒至几毫秒的时间,如果采用间接控制方式访问,每传送一个字节的数据需要访问两次LCM,这将占用大量的时间,使CPU变得很繁忙,甚至影响CPU处理其他数据的传输速度。所以在实际的硬件电路连接中常采用如图8-3所示的电路。采用这种连接方式不能构成三总线的结构,所以不能通过地址的形式直接访问,而是需要按照LCM的方式进行数据的传输,同时由于数据总线使用了8条,所以在数据传输的时间上与直接访问的时间相同,速度较间接控制方式提高了一倍,缩短了CPU对LCM的访问时间。,常用的LCM与单片机的连接,8.1.3 1602字符型LCM的指令集,提 示,(1)对LCM操作主要是4种基本操作:写命令、写数据、读状态和读数据。 (2)在进行写命令、写数据和读数据三种操作之前,必须先查询忙标志,当忙状态BF为0时,才能进行这三种操作。 (3)LCM上电时,都必须按照一定时序对LCM进行初始化操作,主要分以下四步: 设置LCM工作方式 设置显示状态 清屏:将光标设置为第1行第1列 设置输入方式:设置光标移动方向并确定整体显示是否移动 (4)当写一个显示字符后,如果没有再给光标重新定位,则DDRAM地址会自动加1或减1。 (5)对LCM的读写操作必须符合读写操作时序,并要有一定的延时。 读操作时,先设置RS和R/W状态,再设置E信号为高,这时从数据口读取数据,然后将E信号置低。 写操作时,先设置RS和R/W状态,再设置数据,然后产生E的脉冲,案例17 英文字符的液晶显示控制,利用基于HD44780控制芯片的1602液晶显示两行字符“Welcome you!”和“Guang Zhou,2010” 。,源程序(lcd.c),/液晶控制与显示程序 #include unsigned char count; sbit rs=P20; sbit rw=P21; sbit en=P22; void delay(unsigned int dely) unsigned char dely1; for(;dely0;dely-) for(dely1=10;dely10;dely1-); ,/液晶显示器判忙函数 unsigned char busy() unsigned char lcd_status; rs=0; /寄存器选择 rw=1; /读状态寄存器 en=1; /开始读 delay(100); lcd_status=P0;en=0; return lcd_status; ,源程序(lcd.c),/向液晶显示器写命令函数 void WR_Com(unsigned char temp) /忙等待 while(busy() ,/向液晶显示器写数据函数 void WR_Data(unsigned char dat) while(busy() ,源程序(lcd.c),/向液晶显示器写入显示数据函数 /入口条件:液晶显示器行首地址(指示第一行还是第二行)和待显示数组的首地址 void disp_lcd(unsigned char addr,unsigned char *pstr) unsigned char i; WR_Com(addr); delay(100); for(i=0;i16;i+) WR_Data(pstri); delay(100); ,源程序(lcd.c),/液晶显示器初始化函数 void lcd_init() WR_Com(0x38); /设置数据长度为8位、双行显示、57点阵字符 delay(100); WR_Com(0x01); /清屏 delay(100); WR_Com(0x06); /字符进入模式:屏幕不动,字符后移 delay(100); WR_Com(0x0c); /显示开,光标关 delay(100); ,源程序(主程序main.c),/main.c主程序 unsigned char welcome16=“Welcome you!“; unsigned char addr16=“Guang Zhou,2010“; void lcd_init(); /函数原型说明 void disp_lcd(unsigned char,unsigned char *); /函数原型说明 void main() int i=0; lcd_init(); disp_lcd(0x82,welcome); while(1) ,disp_lcd(0xc0,addr+i); i+; if(istrlen(addr) i=0; delay(10000);,案例18 空调预置温度的显示控制,两个LED数码管用于显示人工设置的希望环境温度值(简称预置温度),当实际环境温度高于该预置温度,则启动压缩机。两个LED数码管段选线分别连接到80C51的P1上,即两位预置温度的显示是通过将预置温度十位、个位数字BCD码分别由P1送入LED数码管来实现。,显示程序,#include unsigned char temp=30; main( ) unsigned char t10,t; t10=temp/10;t=temp%10; P0=(t104)|(t ,液晶显示预置温度,本任务的任务准备专门介绍了液晶显示器显示,空调制冷控制系统也可以使用液晶显示预置温度和当前环境温度,如果本案例改用液晶显示预置温度,将如何修改程序? 电路图仍可采用图8-4的电路,假设预置温度为30度,当前环境温度为32度,则液晶显示模块lcd.c可不必修改(见例8-1),只需修改主程序main.c。,主程序main.c,#include unsigned char currT16=“CurrentT:“; unsigned char setT16=“SetTemp:“; unsigned char setTemp=30,currTemp=32; void lcd_init(); void disp_lcd(unsigned char,unsigned char *); void format_Data(unsigned char temp,unsigned char *stemp) /将温度值转换为字符串 stemp0 = temp / 10+0; /将十位数字转换成ASCII码字符 stemp1 = temp % 10 +0; /将个位数字转换成ASCII码字符 ,主程序main.c,void main() unsigned char stemp2; /一定要定义为数组,不能为指针,否则温度显示不了 lcd_init(); format_Data(currTemp,stemp); disp_lcd(0x80,currT); disp_lcd(0x8a,stemp); format_Data(setTemp,stemp); disp_lcd(0xc0,setT); disp_lcd(0xca,stemp); while(1); ,8.2 键盘与单片机的连接,键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向计算机输入指令、地址和数据。一般单片机系统中采用非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。,8.2.1 按键及其抖动问题,组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的。当开关S断开时,P1.0输入为高电平,S闭合时,P1.0输入为低电平。由于按键是机械触点,当机械触点断开、闭合时,会有抖动。,消除抖动的方法,硬件方法:一般不常用。 软件方法:单片机设计中常用软件法,软件去除抖动其实很简单,就是在单片机获得P1.0口为低的信息后,不是立即认定S已被按下,而是延时10毫秒或更长一段时间后再次检测P1.0口,如果仍为低,说明S的确按下了,这实际上是避开了按键按下时的抖动时间。而在检测到按键释放后(P1.0为高),再延时510个毫秒,消除后沿的抖动,然后再对键值处理。,8.2.2 独立式按键接口技术,将每个按键的一端接到单片机的I/O口,另一端接地。,1、通过I/O口连接:,实例8-1,如下图所示,采用不断查询的方法,即检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入相应的键处理。假设两个键定义如下: P3.0:开始执行某种操作(假设让8只发光二极管闪烁) 。 P3.1:停止执行。,void delay(unsigned char); bit key(); void lsd(unsigned char); unsigned char vkey; bit start_end=0; void main() unsigned char ldata; while(1) ,if(key() if(vkey=1) start_end=1; else start_end=0; if(start_end) ldata=ldata; delay(250); else ldata=0xff; P0=ldata;,源程序,源程序(延时函数delay()),void delay(unsigned char t) unsigned char i,j; for(i=t;i0;i-) for(j=200;j0;j-); ,bit key() unsigned char temp; bit flag=0; temp=P3; temp=temp|0xfc; temp=temp0xff; if(temp=0) return flag; else ,delay(25); temp=P3|0xfc; temp=temp0xff; if(temp=0) return flag; else vkey=temp; flag=1; while(temp) temp=P3|0xfc; temp=temp0xff; return flag;,源程序(判断是否有键按下函数),2、采用中断方式,各个按键都接到一个与非门上,当有任何一个按键按下时,都会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中不断地循环查询,如果有键按下,单片机再去做相应的处理。,实例8-2 按照图8-9的电路,试编程实现由3个按键控制发光二极管的全亮、闪烁或全灭。,#include void delay(unsigned char); unsigned char flag; void main() IT0=1;EA=1;EX0=1; while(1) switch(flag) case 1:P0=0x00;break; case 2:P0=P0;delay(250);break; case 3:P0=0xff;break; ,void delay(unsigned char t) unsigned char i,j; for(i=t;i0;i-) for(j=200;j0;j-); ,中断服务函数,void isr_int0() interrupt 0 unsigned char kdata; kdata=P1;kdata=kdata0xff; kdata=1; if(kdata!=0) kdata=1; if(kdata!=0) flag=3; else flag=2; else flag=1; ,8.2.3 矩阵式键盘接口技术,在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,在需要的键数比较多时,采用矩阵法来做键盘是合理的。,1、矩阵式键盘的结构,当按键没有按下时,所有的输入端都是高电平,代表无键按下。一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可判断是否有键按下了。,1、矩阵式键盘的结构,2、矩阵式键盘的按键识别方法行扫描法,1)判断键盘中有无键按下。将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。 2)判断闭合键所在的位置。在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。,2、矩阵式键盘的按键识别方法行扫描法,行扫描法,行扫描法识别按键的方法就象在二维平面上找确定的点,要在二维平面上找到确定的点。 确定这点的横坐标:行线位置 确定它的纵坐标:列线位置 公式:键值=行号列数+列号,实例8-3 89S51单片机的P1口用作键盘I/O口,P0口用作输出口,用于输出所按键的键号(0F)。,89S51单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。列线P1.0P1.3分别接有4个上拉电阻到正电源+5V,并把列线P1.0P1.3设置为输入线,行线P1.4P1.7设置为输出线。4根行线和4根列线形成16个相交点。,行扫描识别步骤,(1)检测当前是否有键被按下:检测的方法是P1.4P1.7输出全“0”,读取P1.0P1.3的状态,若P1.0P1.3为全“1”,则无键闭合,否则有键闭合。 (2)去除键抖动:当检测到有键按下后,延时一段时间再做下一步的检测判断。 (3)若有键被按下,应识别出是哪一个键闭合。,识别键闭合的方法,对键盘的行线进行扫描。P1.4P1.7按下述4种组合依次输出: P1.7 1 1 1 0 P1.6 1 1 0 1 P1.5 1 0 1 1 P1.4 0 1 1 1 在每组行输出时读取P1.0P1.3,若全为“1”,则表示为这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。,流程图,键盘扫描程序,#include unsigned char seg16=0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e; void delay(unsigned char); unsigned char key_scan (); void main() unsigned char val_key; while(1) val_key=key_scan (); if(val_key!=0xff) P0=segval_key; ,void delay(unsigned char t) unsigned char i,j; for(i=0;it;i+) for(j=0;j200;j+); ,键盘扫描程序,键盘扫描函数,unsigned char key_scan() unsigned char kdata,vkey,keyNo; bit iskey=0; /标志,在确定具体哪一个键按下时,如果检测到有一个键按下则该标志置1 P1=0x0f; /行线送“0” kdata=P1; /读取列线值 kdata /无键按下,建立无效标志(0xff为无键按下的无效标志),键盘扫描函数,else /若列线均为“1”则无键按下,否则有键按下 delay(25); /有键按下,去除抖动 kdata=0xef; while(!iskey) /扫描键盘 vkey=P1=kdata; /送扫描码至P1口行线,并将扫描码保存到vkey中 kdata=P1; /读取列线值 kdata ,键盘扫描函数,else /若有键按下则键处理 kdata=0x0f; /为计算列值的方便,将列线P1.3P1.0分别与1异或即按位取反 switch(kdata) /计算列值 case 1:keyNo=0;break; case 2:keyNo=1;break; case 4:keyNo=2;break; case 8:keyNo=3;break; iskey=1; ,键盘扫描函数,vkey=vkey4; /取行扫描码 vkey=0x0f; /将行扫描码取反 switch(vkey) case 1:keyNo+=0;break; /把行值加到列值中 case 2:keyNo+=4;break; case 4:keyNo+=8;break; case 8:keyNo+=12;break; do kdata=P1; kdata ,案例19 空调制冷控制系统预置温度控制,如下图所示,“UP”是“升温”按钮,接INT0,“DOWN”是“降温”按钮,接INT1。显然,该案例中,提高或降低调节温度均采用中断方式实现,按“UP”则产生外部中断0,按“DOWN”产生外部中断1。,源程序(主函数),调节温度的设置可分别在外部中断0和外部中断1的中断服务程序中实现,在中断服务程序中,调节温度放在变量temp(采用BCD码)中,每发生一次中断,temp中的数据加1或减1,并再分别由8051的P1、P2控制的两个数码管显示其温度值。,#include unsigned char temp=30; main() unsigned char t10,t; IT0=IT1=1; t10=temp/10;t=temp%10; P0=(t104)|(t ,/按升温按钮的中断服务程序 void isr_int0() interrupt 0 unsigned char t10,t; if(temp30) temp+; t10=temp/10;t=temp%10; P0=(t104)|(t ,温度设定中断子程序:,/按降温按钮的中断服务程序 void isr_int1() interrupt 2 unsigned char t10,t; if(temp20) temp-; t10=temp/10;t=temp%10; P0=(t104)|(t ,温度设定中断子程序:,提示:,本案例还解决了一个处理十进制温度(BCD码)的问题,请留意。 本案例只是提供一个思路,仅供参考,不要把思维局限在本案例上。 本案例只用了两个按钮,可以直接采用中断法,但本任务却要四个按钮,能直接用吗?显然不行?,8.3 A/D接口实现,8.3.1 A/D转换基本知识,A/D转换器的作用是将模拟量转换为数字量,以便计算机接收处理,传感器,单片机,A/D转换,1.A/D转换器分类,(1)逐次逼近式:逐次逼近式属直接式A/D转换器。 (2)双积分式:双积分式是一种间接式A/D转换器。 (3)V/F变换式:V/F变换器能够将模拟电压信号转换为频率信号。 (4)并行式:并行式也属于直接式A/D转换器,它是所有类型A/D转换器中转换速度最快的。,2.A/D转换器主要技术性能指标,(1)分辨率:分辨率表示输出数字量变化一个最低有效位(Least Significant BitLSB)所对应的输入模拟电压的变化量。,n 为A/D转换器输出的二进制位数,(2)量化误差:模拟量是连续的,而数字量是断续的,当A/D转换器的位数固定后,数字量不能把模拟量所有的值都精确地表示出来,这种由A/D转换器有限分辨率所造成的真实值与转换值之间的误差称为量化误差。一般量化误差为数字量的最低有效位所表示的模拟量,理想的量化误差容限是1/2LSB。,2.A/D转换器主要技术性能指标,(3)转换精度:转换精度是一个实际的A/D转换器和理想的A/D转换器相比的转换误差。绝对精度一般以LSB为单位给出,相对精度则是绝对精度与满量程的比值。 (4)转换时间:指A/D转换器完成一次A/D转换所需时间。转换时间越短,适应输入信号快速变化能力越强。其倒数是转换速率。 (5)温度系数:是指A/D转换器受温度影响的程度。一般用环境温度变化1所产生的相对误差来表示,单位是PPM/(10-6/)。,8.3.2 ADC的工作原理及应用,ADC0809是美国国家半导体公司生产的CMOS工艺8通道、8位逐次逼近式A/D转换器。,1结构及转换原理,(1)八路模拟开关及地址锁存与译码器 (2)8位A/D转换器 (3)三态输出寄存器,2引脚功能,ADC0809采用DIP-28(双列直插式)封装,引脚功能表,3ADC0809的时序,4ADC0809与单片机的接口电路,A1,A2,8031,74LS373,ADC0809,分频,CLOCK,D0D7,1,1,1,G,EOC,S,TART,ALE,OE,RD,P2.7,WR,A,L,E,P0,A0A7,A0,REF(+),REF(-),+5V,GND,IN0,IN7,IN6,IN5,IN4,IN3,IN2,IN1,ADDA,ADDB,ADDC,INT1,主要功能信号的处理方法,(1)时钟信号:当单片机时钟频率高于6MHz时,ALE信号必须经2或4分频后才能接到ADC0809的CLOCK引脚上,否则不能正常工作。 (2)地址线和数据线:ADC0809的地址选择信号线和输出数据线均与P0口相接。ADDAADDC三根地址线的连接与芯片及模拟通道选择又密切关系,地址线经地址锁存器可提高输入信号的稳定性。 (3)控制信号:通过 、 和 P2.7的组合实现对ADC0809控制,显然只有当P2.7为低电平时才能对ADC0809进行操作。转换结束信号EOC通过非门与8031的连接,用来发出中断请求或供CPU查询转换状态。,各个通道的地址,设无关地址位为“1”,则模拟通道IN0IN7的地址依次为7FF8H7FFFH,5程序设计,单片机的A/D转换编程有两条基本原则:一方面要满足所选A/D转换器的转换时序要求,另一方面要根据具体的接口电路编写具体的转换程序即应用软件要和硬件协调、统一。 对于ADC0809而言,其控制程序的主要任务是如何判断一次A/D转换何时结束,只有以此为前提才能保证取回的转换结果的正确性。,(1)软件延时等待方式,完成一次A/D转换的一般流程是: 单片机工作寄存器初始化 送通道地址及启动转换信号 软件延时等待转换结束 送读取转换结果信号 输出转换结果。 其中软件延时时间取决于ADC器件的转换时间,可以通过计算和调试获得。,(2)程序查询方式,将A/D转换器的转换结束信号EOC接至单片机的某端口(如接入P3.3,即 ),启动转换开始后用程序查询该输入端是否出现转换结束信号,没有则继续查询,一旦出现结束信号即可取回转换结果。,(3)中断方式,将ADC的转换结束信号EOC经一定的逻辑接口引至单片机的外部中断输入端(如接入 ),用来向单片机提出中断申请。编程时,在主程序中启动A/D转换并继续执行主程序。当接收到ADC的转换结束EOC(即中断请求)信号后立即转去执行中断服务程序,并在其中完成取回转换结果、启动下一次转换等操作。,8.3.3 高精度ADC与单片机接口,AD574/AD674/AD1674是美国AD公司生产的12位逐次逼近式A/D转换器系列产品,它们转换精度高、速度快,内部设有时钟电路和参考电压源,其中AD1674还在片内集成了采样保持器,转换速度也最快,是AD574和AD674的升级换代产品。但价格较高,适用于高精度快速采样系统中。,1、AD1674的结构特点,(1)AD1674是12位A/D转换器,完成一次12位转换仅需10S,8位转换时间就更短,属于高速A/D器件;而ADC0809是8位A/D转换器,转换速度为100S。 (2)AD1674内部集成有转换时钟,参考电压源,因此它无须外接时钟和参考电压源;而ADC0809必须外部提供转换时钟。 (3)ADC0809只能转换单极性的0+5V输入模拟电压;而AD1674的输入模拟电压既可以是单极性的,也可以是双单极性的,且单极性时为0+10V或0+20V,双单极性为5V或10V。 (4)AD1674片内含有采样保持器,特别适宜于采集快速变化的动态过程信号。 (5)AD1674的数字量输出即可以用作8位转换又可以用作12位转换,同时也具备三态输出锁存器,因此可以方便地和8位微机连接。,2、AD1674的引脚,(1) :片选信号端。低电平有效。 (2)CE:使能端。高电平有效。它与共同用于片选控制,当CE 为“1”并且为“0”时选中本片工作,否则处于禁止状态。 (3)R/ :读/转换选择端。该信号为低电平时启动A/D转换,高电平时允许将A/D转换结果读出。 (4)12/ :输出数据格式选择信号端。高电平时输出数据格式为12 位,若为低电平则按8位数据格式分两次输出。注意,该信号与TTL电平不兼容,因此应直接接+5V或地。 (5)A0:字节选择转换长度控制端。 (6)DB0DB11:数字量输出端。,AD1674 的操作功能表,2、AD1674的引脚,(7)STS:转换状态输出端。 (8)VL:逻辑电源。 (9)VCC:正电源。其范围为+13.5V+16.5V。 (10)VEE:负电源。其范围为-13.5V-16.5V。 (11)AGND:模拟电源地。 (12)DGND:逻辑电源地。 (13)REF OUT:基准电压输出端。 (14)REF IN:基准电压输入端。 (15)10V IN:10V量程模拟电压输入端。在单极性时0+10V,双极性方式下为5V。 (16)20V IN:20V量程模拟电压输入端。在单极性时0+20V,双极性方式下为10V。 (17)BIP OFF:双极性偏移信号输入端。,案例20 单片机控制模拟电压的显示1,假设fOSC=6MHz,要求采用软件延时等待方式采集IN0通道的电压,将电压值由数码管显示。,源程序:,#include #define ADDRADC0 XBYTE0X7FF8 void delay(int);void dispvalue(); unsigned int value; unsigned char display=1,2,4; unsigned char led=0xC0,0XF9,0XA4,0XB0,0X99,0X92, 0X82,0XF8,0X80,0X90; void main() while(1) ADDRADC0=0;/写外部I/O地址操作,启动模数转换 delay(10); value =ADDRADC0; /读入转换结果 dispvalue(); ,延时和电压显示函数,void dispvalue() unsigned int i; value*=100.0*5/255; for(i=0;i3;i+) P2=displayi; P1=ledvalue%10; if(i=2) P1 ,void delay(int x) unsigned int i; while(x-) for(i=100;i0;i-); ,小技巧: 把电压值放大100倍显示,电压值的范围为05V,而并口为8位,数据范围为0255,电压值应为从ADC0809读出的值(P0)乘以5/255,特别注意这里要采用浮点运算,如果整数运算,则结果不对。,小技巧:,本案例利用Proteus仿真时看不到任何现象,原因是Proteus仿真时,单片机的ALE没有脉冲信号输出,要对单片机的属性进行如下设置:在Advanced Properties选项的第一个下拉框中选中Simulate Program Fetches;在第二个下拉框中选中Yes;再点击右上方的“确定”按钮。,案例21 单片机控制模拟电压的显示2,在案例20的基础上采用程序查询方式采集ADC0809模拟通道IN0的电压值,并在数码管上显示出来。设fOSC=6MHz。,源程序,#include #include void delay(int);void dispvalue(); sbit BUSY=P32;unsigned char xdata *addradc0; unsigned int value;unsigned char display=1,2,4; unsigned char led=0xC0,0XF9,0XA4,0XB0, 0X99,0X92,0X82,0XF8,0X80,0X90; void main() while(1) addradc0=0X7FF8; /指针的值为通道IN0的端口地址 *addradc0=0; /写外部I/O地址操作,启动模数转换 while(BUSY=1); value =*addradc0; /读入转换结果 dispvalue(); ,源程序,void dispvalue() unsigned int i; value*=100.0*5/255; for(i=0;i3;i+) P2=displayi; P1=ledvalue%10; if(i=2) P1 ,void delay(int x) unsigned int i; while(x-) for(i=100;i0;i-); ,案例22 单片机控制模拟电压的显示3,源程序:,#include void delay(int);void dispvalue(); unsigned char xdata *addradc; unsigned int value; unsigned char display=1,2,4; unsigned char led=0xC0,0XF9,0XA4,0XB0,0X99, 0X92,0X82,0XF8,0X80,0X90; void main() IT0=0;EA=1;EX0=1; addradc=0X7FF8; *addradc=0;/写外部I/O地址操作,启动模数转换 while(1); ,源程序:,void dispvalue() unsigned int i,temp; temp=value*100.0*5/255; for(i=0;i3;i+) P2=displayi; P1=ledtemp%10; if(i=2) P1 ,void delay(int x) unsigned int i; while(x-) for(i=100;i0;i-); ,源程序:,void isr_int0() interrupt 0 unsigned char i; value =*addradc; /读入转换结果 for(i=50;i0;i-) /由于是动态扫描方式,因此显示电压值要循环若干次。 dispvalue(); addradc+; if(addradc=0x7ffc) addradc=0x7ff8; *addradc=0; ,案例23 高精度ADC与单片机的接口,源程序:,#include sbit CE=P30;sbit RC=P31;sbit STS=P32; sbit LE=P25;sbit A0=P36;sbit CS=P33; #define N 0x0fff /十二位转换 unsigned long result=0; unsigned char seg =0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f; unsigned char buf4;,源程序:,void delay(int n) int i; while(n-) for(i=0;i10;i+); ,unsigned int ad1674_convert() unsigned int temp=0; STS=1;CS=0; CE=0;A0=0;RC=0;CE=1; delay(5); while(STS=1); CE=0;RC=1;A0=0;CE=1; delay(5); temp=P0;temp=P04; return temp; ,源程序:,void change() unsigned long result1; /用于中途的数据转换 unsigned long vol,vol_c; /电压显示,与电压的一个进位 result1=result*10000; /*100*10*10v 扩大一百倍,用来替代两位小数,扩大十倍用来小数点后第三位四舍五入,又乘以10,是最终电压。 vol=result1/N; / vol=result/0x0fff*10(v) vol_c=vol%10; if(vol_c=5) /四舍五入 vol=vol+10; vol=vol/10; buf0=vol/1000; buf1=vol/100%10; buf2=vol/10%10; buf3=vol%10; ,源程序:,void display() /显示子程序. int i; unsigned char temp=0xfe; for(i=0;i4;i+) LE=0; P2=temp; if(i=1) P1=segbufi+0x80; else P1=segbufi; LE=1; LE=0; delay(10); temp=(temp1)|1; P2=temp;/关显示,进行下一次测试 ,main() while(1) result= ad1674_convert(); change(); display(); ,8.4 D/A接口技术,D/A转换器的基本工作原理是:通过电阻网络将n位数字量逐位转换成模拟量,经运算器相加,从而得到一个与n位数字量成比例的模拟量。由于计算机输出的数据(数字量)是断续的,D/A转换过程也需要一定时间,因此转换输出的模拟量也是不连续的。,8.4.1 D/A转换基本知识,D/A转换器的分类,按数据输入方式,D/A转换器有串行和并行两类,输入数据包括8位、10位、12位、14位、16位等多种规格,输入数据位数越多,分辨率也越高; 按输出模拟量的性质,D/A转换器分电流输出型和电压输出型两种。电压输出又有单极性和双极性之分,如0+5V、0+10V、2.5V、5V、10V等,可以根据实际需要进行选择。,8.4.2 8位通用D/A转换器,DAC0832是并行输入、电流输出型的通用8位D/A转换器,它具有与微机连接简便、控制方便、价格低廉等优点,被广泛应用于微机系统中。,1结构,2.引脚功能,ILE:输入锁存允许信号,高电平有效。 :输入寄存器选择信号,低电平有效。 :写信号1,输入寄存器写选通信号,低电平有效。输入锁存器的锁存信号LE1由ILE、 、 的逻辑组合产生。当ILE为高电平, 和 同时为低电平时,LE1为正脉冲,输入寄存器的输出随输入变化;当 变成高电平时,LE1变为低电平,输入数据被锁存在输入锁存器中。 :写信号2,即DAC寄存器的写选通信号,低电平有效。 :数据传送控制信号,低电平有效。DAC寄存器的锁存信号LE2由 、 的逻辑组合产生,当 和 同时为低电平时,LE2为1,DAC寄存器的输出随它的输入而变化;当 变为高电平后,LE2变为0,LE2的负跳变将输入寄存器中的数据锁存在DAC寄存器中。,2.引脚功能,DI0DI7:8位数字输入端,DI0为最低端,DI7为最高端。 Iout1:DAC电流输出端1,为数字输入端逻辑电平为1的各位输出电流之和。DAC寄存器内容随输入端代码线性变化,DAC寄存器的内容为全1时,Iout1最大;全为0时,Iout1最小。 Iout2:电流输出端2。Iout2等于常数减去Iout1,即Iout1+ Iout2=常数。此常数对应于一固定基准电压的满量程电流。 RFB:反馈电阻。反馈电阻被制作在芯片内部,用作DAC提供输出电压的运放的反馈电阻。 Vref:基准电源输入端。Vref一般在-1010V范围内,由外电路提供。 Vcc:逻辑电源输入端,取值范围为+5+15V,+15V最佳。 AGND:模拟地,为芯片模拟电路接地点。 DGND,数字地,为芯片数字电路接地点。,DAC0832可以有三种工作形式:直通、单级缓冲、双缓冲。,3DAC0832与单片机的连接,(1)直通方式,直通方式是指两个数据输入寄存器都处于开通状态,即所有有关的控制信号都处于有效,输入寄存器和 DAC 寄存器中的数据随 DI0DI7的变化而变化,也就是说,输入的数据会被直接转换成模拟信号输出。这种方式在微机控制系统中很少采用。,(2)单缓冲方式,单缓冲方式是指两个数据输入寄存器中只有一个处于受控选通状态,而另一个则处于常通状态,或者虽然是两级缓冲,但将两个寄存器的控制信号连在一起,一次同时选通。单缓冲方式适用于单路D/A转换或多路D/A转换而不必同步输出的系统中。,单缓冲方式的接口,两个输入寄存器同时受控的方式,“同时”做何解释?,转换程序,DAC0832作为了8031的一个并行输出口,若假设无关地址线为1,那么其地址为7FFFH。如果把一个8位数据data写入7FFFH,也就实现了一次D/A 转换,输出一个与#data对应的模拟量。 #define ADDR0832 XBYTE0X7FFF /P2.7=0,定义DAC0832芯片的地址 ADDR0832=data;/写入0832,进行一次转换输出,案例24 单片机控制锯齿波输出,由于DAC0832典型的输出稳定时间是1s,因此输出信号的变化频率必须小于1MHz,亦即单片机的两次数字量输出之间的间隔必须大于1s。因为晶振频率为12MHz,程序中for语句和向DAC0832送数的语句的执行时间已足以达到1s的要求,所以程序中没有必要再进行额外的延时。,案例24 单片机控制锯齿波输出,#include #include #define DAC0832 XBYTE0X7FFF void delay(); void main() unsigned char i; while(1) for(i=0;i=255;i+) DAC0832=i; delay(); ,void delay() unsigned int i; for(i=100;i0;i-); ,1/28,2/28,3/28,254/28,255/28,0,产生的锯齿波的过程,(3)双缓冲方式,双缓冲方式是指由单片机两次发送控制信号,分时选通DAC0832内部的两个寄存器。第一次将待转换数据输入并锁存于输入锁存器中,第二次再将数据从前一级缓冲器写入DAC寄存器并送到D/A转换器完成一次转换输出。 在要求多路模拟信号同步输出的系统中,必须采用双缓冲方式。 按双缓冲方式的要求,设计电路必须能够实现以下两点:一是各路D/A转换器能分别将要转换的数据锁存在自己的输入寄存器中;二是各路D/A转换器的D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论