《单片机应用技术》课件-第五章 数码管的扫描原理及其编程(完整)_第1页
《单片机应用技术》课件-第五章 数码管的扫描原理及其编程(完整)_第2页
《单片机应用技术》课件-第五章 数码管的扫描原理及其编程(完整)_第3页
《单片机应用技术》课件-第五章 数码管的扫描原理及其编程(完整)_第4页
《单片机应用技术》课件-第五章 数码管的扫描原理及其编程(完整)_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

第四章数码管的扫描原理及其编程

1数码显示器的工作原理2数组(复习)3数码管的单片机接口编程主要内容:本章教学计划:

理论+实践教学12学时本章教学重点:掌握数码显示器的工作原理掌握数码管的单片机接口编程1、数码显示器的工作原理

LED(LightEmittingDiode)数码显示器是一种由LED发光二极管组合显示字符的显示器件。它使用了8个LED发光二极管,其中7个用于显示字符,1个用于显示小数点,故通常称之为7段(也有称作8段)发光二极管数码显示器。在单片机中的应用非常普遍。1、数码显示器的工作原理1、数码显示器的工作原理

LED数码显示器有两种连接方法:(1)共阳极接法把发光二极管的阳极连在一起构成公共阳极,使用时公共阳极接+5V,这样阴极端输入低电平的段发光二极管就导通点亮,而输入高电平的则不亮。(2)共阴极接法把发光二极管的阴极连在一起构成公共阴极,使用时公共阴极接地,这样阳极段输入高电平的段发光二极管就导通,而输入低电平的则不亮。2、数码管的单片机接口编程

LED数码显示器的显示段码为了显示字符,要为LED显示器提供显示段码(或称字形代码),组成一个“8”字形字符的7段,再加上1个小数点位,共计8段,因此提供给LED显示器的显示段码为1个字节。各段码位的对应关系如下:段码位D7D6D5D4D3D2D1D0显示段dpgfedcba2、数码管的单片机接口编程

十六进制数及空白字符与P的显示段码:8EH数组的声明和初始化数组是一组变量,这组变量需要满足三个条件:1、具有相同的数据类型2、具有相同的名字3、在存储器中是被连续存放的2、数组(复习)

数组类型数组名[数组长度]数组类型数组名[数组长度]={初值列表};数组的使用和赋值注意事项1、区分数组下标(0-15)和数组元素个数(16)的概念2、数组元素下标可以是常量或变量或表达式,初始化必须是常量3、数组整体赋值只能在初始化进行,程序只能单个元素赋值

eg:unsignedcharLedCode[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};switch语句的用法switch(表达式){case常量表达式1:语句1;case常量表达式2:语句2;......case常量表达式n:语句n;default:语句n+1;}switch(表达式){case常量表达式1:语句1;break;case常量表达式2:语句2;break;......case常量表达式n:语句n;break;default:语句n+1;break;}3、数码管的单片机接口编程

LED数码显示器的接口方法单片机与LED数码显示器有以硬件为主和以软件为主的两种接口方法。2、数码管的单片机接口编程

以软件为主的接口方法这种接口方法是以软件查表代替硬件译码,不但省去了译码器,而且还能显示更多的字符。但是驱动器是必不可少的,因为仅靠接口提供不了较大的电流供LED显示器使用。2、数码管的单片机接口编程

LED数码显示器的接口电路

实际使用的LED数码显示器位数较多,为了简化线路、降低成本,大多采用以软件为主的接口方法。对于多位LED数码显示器,通常采用动态扫描显示方法,即逐个循环点亮各位显示器。这样虽然在任一时刻只有一位显示器被点亮,但是由于人眼具有视觉残留效应,看起来与全部显示器持续点亮的效果基本一样(在亮度上要有差别)。

2、数码管的单片机接口编程

LED数码显示器的显示方法

由于各位数码管的显示段码是互相并联的,因此在同一时刻只能显示同一种字符。对于这种接口电路来说,其显示方法有静态显示和动态显示两种。1.静态显示

所谓静态显示,就是在同一时刻只显示一种字符,或者说被显示的字符在同一时刻是稳定不变的。其显示方法比较简单,只要将显示段码送至段码口,并把位控字送至位控口即可。2、数码管的单片机接口编程2.动态显示

利用人眼对视觉的残留效应,采用动态扫描显示的方法,逐个地循环点亮各位数码管,每位显示1ms左右,看起来就好象在同时显示不同的字符一样。

在进行动态扫描显示时,往往事先并不知道应显示什么内容,这样也就无从选择被显示字符的显示段码。为此,一般采用查表的方法,由待显示的字符通过查表得到其对应的显示段码。2、数码管的单片机接口编程单个数码管静态显示下面程序的功能是完成单个数码管循环显示0,1,2,。。。,F共16个十六进制数,每个字符显示后延时大约1秒后,再显示下一个字符。方法1:(查询方式,软件延时)/*****************************************************************/#include<reg51.h>#defineLedDisplayP0#defineucharunsignedcharvoiddelay(uchar);//函数声明//sbitEnable=P2^0;//*****数码管选通位ucharcodeLedCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极各段码的值/****************************************************************/voidmain(void){uchark=0;while(1){LedDisplay=LedCode[k];//给LED显示端口赋值//Enable=0;//*******共阴极数码管,数码管选通位为低电平时点亮数码管delay(250);delay(250);delay(250);delay(250);//延时k++;if(k==16)k=0;//让LED从0显示到F}}/****************************************************/voiddelay(unsignedcharx)//延时程序{unsignedchari;while(x--)for(i=0;i<125;i++);}/*****************************************************/#include<reg51.h>#defineLedDisplayP0#defineucharunsignedcharucharcodeLedCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极各段码的值voidTimer0(void);//中断函数声明ucharTimes=0;uchark=0;sbitEnable=P2^0;//*****数码管选通位ucharLedTemp;//全局变量的声明voidmain(void){TMOD=0x01;//定时器0工作在方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;//定时器初值设置EA=1;ET0=1;//打开CPU中断和定时器0中断TR0=1;//启动定时器0

