汽车单片机技术 课件全套 张朝山 项目1-4 汽车转向灯的控制(IO输出) - 超声波倒车雷达测距_第1页
汽车单片机技术 课件全套 张朝山 项目1-4 汽车转向灯的控制(IO输出) - 超声波倒车雷达测距_第2页
汽车单片机技术 课件全套 张朝山 项目1-4 汽车转向灯的控制(IO输出) - 超声波倒车雷达测距_第3页
汽车单片机技术 课件全套 张朝山 项目1-4 汽车转向灯的控制(IO输出) - 超声波倒车雷达测距_第4页
汽车单片机技术 课件全套 张朝山 项目1-4 汽车转向灯的控制(IO输出) - 超声波倒车雷达测距_第5页
已阅读5页,还剩163页未读 继续免费阅读

下载本文档

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

文档简介

认识单片机本次课主要内容:1.基本任务(1)单片机是什么?(2)单片机的应用有哪些?2.进阶任务(3)单片机有哪些不同类型和型号?(1)会用Keiluvision4新建一个工程。(2)会用Proteus画最简单的仿真图。认识单片机单片机实质上是一个芯片,单片机芯片上主要集成了如下部件:中央处理器CPU;数据存储器RAM;程序存储器ROM;定时器/计数器;中断系统;输入/输出接口电路。第一阶段(1974-1976年)为单片机初级阶段由于受工艺及集成度的限制,单片机采用双片形式,且功能比较简单。第二阶段(1976-1978年)为低性能单片机阶段单片机采用单芯片形式,是“小而全”。第三阶段(1978-1982年)为高性能单片机阶段是单片机普及阶段,如:MCS-51系列单片机第四阶段(1982年以后)为16位单片机阶段是16位CPU,如:MCS-96系列单片机单片机的发展

由于单片机芯片上集成了CPU、存储器、输入/输出部件和时钟电路等。因此它具有如下特点。体积小、重量轻,价格低、功能强,电源单一、功耗低,可靠性高、抗干扰能力强;使用方便灵活、通用性强;目前大多数单片机采用哈佛(Harvard)结构体系;突出控制功能的指令系统;较低的处理速度和较小的存储容量。单片机的特点单片机的应用单片机主要应用在以下几个方面:家用电器智能卡智能仪器仪表网络与通信工业控制单片机的分类单片机可分为通用型单片机和专用型单片机两大类。通用型单片机是把可开发资源全部提供给使用者的微控制器。我们通常所说的单片机,即指通用型单片机。专用型单片机则是为过程控制、参数检测、信号处理等方面的特殊需要而设计的单片机。按片内不同程序存储器的配置来分片内带ROM、片内带EPROM型、片内无ROM按片内不同容量的存储器配置来分51子系列型(是基本型)、52子系列型(是增强型)按芯片的半导体制造工艺上的不同来分HMOS工艺型、CHMOS工艺型(用“C”表示)按所能适应的环境温度范围,可划分为三个等级:0℃~70℃民用级、-40℃~+85℃工业级、-65℃~+125℃军用级。MCS-51系列单片机MCS-51是美国Intel公司的8位单片机系列,也是我国目前应用最为广泛的一种单片机系列。8051/80C51是整个MCS-51系列单片机的核心。51系列单片机源于Intel公司的MCS-51系列,在Intel公司将MCS-51系列单片机实行技术开放政策之后,许多公司都以MCS-51中的基础结构8051为基核推出了许多各具特色、具有优异性能的单片机,如Philips、Atmel等。这样,把这些厂家以8051为基核推出的各种型号的兼容型单片机统称为51系列单片机。AT89系列单片机在MCS-51系列的基础上,Atmel公司开发的AT89系列单片机,具有较低廉的价格和独特的程序存储器(快闪存储器)。Flash程序存储器可以用电擦除方式瞬间擦除、改写,写入单片机内的程序还可以进行加密。时钟电路CPUROMRAMT0T1中断系统串行接口并行接口P0P1P2P3TXDRXDINT0INT1定时计数器单片机的硬件结构中央处理器(CPU)中央处理器是单片机的核心,完成运算和控制功能。MCS-51的CPU能处理8位二进制数或代码。内部数据存储器(内部RAM)芯片中共有256个RAM单元前128单元,作为供用户使用的寄存器和用于存放可读写的数据;后128单元被专用寄存器占用。通常所说的内部数据存储器就是指前128单元,简称内部RAM。内部程序存储器(内部ROM)芯片中共有4KB个ROM单元。用于存放程序、原始数据或表格,因此,称之为程序存储器,简称内部ROM。定时/计数器两个16位的定时/计数器。实现定时或计数功能,并以其定时或计数结果对计算机进行控制。并行I/O口4个8位的I/O口(P0、P1、P2、P3)实现数据的并行输入/输出串行口一个全双工的串行口,以实现单片机和其它设备之间的串行数据传送。该串行口功能较强,既可作为全双工异步通信收发器使用,也可作为同步移位器使用。中断控制系统5个中断源,即外中断两个,定时/计数中断两个,串行中断一个。全部中断分为高级和低级共两个优先级别。KeilC51是德国Keil软件公司开发的基于8051内核的微控制器软件开发平台。KeilC51是51系列单片机C语言软件开发系统,是目前开发8051内核单片机的主流工具。KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。KeilC51具有集成开发环境,可以完成从工程建立和管理、编译、连接、目标代码的生成、软件仿真和硬件仿真等完整的开发流程。

