实例15 倒车警示器(课件) 《单片机基础与应用》(C语言版) 同步教学

资源下载
  1. 二一教育资源

实例15 倒车警示器(课件) 《单片机基础与应用》(C语言版) 同步教学

资源简介

(共14张PPT)
实例15 倒车警示器
《单片机基础与应用(C语言版)》
高等教育出版社
PART 01
一、任务导入
任务要求
要求用一个开关做为“倒车”挡控制开关,2个黄色的LED做为汽车尾部倒车警示灯,控制电路中再接入一个蜂鸣器。当“倒车”开关闭合时,汽车发出倒车警示信号——通过蜂鸣器发出警示音,并且2个LED不停地闪烁发出黄色警示灯光。
PART 02
二、任务分析
使用单片机做为控制器实现倒车警示器设计。将“倒车”挡控制开关SW接入P0.0引脚,2个黄色LED1、LED2分别接入P1.1、P1.2引脚,一个蜂鸣器 BEEP接入P1.0引脚。倒车时,开关SW闭合(ON),LED1和LED2闪烁,BEEP发声。
PART 03
三、硬件电路
倒车警示器单片机控制电路
PART 04
四、控制程序
倒车警示灯主函数流程图
beep_alarm()函数流程图
程序演示
//程序:ex17.c
//功能:倒车警示器控制程序
#include //包含头文件REGX51.H,定义了51单片机的所有SFR
#define ON 0 //定义符号常量ON
#define OFF 1 //定义符号常量OFF
sbit BEEP=P1^0; //定义位变量BEEP,蜂鸣器BEEP接P1.0引脚
sbit LED1=P1^1; //定义位变量LED1,警示灯LED1接P1.1引脚
sbit LED2=P1^2; //定义位变量LED2,警示灯LED2接P1.2引脚
sbit SW=P0^0; //定义位变量SW,倒车开关SW接P0.0引脚
//函数名:delay
//函数功能:实现软件延时
//形式参数:无符号整型变量i,控制空循环的循环次数
//返回值:无
void delay(unsigned int i)
{
while(i--); //i次空操作
}
程序演示
//函数名:light_alarm
//函数功能:实现倒车光警示
//形式参数:无
//返回值:无
void light_alarm()
{
LED1=~LED1; //LED1闪动
LED2=~LED2; //LED2闪动
}
//函数名:beep_alarm
//函数功能:实现蜂鸣器发“嘀嘀……”声警示
//形式参数:无
//返回值:无
void beep_alarm()
{
unsigned int i;
for(i=0;i<100;i++)
{
BEEP=~BEEP; //BEEP发声
delay(100);
}
for(i=0;i<100;i++)
{
BEEP=OFF; //BEEP不发声
delay(100);
}
}
程序演示
void main() //主函数
{
while(1) //无限循环
{
if(SW==ON) //判断倒车开关SW是不是闭合
{
light_alarm(); //倒车状态,倒车灯闪烁
beep_alarm(); //倒车状态,倒车蜂鸣器发声
}
else
{
LED1=OFF; //非倒车状态,倒车灯LED1熄灭
LED2=OFF; //非倒车状态,倒车灯LED2熄灭
BEEP=OFF; //非倒车状态,蜂鸣器BEEP关闭
}
}
}
感谢您的观看
Thanks for your attention. (共14张PPT)
实例16 LED循环闪烁控制
《单片机基础与应用(C语言版)》
高等教育出版社
一、任务导入
任务要求
用单片机控制8个LED循环闪烁,第1个LED点亮0.5s熄灭1s,闪动10次;然后,第2个LED点亮0.5s熄灭1s,闪动10次;循环8次,第8个LED闪动10次结束,再从第1个开始,如此循环下去。假定晶振频率为12MHz。
二、任务分析
这里采用定时器/计数器来完成0.5 s和1s精确定时,是用硬件加1计数器直接对机器周期进行计数。
三、硬件电路
单片机控制8个LED电路
四、控制程序
程序演示
//程序:ex18.c
//功能:8个LED循环闪烁控制程序
#include //包含头文件REGX51.H,定义了51单片机的所有SFR
#include //包含头文件INTRINS.h,定义了移位函数
//函数名:time50ms
//函数功能:在T1工作方式1下定时50ms,采用查询方式实现
//形式参数:无符号整型变量i,控制定时时间,i*50ms
//返回值:无
void time50ms(unsigned char i)
{
unsigned char k;
for(k=0;kTH1=(65536-50000)/256; //重新设置T1计数初值高8位,定时时间50ms
TL1=(65536-50000)%256; //重新设置T1计数初值低8位
TR1=1; //启动T1
while(!TF1); //查询计数是否溢出,即定时50ms时间到,TF1=1
TF1=0; //50ms定时时间到,将T1溢出标志位TF1清0
}
}
程序演示
void main() //主函数
{
unsigned char i,k,w;
TMOD=0x10; //设置T1为工作方式1,定时功能
P1=0xff; //熄灭8个LED
while(1) //无限循环
{
w=0xfe; //用来控制显示的位
for(i=0;i<8;i++){ //控制8个LED循环
for(k=0;k<10;k++){ //控制每个LED闪烁10次
P1&=w; //点亮指定的LED
time50ms(10); //定时0.5s
P1=0xff; //熄灭8个LED
time50ms(20); } //定时1s
w=_crol_(w,1); } //闪烁的LED循环左移1位
}
}
定时时间计算
系统采用12MHz晶振,所以机器周期为1 s。程序中,T1工作在定时功能、工作方式1(16位计数器)下,从初值开始,加1计数到计数溢出,共计50000个计数脉冲,即50000个机器周期,所以,定时时间计算如下。
t定时=50000×1 s=50ms
定时器/计数器编程步骤
这里计数溢出处理采用的是查询方式,CPU循环等待 TF1标志位由0变1,语句如下。
while(!TF1); //查询计数是否溢出,即定时50ms时间到,TF1=1
思考题。
①如果采用T0的工作方式1进行定时,应该怎么修改程序。
②如果采用T1的工作方式0或工作方式2进行定时,应该怎么修改程序。
感谢您的观看(共22张PPT)
实例17简易计数报警
《单片机基础与应用(C语言版)》
高等教育出版社
01
一、任务导入
任务要求
模拟银行取款吞卡报警系统,用1个按键模拟密码输入错误,按一下表示密码输入错误一次;用一个LED来模拟吞卡报警。系统要求:当输入密码错误5次,则吞卡报警指示灯点亮3s。假定晶振频率为12MHz。
02
二、任务分析
本例中的计数和定时都可以采用定时器/计数器来实现。模拟密码输入错误的按键,接在外部计数脉冲的输入端;定时3s 采用定时功能实现。
03
三、硬件电路
简易计数报警系统电路(按键K连接在定时器/计数器T1的外部脉冲输入端,用来模拟密码输入错误动作,LED D1用来模拟吞卡动作。)
04
四、控制程序
程序演示
//程序:ex19.c
//功能:简易计数报警系统控制程序
#include //包含头文件REGX51.H,定义了51单片机的所有SFR
sbit LED=P1^0; //定义P1.0引脚的位名称为LED
//函数名:time50ms
//函数功能:在T0工作方式1下定时50ms,采用查询方式实现
//形式参数:无符号整型变量i,控制定时时间,i*50ms
//返回值:无
void time50ms(unsigned char i)
{
unsigned char k;
for(k=0;kTH0=(65536-50000)/256; //重新设置T0计数初值高8位,定时时间50ms
TL0=(65536-50000)%256; //重新设置T0计数初值低8位
TR0=1; //启动T0
while(!TF0); //查询计数是否溢出,即定时50ms时间到,TF0=1
TF0=0; //50ms定时时间到,将T0溢出标志位TF0清0
}
}
程序演示
void main() //主函数
{
LED=1; //熄灭LED
TMOD=0x61; //设置T0为工作方式1,定时;T1为工作方式2,计数
TL1=256-5; //设置T1的计数初值,计数个数为5(5次错误)
TH1=256-5; //初值缓冲器赋值,具有初值自动重载功能
TR1=1; //启动T1,K每按下一次,则加1计数
while(1) //无限循环
{
while(!TF1); //查询T1计数是否溢出,即TF1=1
TF1=0;
LED=0; //5次计数,计数溢出,则点亮LED
time50ms(60); //定时3s
LED=1; //熄灭LED
}
}
思考题:系统加上蜂鸣器,怎么修改程序,使得吞卡报警灯亮时,蜂鸣器发出“嘟嘟”声。
实例18 正脉冲宽度测量
《单片机基础与应用(C语言版)》
高等教育出版社
01
一、任务导入
任务要求
利用定时器/计数器的门控位GATE测量正脉冲宽度。假定晶振频率12MHz,正脉冲宽度不超过256 s,将测量结果以二进制数形式(00~FF)显示在8个LED上。
02
二、任务分析
03
三、硬件电路
04
四、控制程序
程序演示
//程序:ex20.c
//功能:正脉冲宽度测量程序
#include //包含头文件REGX51.H,定义了51单片机的所有SFR
sbit INPUT=P3^2; //定义P3.2引脚的位名称为INPUT
void main() //主函数
{
TMOD=0x0a; //设置T0:GATE=1,定时功能,工作方式2
TL0=0; //设置T0的计数初值为0
TH0=0; //初值缓冲器赋值,具有初值自动重载功能
while(INPUT==1); //等待输入脉冲变0
TR0=1; //将运行控制位置1,尚未启动计数
while(INPUT==0); //等待输入脉冲变1,真正启动计数
while(INPUT==1); //等待输入脉冲变0,计数器停止计数
TR0=0; //将运行控制位清0
P1=TL0; //将计数结果显示在P1控制的8个LED上
while(1); //停机
}
05
思考题:怎么利用GATE门控位设计一个简易频率计,用于测量占空比为50%的方波频率。
Thanks for your attention.
感谢您的观看(共13张PPT)
实例19 定时器输出PWM可调光台灯
《单片机基础与应用(C语言版)》
高等教育出版社
01
一、任务导入
任务要求
用1个LED模拟台灯的灯泡(用8个LED模拟效果更好),用1个开关控制灯的亮度;灯泡有较亮和较暗2个亮度,开关闭合时灯泡较亮,开关断开时灯泡较暗。
02
二、任务分析
PWM技术,是一种周期一定而高低电平可调的方波信号。当输出脉冲的频率一定时,输出脉冲的占空比越大,其高电平持续的时间越长。
高电平持续的时间与信号周期的比值,称为占空比。
只要改变

