资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,技术培训项目,项目一 模,拟计算器数字输入及,显示,项目二,ADC0809A/D转换器基本应用技术,项目三,数字电压表,项目四,两点间温度控制,项目五,四位数数字温度计,项目六,单片机对LCD 模块的控制,项目一 模拟计算器数字输入 及显示,实验任务,硬件原理图,系统流程图,程序设计,一 实验任务,开机时,显示“0”,第一次按下时,显示“D1”,第二次按下时,显示“D1D2”,第三按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音,1 数码管显示,二 硬件原理图,2 蜂鸣器模块,GND,3 按键模块,4 接线方式,P1.0端口用导线连接到“音频放大模块”的SPK IN端口上,P3.0P3.7端口用8芯排线连接到“4X4行列式键盘”的C1C4R1R4端上,P0.0P0.7端口用8芯排线连接到“动态数码显示”的AH端口上,P2.0P2.7端口用8芯排线连接到“动态数码显示”的S1S8端口上,四 程序设计,行列式键盘输入及按键功能设定;,动态数码显示;,数码显示方式处理;,五 程序,#include unsigned char code dispcode=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71,0 x00;unsigned char code dispbitcode=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f;unsigned char dispbuf8=0,16,16,16,16,16,16,16;unsigned char dispbitcount;unsigned char temp;unsigned char i,j;unsigned char key;unsigned char keypos;bit alarmflag;void change(unsigned char*p,unsigned char count)while(count0)*(p+count)=*(p+count-1);count-;,void main(void),TMOD=0 x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;TR0=1;,ET0=1;,EA=1;,while(1)P3=0 xff;P3_4=0;temp=P3;temp=temp,switch(temp)case 0 x0e:key=4;break;case 0 x0d:key=5;break;case 0 x0b:key=6;break;case 0 x07:key=11;break;if(key=0),temp=temp,switch(temp)case 0 x0e:key=4;break;case 0 x0d:key=5;break;case 0 x0b:key=6;break;case 0 x07:key=11;break;,if(key=0),switch(temp)case 0 x0e:key=1;break;case 0 x0d:key=2;break;case 0 x0b:key=3;break;case 0 x07:key=12;break;if(key=0),temp=P3;,temp=temp,temp=temp switch(temp),case 0 x0e:key=0;break;case 0 x0d:key=13;break;case 0 x0b:key=14;break;case 0 x07:key=15;break;if(key=0)&(key10),keypos+;if(keypos8),change(dispbuf,keypos);,dispbuf0=key;,else,keypos=8;,alarmflag=1;,LCD_CS=0;/片选 CS 置低,(2)单片机控制及显示部分,7 连接ABCDEFGH端口,7连接到D0D1D2D3D4D5D6D7端子上,7连到“动态数码”的A B C D E F G H端口,LCD_EP=0;/EP 先置低,以便后面产生跳变沿,LCD_A0=0;/A0 置低,示意进行寄存器操作,3 函数说明(1)写寄存器函数:Void LCD_RegWrite(unsigned char Command),void main(void)ST=0;OE=0;TMOD=0 x12;TH0=0 x216;TL0=0 x216;TH1=(65536-500)/256;TL1=(65536-500)%256;TR1=1;TR0=1;ET0=1;ET1=1;EA=1;ST=1;ST=0;while(1)if(lowflag=1),它是逐次逼近式A/D转换器,可以和单片机直接接口,,项目六 单片机对LCD模块的控制,由于AD590的温度变化范围在55150之间,经过10K之后采样到的电压变化在2.,alarmflag=1;,0端口用导线连接到“音频放大模块”的SPK IN端口上,(2)单片机控制及显示部分,temp=P3;,P1_0=P1_0;temp=temp,void t0(void)interrupt 1 using 0,TH0=(65536-4000)/256;TL0=(65536-4000)%256;P0=dispcodedispbufdispbitcount;P2=dispbitcodedispbitcount;dispbitcount+;if(dispbitcount=8)dispbitcount=0;if(alarmflag=1)P1_1=P1_1;,项目二 ADC0809A/D转换器基本应用技术,基本概念说明,实验任务,电路原理图,程序设计内容,程序,1 基本概念说明,(1)ADC0809的内部逻辑结构,由上图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。,(2)ADC0809的应用说明,ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。,初始化时,使ST和OE信号全为低电平。,送要转换的哪一通道的地址到A,B,C端口上。,在ST端给出一个至少有100ns宽的正脉冲信号。,是否转换完毕,我们根据EOC信号来判断。,当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。,2、任务,在ADC0809的通道IN3输入05V之间的模拟量信号,ADC0809的VREF接5V电压。,以十进制的形式用数码管显示转换量。,3 电路原理图,(1)ADC0809转换分,ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口,,其中,ADC0809有8条模拟量输入通道,4条地址输入和控制线,11条数字量输出及控制线。如右图所示:,ADC0809中ALE为地址锁存允许输入线,高电。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。A,B和C为地址输入线,用于选通IN0IN7上的一路模拟量输入。通道选择表如下表所示,C,B,A,选择的通道,0,0,0,IN0,0,0,1,IN1,0,1,0,IN2,0,1,1,IN3,1,0,0,IN4,1,0,1,IN5,1,1,0,IN6,1,1,1,IN7,CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,VREF(),VREF()为参考电压输入。,(2)单片机控制及显示部分,(3)硬件接线方式,P1端口的P1.0P1.7连到“动态数码”的A B C D E F G H端口,P2端口的P2.0P2.7连到“动态数码”S1 S2 S3 S4 S5 S6 S7 S8端口,P0端口的P0.0P0.7到的D0D1D2D3D4D5D6D7端口,,VREF端子连到VCC,ST端子连到P3.0口,CK IN连到ALE,IN3连到“VR1,4 程序设计内容,A/D转换时,采用查询EOC的标志信号来检测A/D转换是否完毕。,通过P0端口读入数据,经处理后在数码管上显示。,A/D转换之前,选择第三通道 ABC110。,ST 0,ST1,ST0产生启动转换的正脉冲信号。,主程序流程图,5 程序说明,#include unsigned char code dispbitcode=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f;unsigned char code dispcode=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x00;unsigned char dispbuf8=10,10,10,10,10,0,0,0;unsigned char dispcount;sbit ST=P30;sbit OE=P31;sbit EOC=P32;unsigned char channel=0 xbc;/IN3unsigned char getdata;void main(void)TMOD=0 x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;TR0=1;ET0=1;EA=1;P3=channel;,while(1)ST=0;ST=1;ST=0;while(EOC=0);OE=1;getdata=P0;OE=0;dispbuf2=getdata/100;getdata=getdata%10;dispbuf1=getdata/10;dispbuf0=getdata%10;void t0(void)interrupt 1 using 0TH0=(65536-4000)/256;TL0=(65536-4000)%256;P1=dispcodedispbufdispcount;P2=dispbitcodedispcount;dispcount+;if(dispcount=8)dispcount=0;,项目三 数字电压表,实验任务,硬件电路图,设计内容,程序,1 实验任务,利用单片机AT89S51与ADC0809设计一个数字电压表。,可以测量05V之间的直流电压值。,用四位数码显示,但要求使用的元器件数目最少。,2 硬件电路图,(1)模/数转换部分,(2)单片机控制及显示部分,(3)硬件接线方式,P2.0P2.7 连接S1S2S3S4S5S6S7S8端口,P3.0 连接ST端子,P3.1连接 OE端子,P3.2 连接EOC端子,P3.3 连接CLK端子,A2A1A0端子连接到GND端子,IN0端子连接到VR1端子,3 设计内容,用软件的方法来产生CLK时钟信号,ADC0809工作时,其参考电压VREFVCC,在数码管上显示出转换后的电压值,实际显示的电压值为(D/256*VREF),4 程序,#include unsigned char code dispbitcode=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f;unsigned char code dispcode=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x00;unsigned char dispbuf8=10,10,10,10,0,0,0,0;unsigned char dispcount,getdata,i;unsigned int temp;sbit ST=P30;sbit OE=P31;sbit EOC=P32;sbit CLK=P33;void main(void)ST=0;,OE=0;,ET0=1;,ET1=1;,EA=1;,TMOD=0 x12;TH0=216;TL0=216;TH1=(65536-4000)/256;TL1=(65536-4000)%256;TR1=1;TR0=1;ST=1;ST=0;while(1)if(EOC=1)OE=1;getdata=P0;OE=0;temp=getdata*235;temp=temp/128;i=5;dispbuf0=10;dispbuf1=10;dispbuf2=10;dispbuf3=10;dispbuf4=10;dispbuf5=0;dispbuf6=0;dispbuf7=0;,while(temp/10)dispbufi=temp%10;temp=temp/10;i+;dispbufi=temp;ST=1;ST=0;void t0(void)interrupt 1 using 0CLK=CLK;void t1(void)interrupt 3 using 0TH1=(65536-4000)/256;TL1=(65536-4000)%256;P1=dispcodedispbufdispcount;P2=dispbitcodedispcount;if(dispcount=7)P1=P1|0 x80;dispcount+;if(dispcount=8)dispcount=0;,项目四 两点间温度控制,实验任务,电路原理图,程序,1 实验任务,用可调电阻调节电压值作为模拟温度的输入量,,当温度低于30时,发出长嘀报警声和光报警,,当温度高于60时,发出短嘀报警声和光报警。,测量的温度范围在099。,(2)单片机控制及显示,(3)蜂鸣器电路,(4)硬件接线,P1.0P1.7 连接ABCDEFGH端口,P2.0P2.7 连接S1S2S3S4S5S6S7S8端口,P3.0 连接ST端子,P3.1 连接OE端子,P3.2连接EOC端子,P3.3 连接CLK端子,A2A1A0端子连接到GND上,IN0端子连接到VR1端子,P0.0P0.7连接到D0D1D2D3D4D5D6D7端子,P3.6、P3.7分别连接到L1、L2上,P3.5连接到SPK IN端口,SPK OUT插入音频喇叭,3 程序,#include unsigned char code dispbitcode=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f;unsigned char code dispcode=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x00;unsigned char dispbuf8=10,10,10,10,10,10,0,0;unsigned char dispcount,getdata,i;unsigned int temp;sbit ST=P30;sbit OE=P31;sbit EOC=P32;sbit CLK=P33;sbit LED1=P36;sbit LED2=P37;sbit SPK=P35;bit lowflag;bit highflag;unsigned int cnta;unsigned int cntb;bit alarmflag;,void main(void)ST=0;OE=0;TMOD=0 x12;TH0=0 x216;TL0=0 x216;TH1=(65536-500)/256;TL1=(65536-500)%256;TR1=1;TR0=1;ET0=1;ET1=1;EA=1;ST=1;ST=0;while(1)if(lowflag=1),else if(highflag=1)if(EOC=1),OE=1;getdata=P0;OE=0;temp=getdata*25;temp=temp/64;i=6;dispbuf0=10;dispbuf1=10;dispbuf2=10;dispbuf3=10;dispbuf4=10;dispbuf5=10;dispbuf6=0;dispbuf7=0;while(temp/10)dispbufi=temp%10;temp=temp/10;i+;dispbufi=temp;,if(lowflag=1)else if(lowflag=0)&(highflag=1),cntb+;if(cntb=400)cntb=0;alarmflag=alarmflag;if(alarmflag=1)SPK=SPK;elsealarmflag=0;cnta=0;cntb=0;,项目五 四位数数字温度计,任务,电路原理图,设计内容,程序,1 实验任务,利用AD590温度传感器完成温度的测量,,把转换的温度值的模拟量送入ADC0809的一个通道进行A/D转换,,将转换的结果进行温度值变换后用数码管显示。,2 电路原理图,(1)AD590转换部分,温度传感器AD590,AD590产生的电流与绝对温度成正比,它可接收的工作电压为4V30V,检测的温度范围为55150,它有非常好的线性输出性能,温度每增加1,其电流增加1uA。AD590温度与电流的关系如下表所示,摄氏温度,AD590电流,经10K电压,0,273.2 uA,2.732V,10,283.2 uA,2.832 V,20,293.2 uA,2.932 V,30,303.2 uA,3.032 V,40,313.2 uA,3.132 V,50,323.2 uA,3.232 V,60,333.2 uA,3.332 V,100,373.2 uA,3.732 V,(2)单片机控制显示部分,(3)硬件接线,P1.0P1.7连接 ABCDEFGH端口,P3.0 连接ST端子,P3.1连接 OE端子,P3.2 连接EOC端子,P3.3连接 CLK端子,A2A1A0端子连接到GND上,IN0端子连接到AD590电路中,P0.0P0.7连接到D0D1D2D3D4D5D6D7端子上,3 设计内容,ADC0809的CLK信号由单片机的P3.3管脚提供,由于AD590的温度变化范围在55150之间,经过10K之后采样到的电压变化在2.182V4.232V之间,不超过5V电压所表示的范围,因此参考电压取电源电压VCC,(实测VCC4.70V),如果(D*2350/128)2732,则显示的温度值为(2732(D*2350/128),如果(D*2350/128)2732,则显示的温度值为(D*2350/128)2732),4 程序,#include#include unsigned char code dispbitcode=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f;unsigned char code dispcode=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x00,0 x40;unsigned char dispbuf8=10,10,10,10,10,10,0,0;unsigned char dispcount,getdata,i;unsigned long temp;bit sflag;sbit ST=P30;sbit OE=P31;sbit EOC=P32;sbit CLK=P33;sbit LED1=P36;sbit LED2=P37;sbit SPK=P35;,void main(void)ST=0;OE=0;TMOD=0 x12;TH0=0 x216;TL0=0 x216;TH1=(65536-4000)/256;TL1=(65536-4000)%256;TR1=1;TR0=1;ET0=1;ET1=1;EA=1;ST=1;ST=0;getdata=148;while(1)void t0(void)interrupt 1 using 0CLK=CLK;,void t1(void)interrupt 3 using 0TH1=(65536-4000)/256;TL1=(65536-4000)%256;if(EOC=1)OE=1;getdata=P0;OE=0;temp=(getdata*2350);temp=temp/128;if(temp2732)temp=2732-temp;sflag=1;elsetemp=temp-2732;sflag=0;i=3;,dispbuf0=10;dispbuf1=10;dispbuf2=10;if(sflag=1)dispbuf7=11;elsedispbuf7=10;dispbuf3=0;dispbuf4=0;dispbuf5=0;dispbuf6=0;while(temp/10)dispbufi=temp%10;temp=temp/10;i+;dispbufi=temp;ST=1;ST=0;P1=dispcodedispbufdispcount;P2=dispbitcodedispcount;dispcount+;if(dispcount=8)dispcount=0;,项目六 单片机对LCD模块的控制,实验任务,时序图说明,LCD状态读写,函数说明,1 实验任务,了解写寄存器函数(LCD_RegWrite)、数据写函数(LCD_DataWrite)和数据读函数(LCD_DataRead)三个基本的时序控制程序,读LCD的状态,时序图分析,2 时序图说明,图中 CS1B(CS2)的信号即为片选 CS,RS 即为数据/寄存器的选择端口 A0 信号,E 为 EP;当作写入寄存器数据操作时,首先要将 A0 置低,以通知 LCD 模块即将进行的是对寄存器的操作;而 RW 线需要置低,以示即将要进行的是写入的操作;然后片选 CS 信号置低,装载数据至总线,然后在 EP 线上产生一个上升沿以触发 LCD 模块将总线上的数据最终载入,3 读 LCD 状态,在一般的 LCD 模块当中,通过读LCD操作获取当前 LCD 模块的忙状态以及一些相关的状态信息,当 LCD 模块正处于忙状态时,则不宜对它进行数据的写入或读出操作。所以在很多 LCD 的驱动程序当中,会在寄存器写入、数据写入/读出的操作前加入读取 LCD状态并判别忙状态的代码;这点可以参考网上流传的很多 LCD 驱动程序。不过,对于 MZL02这样的较新出的 LCD 控制器来说,对忙状态影响已经很小甚至没有了;所以我们在前面的代码当中并没有加入这样的代码。至于有没有必要加读状态判忙的代码,要视具体的 LCD 控制器而定。,3 函数说明,(1)写寄存器函数:Void LCD_RegWrite(unsigned char Command),void LCD_RegWrite(unsigned char Command),LCD_A0=0;/A0 置低,示意进行寄存器操作,LCD_RW=0;/RW 置低,示意进行写入操作,LCD_EP=0;/EP 先置低,以便后面产生跳变沿,LCD_CS=0;/片选 CS 置低,DAT_PORT=Command;/装载数据置总线,LCD_EP=1;/产生有效的跳变沿,LCD_CS=1;/片选置高,(2)数据写函数:,void LCD_DataWrite(unsigned char Dat),void LCD_DataWrite(unsigned char Dat),LCD_A0=1;/A0 置高,示意进行显存数据操作,LCD_RW=0;/RW 置低,示意进行写入操作,LCD_EP=0;/EP 先置低,以便后面产生跳变沿,LCD_CS=0;/片选 CS 置低,DAT_PORT=Dat;/装载数据置总线,LCD_EP=1;/产生有效的跳变沿,LCD_CS=1;/片选置高,(3)数据读函数:unsigned char LCD_DataRead(void),unsigned char LCD_DataRead(void),unsigned char Read_Data;,DAT_PORT=0 xff;/51 的端口想要输入前,要先给端口全置 1,LCD_A0=1;/A0 置高,示意进行显存数据操作,LCD_RW=1;/RW 置高,示意进行读出操作,LCD_EP=0;/EP 先置低,以便后面产生跳变沿,LCD_CS=0;/片选 CS 置低,LCD_EP=1;/产生有效的跳变沿,LCD_EP=0;,Read_Data=DAT_PORT;/读出数据,LCD_CS=1;/片选置高,return Read_Data;/返回读到的数据,
展开阅读全文