认识KEILC51用KEILuvision4新建一个工程建立第一个C程序项目建立工程文件建立源文件加载源文件设置工程的配置参数进行编译和连接进入调试模式全速运行程序PROTEUS简介PROTEUS是英国LabcenterElectronics公司开发的多功能EDA软件。PROTEUS不仅是模拟电路、数字电路、模/数混合电路的设计与仿真平台,也是目前较先进的单片机和嵌入式系统的设计与仿真平台。它实现了在计算机上完成从原理图与电路设计、电路分析与仿真、单片机代码级调试与仿真、系统测试与功能验证到形成PCB的完整的电子设计、研发过程。用PROTEUS画仿真图新建设计文件保存设计文件选取元器件放置元器件

编辑元器件放置终端连线属性设置电气规则检测

点亮一个LED本次课主要内容点亮一个LED;会用Keilμvision4新建一个工程;能编写点亮一个LED的程序段;会用Proteus画<单片机控制一个LED>的仿真图;能进行仿真调试和实物调试。点亮一个发光二极管使用AT89S52单片机,P1.0引脚接发光二极管(LED)的阴极,通过C语言程序控制,从P1.0引脚输出低电平,使发光二极管点亮。PROTEUS设计点亮一个LED的电路图新建设计文件保存设计文件选取元器件放置元器件

编辑元器件放置终端连线属性设置电气规则检测

#include<AT89X52.H>//包含AT89X52.H头文件sbitLED=P1^0;//定义LED是P1.0引脚对应的变量名voidmain(void){LED=0;//P1.0=0,LED点亮while(1);}点亮一个LED程序编写进阶任务:修改程序,点亮LED1,3,5,7,并修改proteus仿真图,完成仿真调试,同时,完成实物板调试。LED闪烁控制本次课主要内容<开关控制LED点亮>程序编写,proteus仿真,实物板调试;<LED闪烁>编程,仿真调试,实物调试;Keil调试的使用;进阶任务:让LED按照0.5s或1s的频率闪烁.单片机最小系统只是单片机能满足工作的最低要求,它不能对外完成控制任务,实现人机对话。

单片机最小系统应用—开关控制LED点亮电路设计程序设计

LED闪烁-编程思路1使用while来实现While(表达式)

{语句(内部也可为空)}特点:先判断表达式,后执行语句。原则:若表达式不是0,即为真,那么执行语句。否则,跳出while语句。LED闪烁-编程思路2分析软件实现思路:点亮发光二极管延时(延时子程序)关闭发光二极管延时重复上述动作(循环)电路设计和前面一样#include<AT89X52.h>sbitLED=P1^0;voidDelay(){unsignedchari,j;for(i=0;i<255;i++)for(j=0;j<255;j++);}voidmain(){while(1){LED=0;Delay();LED=1;Delay();}}for(表达式1;表达式2;表达式3)

{语句(内部可为空)}执行过程:1.求解一次表达式1.2.求解表达式2,若其值为真(非0即为真),则执行for中语句。然后执行第3步。否则结束for语句,直接跳出,不再执行第3步。3.求解表达式3.4.跳到第2步重复执行。带参数延时函数的编写思考把Delay()延时函数放在main函数后面如何处理?以Delay()延时函数为例,不带参数的子程序与带参数的子程序分别应该怎么写?提示:在程序开头加入说明行(即子程序头加分号),既定义在前,使用再后。LED循环点亮控制前期回顾:1.LED以1s的频率闪烁,用while来控制时间怎么编写程序?用延时函数来控制时间怎么编写程序?2.能自己编写一个延时1s的子程序供以后使用(延时子程序用for来实现,请不带参数)。3.能自己编写一个延时500ms的子程序供以后使用(延时子程序用for来实现,请带参数)。4.延时函数放在main函数之前和之后都可以吗?5.LED以1s或0.5s闪烁,你还有其他编程方法吗?本节课重点:1.直接调用C51库函数,编写LED循环点亮的程序。2.使用左移运算符<<,编写LED循环点亮的程序。3.能让每个LED灯循环点亮500ms。左移运算符<<它用来将一个数的各二进位按指定的数值全部左移n位。<<是将高位左移,溢出舍弃,低位以0补充。举例:a=0xA5;//0xA5,转换成二进制数为:10100101b=a<<3;//b的值等于a向左移动3位,b现在值是00101000即0x28使用左移运算符<<,编写LED循环点亮程序关于C51库函数“_crol_”的说明:1.#include<intrins.h>需要包含这个头文件,才能调用该函数2._crol_是循环左移函数unsignedchar_crol_(unsignedcharc,unsignedcharb);函数有返回值c循环往左移动b位举例,a=0xA5;//0xA5,转换成二进制数为:10100101b=_crol_(a,3);//b的值等于a循环向左移动3位,b现在值是0x2D#include<AT89X52.H>#include<intrins.h>unsignedchartemp;//定义一个全局变量voiddelay(unsignedintz){ unsignedinti; unsignedcharj; for(i=0;i<z;i++) for(j=0;j<255;j++); }voidmain(){ temp=0xfe; P1=temp;//点亮LED1 while(1) { delay(642); //持续一段时间

