单片机程序该如何写
如有的同学的主程序是类似这样的结构
void main(void)
{
P0 = 0xff ;
sleep(1000) ;
P0 = 0x00 ;
sleep(1000) ;
}
仿真的时候可能会看到灯是闪烁的。但事实上这样的程序是不对的。也有同学发现了这个问题,我看到他都把汇编代码贴出来了。
分析下上面的程序的流程 P0口输出高电平---->延时一会儿----->P0口输出低电平----->延时一会儿。 这样接在P0口上的LED就会亮暗的闪烁。如果要一直这样循环闪烁下去呢?看到这里大家发现问题了没有?
问题就在这里了,我们想让它循环闪烁,但是回过头来看看我们的主程序,有循环的地方吗?
之所以这样的程序仿真的时候还是正确的,那是因为编译器在生成汇编代码的时候已经自动加上了跳转语句,主程序执行完了之后就重新跳转到初始化处重新执行。
所以上面这段程序的流程是这个样子的:
初始化(内部RAM,堆栈初始化,由编译器自动生成相应代码) --------> 跳转到用户的主程序-------->主程序执行完毕---->再次跳转到初始化处,重新执行。
上面这个流程是我们不想要的。因为初始化是只需要在开机的时候(系统上电)时候初始化一次的时候。想想看如果你的手机每次开机完成之后如果没有按键按下去或者收到短信电话什么的,就会重新初始化一次,是什么后果:) 估计你肯定会扔了那手机,骂道这是谁写的程序呀。
我们希望初始化完成之后,程序就会跳入到主程序(main函数)中去,并且始终循环执行里面的代码(哪怕没有任务,只在那里空跳转循环) 因为只有那里面的代码(中断函数同样属于)才是属于我们用户编写的有用代码,是希望按照我们的意图去执行的。所以我们希望的正确流程是如下的:
初始化(内部RAM,堆栈初始化,由编译器自动生成相应代码) --------> 跳转到用户的主程序-------->主程序执行完毕---->
继续执行主循环里面的用户代码。
理解了上面的那个流程,我们正确的函数应该是如下的。
void main(void)
{
while(1) //循环条件,永远为真,下面复合语句里面的内容会一直循环执行
{
P0 = 0xff ;
sleep(1000) ;
P0 = 0x00 ;
sleep(1000) ;
}
}
当然循环语句的写法不止这一种,我在第十三课 C51循环语句里有详细的介绍 :http://www.51hei.com/mcuteach/136.html
小结一下:基于单片机的程序是一个死循环。所有的代码和函数调用都应该在这个循环里面,(中断函数例外,在进入循环之前可以调用其它的一些初始化的函数或者是其它只需要在系统上电调用一次的函数或者代码)。
基本框架如下
void main(void)
{
// 初始化函数,根据实际系统情况编写
while(1) //死循环 也可以用for(;;;)形式或其它形式
{
//任务函数1
//任务函数2
..........
}
}
先写到这里。
- 跟我来编一个最简单的单片机程序(12-03)
- PIC16C5X单片机程序存储器(12-02)
- 单片机程序运行加密(12-01)
- 单片机程序巧用printf(12-01)
- 单片机程序汇编和C语言-LED灯的循环移动(12-01)
- 时间片轮调的单片机程序结构(12-01)