的值,也就改变波形的占空比,则高低电平持续的时间就
改变了,达到PWM脉宽调制的目的。
03
三、硬件电路
定时器输出PWM可调光台灯电路(也可以用8个LED模拟台灯灯泡)
04
四、程序设计
采用定时器/计数器T0的定时功能亮灭时间的定时。控制灯泡较亮状态和较暗状态的波形
控制灯泡较亮状态和较暗状态的波形
(a)占空比为1/4的PWM波形(灯泡较亮)
(b)占空比为3/4的PWM波形(灯泡较暗)
程序演示
//程序:ex21.c
//功能:定时器输出PWM可调光台灯控制程序
#include //包含头文件REGX51.H,定义了51单片机的所有SFR
sbit LED=P1^0; //定义P1.0引脚的位名称为LED
sbit S1=P0^0; //定义P0.0引脚的位名称为S1
//函数名:time5ms
//函数功能:在T0工作方式0下定时5ms,采用查询方式实现
//形式参数:无符号整型变量i,控制定时时间,i*5ms
//返回值:无
void time5ms(unsigned char i)
{
unsigned char k;
for(k=0;k{
TH0=(8192-5000)/32; //重新设置T0计数初值高8位,定时时间5ms
TL0=(8192-5000)%32; //重新设置T0计数初值低8位
TR0=1; //启动T0
while(!TF0); //查询计数是否溢出,即定时5ms时间到,TF0=1
TF0=0; //5ms定时时间到,将T0溢出标志位TF0清0
}
}
程序演示
void main() //主函数
{
TMOD=0x00; //设置T0,定时,方式0
while(1) //无限循环
{
while(S1==0) //开关闭合,占空比为1/4,较亮(低电平亮灯)
{
LED=0; //点亮LED
time5ms(3); //定时15ms
LED=1; //熄灭LED
time5ms(1); //定时5ms
}
LED=0; //开关断开,占空比为3/4,较暗
time5ms(1); //定时5ms
LED=1; //熄灭LED
time5ms(3); //定时15ms
}
}
思考题:改变定时时间,从而改变PWM输出波形,使得灯泡亮度发生变化。
Thanks for your attention.
感谢您的观看(共16张PPT)
实例20 中断实现LED闪烁控制
《单片机基础与应用(C语言版)》
高等教育出版社
一、任务导入

任务要求
二、任务分析

8位LED流水灯、LED闪烁和交替亮灭时间可以采用定时器/计数器实现精确定时。2个按键实现外部中断源的中断申请,中断过程和中断编程是本例的关键。
三、硬件电路

中断实现LED闪烁控制电路(P1口控制8个LED,按键K1和K2分别连接2个外部中断输入端)
四、程序设计

程序演示
//程序:ex22.c
//功能:中断实现LED闪烁控制程序
#include //包含头文件REGX51.H,定义了51单片机的所有SFR
#include
sbit K1=P3^2; //定义P3.2引脚的位名称为K1
sbit K2=P3^3; //定义P3.3引脚的位名称为K2
//函数名: delayms
//函数功能:延时处理程序,单位毫秒
//形式参数:无符号整型数,延时的毫秒数
//返回值:无
void delayms (unsigned int ms)
{
unsigned int i;
while(ms--)
{
for(i=0;i<120;i++); //12MHz晶体
}
}
程序演示
//函数名:time50ms
//函数功能:在T0工作方式1下定时50ms,采用查询方式实现
//形式参数:无符号整型变量i,控制定时时间,i*50ms
//返回值:无
void time50ms(unsigned char i)
{
unsigned char k;
for(k=0;k{
TH0=(65536-50000)/256; //重新设置T0计数初值高8位,定时时间50ms
TL0=(65536-50000)%256; //重新设置T0计数初值低8位
TR0=1; //启动T0
while(!TF0); //查询计数是否溢出,即定时5ms时间到,TF0=1
TF0=0; //50ms定时时间到,将T0溢出标志位TF0清0
}
}
程序演示
void main() //主函数
{
TMOD=0x01; //设置T0,定时,方式1
EX0=1; //外部中断0允许位
IT0=1; //设置外部中断0为下降沿触发方式
PX0=1; //设置外部中断0为高优先级
EX1=1; //外部中断1允许位
IT1=0; //设置外部中断1为低电平触发方式
EA=1; //允许所有中断
P1=0xfe; //设置左移流水灯初值
while(1) //无限循环
{
time50ms(20); //延时1s
P1=_crol_(P1,1); //P1左移1位控制流水灯效果
}
}
程序演示
void main() //主函数
{
TMOD=0x01; //设置T0,定时,方式1
EX0=1; //外部中断0允许位
IT0=1; //设置外部中断0为下降沿触发方式
PX0=1; //设置外部中断0为高优先级
EX1=1; //外部中断1允许位
IT1=0; //设置外部中断1为低电平触发方式
EA=1; //允许所有中断
P1=0xfe; //设置左移流水灯初值
while(1) //无限循环
{
time50ms(20); //延时1s
P1=_crol_(P1,1); //P1左移1位控制流水灯效果
}
}
程序演示
程序演示
思考题:
(1)如果删除main()函数中的语句PX0=1;,请问K1还可以中断K2实现中断嵌套吗?
(2)函数 int_0()和int_1()是什么时候调用的,与函数time50ms()的调用有什么不同。
提示:低优先级不可以中断高优先级实现中断嵌套;同一级别的2个中断源,也不可以实现中断嵌套。
感谢您的观看
Thanks for your attention.

展开更多......

收起↑

资源列表