temp=_crol_(temp,1);//调用C51循环左移的库函数_crol_ P1=temp; }}直接调用C51库函数_crol_,编写LED循环点亮程序数码管循环显示0~9本次课内容:1.基本任务(1)用1位七段LED数码管显示0-9中的任意一个数,编程,自行设计proteus仿真图,实现功能;编程,使用mini51开发板,实现功能。(2)用1位七段LED数码管循环显示0-9,编程,自行设计proteus仿真图,实现功能;编程,使用mini51开发板,实现功能。2.进阶任务任意两位七段LED数码管循环显示0-9,每个数显示1s,用mini51开发板实现功能。AT89S52单片机的P2口的P2.0~P2.7八个引脚,使其依次连接到一个共阴极LED数码管的a~h七个位段控制引脚上,数码管的公共端接地;1.基本任务Proteus仿真图的设计:认识数码管ABCDEFGDP单片机常用LED和LCD两种方式LED数码显示器价格低廉、体积小、功耗低、而且可靠性好,得到广泛使用。单个LED数码管的管脚结构如图所示数码管内部由8个LED(位段)组成;有7个条形LED和一个小圆点LED;当LED导通时,相应的线段或点发光;将这些LED排成一定图形,来显示数字0~9、字符A~F、H、L、P、R、U、Y、符号“—”及小数点“.”等。认识数码管ABCDEFGDPLED数码管可以分为共阴极和共阳极两种结构共阴极结构把所有LED阴极作为公共端(com)连接低电平(接地),通过控制每个LED的阳极电平使其发光或熄灭阳极为高电平LED发光,为低电平熄灭。如显示0时,把a、b、c、d、e、f端接高电平,其他各端接地。共阳极结构是把所有LED的阳极作为公共端(com)连起来,接高电平(如+5V),通过控制每一只LED的阴极电平来使其发光或熄灭,阴极为低电平LED发光,为高电平熄灭数码管引脚及内部结构管脚排列共阴数码管共阳数码管使用数码管注意事项必须注意的是,数码管内部没有电阻,在使用时需外接限流电阻如果不限流将造成发光二极管的烧毁;限流电阻的取值一般使流经发光二极管的电流在几个mA到十几mA,如果需要更亮一些,可以达到20mA。数码管的字型编码数码管要显示某个字符,必须使它的8个位段上加上相应的电平组合,即一个8位数据,这个数据就叫该字符的字型编码。编码规则如下图所示。共阴极和共阳极数码管的字型编码是不同的,共阴极和共阳极的字型编码是反相的,例如字符“0”:共阴极编码是3FH,二进制形式是00111111;共阳极编码是C0H,二进制形式是11000000,恰好是00111111的反码。D7

D6

D5

D4

D3

D2

D1

D0dpgfedcba一维数组

在C语言中,数组必须要先定义后使用。一维数组的定义方式为:

类型说明符数组名[整型表达式];类型说明符是数组中各个元素的数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,既数组的长度。例如:inta[9];

//定义整型数组a,有9个元素,下标从0到8。floatb[5];

//定义实型数组b,有5个元素,下标从0到4。charch[10];

//定义字符数组ch,有10个元素,下标从0到9。

一维数组的初始化

(1)在定义数组时,对数组的全部元素赋予初值。

例如:inta[5]={1,2,3,4,5};(2)只对数组的部分元素进行初始化。

例如:inta[5]={1,2};即a[0]=1,a[1]=2,后面三个元素的值全部是0.

(3)在定义数组时,对数组的全部元素不赋初值,则数组元素的值均被初始化为0.

