单片机应用技术(C 语言版)任务7 睡眠CPU_第1页
单片机应用技术(C 语言版)任务7 睡眠CPU_第2页
单片机应用技术(C 语言版)任务7 睡眠CPU_第3页
单片机应用技术(C 语言版)任务7 睡眠CPU_第4页
单片机应用技术(C 语言版)任务7 睡眠CPU_第5页
已阅读5页,还剩24页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

主编:李文华“十四五”职业教育国家规划教材经全国职业教育教材审定委员会审定睡眠CPU任务要求用外部中断0对接入/P3.2引脚的按键按下次数进行计数。按键计数处理方式仍采用查询和中断两种方式,仍用与P2相接的8只发光二极管显示按键按下的计数值,其中某位发光二极管亮表示计数值的对应数位为1,每次按键计数处理完毕后让CPU进入睡眠状态。要求观察实验结果,并总结出利用CPU睡眠技术抗干扰的方法。相关知识1、C51中的复合赋值运算C51中,双目运算符可以与赋值运算符“=”一起组合成复合赋值运算。C51的复合赋值运算如下表所示。运算符示例等价式运算符示例等价式+=a+=ba=a+b<<=a<<=ba=a<<b-=a-=ba=a-b>>=a>>=ba=a>>b*=a*=ba=a*b&=a&=ba=a&b/=a/=ba=a/b|=a|=ba=a|b%=a%=ba=a%b^=a^=ba=a^bC51中采用复合赋值运算可以简化程序,提高程序的编译效率。2、电源管理特殊功能寄存器PCONCMOS型的MCS-51单片机(如STC89C系列、STC12C系列、AT89S系列单片等)具有空闲(CPU睡眠)和掉电两种低功耗工作方式,由特殊功能寄存器PCON管理。PCON的格式如下:PCON的位:D7D6D5D4D3D2D1D0PCON字节地址:0x87SMOD×××GF1GF0PDIDL复位值:0x00各位的含义如下:D6~D4位:无定义。SMOD:波特率加倍位,用于设置串行通信的波特率,其用法详见任务12。GF1、GF0:通用标志位。PD、IDL:低功耗工作方式选择控制位,它们的取值组合决定了单片机的状态。相关知识2、电源管理特殊功能寄存器PCON相关知识单片机的状态与PD、IDL位的关系如下表:PDIDL单片机的状态特点00正常工作状态CPU正常工作,各中断按程序的设置而工作,各变量的值、特殊功能寄存器的值、单片机的引脚状态随程序的运行而变化。01空闲状态(CPU睡眠状态)CPU停止工作(CPU睡眠),外部中断、定时/计数器、串行口仍正常工作,ALE、引脚保持低电平,特殊功能寄存器的值不变,程序中各变量的值保持不变,P0~P3口的输出状态不变。任意一中断都可以将CPU唤醒。

1×掉电状态CPU、外部中断、定时/计数器、串行口都停止工作,ALE、引脚保持低电平,特殊功能寄存器的值不变,程序中各变量的值保持不变,P0~P3口的输出状态不变。

2、电源管理特殊功能寄存器PCON相关知识【说明】①单片机复位后,PCON的值为0x00,单片机处于正常工作状态。②PCON的位无位地址,不能用位访问方式将PCON的某位置1或清0,只能用按位操作运算将PCON的位置1、清0或者取反。3、低功耗工作方式的设置与解除相关知识设置方法睡眠CPU:将PCON的IDL位置1进入掉电状态:将PD位置1睡眠CPU的程序:PCON|=0x01; //将PCON.1位置1,CPU睡眠等价于:PCON=PCON|0x01;使单片机进入掉电状态的程序:PCON|=0x02; //将PCON.2位置1,单片机进入掉电状态等价于PCON=PCON|0x02;3、低功耗工作方式的设置与解除相关知识【注意】①语句“PCON=0x01;”也能使PCON.1位置1,但它会将PCON的其他位清0,如果PCON的SMOD位应为1,此时会更改SMOD位的值,从而导致串口工作不正常。②如果只对特殊功能寄存器的某几位赋值,一般是对特殊功能寄存器进行按位操作运算或者是对其中的位以位方式赋值(特殊功能寄存器的位分配有位地址时)。3、低功耗工作方式的设置与解除相关知识解除方法不能用软件解除,只能依赖于硬件。(2)解除掉电方式的方法硬件复位(1)退出空闲状态(睡眠CPU)的方法法一:用中断唤醒CPU任何一种中断(外部中断、定时中断、串行中断)被响应后,硬件电路都会将PCON的IDL位清0,从而使系统退出空闲工作方式。法二:复位单片机单片机复位后,PCON的各位为0,硬件电路自动将PCON的IDL位清0而解除空闲状态。任务实施1、搭建电路电路图如下:任务实施2、编写软件程序(1)查询方式流程图如下:任务实施(1)查询方式#include <reg51.h> //1包含定义特殊功能寄存器的头文件#define uchar unsignedchar //2宏定义:uchar代表unsignedchar#define ledport P2 //3宏定义:ledport代表P2uchar idata keycnt; //4在idata区定义全局变量keycnt(按键计数器)void main(void) //5main函数{keycnt=0; //6按键计数器初始化:初值为0IT0=1; //7外部中断0的触发方式为下降沿触发while(1) //8while死循环,语句9~14是while的循环体{ if(IE0) //9有键按下吗?

