| PIC单片机C语言程序—实例5 |
| 类别:单片机/DSP |
| 前面已介绍了学习PIC单片机C语言程序的一些最基本内容,并以具有一定功能的C语言程序,说明其基本单位是函数,即一个C程序是由一个或多个函数组成的,中只有一个主函数main()。主数main()在程序中的位置可任意放置,但程序运行时一定是从主函数开始,再由主函数调用其他函数,其他函数也是互相调用的,如图5所不。 读者可以从程序实例的注释中,体会C语言程序的算法(即语法规则)与汇编语言指令的相似点和不同点。笔者介绍的PIC单片C语言程序,使用的时钟频率(指实验板上的晶振)都为4bIHz o 8、有参数函数 在《PIC单片机C语言程序—实例1》中(见《电子报》今年第27期第巧版)已介绍:从函数的形式观察,C语言函数可分为两种:无参数函数和有参数函数。这里再补充一点,无参数函数是指函数定义中没有形式参数,当然也没有形式参数的说明。在调用无参数函数时,主调函数没有数据传送给被调函数,其功能仅用来执行指定的一组操作,正如C程序实例中,主调的延时dalay( )'A数一样。无参数函数通常不返回函数值〔少数可以返回)。 有参数函数的定义如下:
函数类型说明符函数名(形式参数)[形式参数说明变最说明]语句 其中,函数类型说明符、形式参数、形式参数说明和变量说明等都是可选项,所以在使用时应按设计功能自主选择。如果不需选用形式参数和形式参数说明,则该函数自然简化成无参数函数。 从以上的定义看出:在调用有参数函数时,在主调函数与被调函数间,存在着参数的传递,即主调函数要将给定的实际参数传给被调函数的形式参数,供给被调函数使用(这一点将在程序实例5中得以说明),被调函数执行后的结果,也可以带回供主函数使用。 请注意:用户为实现特定功能而编写子函数时,需按两个原则。 1.子函数与主调函数之间的界面应清晰,编写子函数的功能应鲜明,函数之间的数据传递越少越好。 2.编写的子函数大小适中。若规模太大,即功能太复杂,常导致结构庞杂,影响阅读、分析和调试。一般情况下,即使要求的功能很多,函数的规模也应控制在几十行内,若不能达到要求,宁可增加新的子函数。 九、PIC单片机C语言程序实例5 这里用PIC16F84A(其他型号的PIC单片机同样等效)单片机,编写一C语言源程序,其硬件电路见图60电路功能如下:用RAO位作程序启动信号,程序一旦启动,5111 B口的RBO位外接LED点亮一秒钟,接着RB2位、RB4位、RB6位外接的LED分别点亮10秒、1分钟、2分钟,循环工作。11137外接蜂鸣器,其用途是RB口的RBO,RB2,RB4,RB6位外接的LED完成给定时间的一个循环,蜂鸣器发出声响(一分钟),以便验证。 这里编写多个延时的C语言程序,仅用了一个带形式参数的延时子函数(delayCunsignad long int m),就完成了上述电路的功能,可见C语言的优点。 该C源程序命名为PIC05.c,程序清单如下: #include//包含头文件pic.h #define PORTBIT (add,bit) ((unsigned)(&add)*5+(bit)) static bit PORT-0 @PORTBIT(PORTB,O);//B口位定义 static bit PORT_2 @PORTBIT(PORTB,2); static bit PORT -4 @PORTBIT(POIITB,4); static bit PORT-6 @PORTBIT(PORTB,6); static bit PORT -7 @PORTBIT(PORTB,7); #define PORTAIT (add,bit) ((unsigned)(&add)* 1+(bit)) static bit PORT-0 @PORTAIT (PORTA,0);//A口位定义 void delay(unsigned long int m)//定义有参数的延时子函数{// dalay(延时)函数开始。unsigned long int i; //无符号长整形变量i。for(i=O;i<=m;i++) //带m参数的for循环。 continue://转移下次循环。//延时dalay子函数结束。main //定义函数名为main()//主函数。 //主函数开始TRISB=0x00; //初始化PIC16F84A、B口//A口 INTCON=0x00;PORTB=0x00;TRISA=Ox 1 F; while(RAO)//判RAO=1.空操作循环。 // RAO =0执行以下语句。 while(1)//循环语句,这是无限循环。//循环语句开始。 RB0=1;//给RBO赋值1(高电平)。 delay (42000);// RBO外接LED点亮1 t钟。 RBO=0;// RBO外接LED灭。 RB2=1;//给RB2赋值1(高电平)。 delay(490000);// RB2外接LED点亮10秒钟。 RB2=0;// RB2外接LED灭。 RB4=1;//给RB4赋值1(高电平)。 delay(2940000);// RB4外接LED点亮1分牛中。 RB4=0:// RB4外接LED灭。 RB6=1;才给RB6赋值1(高电平)。 delay(5890000);// RB6外接LED点亮2分钟。 RB6=0;// RB6外接LED灭 RB7=1://给RB7赋值1(高电平)。 delay(3000000)://蜂鸣器响1分钟。 RB7=0;//蜂鸣器停响。 RB7=0; //while(1)一次循环结束。 从以上程序中可以看出:主调函数delay(给定的m值)要将给定的实际参数42000,490000,2940000,5890000ff13000000;,传给被调函数delay( unsignod long int m)的形式参数,以决定for语句中的m值。 口成都立本 |
- pic16单片机应..
- 2008-1-9
- 基于单片机的某车型..
- 2008-1-7
- 基于ARM的FPG..
- 2008-1-7
- 基于单片机的电热水..
- 2007-11-15
- 一种基于单片机的汽..
- 2007-11-15
- 基于单片机的电子导..
- 2007-11-8
- 51单片机边沿触发..
- 2007-11-8
- 如何选择细纱机主电..
- 2007-11-5
- 单片机编程技巧
- 2007-9-14
- 空压机变频改造技术..
- 2007-9-3
- 运用定点DSP实现..
- 2007-8-7
- 基于TMS320C..
- 2007-8-9
- 一种用于图像认证的..
- 2007-7-29
- TMS320F20..
- 2007-8-9
- 多DSP系统互连方..
- 2007-8-9
- C5402 DSP..
- 2007-8-9
- 具有高可靠性的高速..
- 2007-8-9
- 基于DSP的实时M..
- 2007-8-7
- 带ARM核的双CP..
- 2007-8-9
- 基于TMS320V..
- 2007-8-9