(4)可以在定义时不指明数组元素的个数,而根据赋值部分由编码器自动确定。例如:unsignedcharTab[]={0x7F,0xBF,0xDF,0xEF};相当于定义了Tab[4]这样一个数组。一维数组

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定义0~9十个数字的字形编码表,共阴极数码管有关键字code:将数组元素定义在程序存储器ROM中;没有关键字code:将数组元素定义在内部RAM中,即随机(数据)存储器;注意事项数组的类型是指构成数组的元素的类型;对于同一个数组,其所有元素的数据类型都是相同的数组名的书写规则应符合标识符的命名规则;不能与其它变量同名常量表达式可以是符号常量或常量表达式。常量表达式不能包含变量即不能对数组的大小作动态定义

两位数码管循环显示0~99本次课内容:基本任务(1)用两位数码管显示一个两位数,例如12.编程,自行设计proteus仿真图,实现功能;编程,使用mini51开发板,实现功能。(2)两位数码管循环显示0-99,编程,自行设计proteus仿真图,实现功能。2.进阶任务(1)设计一个0~99的秒表,包括电路设计和程序设计,按下按键开关,从0开始计时,最大计到99秒,之后一直在0-99秒之间循环计时。按键开关断开,停止计时。用proteus仿真图实现功能。(2)设计一个0~99的计数器,手动计数按钮按一下,计一个数,即对按下按键的次数进行计数,并通过两个数码管显示计数结果,最大计到99。画Proteus仿真图,关键词如下:加运算符“+”,减运算符“-”,乘运算符“*”与一般算数运算规则相同。除运算符“/”,分两种情况:(1)整除:两个整数相除,所得商舍去尾数,仅到整数部分。例如,3/6等于0,而不是0.5;(2)实除:参加运算的两个数中有一个数为实数,所得的商为实数,如3.0/6=0.5,3/6.0=0.5,3.0/6.0=0.5等。求余运算符“%”,要求两个对象均为整数,所得结果为两个操作对象整除后,取其余数,如3%6等于3,而6%3等于0.proteus仿真图实现显示一个两位数-程序proteus仿真图见该PPT第3页#include<AT89X52.H>sbitWE1=P2^0;sbitWE2=P2^1;sbitWE3=P2^2;sbitWE4=P2^3;unsignedcharnum;unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //定义0-9十个数字的字形编码表共阳极数码管voiddelay() //延时10ms{ unsignedchari,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } voidmain(){ num=79;while(1) { WE1=0;//开数码管1 P0=table[num/10]; //显示十位数

delay(); WE1=1;//关数码管1 delay();

WE2=0;//开数码管2 P0=table[num%10]; //显示个位数

delay(); WE2=1;//关数码管2 delay(); }

} MINI51开发板实现显示一个两位数-程序proteus仿真图实现循环显示0-99-程序proteus仿真图见该PPT第3页#include<AT89X52.H>unsignedcharnum;unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定义0-9十个数字的字形编码表共阴极数码管voiddelay10ms(void) //10ms延时函数 {unsignedchari,j;for(i=20;i>0;i--)for(j=248;j>0;j--); } voidmain(){ num=0; P0=table[num/10]; //十位数码管显示0 P2=table[num%10]; //个位数码管显示0while(1) { if(P1_0==0) //判断按键是否按下

{ delay10ms(); //延时10ms,延时去抖

if(P1_0==0) //确定按键按下

{ num++; if(num==100) {num=0;} P0=table[num/10]; //显示十位

P2=table[num%10];//显示个位

while(P1_0==0); //等待按键释放

} } }}

计数器0-99-程序#include<AT89X52.H>sbitSW=P1^0;unsignedcharnum;unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定义0-9十个数字的字形编码表共阴极数码管voiddelay() //延时1s{ unsignedinti; unsignedcharj; for(i=0;i<1326;i++) for(j=0;j<249;j++); } voidmain(){ num=0; P0=0x00; //关闭十位数码管

P2=0x00; //关闭个位数码管

while(1) { if(SW==0) { P0=table[num/10]; //显示十位

P2=table[num%10];//显示个位

delay(); num++; if(num==100) {num=0;} } else{P0=0x00; //关闭十位数码管

P2=0x00; //关闭个位数码管

num=0;}

}}

