《蓝桥杯单片机设计与开发》课件 第10-18章 信号频率测量 -单片机设计与开发赛题解析_第1页
《蓝桥杯单片机设计与开发》课件 第10-18章 信号频率测量 -单片机设计与开发赛题解析_第2页
《蓝桥杯单片机设计与开发》课件 第10-18章 信号频率测量 -单片机设计与开发赛题解析_第3页
《蓝桥杯单片机设计与开发》课件 第10-18章 信号频率测量 -单片机设计与开发赛题解析_第4页
《蓝桥杯单片机设计与开发》课件 第10-18章 信号频率测量 -单片机设计与开发赛题解析_第5页
已阅读5页,还剩334页未读 继续免费阅读

下载本文档

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

文档简介

【蓝桥杯】《单片机应用技术》教学课件No.10信号频率测量

IAP15F2K61S2内部集成了3个16位的定时/计数器T1、T0和T2,其核心部件是两个8位加法计数器(TH和TL),可合成为一个16位计数器,对脉冲进行计数。(1)若计数脉冲来自内部时钟,称为定时器(Timer);(2)若计数脉冲来自T1(P3.5)、

T0(P3.4)或者T2(P3.1)引脚,称为计数器(Counter)。

【REVIEW】定时/计数器T1和T0定时/计数控制寄存器定时/计数模式寄存器在初始化过程中,设置定时器或计数器的初始值,需要进行一些运算。计数器最大计数值为M时(16位定时/计数器:M=216=65536,

8位定时/计数器:M=28=256),则初值X的计算方法如下:

【12T】X=M-要求的定时值

/

(12/系统时钟频率)

【1T】

X=M-要求的定时值/(1/系统时钟频率)

注:OSC=12MHz时:

【12T】12/系统时钟频率=1,【1T】1/系统时钟频率=1/12。定时/计数器工作之前要进行初始化配置,通常包括以下几个步骤:STEP1:确定T1和T0的工作方式,对TMOD进行赋值;STEP2:计算定时/计数初值,并写入TH1、TL1或TH0、TL0;STEP3:开放中断,对IE进行赋值;STEP4:置TR1或TR0为1,启动定时/计数器工作。No.10-1频率测量方法2.频率测量的三种方法1.什么是频率?频率测量直接测频法测周期法等精度测量法ISBN:978-7-302-61129-5No.10-2脉冲信号的频率测量★定时/计数器应用实践-信号频率测量【任务描述】在蓝桥杯单片机开发板上,用跳线帽将J3的NET_SIG与P34(第15和16针)短接,其中P34为定时/计数器T0的外部计数信号输入引脚。

新建工程,编写程序,实现以下功能:(1)单片机加电后,关闭蜂鸣器、继电器以及8个LED灯;(2)测量NE555多谐振荡器输出信号的频率,并应用数码管按下图所示格式显示信号频率值。其中“F”为频率提示符,后5位数码管显示测量的频率值,单位为Hz。当测量的频率数值不足5位时,将左侧不需要的数码管熄灭。(3)调节电位器Rb3,能够实时测量信号的频率值。(4)用示波器测量振荡器输出信号NET_SIG的频率值,计算频率测量误差。频率测量时需要将J3的15(NET_SIG)与16(SIG_out,P3.4)用跳线帽短接!实现方案(2)单位时间应用T1,设置为定时器,工作模式为0。【12T】设置为50ms定时,赋初值:TH1=(65536-50000)/256;

TL1=(65536-50000)%256;【1T】设置为5ms定时,赋初值:

TH1=(65536-60000)/256;

TL1=(65536-60000)%256;(1)测脉冲应用T0(P3.4)设置为计数器,工作模式为2,初值为0xff。处理思路:(1)测脉冲:用计数器!(2)单位时间:用定时器!#include<reg52.h>#include"user.c"//内部变量定义unsignedintpulse_cnt=

0;unsignedintfreq_value=

0;//数码显示数据缓存区,初设数据为”F(灭灭)00000”unsignedcharDTbuf[]={15,17,17,0,0,0,0,0};voidFreqValue2buf(void);//函数声明//定时器初始化子程序voidTimer01init

()

{//T0用于计数,模式2,装初值0xff

TH0=0xff;TL0=0xff;

//T1用于定时,模式0,[12T]50ms,装初值

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

//

设置TMOD

TMOD=0x06;//bit:0000_0110ET0=1;ET1=1;EA=1;TR0=1;TR1=1;}//计数器0中断服务程序voidTimer0isr()interrupt1

{

pulse_cnt++;}//定时器1中断服务程序voidTime1isr()interrupt3

{

staticunsignedchartimes=

0;

times++;if(times==20){

freq_value=pulse_cnt;

FreqValue2buf();pulse_cnt=0;

times=0;}

}//将频率值分解为BCD码存入数码显示缓冲区voidFreqValue2buf(void){DTbuf[3]=freq_value/10000;

DTbuf[4]=(freq_value/1000)%10;

DTbuf[5]=(freq_value/100)%10;

DTbuf[6]=(freq_value/10)%10;

【12T】信号频率测量应用程序1(

顺序显示+中断测量

DTbuf[7]=freq_value%10;

}//频率值显示子程序voidDispFreqValue(){DT_drv(0,DTbuf[0]);Delay1ms(2);

//显示F

//DT_drv(1,DTbuf[1]);Delay1ms(2);//不驱动

//DT_drv(2,DTbuf[2]);Delay1ms(2);//不驱动

if(DTbuf[3])//如果万位数不为0,则显示

{DT_drv(3,DTbuf[3]);Delay1ms(2);}

//如果万位数和千位数不同时为0,则显示

if(DTbuf[3]|DTbuf[4])

{DT_drv(4,DTbuf[4]);Delay1ms(2);}

if(DTbuf[3]|DTbuf[4]|DTbuf[5])//百位数{DT_drv(5,DTbuf[5]);Delay1ms(2);}

DT_drv(6,DTbuf[6]);Delay1ms(2);

//十位数

DT_drv(7,DTbuf[7]);Delay1ms(2);

//个位数

}

