第7章80C51单片机常用接口电路设计_第1页
第7章80C51单片机常用接口电路设计_第2页
第7章80C51单片机常用接口电路设计_第3页
第7章80C51单片机常用接口电路设计_第4页
第7章80C51单片机常用接口电路设计_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

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

文档简介

第7章80C51单片机常用接口电路设计显示器接口原理及应用7.1键盘接口原理及应用7.280C51单片机的模拟量接口7.32023/2/61

在单片机应用系统中,显示器是最常用的输出设备。常用的显示器有:

发光二极管(LED)

液晶显示器(LCD)。

发光二极管(LED)又分为七段LED显示器(数码管)和LED点阵显示屏。液晶显示器(LCD)又分为字符液晶与图形液晶。7.1 显示器接口原理及应用2023/2/627.1.1七段LED显示器(数码管)

LED的工作原理多位LED显示问题的解决

2023/2/63LED的工作原理

七段式LED显示部件(a)典型的七段式LED器件(b)共阳极LED(c)共阴极LED2023/2/64

LED的主要部分是七段发光管,分别为a、b、c、d、e、f、g。有的产品还附带有小数点DP。通过发光段的不同组合,可以显示0~9和A~F共16个字母数字。LED可分为:(1)共阳级结构(2)共阴极结构

2023/2/65

共阴极LED显示器的发光二极管的阴极连在一起,通常此公共阴极接地。当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。

共阳极LED显示器的发光二极管的阳极连在一起,通常此公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。2023/2/66数字到段码的译码方法将一个4位二进制数据转换为LED的7位显示代码(段码)的方法有:

(1)专用芯片译码(2)软件译码2023/2/67用专用芯片完成段译码的示意(共阳极)2023/2/68软件译码法①将0~F(或0~9)对应的段码组成一个表,存在存储器中;②查表得段码2023/2/69多位LED显示问题的解决

(1)问题的提出实际使用时,往往用几个显示管实现多位显示,如果每一个LED占用一个独立的输出端口,则占用的输出端口就很多。一个端口一个端口一个端口一个端口一个端口2023/2/610(2)问题的解决方法硬件:采用公用的驱动电路软件:采用扫描方法

2023/2/6112023/2/612

一个数据通道作为位控制,该端口输出的选择信号使某一位为高电平(共阳极)时,该位对应的LED便显示数据。

另一个数据通道输出段码,尽管所有的LED均收到了段码,但只有被位选择信号选中的那个LED才显示数据,其他并不发光。

2023/2/613

在程序中,软件按一定频率循环输出位选择信号和对应的显示数据,利用眼睛的视觉惯性,从LED显示器上便可见到相当稳定的数字显示。2023/2/614七段LED数码管实验硬件连接情况

在实验学习板中,有8个共阴极的LED,位选信号通过P0口,再通过74HC573驱动LED。段码通过74HC595(串行输入,并行输出,节约并口)输出至LED.

实际上为了节约并口资源,P0口连接两个74HC573,另一片驱动点阵及交通灯电路。两个驱动芯片的转换通过一个波段开关控制。当开关拨到上边时,点阵驱动电路起作用,相反当拨到下边时,数码管驱动电路起作用。2023/2/615实验1在左边第一个LED上显示数字5步骤:(1)通过74HC595送5的段码(2)通过P0口送位选信号2023/2/616include<reg51.h>#defineucharunsignedcharsbitclk=P2^7; //595时钟信号输入管脚sbitst=P2^6; //595锁存信号输入管脚sbitio=P2^5; //595数据信号输入管脚2023/2/617voidwr595(ucharucdat){ uchari; clk=1; st=1; for(i=8;i>0;i--) //循环八次,写一个字节

{ io=ucdat&0x01; //发送BIT0位

clk=0; clk=1; //时钟上升沿

ucdat=ucdat>>1; //要发送的数据右移,准备发送下一位

} st=0; st=1; //锁存数据}//名称:wr595()向595发送一个字节的数据//功能:向595发送一个字节的数据(先发低位)2023/2/618Voidmain(){ while(1) { uchark=0xb6;//5的段码wr595(k);P0=0XFEH; }}2023/2/619实验2让8位数码管显示1、2、3、4、5、6、7、82023/2/620#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineSLED_BITP0//LED位选信号输入管脚