0-99秒表-程序出租车计价器动态显示123.4本次课内容:基本任务(1)模拟出租车计价器显示价格123.4元,数码管显示。编程,使用mini51开发板,实现功能。2.进阶任务(1)模拟出租车计价器显示价格123.4元,LCD1602液晶屏显示。编程,设计proteus仿真电路,实现功能。编程,使用mini51开发板,实现功能。(2)LCD1602液晶显示高铁车次和到站时间(第1行显示“G60arrivaltime”,第2行居中显示“15:11”)。编程,设计proteus仿真电路,实现功能。编程,使用mini51开发板,实现功能。数码管引脚及内部结构管脚排列共阴数码管共阳数码管数码管的字型编码数码管要显示某个字符,必须使它的8个位段上加上相应的电平组合,即一个8位数据,这个数据就叫该字符的字型编码。编码规则如下图所示。画Proteus仿真图,关键词如下:加运算符“+”,减运算符“-”,乘运算符“*”与一般算数运算规则相同。除运算符“/”,分两种情况:(1)整除:两个整数相除,所得商舍去尾数,仅到整数部分。例如,3/6等于0,而不是0.5;(2)实除:参加运算的两个数中有一个数为实数,所得的商为实数,如3.0/6=0.5,3/6.0=0.5,3.0/6.0=0.5等。求余运算符“%”,要求两个对象均为整数,所得结果为两个操作对象整除后,取其余数,如3%6等于3,而6%3等于0.proteus仿真图实现显示一个两位数-程序proteus仿真图见该PPT第3页#include<AT89X52.H>sbitWE1=P2^0;sbitWE2=P2^1;sbitWE3=P2^2;sbitWE4=P2^3;unsignedcharnum;unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //定义0-9十个数字的字形编码表共阳极数码管voiddelay() //延时10ms{ unsignedchari,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } voidmain(){ num=79;while(1) { WE1=0;//开数码管1 P0=table[num/10]; //显示十位数

delay(); WE1=1;//关数码管1 delay();

WE2=0;//开数码管2 P0=table[num%10]; //显示个位数

delay(); WE2=1;//关数码管2 delay(); }

} MINI51开发板实现显示一个两位数-程序proteus仿真图实现循环显示0-99-程序proteus仿真图见该PPT第3页#include<AT89X52.H>unsignedcharnum;unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定义0-9十个数字的字形编码表共阴极数码管voiddelay10ms(void) //10ms延时函数 {unsignedchari,j;for(i=20;i>0;i--)for(j=248;j>0;j--); } voidmain(){ num=0; P0=table[num/10]; //十位数码管显示0 P2=table[num%10]; //个位数码管显示0while(1) { if(P1_0==0) //判断按键是否按下

{ delay10ms(); //延时10ms,延时去抖

if(P1_0==0) //确定按键按下

{ num++; if(num==100) {num=0;} P0=table[num/10]; //显示十位

P2=table[num%10];//显示个位

while(P1_0==0); //等待按键释放

} } }}

计数器0-99-程序#include<AT89X52.H>sbitSW=P1^0;unsignedcharnum;unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定义0-9十个数字的字形编码表共阴极数码管voiddelay() //延时1s{ unsignedinti; unsignedcharj; for(i=0;i<1326;i++) for(j=0;j<249;j++); } voidmain(){ num=0; P0=0x00; //关闭十位数码管

P2=0x00; //关闭个位数码管

while(1) { if(SW==0) { P0=table[num/10]; //显示十位

P2=table[num%10];//显示个位

delay(); num++; if(num==100) {num=0;} } else{P0=0x00; //关闭十位数码管

P2=0x00; //关闭个位数码管

num=0;}

}}

0-99秒表-程序单一按键控制灯亮本次课任务:编写程序实现“开关SW闭合,LED灯亮,开关SW断开,LED灯灭”,进行仿真调试和实物板调试。开关SW闭合,LED灯以“亮500ms灭500ms”的频率闪烁,开关SW断开,LED灯熄灭。单片机最小系统应用—开关控制LED点亮电路设计如下程序流程图设计如下if语句1.单分支if语句

if(表达式)语句

//如果表达式的结果为真,则执行语句,否则,不执行。

if(表达式)语句1else语句2//如果表达式的结果为真,则执行语句1,否则执行语句2.2.双分支if语句4.

if语句的嵌套

if(表达式)语句1elseif(表达式2)语句2elseif(表达式3)语句3

……elseif(表达式m)语句melse语句n3.多分支if语句

if(表达式)if(表达式1)语句11else语句12else

if(表达式2)语句21else语句22独立键盘点亮对应LED灯本次课主要内容1.基本任务围绕单片机AT89C52设计8个独立按键,每个按键对应一个LED,没有按键按下时,所有按键所接单片机引脚输出全部为高电平“1”,LED全部熄灭;有按键按下时,该按键所接单片机引脚输出为低电平“0”,其所对应LED点亮。编程,自行设计proteus仿真图,实现功能;2.进阶任务编程,使用mini51开发板,实现功能。

switch语句

Switch的一般形式如下:Switch(表达式){case常量表达式1:语句1case常量表达式2:语句2……case常量表达式n:语句ndefault:语句n+1}当表达式的值与某一个case后面的常量表达式相等时,就执行此case后面的语句;若所有的case中的常量表达式的值都没有与表达式值匹配的,就执行default后面的语句;每一个case的常量表达式的值必须不相同;各个case和default的出现次序不影响执行结果。switch语句特别说明