//主程序voidmain(){

//关LED

LED_drv(0xff);

//关BEEP和继电器BEEP_off();RELAY_off();Timer01init();while(1)DispFreqValue();}

数码管显示刷新率分析:取刷新延时2ms时,完成6个数码管刷新需要(约)12ms,因此,数码管的刷新率能够达到80次/秒以上。#include<reg52.h>#include"user.c"//内部变量定义unsignedintpulse_cnt=

0;unsignedintfreq_value=

0;//数码显示数据缓存区,初设数据为”F(灭灭)00000”unsignedcharDTbuf[]={15,17,17,0,0,0,0,0};//定时器初始化子程序voidTimer01init

(){

//

设置TMOD

TMOD=0x06;//bit:0001_0110

//T0用于计数,模式2,装初值0xff

TH0=0xff;TL0=0xff;

//T1用于定时,模式0,[12T]2ms,装初值

TH1=(65536-2000)/256;

TL1=(65536-2000)%256;

ET0=1;ET1=1;EA=1;

TR0=1;TR1=1;}//定时器0中断服务程序voidTimer0isr()interrupt1

{freq_cnt++;}//将频率值分解为BCD码存入数码显示缓冲区voidFreqValue2buf(void){DTbuf[3]=freq_value/10000;

DTbuf[4]=(freq_value/1000)%10;

DTbuf[5]=(freq_value/100)%10;

DTbuf[6]=(freq_value/10)%10;

DTbuf[7]=freq_value%10;

}//定时器1中断服务程序voidTime1isr()interrupt3

{

staticunsignedinttimes=

0;staicunsignedcharDTno=0xff;//数码管序号

DTno++;

//序号变量加1DTno&=0x07;

//截取后3位【12T】信号频率测量应用程序2(纯中断方式)应用定时器T1即实现1s定时,又驱动数码管显示。

DT_drv(DTno,DTbuf[DTno]);//驱动数码管

times++;

if(times==500)

{freq_value=pulse_cnt;

FreqValue2buf();pulse_cnt=0;

times=0;}

}//主程序voidmain(){//关LED

LED_drv(0xff);

//关BEEP和继电器BEEP_off();RELAY_off();Timer01init();while(1);}

1.对同一脉冲频率,两种方法的测量结果是否相同?2.应用信号源两种应用程序的测率误差,并分析产生测量误差的主要原因。No.10-3PCA及其应用(1)1.测(脉冲)频率(T0+T1/T2)2.串口(T1/T2)3.数码管刷新与事务处理(T0/T1/T2)4.PWM(周期<100Hz,周期>1kHz)(T2/PCA)5.超声波测距(T0/T1/PCA)IAP15F2K61S2

STC15系列单片机的可编程计数器阵列(ProgrammableCounterArray,PCA)由16位PCA定时器/计数器和三个PCA模块组成,如图10-6所示。每个PCA模块均可设置为捕获(capture)、软件定时器、高速脉冲输出和PWM输出4种工作模式。16位PCA定时器/计数器(CH和CL)是3个PCA模块的公共时间基准。定时器/计数器的内部结构如图10-7所示,通过特殊功能寄存器CMOD来选择PCA定时器/计数器的时钟源。18.1PCA相关寄存器PCA的工作状态由CCON、CMOD、CCAPMn,以及PCA_PWMn等多个特殊功能寄存器控制。1.

PCA控制寄存器CCON(可位寻址)特殊功能寄存器CCON包括PCA定时器/计数器的运行控制位,PCA定时器溢出标志位和PCA模块0~2的中断标志位。

STC15系列单片机中断系统的总体结构(中断源max:19)INT:5Timer:5UART:42.PCA模式寄存器CMOD(不可位寻址)

特殊功能寄存器CMOD用于选择PCA定时/计数器的时钟源,以及空闲模式下是否停止PCA计数的控制位和PCA计数器溢出中断允许位。3.PCA计数值寄存器CH和CL

特殊功能寄存器CH和CL分别为16位PCA计数器的高8位和低8位,地址分别为0xF9和0xE9。复位值均为0x00,用于存储PCA计数器的计数值。4.PCA模块模式寄存器CCAPM0、CCAPM1和CCAPM2

