STC15学习笔记之1

工作内容和STC15笔记

这段期间是一枚正式的嵌入式软件菜鸡,主要负责部分产品的软件。涉及到的单片机型号有STC15(课本上学的居然刚毕业就用上了),STM系列。工作的过程中学习到了很多知识,主要是对单片机的一些在企业上的用法,相比较之前的瞎玩单片机来说,的确算是有一些关于使用规范的入门,所以特此记录。

1.矩阵键盘扫描和单片机休眠模式的控制

STC15主要是用在做遥控器上,也是第一次见到平时使用的遥控器内部是怎么控制的。

下面是关于遥控器进入低功耗模式,以便延长电池使用时间的说明。遥控器的多按键是用之前学过的矩阵扫描进行控制的,节约io口资源,不过我之前的确没想到这个。
在这里插入图片描述
值得注意的是,矩阵按键的行排或者列排一定有一个是需要接单片机低功耗唤醒功能的。

在这里插入图片描述

可以看到在这里是列扫描引脚是接在了P3.2 P3.3 P3.6 P3.7这些引脚上。下面是关于STC15手册的截图:
在这里插入图片描述
在这里插入图片描述
这里控制PCON寄存器

PCON = 0x02;

使pd位置一,便可开启单片机的掉电模式,从掉电模式唤醒单片机的话,因为此时单片机只有外部中断在工作,所以就需要通过外部管脚触发外部中断来唤醒,我们设置了矩阵键盘的列扫描引脚为外部中断的触发引脚,所以不管按哪个键都会触发外部中断,从而使单片机从休眠状态唤醒。唤醒之后,需要记得将外部中断的标志位清零。

power_down=1;      //外部中断的标志位

void INT0_routine(void) interrupt 0      //外部中断
{
if(power_down)
	{
	  power_down=0;
	}
}	

2.三极管控制LED的一些注意事项

公司的遥控器上一般都会配一个指示灯,控制指示灯的引脚使用准双向口默认配置的话是不能正常控制三极管使其发亮的。需要改成推挽输出,控制方式和控制原理其实很容易想到,但是当时没想到,所以还是在此记下来。

P2M1 = 0x00;
P2M0 = 0x20;

在这里插入图片描述
根据截图可以看出,我设置的程序是让P2.5引脚修改成推挽输出。在写程序之前,注意需要写好对应寄存器的地址映射。然后就是关于单片机控制三极管的,三极管来控制led。这是三极管很基础的应用,但是大学期间都是直接使用单片机驱动小型的led,今后设计板子原理图时要注意这部分了。用三极管控制较大功率的led。
在这里插入图片描述
公司用的三极管是NPN型,单片机控制引脚输入高电平来控制led的发亮。相对的,PNP型三极管则是用低电平来控制led的发亮。关于限流电阻的选型也是有公式来控制的,这部分没去深入了解,之后有时间详细研究一下限流电阻和三极管的选型。

3.遥控器背光灯的一些常用控制方式

使用的遥控器一般都具有背光灯,在按下某个功能后会亮,然后渐灭。长按或者组合键背光灯会闪烁,不松手的情况下会一直闪烁。这部分的原理和代码其实很简单,但是让我自己去想的话又很难想到该怎么写。所以在此记录一下,今后有需要的话感觉可以参照一下。
在这里插入图片描述
首先这部分的LED也是由三极管进行控制的,所以需要设置成推挽输出驱动三极管,准双向口的电流过小,无法正常驱动三极管。
然后是渐灭部分的写法。

void Delay_BG(void)
{
  uint j,k,l;
  		for(j=200;j>0;j--)
  		{
			l=j/2;
			k=100-l;
			LED=1;
			Delay200ns(l);
			LED=0;
			Delay200ns(k);
  		}
}

在之前的程序中,假设发送出键值,手一直在按键,此时的电平一直输出为高,灯常亮,松手后,立刻码值清0,然后进入此函数,本质是控制pwm波形的长度来控制亮度。写法和原理很简单,但是让我不看这个自己去摸索着写,还真不见得短时间内写出来。(lll¬ω¬)还是太菜。。。。
下面是关于组合键闪烁的写法,松手之后闪烁消失。

if((velue==161)) 
 	{
		keyflag++;
		if(keyflag==4)
		 {
		  	key1=0;
			key2=1;
			key3=1;
			key4=1;
			while(!(S_key1))
				{
					LED=0;
					Delay10ms(300);
					LED=1;
					Delay10ms(300);
				}
		 	keyflag=0;
			key1=0;
			key2=0;
			key3=0;
			key4=0;
			Delay10ms(5);
		    velue=0;
		 }
	}

假设说组合键的键值为161,当接收到此码值之后进入此函数。key1 2 3 4为行扫描的io定义,S_key1为列扫描的io定义,那就是在按下key1和S_key1这两个引脚控制的按键之后,会卡在while循环内。然后一直执行此处的背光灯闪烁,松手后跳出此while循环,然后清除标志位和键值。就可以达到上述的效果。

总结

这部分的控制和原理都比较简单,但是对我这种新手而言还是需要注意的,希望能帮助跟我一样刚上路的新手司机们。
关于STC15的学习笔记第一期先记到这里,还有一些值得注意的用法,但是马上就要下班了,所以就先不摸鱼了,剩下的学习笔记留到下次摸鱼的时候写。

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值