单片机应用技术259_第1页
单片机应用技术259_第2页
单片机应用技术259_第3页
单片机应用技术259_第4页
单片机应用技术259_第5页
已阅读5页,还剩254页未读 继续免费阅读

下载本文档

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

文档简介

单片机应用技术

学习要领在实践中成长!兴趣是最好的老师!第四步:理论实践结合,温故知新第三步:它山之石可以攻玉第二步:照葫芦画瓢第一步:鹦鹉学舌学习单片机四步走示例1

示例2

课程内容:第一章单片机概述第二章最小单片机系统第三章C51编程设计第四章单片机输入应用第五章单片机输出应用第六章单片机内部资源及应用第九章串口通信第1章单片机概述本章教学计划:

理论+实践教学4学时本章教学重点:掌握单片机的概念了解单片机的开发语言了解单片机的开发软件单片机应用实例1.1单片机简介1.2单片机开发语言与软件1.3单片机应用实例1.4Keil51和Proteus安装与使用主要内容:

在半导体硅片上集成了微处理器(CPU),存储器(RAM、ROM、EPROM)和各种输入、输出接口的微型计算机。1单片机的概念(单片微型计算机)1.1单片机简介

单片机不同公司生产的单片机又有所不同,但其中以支持MCS-51的单片机为主,MCS-51早期是Intel公司采用8051内核生产的单片机,后为了兼容性,众多厂商均采用此内核来生产此单片机,例Atmel、NEC、AMD、Philips、OKI、西门子、华邦等公司。2单片机发展历程4、8、16、32位单片机,其中以8位单片机为主流。(8位单片机是指单片机一次处理的二进制的位数)

可开发的内部资源:RAM、ROM、I/O等功能部件,全部提供给用户。用户根据需要,设计一个以通用单片机芯片为核心的测控系统。单片机按用途可分为通用型和专用型两大类:(1)通用型(2)专用型

专门针对某些产品的特定用途而制作的单片机,针对性强且数量巨大。

对系统结构的最简化、可靠性和成本的最佳化等方面都作了全面的考虑。

“专用”单片机具有十分明显的综合优势。3单片机的应用

单片机卓越的性能:体积小、重量轻、可靠性高、价格低廉、功耗低、控制功能强和运算速度快。单片机得到了广泛的应用,已深入到各个领域。使用温度:民品:0°C—+70°C工业品:

-40°C—+85°C军品:

-65°C—+125°C。在下述的各个领域广泛的应用:

1.工业自动化2.智能仪器仪表3.消费类电子产品4.通讯5.武器装备6.终端及外部设备控制7.多机分布式系统1.2单片机开发语言及软件1.常用的编程语言汇编语言:利用汇编指令完成的编程语言单片机C语言(高级语言):利用C语言在单片机上进行开发的编程语言,通常简称为单片机C51语言。

1.2单片机开发语言及软件2两种语言的比较

汇编语言:需要开发人员对指令非常熟悉,对寄存器掌握透彻。

单片机C语言(高级语言):只需开发者掌握C语言的编程规则;

C语言是结构化的语言,考虑的是编程的思路,可读性强;只要求对单片机的存储结构有初步认识;调试时间短,大大提高了工作效率。。。。3单片机开发软件

KeilC51:C51编程软件,进行程序的编辑、编译与链接Proteus:单片机仿真软件,可完成一个完成的单片机系统仿真。1.3单片机应用实例1.流水灯控制

图中的单片机可以是AT89C51系列的单片机,也可以是任意的51内核的单片机,其中8个LED采用共阳极的连接方法,即8个LED的公共端是接在正电源上的,此时当单片机的P1各端口如果是输出低电平时,LED亮,当各端口输出高电平时,LED灭。下面的程序给出了8个LED灯循环显示,即LED灯按照顺序一个一个点亮的程序。#include<reg52.h>//定义特殊功能寄存器库#include<intrins.h>//定义循环左移、右移等函数库#defineucharunsignedchar//预定义#defineuintunsignedintvoiddelay(uchar);//函数声明voidmain(void){ucharLedTemp;LedTemp=0xfe;//初始值while(1){P0=LedTemp;//送值到端口LedTemp=_crol_(LedTemp,1);//循环左移delay(255);delay(255);delay(255);delay(255);//延时}}voiddelay(ucharx)//延时函数{uchark;while(x--)for(k=0;k<125;k++);}/**************************************************/voiddelay(ucharx)//延时函数{uchark;while(x--)for(k=0;k<125;k++);}/**************************************************/本程序的功能是将8个LED循环点亮,中间延时大约1秒(假设晶体振荡器的频率是11.0592MHz)。送给P1端口的变量LedTemp的初始值为0xfe,写成二进制为11111110,因为是低电平LED点亮,所以只有一个LED灯被点亮,送完第一次的值后,LedTemp循环左移,循环后的二进制代码是11111101,延时大约1秒后,将新的LedTemp的值送P1端口,LedTemp再循环左移后二进制代码为11111011,这样不断的运行,8各LED灯就循环向左显示,LED灯就循环的跑起来了。作业1、日常生活中应用单片机的产品有哪些?2、C语言与汇编语言相比,有哪些优点3、了解Keil软件和Proteus的基本用法和单片机编程流程,能够独立完成编程仿真等基本操作。单片机应用技术