寄存器CCAPMn(n=0~2)分别用于设置PCA模块0~2的工作模式。CCAPM0的SFR地址为0xDA。单片机复位后,CCAPM0的初值为x000_0000。5.PCA模块捕获值/比较值寄存器CCAPnH和CCAPnL

当模块用于捕获或者比较时,CCAPnH和CCAPnL(n=0~2)用于存储模块的16位捕获值。设置模块为PWM输出模式时,CCAPnH和CCAPnL用来控制输出PWM的占空比。CCAPnH和CCAPnL对应的地址分别为0xFA和0xEA、0xFB和0xEB、0xFC和0xEC。单片机复位后,CCAPnH和CCAPnL的复位值均为0x00。

6.PCA模块PWM模式寄存器PCA_PWM0、PCA_PWM1和PCA_PWM2STC15系列单片机的PCA模块0~2可以通过设置寄存器PCA_PWMn(n=0~2)中的比特位EBSn_1和EBSn_0,设置模块0~2工作于8位PWM、7位PWM或者6位PWM模式。18.4*PCA的应用-脉冲占空比测量思考与练习

1.占空比(duty)定义为周期信号高电平的持续时间与周期的比值,如图所示。怎样测量信号的占空比?2.参考测率测量应用程序,编写能够测量555定时器输出信号占空比的应用程序,在数码管上同时显示信号的频率值和占空比值,显示格式定义如图所示。【蓝桥杯】《单片机设计与开发》教学课件【共4篇】1.基础篇;2.应用篇;3.器件篇;4.实战篇。No.11PWM的产生与应用1.脉冲2.脉冲特性参数

PWM广泛应用于开关电源和电机调速中。

要控制直流电机的速度,通常采用脉冲周期固定、占空比可调的PWM信号通过驱动电路控制直流电机的转速,其中SSR为固态继电器(SolidStateRelay)。PWM是PulseWidthModulation(脉冲宽度调制)的缩写,是对模拟信号的幅度进行数字化编码的方法。简单理解:PWM就是周期不变占空比可调的脉冲序列。3.PWM

SPWM波产生的原理如下图所示,其中三角波称为载波,正弦波称为调制波。【工程实践1】

LED亮度和闪烁频率控制(1)

【任务描述】新建工程,编写代码,产生频率为100Hz的PWM控制LED的亮度。具体要求如下:(1)单片机上电后,先关闭蜂鸣器和继电器,并预设PWM信号的占空比为50%;(2)定义按键S7为LED“亮度控制”键。按下S7时,PWM信号的占空比按“0→10%→20%→30%→50%→90%”循环变化,以控制LED的亮度;(3)定义按键S6为LED“闪烁频率控制”键。未按下S6之前,LED以0.5为间隔闪烁。按下S6时,LED的闪烁频率以0.2s、0.5s和0.8s为间隔依次切换。分析:(1)PWM信号频率为100Hz时,周期为10ms。(2)若定义PWM信号周期由10个计数点组成,则可以控制PWM信号的占空比按10%步进变化,满足占空比步进要求。(3)对于100Hz的PWM信号,每个PWM周期取10个计数点时,则每个计数点之间的时间间隔为(10ms/10=)1ms。因此,需要应用定时器每隔1ms产生一次中断,10次中断对应一个PWM周期。(4)在一个PWM周期内,根据占空比的要求应用条件运算符(或条件语句)产生高、低电平,输出相应占空比的PWM信号。(5)控制LED以0.2s、0.5s和0.8s为间隔闪烁时,需要产生周期为0.4s、1s和1.6s的方波信号,用方波信号控制PWM是否输出驱动LED。根据上述分析,控制LED亮度和闪烁频率的具体设计思路是:(1)将T0设置为定时器,定时间隔为1ms,根据占空比要求应用条件运算符产生相应的PWM信号;(2)将T1设置为定时器,定时间隔为2ms,用于数码管刷新显示,同时根椐条件产生周期为0.4s、1s或1.6s的方波信号SQwav。(3)用方波SQwav控制PWM信号驱动LED闪烁。

根据上述设计思路,预定义PWM信号的占空比为50%、LED以0.5s为间隔闪烁,应用数码管显示状态、占空比和闪烁参数,应用按键S7和S6分别控制LED亮度和闪烁频率的应用程序代码参考如下。数码管显示格式定义如下表所示。//文件名CP11_PWMduty_twinkling.c#include<reg52.h>#include"user.c"#defineSQ0p2s100//快速闪烁参数定义#defineSQ0p5s250//中速闪烁参数定义#defineSQ0p8s400//慢速闪烁参数定义sbitS7=P3^0;//按键I/O定义sbitS6=P3^1;//数码显示数据缓冲区定义unsignedcharDTbuf[8]={3,16,5,0,16,2,5,0};//按键消抖采样字节变量定义unsignedcharS7buf=0xff,S6buf=0xff;//状态变量,取值范围为0~5unsignedcharstate=3;//占空比控制变量,预设为50%

unsignedcharDuty=3;

