软件渠道
硬件渠道:单片机
编译环境:keil
二、苦逼的CPU
【事端原因】:单片机是单核的,所以在做多线程问题的时分,咱们要考虑的太多。可是大部分人都会让单片机一向作业,比方while死循环,然后就诉苦单片机太简略了,只能点灯,其它的作业就不可了。
【现场剖析】:1.单片机是单核的;
2.做多线程,办法两种:a.上操作体系,b.仿操作体系;
3.自己想开释单片机的CPU,可是格式有限,就怪单片机;
4.要想马儿跑,有必要给马儿吃草。要想单片机多作业,有必要优化代码,多下功夫。
【事例罗列】:单灯闪耀
void main(void)
{
LED_Init(); //LED初始化
while(1)
{
LED = ON; //LED亮
Delay_Ms(1000); //延时1s
LED = OFF; //LED灭
Delay_Ms(1000); //延时1s
}
}
【事例剖析】:单灯闪耀剖析
声明几点:1.假如你只用单片机作为单灯闪耀,那么单片机就完全能够;
2.假如你不想玩那么高档,那么单机这样也是OK的;
3.假如你想玩高档的,那么必定不可。
剖析:咋一看,程序没有什么问题,可是暗藏玄机。
1.程序被死循环卡死;
2.死循环里边便是一个发生2s周期的频率,那么灯便是2s闪耀一次;
3.单片机就这样被你“降服”了。可是你这是把单片机浪费了。
这是单片机CPU的苦啊,他是没有口啊,有口要谩骂的哦!O(∩_∩)O哈哈~
三、单片机CPU的苦衷——请开释CPU
1.硬件电路剖析
用上面的电路来做剖析,当P1口为低电平的时分,LED灯才亮,高电平则灭。
1.软件剖析
由硬件能够知道,咱们能够经过宏界说来对接口进行简略的界说
#define LED_Light P1 //LED灯端口
#define LED_ON() LED_Light = 0x00 //LED灯亮
#define LED_OFF() LED_Light = 0xFF //LED灯灭
现在端口也界说好了,下面单片机要泣诉了。
3.你误解了单片机
单片机其实能够干许多活,成果你误解了。
为了让单片机不白忙活咱们能够经过两种方法来完成LED灯闪耀:a.定时器中止,b.计时+标志位。
A.定时器中止
定时器中止咱们都知道,这儿就不说了,便是发生xms的中止就能够了。
B.计时+标志位
计时+标志位太有用了,这一下帮单片机洗清沉冤了。咱们只需发生一个对200ms的时刻,然后对该时刻进行计数到了5次,然后就清0该计数值,一起回转LED灯的状况即可。
代码部分:
unsigned int LedTimeCount = 0 ; //LED计数器
unsigned char LedStatus = 0 ; //LED状况标志, 0表明亮,1表明平息
/***************************************
* 函数描绘:LED灯线程处理函数
* 输入参数:No
* 返 回 值:No
* 说 明:经过标志位来完成LED的回转
* 修正记载:
****************************************/
void LEDThread_Process(void)
{
if(0 == LedStatus) //假如LED的状况为0,则点亮LED
{
LED_ON() ; //点亮LED灯
}
else //不然平息LED
{
LED_OFF() ;
}
}
/***************************************
* 函数描绘:计时和标志位函数
* 输入参数:No
* 返 回 值:No
* 说 明:状况标志位改动
* 修正记载:
****************************************/
void LEDStatus_Change(void)
{
if(Sys_200MS) //体系200ms时标到
{
Sys_200MS = 0 ;
LedTimeCount ++ ; //LED计数器加1
if(LedTimeCount >= 5) //计数到达5,即1s到了,改动LED的状况。
{
LedTimeCount = 0 ;
LedStatus = ! LedStatus;
}
}
}
/***************************************
* 函数描绘:主函数
* 输入参数:No
* 返 回 值:No
* 说 明:
* 修正记载:
****************************************/
void main(void)
{
while(1)
{
LEDThread_Process() ;
LEDStatus_Change() ;
}
}
经过上面的程序就能够开释单片机的CPU。由于LED灯亮灭是有标志位(LedStatus)来决议,而标志位由计数器(LedTimeCount)来决议,两个函数都没有劫持单片机的CPU,所以单片机的CPU是自在的。总算洗冤了。O(∩_∩)O哈哈~
到此结束!!! 谢谢阅览,欢迎拍砖!!!!