第2章最小单片机系统本章教学计划:

理论+实践教学8学时本章教学重点:掌握MCS51单片机的基本结构掌握MCS51单片机的外部引脚掌握单片机的最小系统了解C51单片机简单编程2.1MCS单片机基本结构2.2MCS-51引脚2.3单片机最小系统2.4LED介绍2.5点亮LED程序代码编写2.6Keil51和Proteus安装与使用主要内容:CPU时钟电路

ROMRAM并行接口串行接口中断系统定时/计数器T0T1P0P1P2P3TXDRXDINT0INT12.1MCS单片机基本结构各功能部件:1.CPU(微处理器):由运算器和控制器所构成2.数据存储器(RAM:RamdomAccessMemory)片内为128个字节(52子系列的为256个字节)3.程序存储器(ROM/EPROM:ReadOnlyMemory)用来存放应用程序和表格之类的固定常数。

8031:无此部件;

8051:4K字节ROM;

8751:4K字节EPROM;

89C51/89C52/89C55:4K/8K/20K字节闪存。4.P1口、P2口、P3口、P0口:为4个并行8位I/O口。5.串行口1个全双工的异步串行口6.定时器/计数器7.中断系统

8.时钟电路

2.2MCS-51的引脚

40只引脚双列直插封装(DIP)引脚逻辑图8051单片机为40条引脚双列直插式封装引脚可分为三个部分1.引脚总体介绍(1)电源及时钟引脚:Vcc、Vss;XTAL1、XTAL2。(2)控制引脚:

PSEN*、EA*

、ALE、RESET

(3)I/O口引脚:P0、P1、P2、P3,4个8位I/O口2.电源及时钟引脚

1)电源引脚

(a)Vcc(40脚):+5V电源;(b)Vss(20脚):接地。

2)时钟引脚

(a)XTAL1(19脚):采用外接晶体振荡器时,此引脚应接地。(b)XTAL2(18脚):接外部晶体的另一端。3.控制引脚

(1)RST/VPD(9脚):复位与备用电源(2)ALE/PROG*(30脚):第一功能ALE

:地址锁存允许第二功能PROG*:编程脉冲输入端。(3)PSEN*

(29脚):读外部程序存储器的选通信号。可以驱动8个LS型TTL负载。(4)EA*/VPP(31脚):EA*为内外程序存储器选择控制

EA*=1,访问片内程序存储器,

EA*=0,单片机则只访问外部程序存储器。第二功能VPP,用于施加编程电压。4.I/O口引脚(1)P0口:双向8位三态I/O口,地址总线(低8位)及数据总线分时复用口,可驱动8个LS型TTL负载。(2)P1口:8位准双向I/O口,可驱动4个LS型TTL负载。(3)P2口:8位准双向I/O口,与地址总线(高8位)复用,可驱动4个LS型TTL负载。(4)P3口:8位准双向I/O口,双功能复用口,可驱动4个LS型TTL负载。注意:准双向口与双向三态口的差别。当3个准双向I/O口作输入口使用时,要向该口先写“1”,另外准双向I/O口无高阻的“浮空”状态。2.3单片机最小系统单片机最小系统的必备条件1、电源2、EA引脚(直接上拉至高电平)3、晶体振荡电路(时钟电路)4、复位电路3时钟电路(P18)时钟电路用于产生单片机工作所必需的时钟控制信号。单片机所有的工作都要以这个时钟信号为基准步调来进行工作。时钟电路时钟频率直接影响单片机的速度,电路的质量直接影响系统的稳定性。常用的时钟电路有两种方式:内部时钟方式和外部时钟方式。1)内部时钟方式(P18)

内部有一个用于构成振荡器的高增益反相放大器,其输入端:XTAL1,输出端:XTAL2。

C1和C2典型值通常选择为30pF左右。晶体的振荡频率在1.2MHz~12MHz之间。某些高速单片机芯片的时钟频率已达40MHz。2)外部时钟方式

常用于多片MCS-51单片机同时工作。

4复位操作和复位电路复位操作单片机的初始化操作,摆脱死锁状态。

引脚RST加上大于2个机器周期(即24个时钟振荡周期)的高电平就可使MCS-51复位。复位时,PC初始化为0000H,使MCS-51单片机从0000H单元开始执行程序。

除PC之外,复位操作还对其它一些寄存器有影响。

SP=07H,P0-P3的引脚均为高电平。

在复位有效期间,ALE脚和PSEN*脚均为高电平,内部RAM的状态不受复位的影响。MCS-51单片机各寄存器的复位状态

00HTCON0000HPC