//方波输出控制变量,预设以0.5s为间隔闪烁unsignedintSQmode=SQ0p5s;bitPWM;//PWM输出bitSQwav;//方波输出//定时器T1和T0初始化voidTimer01Init(){//AUXR&=0x3F; //设置T1和T0时钟均为12T//设置T1和T0为定时器,模式0TMOD=0x00;

//T0用于1ms定时,装初值TH0=(65536-1000)/256;TL0=(65536-1000)%256;

//T1实现2ms定时,装初值TH1=(65536-2000)/256;TL1=(65536-2000)%256;ET0=1;ET1=1;//允许T0和T1中断EA=1;//开放总中断TR0=1;TR1=1;//启动T0和T1}//T0中断服务程序,用于产生PWMvoidTimer0isr()interrupt1{//PWM计数点变量

staticunsignedcharPWMcnt=0;PWMcnt++;//中断次数加1//PWMcnt为10时对应一个PWM周期if(PWMcnt=10)PWMcnt=0;//生成PWM信号PWM=(PWMcnt<Duty)?1:0;}

/*T1中断服务程序,用于刷新数码管、键值采样和产生方波信号*/voidTimer1isr()interrupt3{//数码管序号变量

staticunsignedcharDTno=0xff;

//中断次数统计变量

staticunsignedintSQcnt=0;DTno++;//数码管刷新过程DTno&=0x07;DT_drv(DTno,DTbuf[DTno]);//键值采样过程S7buf=(S7buf<<1)|S7;S6buf=(S6buf<<1)|S6;

SQcnt++;//中断次数加1if(SQcnt>=SQmode)//方波输出控制{SQcnt=0;SQwav=~SQwav;}}//按键处理子程序voidKeysProcess(){if(S7buf==0x00)

//如果S7按下{//LED亮度控制

switch(state)

{

case0:state=1;Duty=1;break;

case1:state=2;Duty=2;break;

case2:state=3;Duty=3;break;

case3:state=4;Duty=5;break;

case4:state=5;Duty=9;break;

case5:state=0;Duty=0;break;default:state=3;Duty=3;}DTbuf[0]=state;//更新显示DTbuf[2]=Duty;

//DTbuf[3]=0;while(S7buf!=0xff);//等待S7释放}if(S6buf==0x00)//如果S6按下{

switch(SQmode)

//LED闪烁频率调整{

caseSQ0p2s:SQmode=SQ0p5s;break;

caseSQ0p5s:SQmode=SQ0p8s;break;

caseSQ0p8s:SQmode=SQ0p2s;break;default:SQmode=SQ0p5s;}DTbuf[5]=SQmode/100;DTbuf[6]=(SQmode%100)/10;DTbuf[7]=SQmode%10;while(S6buf!=0xff);//等待S6释放}}//主程序voidmain(){BEEP_off();//关闭蜂鸣器RELAY_off();//断开继电器Timer01Init();//T0和T1初始化while(1){KeysProcess();//按键处理

//SQwav和PWM均为1时if(SQwav&PWM)LED_drv(0x00);//点亮LEDelse//否则LED_drv(0xff);//熄灭LED}}【工程实践2】PWM应用进阶-呼吸流水灯

【任务描述】在蓝桥杯开发板上,将键盘设置为独立按键模式,然后编写程序,应用PWM信号实现呼吸流水灯。具体任务如下:(1)系统上电后,关闭蜂鸣器和继电器,并点亮LED4和LED5,其余LED熄灭;(2)按下S4按键并松开后,8个LED灯从左向右呼吸点亮,即:LED1缓慢点亮→LED1缓慢熄灭→LED2缓慢点亮→LED2缓慢熄灭→。。。→LED8缓慢点亮→LED8缓慢熄灭→LED1缓慢点亮→。。。,其中缓慢点亮的时间设置为0.5s,缓慢熄灭的时间为0.5s;(3)再次按下S4按键并松开后,切换流水方向,即从当前LED开始从右向左呼吸流水;(4)在按键S4按下期间,LED暂停呼吸并保持现有的亮度,直到S4松开后从当前状态恢复呼吸流水;(5)按下按键S7时,暂停流水并保持当前LED亮度,同时用数码管显示当前LED的序号和亮度,如图所示。松开S7后数码码熄灭,恢复呼吸流水。分析:(1)要求每个LED灯,缓慢点亮0.5s,缓慢熄灭0.5s,因此一次呼吸过程为1s;(2)若将缓慢点亮过程和缓慢熄灭过程均定义为10级占空比,按10%步进,则每级占空比的PWM信号持续时间为0.5s/10=50ms;(3)若定义每级占空比包含10个PWM周期,则每个PWM的周期为50ms/10=5ms;(4)若定义每个PWM周期包含10个计数点,则每个计数点的间隔为5ms/10=0.5ms,因此需要设计定时器每0.5m产生一次中断,计数一次;(5)根据上述分析,一次呼吸过程需要2000个计数值:(1)0~999为缓慢点亮过程,每级占空比对应100个计数值,包含10个PWM周期,每个PWM周期对应10个计数点;(2)1000~1999为缓慢熄灭过程,每级占空比对应100个计数值,包含10个PWM周期,每个PWM周期对应10个计数点。//文件名CP11_LEDbreath_twinkling.c#include<reg52.h>#include"user.c"//按键引脚定义sbitS7=P3^0;//显示当前状态信息键sbitS4=P3^3;//呼吸灯流动方向控制键//全局变量定义unsignedcharS4no=0;//S4按键次数统计:0~2unsignedcharDuty=0;//占空比,初值为0unsignedcharLEDno=0;//当前LED灯号:0~7bitKEYpressed;//按键按下状态标志bitPWM;//PWM信号

