PIC单片机C语言程序设计(12)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PIC单片机C语言程序设计(12)
丁锦滔
【摘要】@@ (接上期)rn6.Pic单片机C语言程序SlM软件仿真技巧(2)rn鉴于C 语言模拟仿真(SlM)在学习C语言程序时十分有用,这里笔者再进一步讨论模拟仿真的更多功能.
【期刊名称】《电子制作》
【年(卷),期】2010(000)009
【总页数】4页(P59-62)
【作者】丁锦滔
【作者单位】
【正文语种】中文
(接上期)
6.Pic单片机C语言程序SIM软件仿真技巧(2)
鉴于C语言模拟仿真(SIM)在学习C语言程序时十分有用,这里笔者再进一步讨论模拟仿真的更多功能。

⑴ 模拟仿真C程序运行的全过程,如果想要仿真查看《PIC单片机C语言设计程序(8)》Pic07.C中的程序的全部运行过程(0~99的增量),是十分困难的,其原因是,主函数void main( )要调用显示函数display(x),而该显示函数为了完成X++的0~99任意一个增量(△为1秒)的显示,则要通过循环语句while
(d>0)进行d--的100次循环(因d=100),模拟仿真这种循环太费时。

且在
该循环语句while(d>0)中,又要调用延时函数delay(200),使仿真更复杂。

尽管这种仿真可以在MPLAB IDE中完全正常运行,但是操作者等待时间太长。

解决上述问题的最佳方法,是改写程序pic07.C中的一些参数,以快速完成程序模拟仿真的全过程。

改写程序仍在MPLAB IDE(较高版本)集成环境下进行,改写的原则是不能减少C程序的代码数(量),仅改写其中少数参数值(值大的),即不
改变程序的整体工作模式。

比如,将pic07.C显示函数中说明语句unsigned int
d=100,的d值改为3,d值决定0~99每个增量的时间,d=100,增量时间约
1秒,同一循环操作时间大大减少,以便我们进入程序的其他运作。

又如,将
pic07.C循环语句while(d>0)中的延时(调用)delay(200);改为delay(4),将
无限循环语句while(1)中调用显示函数display(x);中的if(x==99)改为if(x==4)。

这样整个程序的逻辑功能操作,便可较快地通过模拟调试全部完成。

经上述改写后的程序重新命名为pic07a.C,其清单
如下:
改写后的pic07a.C的功能,是0~03的增量循环计数,其增量耗时很短(不再是1秒)。

将pic07a.C按照《PIC单片机C语言设计程序(8)》和《PIC单片机C语言设
计程序(9)》中所述,在MPLAB IDE中存盘,再进行编译,编译成功生成目标码.hex后,便能对其进行模拟仿真操作了。

(1)根据《PIC单片机C语言设计程序(10)》所述,建立模拟仿真调试环境,pic07a.C源程序编译成功,在MPLAB IDE窗口中,点击Debugger(调试命令)→Selec TooL……的方法,把pic07a.C设置成仿真调试状态,再快速点击模拟调
试快捷图标中的Animate(动画运行)和Hate(停止),则在pic07a.C主函数main()以下的TRISA=0X10;的左边,会出现一黄色箭头,如图53所示。

该箭头是C程序运行的起始位,即程序运行总是从主函数开始的。

图53
(2)程序运行全过程,点击图53中模拟调试快捷图标的step lnto(单步运行),你会观察到,鼠标每点击一次step lnto命令,图53中的黄色箭头会沿着C程序代码运行一次,我们只需用鼠标一次一次地点击step lnto命令,黄色箭头就沿着主函数以下的C代码一步一步地运行。

当点击step lnto,使黄色箭头到达while(1)语句时,程序的运行就进入到while(1)语句的无限循环区域,这时,程序仅在while(1)区域运行,不再返回主函数(除非复位)。

下面看看,程序在while(1)中是如何运行的。

继续用鼠标一步一步点击step lnto,一旦黄色箭头到达调用显示函数display(x);,黄色箭头就会跳转到显示函数void display(unsigned int x)的说明语句中运行。

注意:按上述单步运行,当黄色箭头到达unit_bit=x%10;(送个位数显示)时,因它和下一条代码ten_bit=x/10%10(送十位数显示)的操作耗时太长,用step lnto命令难以进行,应改用模拟调试快捷图标中的命令step over(单步越过),即点击两次step over,黄色箭头就运行到while(d>0)语句。

然后又用step lnto (单步运行),即一步一步点击step lnto,黄色箭头就沿着while(d>0)中的C
代码运行。

当运行到调用延时delay(4);时再点击step lnto,黄色箭头转到延时函数Void delay(unsigned long int k)中进行延时功能操作。

因delay(4);的形参数为4,所以标点击step lnto命令应4次,才能跳出延时操作功能,此后黄色箭头又回到RA3=1;代码,依序用鼠标一步一步点击step lnto运行,黄色箭头又
运行到调用延时delay(4)时,又转到前述延时函数进行延时功能操作,也是点击step lnto命令,又是 4次,才能跳出延时函数。