方法2:定时器中断方式while(1){LedDisplay=LedCode[k];//初始值Enable=0;//*******共阴极数码管,数码管选通位为低电平时点亮数码管}}voidTimer0(void)interrupt1//定时器0中断体{TH0=(65536-50000)/256;TL0=(65536-50000)%256;//初值重载Times++;//计数次数加1if(Times==20){k++; if(k==16)k=0;//循环左移Times=0;//中断次数清0}}单个数码管显示独立按键编号(与第三章按键结合)#include<reg52.h>//定义特殊功能寄存器库#defineucharunsignedchar#defineuintunsignedint//#defineLedDiplayP2voiddelay(uchar);//函数声明ucharKeyScan(void);//键盘扫描函数ucharTempValue;sbitBEEP=P3^0;voidmain(void){ucharKeyValue;while(1){KeyValue=KeyScan();//调用函数,读取键值

//键值得应用

switch(KeyValue) { case0x0e:P2=0x06;BEEP=0;break; case0x0d:P2=0x5b;BEEP=0;break; case0x0b:P2=0x4f;BEEP=0;break; case0x07:P2=0x66;BEEP=0;break; }}}ucharKeyScan(void){TempValue=P1;//读端口到变量TempValue&=0x0f;//将高四位置0if(TempValue!=0x0f){ //判断是delay(10);//延时后再判断,为什么?后介绍TempValue=P1;//读端口到变量TempValue&=0x0f;//将高四位置0if(TempValue!=0x0f)//判断是否有键按下{returnTempValue;//有键时的键值}}return0;//无键按下时,函数返回值为0}voiddelay(ucharx)//延时函数{uchark;while(x--)for(k=0;k<125;k++);}多个数码管动态显示单片机与四个数码管连接,如果直接采用单片机和四个单独的数码管,则单片机的四个口P0-P3分别各连接一个数码管,现在采用下图的连接方式,可以节省I/O口,但是软件相对来讲要复杂许多,是利用软件来节省单片机的I/O口。任务一:四个数码管同时依次显示0,1,2,。。。,F共16个十六进制数/*************************************************************************/#include<reg52.h>

#defineucharunsignedchar#defineLedDisplayP0

voiddelay(uchar);//函数声明

ucharcodeLedCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};共阴极数码管段码/*************************************************************************/voidmain(void){uchark=0;P1=0x0f;//打开数码管的公共端

while(1){LedDisplay=LedCode[k];//送数据到P0口显示

k++;if(k==16)k=0;//显示16个后,从头开始

delay(255);delay(255);delay(255);}}/*************************************************************************//*************************************************************************/voiddelay(unsignedcharx){unsignedchari;//延时程序while(x--)for(i=0;i<125;i++);}/*************************************************************************/任务二:四个数码管分别显示0123,即第一个数码管显示0,第二个数码管显示1,第三个数码管显示2,第四个数码管显示3。提示:利用数码管的动态扫描原理,即利用人眼的视觉残留来完成动态显示。原理:首先将四个数码管关闭,将希望在第一个数码管显示的内容送到P0口,再打开第一个数码管,延时大约1~2ms后,关闭第一个数码管,接着送第二个数码管要显示的内容到P0口,打开第二个数码管,延时大约1~2ms后,关闭第二个数码管,后面两个数码管的原理依次类推,即可完成四个数码管的动态扫描。注意:一定要送完数据到端口后,再打开需要显示的数码管,否则,在数码管上显示不该显示的内容,请读者仔细想想。动态扫描的函数如下:voidLedScan(void){P0=LedCode[0];Led0=0;delay(1);Led0=1;P0=LedCode[1];Led1=0;delay(1);Led1=1;P0=LedCode[2];Led2=0;delay(1);Led2=1;P0=LedCode[3];Led3=0;delay(1);Led3=1;}Led0,Led1,Led2,Led3需要定义,定义如下:sbitLed0=P1^4;sbitLed1=P1^5;sbitLed2=P1^6;sbitLed3=P1^7;完整程序:/*************************************************************************/#include<reg52.h>#defineucharunsignedchar#defineLedDisplayP0sbitLed0=P1^4;sbitLed1=P1^5;sbitLed2=P1^6;sbitLed3=P1^7;voiddelay(uchar);//函数声明ucharcodeLedCode[]={0x3f,0x06,0x5b,0x4f};//共阴极段码/*************************************************************************/voidmain(void){uchark=0;

while(1){LedDisplay=LedCode[0];Led0=0;delay(1);Led0=1;LedDisplay=LedCode[1];Led1=0;delay(1);Led1=1;LedDisplay=LedCode[2];Led2=0;delay(1);Led2=1;LedDisplay=LedCode[3];Led3=0;delay(1);Led3=1;}}/*************************************************************************//*************************************************************************/voiddelay(unsignedcharx){unsignedchari;//延时程序while(x--)for(i=0;i<125;i++);}/*************************************************************************/任务三:四个数码管先显示0123,延时一段一定的时间后,显示1234,再显示2345……,依次显示CDEF,DEF0,EF01,F012,最后再回到0123,再循环显示。提示:利用数码管的动态扫描原理,即利用人眼的视觉残留来完成动态显示。#include<reg52.h>#defineucharunsignedchar#defineLedDisplayP0sbitLed0=P2^4;sbitLed1=P2^5;sbitLed2=P2^6;sbitLed3=P2^7;voiddelay(uchar);

温馨提示

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

评论

0/150

提交评论