赞
踩
单片机( Single-Chip Microcomputer )是一种 集成电路芯片 , 把具有数据处理能力的 中央处理器 CPU 、随机存储器 RAM 、 只读存储器 ROM 、 多种I/O 口和中断系统、定时器 / 计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多 路转换器、 A/D 转换器 等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。
基于单片机设计一些外接电路,模块以满足学习,日常调研等工作需求
IO口也叫输入输出口,这里与单片机引脚还是有区别的,引脚不仅有IO口,还有串口,定时器等等。单片机外面的引脚可以使我们方便的使用它内部的资源。
(1)sfr指令:直接用来描述硬件的地址,可以理解成一组IO口的地址,在文件reg52.h中
(2)sbit指令:
sbit是keil c51中的关键字。
sbit 要在最外面定义,就是说必须定义成外部变量
sbit定义的是SFR(特殊功能寄存器)的bit,bit和sbit都是C51扩展的变量类型
bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。
第一种方法:sbit 位变量名=地址值
第二种方法:sbit 位变量名=SFR名称^变量位地址值
第三种方法:sbit 位变量名=SFR地址值^变量位地址值
如定义PSW中的OV可以用以下三种方法:
sbit OV=0xd2 (1)说明:0xd2是OV的位地址值
sbit OV=PSW^2 (2)说明:其中PSW必须先用sfr定义好
sbit OV=0xD0^2 (3)说明:0xD0就是PSW的地址值
电动车报警器功能,当开启报警模式时,喇叭长响一声,有震动发生,报警器鸣叫
关闭报警模式,喇叭短响一声,就算有震动,报警器也不鸣叫
需要用到STC89C52、振动传感器、继电器、433M无线发送接收模块、 高功率喇叭
(1)振动传感模块
项目中用到了三个引脚VCC、GND、D0(数字信号量输出),使用也很简单,接上电源后,当有振动发生时,D0口输出一个低电平,我们只需要检测这个D0口就可以执行对应的行为。
sbit Vibrate = P1^1 //将D0口设置为P1的第一个引脚 int main(void) { while(1){ if( Vibrate == 0 ){ //执行想要处理的函数 } } return 0; }
(2)继电器模块
继电器其实相当于一个开关,共有五个引脚:VCC,GND,IN,NO, COM ,NC
如上图所示,右边是继电器的原理图,当继电器线圈两端无电压或者电压不够时,继电器的COM端会和常闭端接通,当给IN引脚输入一个低电平时,COM端会和NO端接通,此时在外面再接一个电路,就会形成一个闭合回路,例如上面左图中,芯片控制IN口的输入来控制继电器COM端和NO端的连接与否进而可以控制小灯泡的亮灭,我们可以替换为喇叭,初步实现报警器。
(3)433M无线发射接收模块
433模块有VCC、GND还有D0、D1、D2、D3这几个引脚,当按键按下A B C D四个按键中的一个是,D0、D1、D2、D3会输出高电平(具体哪个按键对应哪个引脚要自己试试)
上面用到的几个模块已经封装的很好了,我们只需要将它们组装起来完成我们所需要的功能就可以了。
(4)代码
配置继电器IN引脚为P1.1,433M无线收发模块D0引脚为P1.1 ,D1为P1.2,震动检测的输入口配置成P1.3
#define alarm_ON 1 #define alarm_OFF 0 sbit switcher = P1^0; sbit D0_ON = P1^1; sbit D1_ON = P1^2; sbit vibrate = P1^3;
主函数
- void main()
- {
-
- int mark = alarm_OFF;
- switcher = 1;
- while(1){
-
- // 1.如果a按键按下,设定为开启警报模式
- if( D0_ON == 1){
- switcher = 0;
- //长响进入警报模式标记
- Delay2000ms();
- switcher = 1;
- //设定警报模式标记
- mark = alarm_ON;
-
- }
-
- //关闭警报模式
- if( D1_ON == 1){
- switcher = 0;
- //短响
- Delay500ms();
- switcher = 1;
- //设定解除警报模式标记
- mark = alarm_OFF;
- }
-
- if( mark = alarm_ON ){
- //如果发生了震动
- if(vibrate == 0){
- //喇叭响
- switcher = 0;
- }
- else{
- switcher = 1;
- }
-
- }
-
- }
-
- }
这里需要注意下,我们设置了一个标记mark,当mark等于1的时候,表示进入了报警模式,此时发生震动,我们的喇叭会响 。
刚开始在写时,我把判断是否震动写在了是否开启报警里面,逻辑上是没有错误的,但是这个在使用时就出问题了。
我写的错误代码它只有当按键按下并且电动车震动时喇叭才会响,但是我们需要的是只要进入警报模式,当有振动时它就会响,这两者是不一样的,这个时候很关键的一步就是设置标识mark,当进入到警报模式中时,我们的mark标志置1,然后再到外面去判断是否是在警报状态,是的话当发生震动时我们的喇叭开始响。关闭警报模式,mark置0。
还有值得注意的一点就是我们使用了延时函数,为了方便我们可以使用STC-ISP自动生成:
注意选择8051指令集时要看适用于哪种类型的单片机,有时侯代码中会出现_nop_(),编译时会报错,可以删去(有点影响但不大),或者加入头文件 #include <intrins.h> 即可。
把各个模块连接好就可以了,编译烧录代码后,通过遥控控制,这样我们的第一个小项目——电动车报警器就做好啦。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。