执行完一个case后面的语句后,并不会自动跳出switch语句,转而去执行其后面的语句;通常在每一段case的结束加入“break;”语句,使程序退出switch结构,即终止switch语句的执行。如:switch(x){case1:y=1;case2:y=2;case3:y=0;}

假如x的值是1,y=?

矩阵式键盘控制数码管显示0~F本次课主要内容1.基本任务使用单片机AT89C52设计一个4*4矩阵键盘,16个按键分别对应0~9、A~F。当有按键按下时,数码管显示按下健的对应字符;没有按键按下时,数码管无显示。编程,自行设计proteus仿真图,实现功能。认识键盘键盘是单片机应用系统中人机交流不可缺少的输入设备。键盘由一组规则排列的按键组成,一个按键实际上是一个开关元件。键盘通常使用机械触点式按键开关,其主要功能是把机械上的通断转换为电气上的逻辑关系(1和0)。常见的键盘种类有:查询(独立)式键盘矩阵式键盘键盘分类按键按照结构原理可分为两类触点式开关按键,如机械式开关、导电橡胶式开关等;无触点开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。按键按照接口原理可分为两类

编码键盘,主要是用硬件来实现对按键的识别,硬件结构复杂;非编码键盘,主要是由软件来实现按键的定义与识别,硬件结构简单,软件编程量大。我们主要介绍单片机中常用的触点式开关按键、非编码键盘。键盘防抖动措施机械式按键在按下或释放时,由于机械弹性作用的影响,通常伴随一定时间的触点机械抖动,然后才能稳定下来。触点抖动过程如右图所示,抖动时间的长短与开关的机械特性有关,一般为5

10ms。若有抖动,按键按下会被错误地认为是多次操作。

防抖动措施为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。键数较少时,采用硬件去抖;键数较多时,采用软件去抖。

软件去抖的步骤在检测到有按键按下时,执行一个10ms左右(具体时间应视所使用的按键进行调整)的延时程序;再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态,从而消除抖动的影响。软件去抖流程图在检测到有按键按下时执行一个10ms左右延时程序;再检测该键电平是否仍保持闭合状态。若按键仍保持闭合状态电平,则确认该键是处于闭合状态。

矩阵式键盘的结构原理矩阵式键盘的结构在单片机应用系统中,若使用的按键较多时,通常采用矩阵式键盘。矩阵式键盘是由行线和列线组成的,按键位于行、列的交叉点上,其结构如下图所示。矩阵式键盘的结构原理矩阵式键盘的结构由上图可知,一个4×4的行、列结构,可以构成一个含有16个按键的键盘,节省了很多I/O口。按键开关的两端分别接行线和列线,列线通过上拉电阻接到+5V的电源上。将所有行线的电平状态读入;判断所有行线是否都保持高电平状态。若无键按下,所有的行线仍保持高电平状态;若有键按下,行线中至少应有一条线为低电平。如果第2行与第2列交叉点的键被按下,则第2行与第2列导通,第2行电平被拉低,读入的行信号就为低电平,表示有键按下。判断按键按下的方法在P1口输出0x0f时,若没有按键按下,行线处于高电平状态,列线处于低电平状态;当有按键按下,按键所在的行线和列线导通,此时的行线电平由与该行线相连的列线电平来决定。问题:那么,能否肯定认为是第2行第2列的键被按下呢?识别按键的方法识别按键的方法是采用键盘扫描方法,其方法是往列线上按顺序一列一列的送出低电平。先送第0列为低电平,其它列为高电平,读入的行的电平状态就表明了第0列的4个键的情况,若读入的行值全为高电平,则表示无键按下;再送第1列为低电平,其它列为高电平,读入的行的电平状态则显示了该列上的4个按键的情况,若读入的行值全为高电平,则表示无键按下;然后依次轮流给各列送出低电平,直至4列全部送完,再从第0列开始,依此循环。采用键盘扫描,我们再来观察第2行与第2列交叉点的键按下时的判断过程,当第2列送出低电平时,读第2行为低电平,而其它列送出低电平时,读第2行却为高电平,由此即可断定按下的键应是第2行与第2列交叉点的键。按键编码由于矩阵式键盘的按键较多,按键的位置又是由行号和列号唯一确定的,因此可以对按键进行编码,并把得到的编码称为键值。键值=列号+行号×4。例如:第2行与第2列交叉点的键的键值为0AH(00001010b)。注意:行和列的编号都是从0开始,如4×4键盘,行号为0~3,列号为0~3。按键编码由以上分析,可以得到矩阵式键盘的编程方法:先判断是否有键按下;若有再判断是哪一个按键按下;然后查表或计算得到键值;最后根据键值转向不同的功能程序。0~9秒数码管显示目录1、数码管的基本认识2、数码管的分类3、数码管符号真值表认识数码管ABCDEFGDP数码管内部由8个LED(位段)组成;有7个条形LED和一个小圆点LED;当LED导通时,相应的线段或点发光;将这些LED排成一定图形,来显示数字0~9、字符A~F、H、L、P、R、U、Y、符号“—”及小数点“.”等。数码管引脚及内部结构管脚排列共阴数码管共阳数码管数码管的真值表目录1、什么是数组?2、如何定义数组?3、数组元素的访问和赋值4、遍历数组5、数组的初始化6、使用数组计算平均数7、常见数组问题及解决方法什么是数组?1、数组是什么?数组是一组相同数据类型的有序集合,可以通过数组下标来访问和操作数组中的每一个元素。如何定义数组?1、数组的定义数组的定义需要指定数据类型、数组名和数组大小。例如,定义一个包含10个整数的数组:inta[10];1、如何访问数组元素?数组元素可以通过数组下标来访问,下标从0开始计数。例如,访问a数组的第一个元素:a[0]。2、如何赋值数组元素?可以通过数组下标来对数组元素进行赋值。例如,将a数组的第一个元素赋值为10:a[0]=10;数组元素的访问和赋值遍历数组1、如何遍历数组?可以使用for循环来遍历数组。例如,遍历a数组:for(inti=0;i<10;i++){printf("%d",a[i]);}数组的初始化1、数组的初始化可以使用花括号来初始化数组元素,如inta[3]={1,2,3};。如果不足初始化的元素将被自动赋值为0。1、如何使用数组计算平均数?可以使用数组来存储需要计算平均数的数据,然后通过遍历数组来求和并计算平均数。例如,计算a数组的平均数:intsum=0;for(inti=0;i<10;i++){sum+=a[i];}doubleavg=sum/10.0;使用数组计算平均数注意事项1、数组越界问题数组越界会导致程序崩溃或数据异常,需要注意数组下标的范围。2、数组长度问题数组长度需要提前定义好,无法在程序运行时动态扩展。目录1、数码管的显示方式2、固定字符显示3、数字0-9循环显示数码管的显示方式利用单片机的端口输出控制数码管的显示分为静态显示和动态显示静态显示是利用单片机端口或者外置芯片进行直接或者间接驱动动态显示结构相对复杂,通过轮流点亮每一位数码管,且其中加入极短的延时,使得人眼无法分辨。固定字符8显示

