目前本人已经不再写代码了,只是想把自己走过的弯路,踩过的坑分享出来,希望更多的小伙伴能看到,少走弯路,仅供参考哈!
回想起来核桃已经很多年没有敲代码了,这么多年一直从事硬件工程师这个岗位,相比于软件的ABCD,我更倾向于原理图的设计与PCB,喜欢折腾,喜欢松香的味道。
但是,刚毕业那会,要想得到更多的机会,只能硬着头皮学硬件和软件,大概有一年左右的时间吧,都是一个人兼顾软件和硬件,自己画板,自己调代码!
说实话,只有自己写代码调试自己的板子,才能更加清楚的认识到自己的板卡还有哪些可以优化地方,对于以后从事硬件工程师的岗位益处良多!
我们先来看一段51单片机的点灯程序,如下:
void main(void)
{
while(1)
{
LED=0;
delayms(100);
LED=1;
delayms(100);
}
}
程序是非常简单的,相信很多小伙伴刚开始学的时候都是这样写的,程序一样是可以正常运行的,那这段程序有什么问题呢?
可以看的出来,整个大循环里面除了LED=0和LED=1外,剩下的就是 delayms(100);这个延时函数,是一直让CPU处于等待的状态,啥事都干不了,一直空耗着CPU的资源。
思考问题:如果只是为了点亮一颗LED,这样写是没问题的,但是实际的项目中不可能用一个CPU啥事都不干,就为了点灯,我相信没有哪个老板肯让你这么浪费,所以我们首要做的就是:
把CPU释放出来,哪怕让它一遍一遍的扫描有什么任务可以执行,也不要让它一直在空等待!
那该如何实现?
具体思路:
从上面的程序可以知道,延时的时间是delayms(100),也就是100ms,那我们可以为系统加入一个1ms的基准时间,然后再对这个基准时间进行计数100次,达到100次后,清理该计数值,再对LED的状态进行转换即可!
大概程序如下:
#include
sbit LED=P1^0; //定义LED管脚
bit 1mscriterion=0;//1ms时间基准
unsigned int 1mscount=0;//1ms基准时间计数变量
unsigned char LEDsign=0;//LED状态变量,0为点亮,1为熄灭
void Time0int(void)
{
TMOD &= 0xf0 ;
TMOD |= 0x01 ; //定时器 0 工作方式 1
TH0 = 0xfc ; //定时器初始值
TL0 = 0x66 ;
TR0 = 1 ;
ET0 = 1 ;
}
void LEDcontrol()
{
if(LEDsign==0)
{
LED=0;//LED点亮
}
else
{
LED=1;//LED熄灭
}
}
void LEDStateful Switch(void)
{
if(1mscriterion) //1ms基准时间到
{
1mscriterion=0;先清零
1mscount++;//LED计数器加1
if(1mscount>=100) //计数达到100,证明100ms已经到了
{
1mscount=0;//一定要先清零
LEDsign=!LEDsign;//LED状态取反
}
}
}
void main(void)
{
Time0int();
EA=1;
while(1)
{
LEDcontrol();
LEDStateful Switch();
}
}
void Time01ms(void)interrupt 1
{
TH0=0xfc; //重新赋值
TL0=0x66;
1mscriterion=1; //1ms基准时间到
}
由于核桃很长时间没有写代码了,有不对的地方望小伙伴们能指出来!
还有核桃不是专业写代码的,以上仅供参考哈!
好了,这章就先写到这吧!我们下一章接着唠!