共阳16 进制:0xB0
本开发板使用共阴数码管
1.2.5开发板数码管模块原理图
1.3 源码编写
开始写程序之前认识一下锁存器(74HC573):顾名思义,就是把输入端的数据锁存(或送)到输出端,请看下图中的U3 元件,第11 角(锁存端)为高电平的时候,右边D0-D7 的输入与左边Q0-Q7 的输出是直通的,就是说,输入端是什么电平,输出端就是什么电平,可以把它当作不存在。当第11 角为低电平的时候,左右两端就被断开了,无论输入端怎么变化,输出端都不会变化,当第11 角由低电平变为高电平的一瞬间,输入端的数据立刻被传送到输出端,并且在11 角保持为高电平期间,输出端数据始终与输入端数据相同,如果此时我们再次把第11 角设置为低电平,那么以后当输入端无论再怎么变化,输出端都不会变化而是保持刚才第11 角在下降沿(由高电平到低电平跳变)之间时输入端的值,这样就达到了锁存数据的目的,这也就是所谓的总线设计思路,一个8 位的数据线加一个锁存器后就可以扩接多个元件,当选通哪个元件的片选信号,就送数据给那个元件。先说这个元件,以后用到别的元件我们再解释。
74HC573 11 脚接高电平,锁存不起作用,相当于直通。相应的段赋值“1”有效。74HC138 A、B、C 赋值0~7,则输出端分别是Y0~Y7 置“0”,如P2=0, 则Y0=0;P2=6;则Y6=0;即选通第七个数码管。 程序如下
/*-----------------------------------------------
内容:数码管使用动态扫描显示,所以可以同时看到数码管同时显示数字或者 字符,扫描原理可以参 #include
#define uint unsigned int #define uchar unsigned char sbit dula=P2^6;
sbit wela=P2^7; void delay(uint z) {
uint x,y;
for(x=z;x>0;x--) for(y=110;y>0;y--); }
void main(void) //每一个C 语言程序有且只有一个主函数, {
while(1) //循环条件永远为真,以下程序一直执行下去。 {
dula=1;
P0=0x5b; //显示一个2 dula=0; wela=1;
P0=0xfe; //显示一位数码管?可以自己修改显示位数 wela=0; delay(1); } }
多个数码管同时显示
上一节单个数码管显示,实际使用中单个数码管往往不能满足要求,这就需要多个数码管组合使用,单个数码管一般用静态显示,占用IO 口线较多,如果使用普通的静态显示,单片机的IO 口是不够用的。所以就需要使用动态扫描。
通过程序让任意一位数码管显示任意一种字符,这样我们可以以时间为轴,循环显示每个数码管需要的数值,当循环显示的时间比较小时,眼睛就不能分辨出闪烁,而是看到一个静态的数值显示,可以通过下载“数码管动态扫描”和“数码管动态扫描演示”,就可以深入了解这个原理,以后使用的数码管显示的部分都是基于这个原理的。 1.4总结
数码管是最常用的显示输出模块,可以显示温度,时间,步进电机转速等,数码管里面简单一点说是集成了8 个发光管,由点变成线,由7 条线1 个点组成1 个数码管,发光管我们会写程序控制它了,这个数码管一定难不到我们,原理方法是一样的,这次不是单片机IO 口直接驱动的,是加了573 还有138 共同来控制数码管的点亮,主要是为了节省单片机IO 口,一口多用,一个8 位IO 口实现多功能控制。
1.5.1 学习目标
独立按键是区别于矩阵键盘的一种按键方式,主要是按键直接连接到IO 口,另外一端连接VCC 或者GND,一般情况连接到GND(地),也就是按键按下的时候,IO 口的电平被强制拉低,即0,而通过IO 输入检测该端口电平就可以判断按键是否按下。 1.5.2 硬件电路
1.6 原理图
1.6.1 触点存在抖动现象说明
由于按键本身都存在不同的机械抖动,单片机属于高速检测器件,可以很容易检测出抖动,但抖动并不是我们需要的,容易造成误操作,所以正常使用过程中需要添加去抖动程序,主要用于跳过抖动,避免造成干扰。 1.6.2 开发板独立按键模块原理图
1.7 源码编写
独立按键软件操作简单,主要检测按键连接的IO 口是否为“0”,为“0”表 示按键按下。 用以下语句: Sbit KEY1 = P3^0;
If(!KEY1){//添加按键按下时需要执行的操作}
实际使用中按键有固定的机械抖动,根据不同按键抖动时间不同,一般4-15mS,根据这个特点,需要延时躲避抖动,由于按下和释放都会存着抖动,实际使用程序需要进行2 次去抖。具体程序如下: #include
sbit BY1=P3^4; //定义按键的输入端S2键
unsigned char count; //按键计数,每按一下,count加1 unsigned char temp;
unsigned char a,b;
void delay10ms(void) //延时程序 {
unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); }
key() //按键判断程序 {
if(BY1==0) //判断是否按下键盘 {
delay10ms(); //延时,软件去干扰 if(BY1==0) //确认按键按下 {
count++; //按键计数加1
if(count==8) //计8次重新计数 {
count=0; //将count清零 } }
while(BY1==0);//按键锁定,每按一次count只加1. } }
move() //广告灯向左移动移动函数 {
a=temp<
main() {
count=0; //初始华参数设置 temp=0xfe; P1=0xff; P1=temp;
while(1) //永远循环,扫描判断按键是否按下 {
key(); //调用按键识别函数 move(); //调用广告灯移动函数 } }
//如果有干扰请加去抖程序
//红外接收头部分用黑色物质遮光,防止干扰按键,因为红外接收和按键使用同 一个端口
1.3 报警模块 一、蜂鸣器介绍
蜂鸣器有两种:一种是有源蜂鸣器,只要给它加上恒定的电压,就能发声,另一 种是无源蜂鸣器,必须给它加上一定频率的方波或正弦波才能发声,一般实验板 配的是无源蜂鸣器,HJ-1G 开发板也不例外,由于驱动蜂鸣器电流要求比较大, 所以我们使用8550 三极管来放大驱动,电路如下:FM IO 口为P2.3
图2 蜂鸣器外形图
注意:喇叭和蜂鸣器不同,如果蜂鸣器直接加5V 电源则发出固定频率的 声音。掉电后会消失。喇叭不同,加5V 电压后是不发声的, 但是器件处 于最大功耗状态,会有非常大的热功耗。长时间会烧毁喇叭。所以使 用的时候要注意,如果不是专门针对它操作,请断开它的输入信号端 子,防止误操作导致意外损坏。 二、蜂鸣器编程实例
具体编程时我们间隔一段时间将BZ 线置反,就能输出一个固定频率的方波,让 蜂鸣器响起来。
大家可能会问,给蜂鸣器多少频率的方波呢?首先这个频率必须在音频范围内, 也就是20Hz 到20KHZ 之间,但是20Hz 到20KHZ 的频率送给蜂鸣器后,只有某一
点的频率是最响的,这个频率称为蜂鸣器的谐振频率,离它越远,蜂鸣器发出的 声音越轻。
1G/3G 开发板配的蜂鸣器的谐振频率是2KHZ,其半周期是250us,这样我们就确 定了BZ 口线每延时250us 就要变反。 下面是一个蜂鸣器发声的实例程序:
/*以下程序为FM 程序,晶振频率为11.0592MHz*/ #include
sbit SPK=P2^3;//定义蜂鸣器端口 void delay(unsigned int cnt)//延时 {
while(--cnt); }
main() {