数码管地址位对应数码管编号地址位LED1LED2LED3LED4LED5LED6LED7LED8ADDR200001111ADDR100110011ADDR001010101固定字符8显示#include<STC89C5xRC.H>unsignedchartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管真值表sbitADDR0=P2^2;sbitADDR1=P2^3;sbitADDR2=P2^4;voidmain(){ADDR0=1;ADDR1=0;ADDR2=1;P0=0x7F;//点亮数码管段a、b、c、d、e、f、gwhile(1);}开发板实物演示数字0-9循环显示unsignedintcount=0; //定时器计数unsignedcharx=0; //显示数值//数码管段码表0unsignedchartable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};voidDelay() //延时函数

{ unsignedinti=100000;while(i--);//大致延时1s}voidmain()//主函数{ while(1)

{

for(x=0;x<=9;x++)

{

P0=table[x];Delay();

} }}0~59秒数码管显示目录1、三八译码器的原理2、三八译码器的使用3、案例分析三八译码器的原理三八译码器是数字电路中常用的解码器,它可以将三位二进制代码转换成八位二进制代码。在数字电路中,三八译码器常用于将数字信号转换成控制信号,以控制某些元件的状态三八译码器的使用利用三八译码器控制数码管的过程,可分为以下几个模块:数码管显示模块:这个模块负责将要显示的数字转换成对应的七段码输出,用于控制数码管的亮灭。三八译码器模块:这个模块负责对多位数码管进行位选。单片机控制模块:这个模块将控制三八译码器模块和数码管显示模块的工作。0-59数字循环代码分析unsignedcharx=0; //显示数值//数码管段码表unsignedchartable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};sbitADDR0=P2^2;sbitADDR1=P2^3;sbitADDR2=P2^4;//延时函数voidDelay() //延时函数