sbitclk=P2^7; //595时钟信号输入管脚

sbitst=P2^6; //595锁存信号输入管脚

sbitio=P2^5; //595数据信号输入管脚ucharcodeuc7leds[]={0xfc,0x60,0xda,0xf2, 0x66,0xb6,0xbe,0xe0,0xfe};

//定义0-8段码uchardisplay_7leds[8]={1,2,3,4,5,6,7,8};2023/2/621//功能:向595发送一个字节的数据(先发低位)voidwr595(ucharucdat){ uchari; clk=1; st=1; for(i=8;i>0;i--) //循环八次,写一个字节

{ io=ucdat&0x01; //发送BIT0位

clk=0; clk=1; //时钟上升沿

ucdat=ucdat>>1;/ /要发送的数据右移,准备发送下一位

} st=0; st=1; //锁存数据}2023/2/622延迟程序delay(uintdat){ while(dat--) {; }}2023/2/623//显示display_7leds[]中的数据voidwr7leds(void){ uchari,ch; ch=0x01; //位选信号初始化

for(i=0;i<8;i++) //循环8次写8个数据

{ wr595(uc7leds[display_7leds[i]]);//显示数据

SLED_BIT=~ch; //送位选信号

ch<<=1;//位选信号右移,准备在下一个数码管显示下一个数字 delay(300); //延时

}}2023/2/624Voidmain(){ while(1) { wr7leds(); }}2023/2/625实验3

利用实验系统相关资源,在LED上(左边第1、2两个)显示秒信息(60秒计时),要求左边第一个LED显示秒的高位值、第2个显示秒的低位值。初始值为00。2023/2/626①总体设计思路设置二个变量存储秒值,初值皆为0,设置一计数变量进行中断次数计数,初值为0。使用定时器/计数器(工作在方式1)每0.025秒(25ms)产生一次中断,每次中断时,先中断次数加1,并判断是否已达40次,若没有达40次,直接显示原秒值,若达40次,即,时间已过1秒,改变秒值,然后显示。2023/2/627#include<reg52.h> //包含头文件#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintucharnum=0,shijian=0,miao1=0,miao2=0;//74HC595与单片机连接口sbitclk=P2^7; //595时钟信号输入管脚sbitst=P2^6; //595锁存信号输入管脚sbitio=P2^5; //595数据信号输入管脚//定义P0口sbitP00=P0^0;sbitP01=P0^1;2023/2/628ucharcodeuc7leds[16]={0xfc,0x60,0xda,0xf2 0x66,0xb6,0xbe,0xe0, 0xfe,0xe6,0xee,0x3e, 0x9c,0x7a,0x9e,0x8E};voidtime0_init();voidwr595(ucharucdat);voidwrleds(void);voiddelay(uintdat);

2023/2/629voidmain()//主函数{time0_init();//调用定时器0初始化子函数

while(1);//等待中断}2023/2/630voidtimer0()interrupt1//每中断一次num加1,若num到40,改变miao1,miao2{TH0=(65536-23040)/256; //定时器赋初值,每0.025秒中断一次