00HTMOD0×××0000BPCON0×000000BIE不定SBUF

××000000BIP00HSCON0FFHP0~P300HTH10000HDPTR00HTL107HSP00HTH000HPSW00HTL000HACC复位状态寄存器复位状态寄存器上电自动复位和按钮复位

最简单的上电自动复位电路:复位电路

按键手动复位

2.4LED介绍

通常红色贴片LED:靠电流驱动,电压1.8V~2.2V,电流1到20mA,在1到5mA亮度有所变化,5mA以上亮度基本无变化。点亮一个LED发光二极管`2.5点亮LED程序代码编写点亮LED假设单片机的P1.0脚连接一个LED,如图2-10所示,图中D1是LED。P54:注意1电容电阻的取值2P口仿真图与程序对应起来

根据LED的显示情况来写程序,假设要求LED闪动就可以,程序如下:这个程序就可以在Protues上看到单片机的P1.0连接的LED不断闪烁,延时时间间隔是大约500msLED变换一次。/***************************************************/#include<reg52.h>//包含特殊功能寄存器定义的头文件#defineucharunsignedchar//预定义voiddelay(uchar);//函数声明sbitLED=P1^0;//位地址声明,定义P1.0为LED/***************************************************/voidmain(void)//主函数,任何一个C程序有且仅有一个主函数{

//{}是成对出现的,这里表示函数的起始与结束

while(1)//死循环,让程序停留在所希望的状态下,不//要乱运行{LED=!LED;//取反后送到LED端口;分号表示一条语句结束delay(255);delay(255);}//调用延时函数,延时510ms}/****************************************************/voiddelay(ucharx)//延时函数{uchark;while(x--)for(k=0;k<125;k++);}/*****************************************************/程序宏观框架结构2.流水灯控制

图中的单片机可以是AT89C51系列的单片机,也可以是任意的51内核的单片机,其中8个LED采用共阳极的连接方法,即8个LED的公共端是接在正电源上的,此时当单片机的P1各端口如果是输出低电平时,LED亮,当各端口输出高电平时,LED灭。下面的程序给出了8个LED灯循环显示,即LED灯按照顺序一个一个点亮的程序。#include<reg52.h>//定义特殊功能寄存器库#include<intrins.h>//定义循环左移、右移等函数库#defineucharunsignedchar//预定义#defineuintunsignedintvoiddelay(uchar);//函数声明voidmain(void){ucharLedTemp;LedTemp=0xfe;//初始值while(1){P1=LedTemp;//送值到端口LedTemp=_crol_(LedTemp,1);//循环左移delay(255);delay(255);delay(255);delay(255);//延时}}voiddelay(ucharx)//延时函数{uchark;while(x--)for(k=0;k<125;k++);}本程序的功能是将8个LED循环点亮,中间延时大约1秒(假设晶体振荡器的频率是11.0592MHz)。送给P1端口的变量LedTemp的初始值为0xfe,写成二进制为11111110,因为是低电平LED点亮,所以只有一个LED灯被点亮,送完第一次的值后,LedTemp循环左移,循环后的二进制代码是11111101,延时大约1秒后,将新的LedTemp的值送P1端口,LedTemp再循环左移后二进制代码为11111011,这样不断的运行,8各LED灯就循环向左显示,LED灯就循环的跑起来了。2.6Keil51与Proteus安装与使用Keil51与Proteus安装与使用学习前的准备工作作业1、理解单片机基本结构和最小系统,SFR等基本概念。2、了解普通发光二极管的参数3、了解Keil软件和Proteus的基本用法和单片机编程流程,能够独立完成编程仿真等基本操作。第三章C51编程设计及应用实例3.1C51程序设计基础3.2软件延时3.3流水灯程序主要内容:本章教学计划:

理论+实践教学12学时本章教学重点:掌握C51程序设计基础掌握软件延时方法掌握流水灯控制程序3.1.1进制转换

二进制、十进制和十六进制十进制 二进制 十六进制0 0b0000 0x01 0b0001 0x12 0b0010 0x23 0b0011 0x34 0b0100 0x4…… …… ……9 0b1001 0x910

0b1010 0xA11 0b1011 0xB12 0b1100 0xC13 0b1101 0xD14 0b1110 0xE15 0b1111 0xF16 0b00010000 0x1017

0b00010001 0x11…… …… ……3.1C51程序设计基础1)C语言的数据类型及范围(P25)3.1.2数据与运算符数据2)C51语言的数据类型及范围(P25)3)常量常量分为有不同的类型:0、1、-5称为整型常量;3.14159、-12.34称为实型常量;‘a’、‘A’称为字符型常量常量的定义形式为#define常量名常量例如:#definePI3.14159定义:程序运行过程中,不能改变的量。常量名一般用大写3.1.2数据与运算符4)变量

位变量:bitb1,b2,b3;整型变量;inta,b;浮点型变量;floatx,y;字符型变量:charch1,ch2;定义:程序运行过程中,可以改变的量。变量分为有不同的类型,定义形式如下:缩写变量的数据类型#defineucharunsignedchar#defineuintunsignedint1)C51的优先级及结合方向优先级:当运算对象两侧都有运算符时,执行运算的先后次序。按运算符的高低来执行。例:先乘除、后加减。结合方向:一个运算对象两侧的运算符的优先级相同时的运算顺序。分左右结合两种。例:a+b+c-d左结合-(-(-5))右结合C语言基本运算符(P34)2)C51算术运算符及表达式C51的算术运算符有5种:+-*/%加法运算符或正值符号减法运算符或负值符号乘法运算符除法运算符求余运算符除法有两种:整除:两个运算对象为整数时;普通除法:两个运算对象中有一个为实数时。优先级:先乘除求余、后加减(小括号的优先级最高)结合方向:除正负号外,其它都是左结合算术表达式:由算术运算符连接起来的式子3)C51关系运算符及表达式C51的关系运算符有6种:<><=>===!=小于大于小于等于大于等于等于注意:等于和赋值不要混淆。关系运算符的结果是0或1优先级:<,>,<=,>=同优先级,==,!=同优先级,但前者高于后者结合方向:全部左结合不等于例如:若a=5,b=3,c=1则a>bb+c<ad=a>bf=a>b>c关系表达式:由关系运算符连接起来的式子4)C51逻辑运算符及表达式C51有三种逻辑运算符:!&&||逻辑非逻辑与逻辑或“!”是单目运算符,&&和||是双目运算符。逻辑表达式:用逻辑运算符连接起来的式子。优先级:!最高,&&次之,||最低。结合方向:!是右结合,&&和||是左结合。逻辑表达式的结果是“0”或“1”。Note:逻辑运算中,所有非0值都当作逻辑值“1”。例如:若a=4,b=5!aa||ba&&b!a&&b逻辑表达式的计算顺序当由多个逻辑运算符构成的逻辑表达式中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑表达式的值时,才执行该运算符。对逻辑与&&,只有当左边的表达式的不为0时,才继续往后运算,直到有一个为0为止或计算完毕为止。例:若a=1,b=2,c=3,d=4,m=1,n=1

表达式:(m=a>b)&&(n=c<d)

表达式:(m=a>b)||(n=c<d)对逻辑或||,只有当左边的表达式的不为1时,才继续往后运算,直到有一个为1为止或计算完毕为止。5)C51位操作及表达式C51提供了如下位操作运算符:

&按位与;|按位或;优先级高于逻辑运算符^按位异或;~接位取反:优先级次于!<<位左移;>>位右移;除了按位取反运算符~以外,以上位操作运算符都是两目运算符,即要求运算符两侧各有一个运算对象。注意:位运算符只能是整型或字符型数。不能为实型数据。优先级低于算术运算符5.1)按位反运算符~~是一个单目运算符,用来对一个二进制数按位进行取反,即0变1,1变0。例若a=F0H=11110000B则表达式:a=~a值为0F

即a:11110000

~00001111(0FH)~运算符的优先级比别的算术运算符、关系运算符和其它运算符都高。

例如~a&b的运算顺序为先作~a再作&运算。优先级次于!。5.2)按位与运算符&

运算规则:参加运算的两个运算对象,若两者相应的位都为1,则该位结果值为1,否则为0。即0&0=00&1=01&0=01&1=1例若a=54H=01010100Bb=3BH=00111011B则表达式:c=a&b的值为10H即a:01010100

b:&00111011c:=00010000(10H)5.2)按位与运算符&按位与&的作用:用作指定位的清零用法:指定位用0,其他位用1,该数与目标数进行按位与的运算(0的位置对应清零位置)例子:P1=P1&0xof的作用?P1=P1&0xof,即P1=(P1&00001111),结果是高四位清零原因:任意数和0进行&运算后为0,任意数和1进行&运算后该数不变5.2)按位与运算符&练习把端口P2的低四位置0把端口P3的前两位置0把端口P0的后两位置0把端口P0的各位间隔置05.3)按位或运算符|

运算规则:参加运算的两个运算对象,若两者相应的位中,只要有一个为1,则该侠结果为1。即0|0=00|1=11|0=11|1=1例若a=30H=00110000Bb=0FH=00001111B则表达式:c=a|b的值为3FH

即a:00110000

b:|0000111100111111(3FH)5.3)按位或运算符|按位或|的作用:用作指定位进行置1用法:指定位用1,其他位用0,该数与目标数进行按位或的运算(1的位置对应置1的位置)例子:P1=P1|0xof的作用?P1=P1|0xof,即P1=(P1|00001111),结果是低四位置1原因:任意数和1进行或运算后为1,任意数和0进行或运算后该数不变练习把端口P2的低四位置1把端口P3的前两位置1把端口P0的后两位置1把端口P0的各位间隔置15.4)异或运算符^运算规则:参加运算的两个运算对象,若两者相应的位值相同,则结果为0;若两者相应的位相异,则结果为1。即0^0=0

0^1=11^0=1

1^1=0例a=A5H=10100101b=37H=00110111则表达式:c=a^b的值为92H

即a:10100101

^b:0011011110010010(92H)特点:按位异或可以将指定位取反。5.4)异或运算符^按位异或^的作用:用作指定位进行取反用法:指定位用1,其他位用0,该数与目标数进行按位异或的运算(1的位置对应取反的位置)例子:P1=P1^0xof的作用?P1=P1^0xof,即P1=(P1^00001111),结果是低四位取反原因:任意数和1进行异或运算后结果取反,任意数和0进行异或运算后该数不变5.4)异或运算符^练习把端口P2的低四位取反把端口P3的前两位取反把端口P0的后两位取反把端口P0的各位间隔取反5.5)位左移和位右移运算符(<<,>>)

(优先级次于算术运算符)位左移、位右移运算符<<、>>,用来将一个数的各二进制位的全部左移或右移若干位,移位后,空白位补0,而溢出的位舍弃。例若a=EAH=11101010B则表达式:a=a<<2,将a值左移两位,其结果为A8H。(左边位舍弃,右边位补零)

表达式:a=a>>2,将a值右移两位,其结果为3AH。(右边位舍弃,左边位补零)循环左移和循环右移注意(P46)单片机中经常会用到循环左移和循环右移,只能用函数实现(使用时,程序中必须包含#include<intrins.h>一行)_crol_,_cror_;将char型变量循环左移、右移指定位数后返回_irol_,_iror_;将int型变量循环左移、右移指定位数后返回eg:LedTemp=_crol_(LedTemp,1);//循环左移eg:位移运算符的例子main(){unsignedchara=0xc3,b,c;intn=2;b=a<<(8-n);c=a>>n;a=c|b;}答案:b=0b11000000c=0b00110000a=0b11110000=0xF06)自增、自减运算符(++,--)

(优先级高于算术运算符)

作用是使变量的值增1或减1,如:++i,--i(在使用i之前,先使i的值加(减)1)如果i的原值为3a)j=++i;(i的值先变成4,再赋给j,j的值为4)

i++,i--(在使用i之后,使i的值加(减)1)b)j=i++;

(先将i的值3赋给j,j的值为3,然后i变为4)例2.1.2:写出程序运行的结果。

#include<stdio.h>voidmain(){

int

i,j,m,n;

i=8;j=10;

m=++i;n=j++;’

printf(“%d,%d,%d,%d\n”,i,j,m,n);}7)复合运算符凡是二目运算符都可以与赋值运算符“=”组合在一起,称为复合运算符。C51提供有10种符合赋值运算符:+=、-=、*=、/=、%=、&=、|=、^=、>>=、<<=例如:a=a+b可写为a+=ba=a<<3可写为a<<=3for语句

for(表达式1;表达式2;表达式3)

{语句1;语句2;

……

语句n;}

语句格式:循环体表达式1—

循环初始表达式,用于进入循环体前为循环变量赋初值由算术、赋值、逻辑和逗号表达式构成。表达式2

循环控制表达式,用于控制循环体语句的执行次数由关系表达式或逻辑表达式构成。表达式3

修改循环变量表达式,即每循环一次使得表达式1的值就要变化一次。由算术、赋值、逻辑或逗号表达式构成

语句功能:

当表达式2

的值为真时执行循环体中各语句。3.1.3for与while循环语句它的执行过程如下:

(1)

先求解表达式1。

(2)

求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。

(3)

求解表达式3。

(4)

转回上面第(2)步骤继续执行。

(5)

循环结束,执行for语句下面的一个语句。for语句的用法for语句的一般形式(用法1)for(表达式1;表达式2;表达式3){ (需要执行的语句);}例如:for(i=0;i<2;i++){j++}for语句的用法用法2:for(i=0;i<30000;i++);(延时)用法3:for(;;)(即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。死循环)while语句

先计算表达式的值并判断,若表达式值为“真”(即非零值),则执行循环体中的语句;然后再计算再判断,如此重复,直到表达式值为“假”(即0值)时,则跳出循环语句格式:

while(条件表达式){语句1;语句2;

……语句n;}

循环体语句功能:当条件表达式的值为真时重复执行循环体中各语句。

语句说明:条件表达式是关系表达式,逻辑表达式,赋值表达式

while语句的用法

(如果没有花括号的话,则while循环语句的范围只是到while后面的第一个分号处)函数的简单介绍函数定义的一般形式:函数值类型函数名(形式参数列表){函数体}1、函数值类型2、函数名3、形式参数列表4、函数体5、main函数(必须有且唯一)6、语句注释//3.1.4函数(P42)3.1.4函数(P42)函数的声明形式对应数学里的函数:自变量->参数因变量->返回值调用原则:函数可相互调用(main函数除外),但不能嵌套定义函数的执行顺序:从main函数进入,调用其他函数后,在main函数结束3.1.4函数(P42)函数的声明形式参数:形参:函数定义时的参数实参:使用时的参数返回值:默认为整型无返回值可加void3.1.4函数(P42)函数的声明形式函数调用:种类:本身的库函数以及自定义的函数被调用的函数放在前面(或在主函数前先定义,P42-43)变量作用域:全局变量:作用在程序文件里局部变量:作用在函数里3.1.4函数(P43)函数的声明形式变量生存期:全局变量:直到程序的退出局部变量:直到函数的退出3.1.5特殊功能寄存器的关键字sfr(P29)P25表2-3:对比C语言里的数据类型单片机特有的类型:bit,sbit,sfr,sfr163.1.5特殊功能寄存器的关键字sfr(P29)数据存储器存储结构的分析:(P23图2-8(b))0000-FFFFH为片外存储片外数据存储器利用P2,P0口作为地址总线(共16根)(AT89C51)片内数据存储:00H-7FH,80-FFH区间用于特殊功能寄存器SFR3.1.5特殊功能寄存器的关键字sfr(P29)00-7FH的片内数据存储器划分为3个区:00-1FH:通用寄存器区20-2FH:可位寻址区30-7FH:用户RAM区P24图2-9存储器区域的对应分析3.1.5特殊功能寄存器的关键字sfr(P29)SFR:用以控制定时器、计数器、串口、I/O口及其它部件。

特殊功能寄存器的名字,在C51程序中,全部大写。SFR的地址为80-FFH,容量为:15*16+15-8*16+1=128字节寻址方式:位寻址部分字节寻址字寻址AT89C51单片机的所有特殊功能寄存器及初值(见P30表2-7)例如:P0-P3的地址分别为80H,90H,A0H,B0H3.1.5特殊功能寄存器的关键字sfr(P31)操作和赋值方式:对寄存器地址对应的端口进行操作例子:把90H位置设置为FFH,参照表2-7,90H对应P1端口,即:让P1的8个端口全置1推广:1.将A0H置00H?2.将80H置aaH?3.将B0H置10H?3.1.5特殊功能寄存器的关键字sfr(P31)SFR的定义方式(P31)(三个关键字:sfr,sfr16和sbit)与P1的赋值语句不同:P1=0x90;:赋值sfrP1=0x90;:P1端口寄存器地址为90HSFR定义的为数值,‘=’后不能有计算表达式头文件(提供了特殊功能寄存器的定义)51单片机:#include<reg51.h>52单片机:#include<reg52.h>3.1.5特殊功能寄存器的关键字sfrSFR的定义方式(P31)sfr与sfr16的区别:sfr:8位数据访问sfr16:16位数据访问(字寻址)sfr16直接定义低8位地址,高8位续低8位地址例子:sfr16T2=0xcc表示(AT89C52中的定时器2)T2低8位地址:oxcc;T2高8位地址:oxcd;3.1.5特殊功能寄存器的关键字sfrSFR的定义方式(P31)具有位运算功能的SFR用‘sbit’定义定义方式:(比较P31-P32的三种定义方式)1.先基地址再子地址的方式:P31(1)2.直接基地址上的子地址:P32(2)3.地址直接赋值P32(3)实例:P32第一种方法:

sfrP1=0x80;sbitred=P1^0;sbityellow=P1^1;sbitgreen=P1^2;第二种方法:

sbitred=0x80^0;sbityellow=0x80^1;sbitgreen=0x80^2;第三种方法:

sbitred=0x80;sbityellow=0x81;sbitgreen=0x82;1、sbit的定义形式:3.1.5特殊功能寄存器的关键字sfr3.1.5特殊功能寄存器的关键字sfr定义位变量的bit和sbit的区别(1)bit不指定地址的话地址随机(片内RAM中位寻址区)sbit一般用于确定的地址,一般有基地址和‘^’的衍生位(P32的几个实例)(2)bit一般用于判断的标志位(类似bool类型)sbit一般用于SFR中可位寻址端口,否则要求变量存储器类型为‘bdata’(20H~2FH:可位寻址内部RAM区)3.1.5特殊功能寄存器的关键字sfr定义位变量的bit和sbit的区别bit类型(位变量)bit定义位变量,值为0或1作用(类似布尔变量)1.条件是/否的判断(如循环,分支语句)2.灯亮/暗,高/低电平灯实际量的表示3.1.5特殊功能寄存器的关键字sfr‘^’操作符的位位置的最大值char/uchar:8位,位位置的最大值:0-7int/uint/short/ushort:16位,位位置的最大值:0-15long/ulong:32位,位位置的最大值:0-31位位置的最大值的范围与取值范围的含义不同char位位置的最大值:0-7…….51单片机延时常用办法3.2软件延时for语句循环一次消耗8个机器周期的时间51单片机延时常用办法3.2软件延时几个常用概念:振荡周期:振荡源周期,由晶体本身决定;时钟周期:包含2个振荡周期,分别为:节拍P1:完成算术逻辑操作;节拍P2:完成寄存器之间的数据传输;机器周期:包含6个时钟周期包含的时钟周期:S1,S2,S3,S4,S5,S6包含的节拍(振荡周期):12个:S1P1,S1P2,…….,S6P1,S6P251单片机延时常用办法3.2软件延时机器周期:完成一条指令的时间,时间不确定,MCS-51单片机为1-4个机器周期(P17);相互关系:1机器周期=6时钟周期=12振荡周期;计算:当晶体频率为12MHz时,对应的振荡周期,时钟周期,机器周期分别是多少?(P17)/***************************************************/#include<reg52.h>//包含特殊功能寄存器定义的头文件#defineucharunsignedchar//预定义voiddelay(uchar);//函数声明sbitLED=P1^0;//位地址声明,定义P1.0为LED/***************************************************/voidmain(void)//主函数,任何一个C程序有且仅有一个主函数{

//{}是成对出现的,这里表示函数的起始与结束

while(1)//死循环,(程序空间可容纳代码量),让程序停//留在所希望的状态下,不要乱运行{LED=!LED;//取反后送到LED端口;分号表示一条语句结束

delay(255);delay(255);//调用延时函数,延时510ms}}/****************************************************/voiddelay(ucharx)//延时函数{uchark;while(x--)for(k=0;k<125;k++);}/*****************************************************/回顾:流水灯实验8个LED发光二极管,分别对应单片机IO口的P1.0到P1.7口,8个单片机IO口组成一个字节,在程序编写过程中,可以直接用P1来进行操作。C语言的8位二进制数代表了8个IO口例如:P1=0xfe;0b11111110

0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F.P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.01111111

02.3流水灯程序流水灯控制图2-11中的单片机可以是AT89C51系列的单片机,也可以是任意的51内核的单片机,其中8个LED采用共阳极的连接方法,即8个LED的公共端是接在正电源上的,此时当单片机的P1各端口如果是输出低电平时,LED亮,当各端口输出高电平时,LED灭。下面的程序给出了8个LED灯循环显示,即LED灯按照顺序一个一个点亮的程序。/*****************************************************/#include<reg52.h>//定义特殊功能寄存器库#include<intrins.h>//定义循环左移、右移等函数库#defineucharunsignedchar//预定义#defineuintunsignedintvoiddelay(uchar);//函数声明/*****************************************************/voidmain(void){ucharLedTemp;LedTemp=0xfe;//初始值while(1){P0=LedTemp;//送值到端口LedTemp=_crol_(LedTemp,1);//循环左移delay(255);delay(255);delay(255);delay(255);//延时}}/**************************************************/voiddelay(ucharx)//延时函数{uchark;while(x--)for(k=0;k<125;k++);}/**************************************************/本程序的功能是将8个LED循环点亮,中间延时大约1秒(假设晶体振荡器的频率是11.0592MHz)。送给P1端口的变量LedTemp的初始值为0xfe,写成二进制为11111110,因为是低电平LED点亮,所以只有一个LED灯被点亮,送完第一次的值后,LedTemp循环左移,循环后的二进制代码是11111101,延时大约1秒后,将新的LedTemp的值送P1端口,LedTemp再循环左移后二进制代码为11111011,这样不断的运行,8各LED灯就循环向左显示,LED灯就循环的跑起来了。作业1、将流水灯左移理解透彻后,独立完成流水灯右移操作。2、修改程序并实现:依次1和5灯亮,然后2和6灯亮,然后3和7灯亮,然后4和8灯亮,之后循环3、独立完成一个左移到头接着右移,右移到头接着左移的花样流水灯程序。注意是:P0口#include<reg51.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharuchar

i,LEDtemp;voiddelay(ucharx);voidmain(){

LEDtemp=0xfe;while(1){//向左循环点亮LEDfor(i=0;i<7;i++){P0=LEDtemp;

LEDtemp=_crol_(LEDtemp,1);//左移一位,点亮下一位LEDdelay(255);delay(255);delay(255);delay(255);}//向右循环点亮LED5、for(i=0;i<7;i++){ P0=LEDtemp;

LEDtemp=_cror_(LEDtemp,1);//右移一位,点亮上一位LEDdelay(255);delay(255);delay(255);delay(255);}}}//延时函数,延时a毫秒/**************************************************/voiddelay(ucharx)//延时函数{

uchark;while(x--)for(k=0;k<125;k++);}/**************************************************/注意是:P0口#include<reg51.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharuchar

i,LEDtemp;voiddelay(ucharx);voidmain(){

LEDtemp=0xfe;while(1){//向左循环点亮LEDfor(i=0;i<7;i++){P0=LEDtemp;

LEDtemp=_crol_(LEDtemp,1);//左移一位,点亮下一位LED

delay(255-i*30);delay(255-i*30);delay(255-i*30);delay(255-i*30);}//向右循环点亮LED变速跑;for(i=0;i<7;i++){ P0=LEDtemp;

LEDtemp=_crol_(LEDtemp,1);//右移一位,点亮上一位LED

delay(45+i*30);delay(45+i*30);delay(45+i*30);delay(45+i*30);}}}//延时函数,延时a毫秒/**************************************************/voiddelay(ucharx)//延时函数{

uchark;while(x--)for(k=0;k<125;k++);}/**************************************************/第四章键盘接口及扫描原理

——单片机输入应用

本章教学计划:

理论+实践教学12学时本章教学重点:了解键盘分类掌握行列扫描键盘原理掌握行列键盘扫描程序1键盘分类2选择结构程序设计3行列扫描键盘原理4行列键盘扫描程序5键盘的键值6线反转法键盘扫描程序主要内容:1、键盘的分类键盘按结构形式可分为两种:编码键盘

非编码键盘

编码键盘:由内部硬件逻辑电路自动产生被按键的编码。

特点:使用方便,软件简单,成本较高。

非编码键盘:主要由软件产生被按键的编码。特点:非编码键盘结构简单、成本低廉,使用不如编码式键盘方便,键盘的管理程序的编制比较复杂。在单片机中使用非编码键盘,键盘上的键按行列构成矩阵,在行列的交点上对应一个键。1、键盘的分类编码键盘1(独立按键)按键开关的连接采用上拉电阻的方法判断是否有键按下:当按键不按下时,P1.0-P1.3为高电平;有按键按下时,相应引脚为低电平;松开按键时,相应引脚变成高电平。编码键盘2利用中断的形式:(不需要扫描键盘)无键按下时,与门输出高电平;有一个键按下时,与门输出低电平,引发中断,中断后程序会执行中断服务程序,对按键进行处理。注:若在一个系统设计中,需要使用很多按键,采用独立按键的方式,会大量占用IO口1、键盘的分类2.1if语句if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假、非零或零)决定执行给出的两种操作之一。2.1.1if语句的三种形式C语言提供了三种形式的if语句:1)if(表达式)语句例如:

if(x>y) printf("%d",x);这种if语句的执行过程2、选择结构程序设计2)

if(表达式)语句1else语句2例如:

if(x>y) printf("%d",x);

else printf(“%d”,y);见图:练习1、#include<stdio.h>voidmain(){inti=-1;

if

(i<=0)

printf(“****\n”);

else printf(“%%%%\n”);}

A)**** B)%%%% C)%%%%c D)有语法错误,不能正确执行3)

if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3…elseif(表达式m)语句melse语句n

例如:有一个程序段

根据学生的成绩分为5个等级A.B.C.D.Escanf(“%d”,&results);if(results>89)printf(“%disA”,results);elseif(results>79)printf(“%disB”,results);elseif(results>69)printf(“%disC”,results);elseif(results>59)printf(“%disD”,results);elseprintf(“%disE”,results);练习

x(x<1)y=2x-1(1≤x<10)3x-11(x≥10)#include<stdio.h>voidmain(){floatx,y;scanf(“%f”,&x);

if(x<1) y=x;

elseif((x>=1)&&(x<10)) y=2*x-1;

else y=3*x-11;printf(“x=%f,y=%5.2f\n”,x,y);}(1)三种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关系表达式。表达式的类型不限于逻辑表达式,可以是任意的数值类型(包括整型、实型、字符型、指针型数据)。(2)第二、第三种形式的if语句中,在每个else前面有一分号,整个语句结束处有一分号。

else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。(3)在if和else后面可以只含一个内嵌的操作语句;也可以有多个操作语句,此时用花括号“{}”将几个语句括起来成为一个复合语句。注意2.1.2if语句的嵌套

在if语句中又包含一个或多个if语句称为if语句的嵌套.语句格式:

if(表达式)

if(表达式1)语句1;

else

语句2;

else

if(表达式2)语句3;

else

语句4;2.2switch语句switch(表达式){

case常量表达式1:

语句1;可以是多行,可以加括号,也可以不加,到下一个case之前,都是本case的语句范围

[break;]中括号,表示此语句可以没有

case常量表达式2:

语句2;[break;]……

case常量表达式n:

语句n;[break;]

[default:]

语句n+1;[break;]}#include<reg52.h>//定义特殊功能寄存器库#defineucharunsignedchar#defineuintunsignedintvoiddelay(uchar);//函数声明ucharKeyScan(void);//键盘扫描函数voidmain(void){ucharKeyValue;while(1){KeyValue=KeyScan();//调用函数,读取键值编码键盘1的参考程序:/*switch(KeyValue)//各个键值的应用{case0x0E:……;break;case0x0D:……;break;case0x0B:……;break;case0x07:……;break;}*/}}/********************************************/ucharKeyScan(void){TempValue=P1;//读端口到变量TempValue&=0x0f;//将高四位置0if(TempValue!=0x0f)//判断是否有键按下{del

温馨提示

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

评论

0/150

提交评论