{IE0=0; //10IE0位清0。

keycnt++; //11按键计数值加1 } //12if语句块结束

ledport=~keycnt; //13计数值按位取反后送led控制口显示

PCON|=0x01; //14睡眠CPU相对任务6增加的语句} //15while循环体结束} //16main函数结束任务实施(1)查询方式【说明】和任务6中的查询方式的程序相比,本程序仅仅只是增加了第14行睡眠CPU语句“PCON|=0x01;”,但是,本程序不能对按键按下的次数进行计数。实验时,按按键时发光二极管一直处于熄灭状态。产生这一现象的原因是,按键的速度一般为几十毫秒到上百毫秒,而单片机执行指令的时间为µs级,上电时IE0=0,若P3.2引脚无下降沿,语句9判断的结果是条件为假,CPU将跳过语句10和语句11,直接执行语句13,此时发光二极管显示为0(所有发光二极管熄灭),执行语句14后CPU停止工作,不会跳转至语句8处重新执行while循环程序。因此,即使后期P3.2脚出现下降沿(按键按下),单片机也不会处理。本例表明,CPU睡眠时,CPU停止工作,程序不能运行。任务实施(2)中断方式流程图如下任务实施(2)中断方式#include <reg51.h> //1包含特殊功能寄存器定义头文件reg51.h#define ledport P2 //2宏定义:ledport代表P2(发光二极管接P2口)#define uchar unsignedchar //3宏定义:uchar代表unsignedcharuchar idata keycnt; //4定义全局变量keycnt(按键按下的次数)void count() interrupt0 using 1 //5定义中断服务函数{keycnt++; //6按键计数值加1ledport=~keycnt; //7按键计数值送led口显示} //8中断服务函数结束void main(void) //9main函数{keycnt=0; //10按键计数值初始化:赋初值0IT0=1; //11外部中断0的触发方式:下降沿触发EX0=1; //12开外部中断0EA=1; //13开全局中断while(1) //14死循环,语句15为循环体{ PCON|=0x01; } //15睡眠CPU,相对任务6增加的语句} //16main函数结束本次中断服务需使用前次中断服的结果,该变量要定义成全局变量本程序用“PCON|=0x01;”代替了任务6中断方式程序中的空语句(语句14)。单片机系统可以对按键按下的次数进行计数。实践表明,中断可以唤醒CPU,CPU睡眠后不改变变量的值任务实施(3)利用CPU睡眠抗干扰的应用程序框架结构//全局变量定义void fun1_int(void) interruptn1 using m1 //中断服务函数1{ //局部变量定义

//中断1的事务处理}void funn_int(void) interruptnn using mn //中断服务函数n{ //局部变量定义

//中断n的事务处理}void main(void){ //局部变量定义

//初始化模块

while(1) //死循环

{PCON|=0X01;} //睡眠CPU}应用总结与拓展结构体结构体是一种构造类型数据。它是把若干个不同类型的变量有序地组合在一起而形成的一个组合变量。组成结构体的各个变量称为结构体的元素或者结构体的成员。一般来讲,结构体中的各个变量之间是存在某种关系的,例如日期数据中的年、月、日等。结构体可以将一组相关联的变量作为一个整体来组织处理。⑴结构体类型变量的定义1)先定义结构体类型再定义结构体变量结构体类型的定义格式如下:struct 结构体类型名{ 成员表列};

“struct”是关键字,说明后面的名字是一个结构体类型,不可省略。“结构体类型名”用作结构体类型的标志。“成员表列”列出的是结构体中各个成员的定义。成员的定义格式如下:类型名成员名;

同一结构体中的成员不可同名

结尾处有分号结构体举例日期数据是由年、月、日构成的,可以定义成一个结构体类型,其定义如下:struct date{ unsigned int year; unsigned char month; unsigned char day;};结构体struct 结构体类型名 结构体变量名1,结构体变量名2,…,结构体变量名n;结构体变量的定义格式举例利用前面定义好的结构体类型date来定义两个structdate类型的结构体变量dat1、dat2:

struct date dat1,dat2;上述定义后,变量dat1、dat2都具有srturctdate类型的结构,它们都是由在内存中连续存放的1个无符号整型变量和2个无符号字符型变量组成,它们在存储器中各占据2+1+1=4字节的空间。结构体2)在定义结构体类型的同时定义结构体变量定义格式如下:struct 结构体类型名{ 成员表列}结构体变量名1,结构体变量名2,…,结构体变量名n;举例struct date{unsigned int year;unsigned char month;unsigned char day;}dat1,dat2; //大括号后跟随结构体变量名结构体3)直接定义结构体变量struct{

