【嵌入式】基于STC89C52RC的51单片机学习(一)

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

第一节 基本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口就可以执行对应的行为。

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> 即可。

(5)组装 

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
v90无线接收模块的51单片机编程需要以下几个步骤: 1. 硬件连接:将v90无线接收模块的信号引脚连接到51单片机IO口。 2. 初始化串口:使用51单片机的串口通信功能,初始化串口并设置波特率等参数。这样可以通过串口接收来自v90无线接收模块的数据。 3. 中断处理:由于v90无线接收模块是异步发送数据,因此需要使用中断处理来接收数据。可以使用串口接收中断或外部中断来实现。 4. 解析数据:接收到数据后,需要对其进行解析。v90无线接收模块发送的数据一般包括数据长度、数据内容和校验位等信息。需要对这些信息进行解析和校验,确保数据的完整和正确性。 5. 数据处理:根据接收到的数据内容,进行相应的数据处理。例如,可以将接收到的数据显示在LCD屏幕上,或者控制相应的设备进行操作。 下面是一个简单的代码示例: ```c // 初始化串口 void init_uart() { // 设置波特率 TMOD |= 0x20; TH1 = 0xFD; TL1 = 0xFD; // 启用串口中断 ES = 1; // 启用全局中断 EA = 1; // 启用串口 TR1 = 1; } // 中断处理函数 void uart_isr() interrupt 4 { // 判断是否接收到数据 if (RI) { // 读取数据 data = SBUF; // 处理数据 handle_data(data); // 清除接收标志 RI = 0; } } // 处理数据 void handle_data(unsigned char data) { // 解析数据 // ... // 处理数据 // ... } // 主函数 void main() { // 初始化串口 init_uart(); while (1) { // 主程序 // ... } } ``` 在实际应用中,还需要根据具体的需求进行相应的修改和调试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值