按上述规律,当黄色光标箭头运
行到自减量d--;时,d值从3减1得2,while(d>0)语句中d仍大于0,黄色光标箭头再次回到whila(d>0)中的代码中,点击step lnto命令重复上述程序运行过程,直到d--;从3减到0,黄色箭头跳出while(d>0)语句,回到while(1)语句中的x++;使x值从0增量到1。

再用鼠标点击step lnto,黄色光标箭头到达
if(x==4)语句,判断x是否等于4,若不为4(此时x等于1),黄色光标箭头随鼠标点击step lnto又回到调用显示函数display(x);中运行。

按上述方法重复操作,当x++;自增量等于4时,由if(x==4)条件语句引导给x赋值0,即x=0;pic07a.C程序中的x++的0-4增量计数全部完成。

上述C程序运行全过程,读者应反复熟练操作。

⑵ 模拟仿真找出pic07.C程序的错误pic07.C的功能,是0~99增量计数(△为1秒)。

初看程序while(1)中的x++;条件是if(x==99)时给x赋值0(x=0;),即能完成0~99的计数功能。

可事实上,如果将pic07.C进行编译生成目标码.hex,再用PIC编程器将该目标码烧写到PIC16F84A芯片中,用《PIC单片机C语言设计程序(4)》中的电路图3 的实验板通电观察两位数码管显示时,循环计数显示的是0~98而不是0~99(约1秒)计数。

实验说明,pic07.C程序没有达到设计要求,程序中有错误。

下面我们一起来通过模拟仿真找到该错误点并进行修正。

具体操作过程如下:
在MPLAB IDE中,按照《PIC单片机C语言设计程序(11)》中介绍的方法,点击debugger,在下拉菜单中将stop watch(跑表)调到图53的窗口中(时钟频率为4HZ),再点击MPLAB IDE中的View,在下拉菜单中点击Locals(局部变量),将Locals界面也调到图53窗口中,用鼠标调整各界面后的显示界面如图54所示。

图54中的Locals界面上显示有Address(地址)、Symbol Name (符号名或参数名)和Valua(取值)。

在进行下面的模拟调试时注意观察,会看到Locals界面各参数随调试运行显示。

按照前述方法,对图54中的程序(pic07a.C)进行全过程运行。

用鼠标一步一步点击模拟调试快捷图标中的step lnto,一旦程序旁边的黄色箭头运行到显示函数Void display(unsigned int x)以下代码时,图54中的Locals(局部变量)就会
出现pic07a.C参数相关的显示值,见图55。

图54
图55
symbol Name(符号名)为ten_bit(显示十位数),unit_bit(显示个位数、
d(unsignen int d)、SEG7(7段码)和 X(自增量)的Address(地址)分别为0010、0012、0014、0016和000E。

这些Value(值)由程序运行决定。

Locals(局部变量)界面显示的,实际上是pic07a.C程序主要参数,可帮助用户
了解程序的重要功能参数随程序运行(黄色光标指示)的变化,而这些功能参数正是增量计数时所需的数据。

只要按照上述方法,对该程序进行全功能运行,直到
X++;自增量为4,即满足了if(x=4)的条件,此时X=0;(给X赋值0),再用鼠标点击step lnto,Locals的界面演变成图56。

从图54可清楚看出:只要
X++;(自增量)满足if语句的条件,就会给X赋值0,这里X++;一旦为4,
就给X赋值0,所以程序再运行时,回到调用显示函数display(x),其中X已为0,再运行,其个位unit_bit显示即为0,而不会是X++;的4值,如图56中的
unit_pit(个位)只能为3。

程序再运行,显示又从0开始直到0~03为止。

由此可见,对于pic07a.C,当X++;自增量为4时,会立刻因it(x==4)的条件而导致X=0,所以程序运行显示时,只会从unit_bit;的3回到0,而不可能使个位显示X++;自增的4值。

按上述逻辑过程,对Pic07.C,当其中的X++;自增为99时,同样会由if(x==99)的条件满足而使X=0;程序运行时,只能是显示98后即清零,不可能显示99。

如果想满足0~99的增量显示,必须将条件语句if(x==99)改为
if(X==100)
⑶ 模拟仿真优化C程序代码利用模拟仿真,可对C程序中的代码进行优化(即去掉多余的代码),以简化程序而不改变其功能。

当然,优化后的程序还应通过最后的实验验证。

例如pic07.C的延时函数Void delay(unsighed long int k)可优化为Void delay(unsighed int k)而不需要long的条件,因为int k的定义范围已满足了程序中delay(200);即K=200的要求。

受版面限制,笔者不再介绍此程序的优化过程。

总之,利用MPLAB IDE 7.40开发环境进行程序的SIM模拟仿真,对初学C语言是十分有用的,大家必须熟练掌握其操作方法。

图56。

相关文档
最新文档