当前位置:   article > 正文

【嵌入式】基于STC89C52RC的51单片机学习(一)_stc89c52rc单片机io接口和vccio接口区别

stc89c52rc单片机io接口和vccio接口区别
自己对于单片机学习中不理解地方的梳理,还有犯过错误的一些总结,想系统学习的友友可以参考,但是内容不全。

第一节 基本IO控制

 1.1什么是单片机

单片机 Single-Chip Microcomputer )是一种 集成电路芯片 , 把具有数据处理能力的 中央处理器 CPU 、随机存储器 RAM 只读存储器 ROM 、 多种I/O 口和中断系统、定时器 / 计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多 路转换器、 A/D 转换器 等电路)
集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。

1.2什么是单片机开发板  

基于单片机设计一些外接电路,模块以满足学习,日常调研等工作需求

1.3 基本IO口控制  

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的地址值

1.4做一个电动车报警器 

电动车报警器功能,当开启报警模式时,喇叭长响一声,有震动发生,报警器鸣叫

                                关闭报警模式,喇叭短响一声,就算有震动,报警器也不鸣叫

需要用到STC89C52、振动传感器、继电器、433M无线发送接收模块、 高功率喇叭

(1)振动传感模块

项目中用到了三个引脚VCC、GND、D0(数字信号量输出),使用也很简单,接上电源后,当有振动发生时,D0口输出一个低电平,我们只需要检测这个D0口就可以执行对应的行为。

  1. sbit Vibrate = P1^1 //将D0口设置为P1的第一个引脚
  2. int main(void)
  3. {
  4. while(1){
  5. if( Vibrate == 0 ){
  6. //执行想要处理的函数
  7. }
  8. }
  9. return 0;
  10. }
(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

  1. #define alarm_ON 1
  2. #define alarm_OFF 0
  3. sbit switcher = P1^0;
  4. sbit D0_ON = P1^1;
  5. sbit D1_ON = P1^2;
  6. sbit vibrate = P1^3;

主函数

  1. void main()
  2. {
  3. int mark = alarm_OFF;
  4. switcher = 1;
  5. while(1){
  6. // 1.如果a按键按下,设定为开启警报模式
  7. if( D0_ON == 1){
  8. switcher = 0;
  9. //长响进入警报模式标记
  10. Delay2000ms();
  11. switcher = 1;
  12. //设定警报模式标记
  13. mark = alarm_ON;
  14. }
  15. //关闭警报模式
  16. if( D1_ON == 1){
  17. switcher = 0;
  18. //短响
  19. Delay500ms();
  20. switcher = 1;
  21. //设定解除警报模式标记
  22. mark = alarm_OFF;
  23. }
  24. if( mark = alarm_ON ){
  25. //如果发生了震动
  26. if(vibrate == 0){
  27. //喇叭响
  28. switcher = 0;
  29. }
  30. else{
  31. switcher = 1;
  32. }
  33. }
  34. }
  35. }

      这里需要注意下,我们设置了一个标记mark,当mark等于1的时候,表示进入了报警模式,此时发生震动,我们的喇叭会响 。

      刚开始在写时,我把判断是否震动写在了是否开启报警里面,逻辑上是没有错误的,但是这个在使用时就出问题了。

我写的错误代码它只有当按键按下并且电动车震动时喇叭才会响,但是我们需要的是只要进入警报模式,当有振动时它就会响,这两者是不一样的,这个时候很关键的一步就是设置标识mark,当进入到警报模式中时,我们的mark标志置1,然后再到外面去判断是否是在警报状态,是的话当发生震动时我们的喇叭开始响。关闭警报模式,mark置0。

还有值得注意的一点就是我们使用了延时函数,为了方便我们可以使用STC-ISP自动生成:

注意选择8051指令集时要看适用于哪种类型的单片机,有时侯代码中会出现_nop_(),编译时会报错,可以删去(有点影响但不大),或者加入头文件 #include <intrins.h> 即可。

(5)组装 

 把各个模块连接好就可以了,编译烧录代码后,通过遥控控制,这样我们的第一个小项目——电动车报警器就做好啦。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/531301
推荐阅读
相关标签
  

闽ICP备14008679号