{ unsignedinti=100000;while(i--);//大致延时1s}voidDelay10us(){ uchari=2;; while(--i); }0-59数字循环代码分析voidmain()//主函数{ while(1) { for(x=0;x<=59;x++) {

ADDR0=1;ADDR1=1;ADDR2=1;

P0=table[x]/10;

Delay10us();

ADDR0=1;ADDR1=1;ADDR2=0;

P0=table[x]%10;

Delay();

} }}开发板实物演示目录1、单片机中断的原理2、定时器的使用3、案例分析单片机中断的原理中断是一种特殊的事件,它可以暂停正在执行的程序,并转而去处理一些紧急的事情。在单片机中,中断可以是内部事件(例如定时器溢出)或外部事件(例如按键触发),当中断事件发生时,单片机会自动跳转到中断服务程序进行处理,完成后再返回原程序继续执行。定时器的原理单片机定时器是单片机内部提供的一种计时器,它可以产生一定的时间延迟、定时或周期性触发中断等功能。通过定时器可以实现许多应用,如控制电机、蜂鸣器、数码管等。单片机定时器是基于单片机内部的时钟信号实现的,每个定时器都有一个计数器,计数器可以根据时钟信号自动递增。当计数器的值达到预设的值时,定时器会产生一个中断信号或者一个输出信号,从而触发相应的操作。定时器简单代码分析voidmain(){TMOD=0x01;//设置定时器0为模式1TH0=0x3C;//设置定时器0的上限TL0=0xAF;//设置定时器0的下限TR0=1;//启动定时器0

while(1){if(TF0==1)//判断定时器0是否溢出{TF0=0;//清除TF0标志位P0=~P0;//翻转P0口输出}}}目录1、控制寄存器2、存储寄存器3、模式寄存器3、案例分析控制寄存器控制寄存器用于启动、停止和重置定时器/计数器,同时控制定时器/计数器的输入时钟源。TCON寄存器控制定时器/计数器0和1的工作状态,其中高4位(TF1、TR1、TF0、TR0)是定时器0和1的控制位,低4位(IE1、IT1、IE0、IT0)是定时器0和1的中断控制位。存储寄存器存储寄存器用于存储定时器/计数器的初值和计数器的计数值。在8051单片机中,每个定时器/计数器都有一个高8位和低8位的存储寄存器,分别为THx和TLx(x为0或1)。模式寄存器TMOD寄存器用于设置定时器/计数器的工作模式和计数器的位数,其中高4位是定时器1的控制位(GATE1、C/T1、M1_1、M1_0),低4位是定时器0的控制位(GATE0、C/T0、M0_1、M0_0)。目录0-59s精确定时案例分析案例分析#include<STC89C5xRC.H>unsignedintcount=0; //定时器计数unsignedcharx=0; //显示数值//数码管段码表unsignedchartable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};sbitADDR0=P2^2;sbitADDR1=P2^3;sbitADDR2=P2^4; voidDelay10us(){uchari; i=2; while(--i);}voidtime0_init(){TMOD=0X01; TH0=0XDC; TL0=0X00; EA=1; ET0=1; TR0=1; }voidtime()interrupt1{ TH0=0X3C; TL0=0XB0; count++; if(count==100) { x++;if(x>=60) { x=0;}ADDR0=1;ADDR1=1;ADDR2=1; P0=table[x/10];Delay10us();ADDR0=1;ADDR1=1;ADDR2=0; P0=table[x%10]; } count=0;}//主函数voidmain(){ time0_init(); x=0; while(1) {}}超声波测距显示目录超声波测距原理传感器的使用工作电压:DC5V静态电流:小于2mA电平信号输出:高5V,低0V感应角度:不大于15度探测距离:2cm-450cm(1)采用IO触发测距,给至少10us的高电平信号;(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.(4)单片机将得到的数据进行处理计算,公式如下测试距离=(高电平时间*声速(340M/S))/2案例分析sbitTrig=P2^0;//定义Trig引脚sbitEcho=P2^1;//定义Echo引脚voidInit_Timer0()//初始化定时器{TMOD&=0xF0;TMOD|=0x01;//设置为模式1TH0=0;//重置定时器初值TL0=0;}voidmain(){unsignedlongdistance;unsignedinttime;while(1){Trig=0;//将Trig引脚拉低至少2微秒DelayUs(2);Trig=1;//将Trig引脚拉高至少10微秒DelayUs(10);Trig=0;while(Echo==0);//等待Echo引脚变高Init_Timer0();//开始计时while(Echo==1);//等待Echo引脚变低TH0=TL0=0;//停止计时time=(TH0<<8)|TL0;//计算计时值distance=time*17/100;//计算距离}}目录动态显示软件消隐动态显示是指将一组数字分别显示在数码管的不同位上,并通过快速切换的方式来模拟多个数字的同时显示。这种方式可以减少需要的数码管数量,因此被广泛应用。动态显示需要使用定时器来控制数码管的切换频率。具体来说,我们可以使用定时器中断来控制数码管的切换,以便每隔一段时间就切换一次。数码管软件消隐是指在数码管动态显示过程中,为了避免重影或者显示混乱,需要通过编写程序在某些时间段内关闭不需要显示的数码管的显示。这样,可以确保数字在数码管上的清晰可见。软件消隐的实现需要使用单片机的定时器和

温馨提示

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

评论

0/150

提交评论