TL0=(65536-23040)%256; num++;if(num==40){num=0;shijian++;miao1=shijian/10;miao2=shijian%10;if(shijian==60)shijian=0;}wrleds();//显示miao1,miao2

}2023/2/631voidtime0_init(){TMOD=0X01; //定时器0方式1TH0=(65536-23040)/256;//定时器赋初值,每0.025秒中断一次

TL0=(65536-23040)%256; EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1; //启动定时器0}2023/2/632voidwr595(ucharucdat)//写595函数{ uchari; clk=1; st=1; for(i=8;i>0;i--) //循环八次,写一个字节

{ io=ucdat&0x01; //发送BIT0位

clk=0; clk=1; //时钟上升沿

ucdat=ucdat>>1; //要发送的数据右移,准备发送下一位

} st=0; st=1; //锁存数据}2023/2/633voidwrleds(void){ ucharch1,ch2; ch1=0xfe;ch2=0xfd;//位选信号初始化

wr595(uc7leds[miao1]);//传送显示数据

P0=ch1; //送位选信号

delay(500); //延时,(决定亮度,和闪烁)

wr595(uc7leds[miao2]);//传送显示数据

P0=ch2; //送位选信号

delay(500); //延时,(决定亮度,和闪烁)}

voiddelay(uintdat){ while(dat--);}

2023/2/6347.1.2LED点阵显示屏

LED显示屏是一种由半导体发光二极管构成的显示点阵.通过控制每个LED的亮灭实现图形或字符的显示。由于LED显示屏亮度高、视角广、工作电压低、功耗小、寿命长、耐冲击、性能稳定,因而被广泛应用于机场、商场、医院、宾馆等公共场所。根据连接情况,可分为共阳极、共阴极。2023/2/6352023/2/636显示原理

如果采用动态扫描方式,扫描电路就可以实现多行发光二极管共用一套驱动器。动态扫描,简单说就是逐行轮流点亮。(类似于多位LED,可以把LED点阵显示屏看成是多位LED的特殊形式)。具体以8×8点阵模块为例显示字符“B”的过程2023/2/637即先送出对应于第一行发光二极管亮灭的列数据0FFH并锁存,然后选通第一行,即送行数据80H,延时一段时间后,送行数据00H,第一帧显示结束;再送第二行的列数据87H并锁存,然后选通第二行,即送行数据40H,点亮相同时间后,送行数据00H,相应二极管熄灭,第二帧显示结束;以此类推,第8行显示之后,又重新点亮第一行,周而复始。当这样轮回的速度足够快(每秒24次以上)时,就能看到显示屏上稳定的字符B了。2023/2/6382023/2/639实验1在LED点阵上显示52023/2/640#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineSLED_BITP0//LED位选信号输入管脚

sbitclk=P2^7; //595时钟信号输入管脚

sbitst=P2^6; //595锁存信号输入管脚

sbitio=P2^5; //595数据信号输入管脚ucharcodeuc7leds[]={0x00,0x00,0x72,0x51,0x51,0x51,0x4E,0x00};//5的字模码(共阴极)2023/2/641//功能:向595发送一个字节的数据(先发低位)voidwr595(ucharucdat){ uchari; clk=1; st=1; for(i=8;i>0;i--) //循环八次,写一个字节

{ io=ucdat&0x01; //发送BIT0位

clk=0; clk=1; //时钟上升沿

ucdat=ucdat>>1;/ /要发送的数据右移,准备发送下一位

} st=0; st=1; //锁存数据}2023/2/642延迟程序delay(uintdat){ while(dat--) {; }}2023/2/643//显示display_7leds[]中的数据voidwr7leds(void){ uchari,ch; ch=0x01; //位选信号初始化

for(i=0;i<8;i++) //循环8次写8个数据

{ wr595(uc7leds[i]);//显示数据

SLED_BIT=~ch; //送位选信号

ch<<=1;//位选信号右移,准备在下一个数码管显示下一个数字 delay(300); //延时

}}2023/2/644Voidmain(){ while(1) { wr7leds(); }}2023/2/645voidwr595(ucharucdat){ uchari; clk=1; st=1; for(i=8;i>0;i--) //循环八次,写一个字节

{ io=ucdat&0x01; //发送BIT0位

clk=0; clk=1; //时钟上升沿

ucdat=ucdat>>1; //要发送的数据右移,准备发送下一位

} st=0; st=1; //锁存数据}2023/2/646实验2以1s间隔循环显示0-9#include<reg52.h>#include<intrins.h>#defineucharunsignedchar//#############管脚定义#######################sbitclk=P2^7; //595时钟信号输入管脚sbitst=P2^6; //595锁存信号输入管脚sbitio=P2^5; //595数据信号输入管脚2023/2/647

//要显示的数据代码

ucharcodeled_88seg[80]={0x00,0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,//0 0x00,0x00,0x01,0x21,0x7F,0x01,0x01,0x00,//10x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00,//20x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00,//30x00,0x00,0x0C,0x14,0x24,0x7F,0x04,0x00,//40x00,0x00,0x72,0x51,0x51,0x51,0x4E,0x00,//50x00,0x00,0x3E,0x49,0x49,0x49,0x26,0x00,//60x00,0x00,0x40,0x40,0x40,0x4F,0x70,0x00,//70x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00,//80x00,0x00,0x32,0x49,0x49,0x49,0x3E,0x00};//92023/2/648uchari=0; uchart=0; //点阵显示函数时间//延时函数voiddelay(uchari){ucharj;for(;i>0;i--)for(j=0;j<125;j++){;}}2023/2/649//名称:wr595()向595发送一个字节的数据voidwr595(ucharucdat){ uchari; clk=1; st=1; for(i=8;i>0;i--) //循环八次,写一个字节

{ io=ucdat&0x01; //发送BIT0位

clk=0; clk=1; //时钟上升沿

ucdat=ucdat>>1; //要发送的数据右移,准备发送下一位

} st=0; st=1; //锁存数据}2023/2/650voidtime0_init()//T0初始化函数{TMOD=0X01; //定时器0方式1TH0=(65536-23040)/256; //定时器赋初值,每0.025秒中断一次

TL0=(65536-23040)%256; EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1; //启动定时器0}2023/2/651voidmain(void){ucharj;ucharwx; //位选信号控制

time0_init();while(1){wx=0x01;for(j=i;j<i+8;j++){wr595(led_88seg[j]);P0=~wx;delay(2);wx<<=1;}}2023/2/652//定时器中断0服务子函数

voidtimer0()interrupt1{TH0=(65536-23040)/256;TL0=(65536-23040)%256; //定时器赋初值,每0.025秒中断一次

t++;if(t==40){t=0;i+=8; //显示下一列的段码值

if(i==80)i=0;}}2023/2/653汉字字模的生成

由于要显示内容的不确定性,汉字字模的生成仅靠用户自己构建是不可能的。如果依靠单片机完成字模的创建和显示控制,则由于单片机运算能力有限,是无法实现汉字的选定和实时显示。为此利用PC机和相关软件,预先生成所要显示汉字的字模。通常可以利用UCDOS的汉字库构造需要显示的字模。2023/2/654

在UCDOS汉字库中汉字均以行字模的形式存储,只要确定了汉字在字库中的位置和字模的长度,就可以将需要汉字的行字模读出。汉字在字库中的位置可以通过汉字的机内码根据如下公式加以确定:Offset=(94×m_H+m_L)×32式中:m_H代表以16进制表示的汉字机内码的高8位,m_L代表机内码的低8位。字模的长度则是由显示所用的点阵决定的,以常用的16×16点阵字模为例一个汉字字模需要16×16÷8=32B。因此从字模的开始依次读取32个。2023/2/655采用PCtoLCD2002字模软件,可以方便地生成字模数据,如图3所示。将生成的字模数据复制到系统源.2023/2/6562023/2/657液晶显示器是单片机应用系统中一种常用的人机接口形式。液晶显示器(LCD),的主要原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面。各种型号的液晶通常是按显示字符的行数或液晶点阵的行、列数来命名。如1602:每行16个字符,可以显示2行。类似的命名有0802、1601

7.1.3

LCD16022023/2/658如12232液晶属于图形液晶,该液晶由122X32个点来显示各种图形。可以通过程序控制每个点显示或不显示。类似的命名有:12864,根据客户需要,厂家可以设计出任意数组合的点阵显示。液晶显示器具有体积小、重量轻、功耗低、显示操作简单等特点。2023/2/659弱点:温度范围窄。通用型液晶正常工作温度为0℃~+55℃,存储温度范围:-20℃~+60℃宽温级液晶,正常工作温度为-20℃~+70℃,存储温度范围:-30℃~+80℃2023/2/660

液晶显示器可分为三类:字段式、字符点阵式和点阵图形式液晶显示器。

字符点阵式:LCD1602(单片机应用系统中广泛使用)2023/2/661LCD1602模块的外形与引脚

共16根引脚,引脚01:VSS,接地引脚引脚02:VDD,接+5V电源引脚03:VL,对比度调整端引脚04:RS,数据/命令寄存器选择端,1:数据;0:命令引脚05:RW,读/写选择端,1:读;0:写引脚06:E,使能端,高电平跳变成低电平时,液晶模块执行命令引脚07~14:D0~D7,8位双向数据总线引脚15:BLA,背光正极引脚16:BLK,背光负极2023/2/662结构框图LCD1602模块的组成

HD44780是典型的液晶显示控制器,集控制与驱动于一体,本身可以驱动单行16字符或2行8字符,对于2行16字符的显示要增加HD44100驱动器2023/2/663HD44780

由字符发生器CGROM、自定义字符发生器CGRAM和显示缓冲区DDRAM组成。CGROM存储了不同的点阵字符图形(包括数字,英文字母的大小写,常用的符号等),每一个字符都有一个固定的代码(数字,英文字母的大小写为其ASCII码)。2023/2/664DDRAM有80个单元,但第1行仅用00H~0FH单元,第2行仅用40H~4FH单元。DDRAM单元存放的是要显示字符的编码(ASCII码),控制器HD44780以该编码为索引,到CGROM(或CGRAM)中取点阵字形送液晶板显示。2023/2/665LCD1602模块的命令

序号指令RSR/WD7D6D5D4D3D2D1D01清屏00000000012光标归位000000001*3输入模式设置00000001I/DS4显示与不显示设置0000001DCB5光标或屏幕内容移位选择000001S/CR/L**6功能设置00001DLNF**7CGRAM地址设置0001CGRAM地址8DDRAM地址设置001DDRAM地址9读忙标志和计数器地址设置01BF计数器地址10写DDRAM或CGROM10要写的数据11读DDRAM或CGROM11读出的数据2023/2/666命令说明命令1:清屏(DDRAM全写空格)。光标回到屏幕左上角,地址计数器设置为0命令2:光标回到屏幕左上角.命令3:输入模式设置,设置每写入一个数据字节后,光标的移动方向及字符是否移动。I/D=1,S=0,光标右移一格且计数器加1(常用)2023/2/667命令4:显示与不显示设置。D=1,开显示;D=0,关显示。C=1,有光标;C=0,无光标。B=1,光标闪烁,B=0光标不闪烁。命令5:光标或屏幕内容移位选择。S/C=1,移动屏幕内容,S/C=0,移动光标。R/L=1,右移,R/L=0,左移。命令6:功能设置。DL=0:4位数据接口,DL=1:8位数据接口。N=0,单行显示,N=1,双行显示。F=0:5x7点阵,F=1:5X10点阵2023/2/668命令7:CGRAM地址设置命令8:DDRAM地址设置命令9:读忙标志和计数器地址,BF=1,忙,此时模块不能接收命令或数据。BF=0,不忙(理论上,在向模块写命令或数据时,先要检测为不忙状态。实际中,可通过适当延迟,而不需检测)命令10:写DDRAM或CGROM.要配合地址设置命令。命令11:读DDRAM或CGROM.要配合地址设置命令。2023/2/669LCD1602的初始化LCD1602在使用前先进初始化:1、清屏2、功能设置3、显示与不显示设置4、输入模式设置2023/2/670接口电路LCD1602模块的接口示例

2023/2/671实验1LCD1602显示#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitrs=P2^7;sbitlcden=P2^5;sbitlcdrw=P2^6;uchartable1[]="Iamastudent";uchartable2[]="Ilikestudying";2023/2/672//延迟程序voiddelay(uintx){ uinta,b; for(a=x;a>0;a--) for(b=10;b>0;b--);}2023/2/673//写命令至LCD1602voidwrite_com(ucharcom){ P0=com; rs=0; lcden=0; delay(10); lcden=1; delay(10); lcden=0;2023/2/674//写数据至DDRAMvoidwrite_date(uchardate){ P0=date; rs=1; lcden=0; delay(10); lcden=1; delay(10); lcden=0;}2023/2/675//LCD1602初始化voidinit(){lcdrw=0; write_com(0x01);delay(20);write_com(0x38); delay(20); write_com(0x0e); delay(20); write_com(0x06); delay(20);}2023/2/676voidmain(){ uchara; init(); write_com(0x80); delay(20); for(a=0;a<14;a++) { write_date(table1[a]); delay(2000);//控制

温馨提示

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

评论

0/150

提交评论