//状态信息显示子程序

voidLEDinfo_display(void){DT_drv(0,LEDno+1);Delay1ms(5);//显示LED号DT_drv(6,Duty);Delay1ms(5);//显示占空比

DT_drv(7,0);Delay1ms(5);//显示0}//定义关闭所有数码管子程序

voidAllDT_off(void){P0=0xff;DTseg_en;ALL_off;P0=0xff;DTbit_en;ALL_off;}//T0初始化子程序voidTimer0Init(){//AUXR&=0x7F;//设置定时器T0为12T时钟//设置T0为16位定时器,自动重装初值方式TMOD&=0xf0;//位与后赋值//定时0.5ms,@12MHzTH0=(65536-500)/256; TL0=(65536-500)%256;ET0=1;//开T0中断EA=1;//开放总中断TR0=1;//启动T0}

//T0中断服务程序voidTimer0isr()interrupt1

{//中断次数统计变量:0~2000staticunsignedinttimes=0;

//若S4未按下过,则显示初始状态,关闭数码管返回if(S4no==0){LED_drv(~0x18);AllDTs_off();return;}

//如果按键处于按下状态,不处理直接返回if(KEYpressed)return;//PWM信号生成与LED驱动

times++;//中数次数计数

//如果一次呼吸过程结束if(times==2000){times=0;//重新开始计数

//根据S4按键的次数调整呼吸灯流动方向

if(S4no==1)LEDno++;elseLEDno--;//LED序号越界处理,截取变量LEDno后3位LEDno&=0x07;}//每计数100次重新定义占空比(0~9)if((times%100)==0)if(times<1000)Duty=(times/100);elseDuty=19-(times/100);

//每计数10次生成一个PWM周期PWM=((times%10)<Duty)?1:0;

//驱动LED显示if(PWM)LED_drv(~(0x01<<LEDno));elseLED_drv(0xff);}

//按键扫描子程序voidScanKeys()

{

//如果S4按下if(S4==0){Delay1ms(20);//延时消抖

if(S4==0)KEYpressed=1;//如果S4仍处于按下状态,设置KEYpressed有效while(S4==0);//等待S4释放

//S4已释放,设置KEYpressed无效

KEYpressed=0;S4no++;//S4按键次数加1//如果S4按键次数大于2,则转为1if(S4no>2)S4no=1;}

//如果S7按下if(S7==0){Delay1ms(20);//延时消抖if(S7==0)//如果S7仍处于按下状态{KEYpressed=1;//设置KEYpressed有效//S7按下期间,显示当前灯号及占空比while(S7==0)LEDinfo_display();}//S7已释放,设置KEYpressed无效KEYpressed=0;AllDT_off();//关闭所有数码管}}//主程序voidmain(){//关闭蜂鸣器和继电器BEEP_off();RELAY_off();

AllDTs_off();

//T0初值化

Timer0Init();//主循环,只检测按键

while(1)ScanKeys();}

PCA及其应用(2)18.3*PWM输出模式

将比较/捕获模式寄存器CCAPMn的比特位ECOMn和PWMn同时置1时,即可配置PCA模块n工作于PWM模式,然后再通过PWM寄存器PCA_PWMn将PCA模块配置为8位PWM、7位PWM或者6位PWM模式。

设置PWM寄存器中PCA_PWMn中的比特位[EBSn_1,EBSn_0]=[0,0]或者[1,1]时,则PCA模块n工作于8位PWM输出模式,此时PCA模块的内部结构如图11-7所示,通过将{0,CL[7:0]}与[EPCnL,CCAPnL[7:0]]进行比较产生PWM波。综合训练题11-1.设计模拟风扇控制系统,用按键控制风扇的运行模式和设置定时时间。具体的功能要求描述如下:1.运行模式风扇有“睡眠风”、“自然风”和“正常风”三种工作模式,对应的PWM占空比分别为20%、30%和70%。2.显示格式数码管以表题11-1所示的格式显示当前工作模式和剩余工作时间。3.按键功能描述(1)定义按键S4为工作模式切换键。每次按下S4后,依次按“睡眠风”、“自然风”和“正常风”的顺序切换工作模式;(2)定义按键S5为定时时间设置键。每次按下S5后,定时时间在1、2和3分钟之间倍依次切换,然后以倒计时方式显示剩余工作时间。剩余工作时间为0时,停止PWM输出。(3)定义按键S7为停止键。按下S7后,将剩余工作时间清0,同时停止PWM输出,直到应用按键S5重新设置定时时间。4.LED指示驱动L5~L8指示PWM的占空比。同时,

(1)仅在“睡眠风”模式时点亮L1;(2)仅在“自然风”模式时点亮L2;(3)在“正常风”模式时点亮L3。【蓝桥杯】《单片机设计与开发》教学课件【共4篇】1.基础篇;2.应用篇;3.器件篇;4.实战篇。No.12串行口通信No.12-1通信基础知识1.通信通信是指消息的传递或交换,分为模拟通信和数字通信两大类。(1)模拟通信是利用正弦波的幅度、频率或相位的变化(AM、FM或PM),或者利用脉冲的幅度、宽度或者脉冲的相对位置来传递信息(PAM、PWM和PPM),以达到通信的目的。另外,还有脉冲编码调制(PCM)。(2)数字通信是用数字信号对载波进行调制后来传递信息的通信方式,通常有的幅移键控ASK、频移键控FSK、相移键控PSK、差分幅移键控DPSK、正交幅度调制QAM和正交频分复用调制OFDM等多种类型。

通信协议是指通信双方完成信息的传递或交换应遵循的规则和约定,可以理解为计算机与计算机、或者计算机与设备之间进行通信所使用的共同语言。

通信协议主要由以下三个要素组成:

语法:是如何通信,包括数据格式和编码等;

语义:是通信内容,包括数据含义和控制信息等;

时序:是何时通信,包括通信的顺序和传输速率等。①

并行通信/串行通信;②

同步通信/异步通信;③

有线通信/无线通信;④近距离通信/远距离通信...

2.通信协议3.通信方式近距离无线通信(1)Bluebooth(2)WIFI(3)NFC(4)ZigBee(5)Lora近距离有线通信(1)RS-232(2)RS-422(3)RS-485板级通信(1)UART(2)I2C(3)SPI汽车级总线:CAN并行通信串行通信并行通信的特点:传送控制简单、速度快,但传输线较多,成本高。串行通信的特点:传送控制复杂、速度慢,传输线少,成本低。USB:UniversalSerialBus异步通信起始位(1位);数据位(8位);奇偶校验位(0/1位);停止位(1位)。

特点易于实现效率不高异步通信特征:收、发设备时钟独立,以数据帧为单位传输

远距离有线通信调制解调器调制解调

DTE:数据终端设备DCE:数据通信设备近距离有线通信RS-232C是DTE与DCE间的接口标准。DB-25连接器DB-9连接器

RS-232C采用负逻辑电平:-3~-25V为逻辑“1”,+3~+25V为逻辑“0”。新标准RS-485改善了传输特性,应用广泛。4.近距离有线通信接口标准

RS232接口定义插针序号信号名称功能信号方向1

PGND保护接地

2(3)TXD发送数据(串行输出)DTE→DCE

3(2)RXD接收数据(串行输入)DTE←DCE

4(7)RTS请求发送DTE→DCE

5(8)CTS允许发送DTE←DCE

6(6)DSRDCE就绪(数据建立就绪)DTE←DCE

7(5)

SGND信号接地

8(1)DCD载波检测DTE←DCE

20(4)DTRDTE就绪(数据终端准备就绪)DTE→DCE

22(9)RI振铃指示DTE←DCE奇偶校验传输速率码元:在串行数字通信中用时间间隔相同的符号来表示数字。

这样的时间间隔内的信号称为码元,这个间隔称为码元长度。比特率:表示数字信号的传输速率,以每秒传输二进制码位数表示。

比特率单位:bit/s波特率:每秒钟传送信息的位数,单位:波特(Baud)。常用波特率为:2400、4800、9600、14.4K、19.2K,...,115200传输距离与传输速率的关系传输距离随波特率的增加而减小。CRC

如果在数字通信中,如果每个码元用两个二进制数字表示,例如,用00、01、10和11分别表示0V、2V、4V和6V,即四相调制:每个码元有2个比特位。此时波特率等于比特率一半。

循环冗余校验(CyclicRedundancyCheck),是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。5.串行通信的两个相关概念

蓝桥杯4T开发板外围功能器件:(1)1线(1-wire)-DS18B20:数字温度传感器(2)2线(I2C)-AT24C02:E2PROM存储器

-PCF8591:A/D和D/A转换器(3)3线(2+)-DS1302:

实时时钟芯片(3)4线(SPI)-93C66,TLC5615,TLC549,LTC2308串行通信的传输方向

单工

半双工

全双工No.12-2计算机串行口1.串行口的结构

UART为通用异步收发器(UniversalAsynchronousReceiver/Transmitter),通常称为串口,其特点是通信线路简单,成本低,适用于对数字信号传输速率要求不高的应用场合。

计算机UART通常使用DB-9物理接口,应用两条信号线和地线就能够进行全双工通信。其中TxD为数据发送口,RxD为数据接收端。单向传输数字信号时,只需要一条信号线和地线。2.串行口通信协议

UART以帧(frame)为单位传输数据,由1比特起始位(START)、(5~)8比特的数据位(D0~D7)、0~1比特奇偶校验位(PARITY)和1~2比特停止位(STOP)构成。其中START恒为低电平,表示数据帧开始;STOP恒为高电平,表示数据帧结束。在帧前和帧后,传输线为高电平,为空闲状态。UART支持50、100、300、600、1200、2400、4800、9600、38400、19200和115200bits/s等多种传输速率,以适应不同的设备接口。在嵌入式系统设计中,UART常用于主机与设备之间,或者上位机与下位机之间的字符通信。

串行口应用异步通讯协议,只传输数据不传输时钟,所以收发时需要事先约定传输速率(波特率或者比特率)和数据格式,从而能够使接收数据能够与发送的数据相对应。3.单片机串行口AT89系列单片机UART的接收缓冲器和发送缓冲器逻辑同名、物理分开;收发双缓冲。(2)串行口控制寄存器SCON(★)(1)中断允许寄存器IE:ESSM0和SM1:工作方式控制位TI:UART发送完成中断标志位,需要手动清0RI:UART接收完成中断标志位,需要手动清0ES:串行口中断允许控制位:=1允许中断,=0禁止中断;REN:串行接收使能位:

=1允许接收,=0禁止接收;不建议学习!(3)电源控制寄存器PCON:SMODSMOD:波特率倍增位。当SMOD=1时,波特率提高一倍。复位时,SMOD=0。不建议学习!(4)串行口工作方式:0/1/2/3方式0:用作同步移位寄存器,

用于扩展并行口;

波特率=fosc/12。RXD:输入或输出引脚TXD:移位脉冲输出引脚发送和接收都是8位波特率固定为:fosc/12CR用于对74LS164清0S/L下降沿将并行数据装入,高电平启动数据移入。

不建议学习!

方式1:8位UART(10位帧数据)

起始位:1位数据位:8位停止位:1位

方式2/方式3:9位UART(11位帧数据)起始位:1位数据位:9位停止位:1位串口发送时序(写SBUF启动发送过程)串口接收时序(置REN=1启动接收过程)(5)串行口发送/接收时序【方式0/2】固定波特率:

方式2波特率=(2SMOD/64)*fosc【方式1/3】可变波特率:波特率=(2SMOD/32)*

定时器T1溢出率

定时器T1溢出率=fosc/{12×[256-(TH1)]}fosc=11.0592MHz时:方式0波特率=921600;方式2波特率=345600/172800.方式0波特率=fosc/12

波特率要选择标称值。由于TH1的初值是整数,为了获得标称值,依公式晶振频率要选11.0592MHz。

方式1和方式3波特率与TH1初值的对应关系:波特率/(b/s)19.2k9600480024001200TH1初值FDHFDHFAHF4HE8HSMOD10000(6)串口波特率STEP1:设置定时器T1(工作方式2),作为波特率发生器。STEP2:选择UART波特率,装载TH1和TL1STEP3:启动定时器T1(设置TR1=1)STEP4:确定串行口工作方式(SCON),

并使AUXR=0x00(default);STEP5:允许串口中断(设置ES=1)STEP6:打开总中断(设置EA=1)(7)串行口初始化(8)串行口的基本应用//文件名CP12_UARTdemo.c#include<STC15F2K60S2.h>#include"user.c"//串口初始化子程序

voidUartS1Init(void)//9600bps@11.0592MHz{PCON&=0x7F; //波特率不倍速SCON=0x50; //8位数据,可变波特率AUXR&=0xBF; //设置定时器1时钟为Fosc/12,即12TAUXR&=0xFE; //选择定时器1为波特率发生器TMOD&=0x0F; //清除定时器1模式位TMOD|=0x20; //设定定时器1为8位自动重装方式TL1=0xFD; //设定定时初值【任务描述】应用UART实现单片机与STC-ISP串口助手的数据收发。

设置UART为10位帧数据模式,波特率为9600bps。数据发送采用查询方式,数据接收采用中断方式。单片机每接收到一个字节数据后,返回该字节数据和字符串“received”给串口助手进行验证。TH1=0xFD;//设定定时器重装值ET1=0;//禁止定时器1中断TR1=1;//启动定时器1ES=1;//允放串口中断

EA=1;//开放总中断}//发送一个字节数据voidSend_byte(unsignedcharTxData){SBUF=TxData;//将发送数据送入SBUF时,自动启动发送过程while(TI==0);//等待发送结束(发送结束TI由硬件自动置1)TI=0;//发送结束,将TI清零,允许发送下一个字节数据。}//发送字符串子程序voidSend_string(unsignedchar*str){while(*str!='\0')//'\0'为字符串结束标志{Send_byte(*str);//发送1个字符str++;//指向下一个要发送的字符}}//串口接收中断服务程序

voidUART_RecvByte(void)interrupt4{unsignedcharRxData;

//将接收中断标志位清零,允许串口继续接收数据RI=0;RxData=SBUF;//读取接收到的数据

LED_drv(~RxData);//用于分析数据编码Send_byte(RxData);//发回接收到的数据进行验证Send_string("received\r\n");//发送反馈信息“received”}voidmain(void){BEEP_off();//关闭蜂鸣器RELAY_off();//断开继电器LED_drv(0xff);//熄灭LEDUartS1Init();//串口S1初始化while(1);//空循环,等待接收中断}提示:如果应用方式0(16位自动重装)作为波特发生器,与应用方式2(8位自动重装)作为波特发生器的方式相比,能够得到相对准确的波特率,从而增强串口通信的可靠性。【工程实践】LED亮度和闪烁频率控制(2)

新建工程,编写代码,产生频率为100Hz的PWM控制LED的亮度。具体要求如下:(1)单片机上电后,先关闭蜂鸣器和继电器,并预设PWM信号的占空比为30%;(2)通过STC-ISP串口助手发送数字“7”时,PWM信号的占空比按“0→10%→20%→30%→50%→90%”循环变化,以控制LED的亮度;(3)通过STC-ISP串口助手发送数字“6”时,LED的闪烁频率以0.2s、0.5s和0.8s为间隔依次切换;(3)通过发送字符“?”查询状态和闪烁间隔。分析

串行口S1默认使用定时器T1为波特率发生器,与11.2节原应用程序中定时器T1用于数码管刷新和产生方波信号相冲突。解决方案:

(1)11.2节:T0用产生PWM,T1用于数码管刷新和产生方波信号;

修改:定时器T1替换为定时器T2,。。。。

(2)改用定时器T2作为串行口S1的波特率发生器。设计

改用定时器T2作为串行口S1的波特率发生器,通过串口助手发送数字“7”和“6”替代按键S7和S6控制LED亮度和闪烁频率,并通过发送字符“?”查询当前状态和闪烁间隔的应用程序代码参考如下。//文件名CP12_PWMduty_twinkling.c#include<STC15F2K60S2.h>#include"user.c"#defineSQ0p2s100//快速闪烁参数定义#defineSQ0p5s250//中速闪烁参数定义#defineSQ0p8s400//慢速闪烁参数定义//数码显示数据缓冲区定义。显示格式:状态1B-占空比2B-闪烁参数3BunsignedcharDTbuf[8]={3,16,3,0,16,2,5,0};//全局变量定义unsignedcharDuty=3;//占空比控制变量,预设占空比30%unsignedintSQmode=SQ0p5s;//方波输出控制变量,预设以0.5s闪烁unsignedcharstate=3;//状态变量,预设为3bitPWM;//PWM输出bitSQwav;//方波输出信号//定时器T1和T0初始化voidTimer01Init(){//设置T1和T0时钟均为12T//AUXR&=0x3F; //设置T1和T0均为定时器,模式0:16位定时,自动重装初值

TMOD=0x00;

//T0用于1ms定时,装初值TH0=(65536-1000)/256;TL0=(65536-1000)%256;//T1实现2ms定时,装初值TH1=(65536-2000)/256;TL1=(65536-2000)%256;ET0=1;ET1=1;//允许T0和T1中断TR0=1;TR1=1;//启动T0和T1//EA=1;//开放总中断}//串口初始化子程序

voidUartS1Init(void) //9600bps@12.000MHz{SCON=0x50; //8位UART,允许接收

AUXR|=0x01; //设置定时器T2作为波特率发器AUXR&=0xFB; //设置定时器T2时钟为12TT2L=0xE6; //设置T2计数初值T2H=0xFF; //设置T2计数初值IE2&=0xFB;//设置IE2比特位ET2=0,禁止T2中断AUXR|=0x10;//设置AUXR比特位T2R=1,启动T2ES=1;//允许串口中断

EA=1;//开放总中断}//T0中断服务程序,用于产生PWM信号voidTimer0isr()interrupt1{staticunsignedcharPWMcnt=0;//PWM计数点变量PWMcnt++;//中断次数加1//PWMcnt为10时对应一个PWM周期if(PWMcnt>=10)PWMcnt=0;//生成PWM信号PWM=(PWMcnt<Duty)?1:0;}//T1中断服务程序,用于刷新数码管、键值采样和产生方波信号voidTimer1isr()interrupt3{staticunsignedcharDTno=0xff;//数码管序号变量staticunsignedintSQcnt=0;//中断次数统计变量DTno++;//数码管刷新过程DTno&=0x07;DT_drv(DTno,DTbuf[DTno]);SQcnt++;//中断次数加1if(SQcnt>=SQmode)//方波输出控制{SQcnt=0;SQwav=~SQwav;}}//串口发送字节数据子程序voidSend_byte(unsignedcharTxData){SBUF=TxData;//将数据送到SBUF,自动启动发送过程while(TI==0);//等待发送结束(结束时TI由硬件自动置1)TI=0;//将TI清零,允许发送下一字节数据。}//串口发送字符串子程序voidSend_string(unsignedchar*str){while(*str!='\0')//'\0'为字符串结束标志{Send_byte(*str);//发送1个字符str++;//指向下一个发送字符}}//串口接收中断服务程序

voidUART_RecvData(void)interrupt4{

unsignedcharRxData;RI=0;//将接收中断标志位清零(让串口可以继续接收数据)

RxData=SBUF;//读取接收到的数据

if(RxData==0x37)//接收的命令为7时(注:7的ASCII为0x37){switch(state)//根据状态码调整LED亮度{case0:state=1;Duty=1;break;case1:state=2;Duty=2;break;case2:state=3;Duty=3;break;case3:state=4;Duty=5;break;case4:

温馨提示

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

评论

0/150

提交评论