成员表列}结构体变量名1,结构体变量名2,…,结构体变量名n;省去了结构体名,所有结构体变量必须一次定义,如果在程序中需要多处定义相同结构类型的结构体变量(例如在不同函数中定义结构体变量),一般不采用这种定义方式。结构体有关说明①结构体类型和结构体变量是两个不同的概念。定义结构体类型时,给出的是结构体的组织结构,编译时并不给结构体类型分配存储空间,结构体类型名与char、int等基本类型的名字一样,不能作为运算对象。结构体变量是一个结构体中的具体对象,编译时会给结构体变量分配存储空间,在程序中可以对结构体变量进行赋值、存取或运算。②结构体类型的成员可以与程序中的其他变量同名,也可以与其他结构体类型中的成员同名,它们代表的是不同对象,互不相干。但是,同一结构体类型中的成员不可同名。结构体③结构体类型的成员也可以是一个结构体变量。例如:struct student{unsigned int num;unsigned char name[10];unsigned char sex;struct date birthday; /*birthday是前面定义的structdate类型*/}stud1,stud2;④在实际应用中,一般是先定义结构体类型,再定义该结构体类型的变量。如果结构体类型比较多,可以将各个结构体类型的定义集中放在一个头文件中(扩展名为h的文本文件),在程序中只作结构体变量的定义,并且在程序的开头处要用#include预处理命令将该头文件包含进来。结构体⑵结构体变量的引用与基本类型的变量一样,结构体变量必须先定义然后使用。引用结构体变量必须遵循的原则①对结构体变量的引用是通过对其成员的引用来实现的,除了可以用“&结构体变量名”的形式取结构体变量的首地址外,不能把一个结构体变量作为一个整体进行赋值、存取或运算。引用结构体变量中的成员的格式如下:结构体变量.成员名例如:dat1.year=2010; //将2010赋给结构体变量dat1的year成员②如果结构体变量的成员又是一个结构体变量,则需要用若干个取成员运算符“.”一级一级地找到最低级的成员,只能对最低级的成员进行赋值、存取或者运算。结构体③结构体变量的最低级成员可以像普通变量一样进行各种运算。例如: stud1.birthday.year++; dat1.month<<=1;注意,取成员运算符“.”的优先级最高,stud1.birthday.year++等价于(stud1.birthday.year)++。④在程序中可以直接引用结构体变量的地址和结构体变量成员的地址。结构体变量的地址主要用作函数的参数,用来传递结构体的地址。结构体⑶结构体变量的初始化可以在定义结构体变量时对结构体变量进行初始化。方法如下:将结构体变量最低级成员的值放在一个大括号“{}”中一一列出,然后赋给结构体变量,系统会按所给值的顺序给各成员进行赋值。例如:如果

温馨提示

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

评论

0/150

提交评论