51单片机模块化编程设计与实例要点分析
- 格式:doc
- 大小:17.00 KB
- 文档页数:2
项目三C51程序设计语言基础任务1 C51程序的识读1.C51程序结构例3-1 P_test/********************* //注释,还可用//注释掉一行File name:P_test.cChip name:STC89C51RCClock frequency:1.20MHz***********************/#include “reg52.h” //预处理命令,文件包含预处理命令,后缀名都是.h,标准的MCS-51单片机头文件为”reg51.h”,STC89系列单片机头文件为”reg52.h”#define unit unsigned int //宏定义预处理命令sbit BZ=P3`7 ;sbit key=P1`0;void delay(unit ms){unit i;while( ms --){for(i=0;i<120;i++);}}void main(void){while(1){if(key==0){BZ=0x0;delayms(10);BZ=0x1;delayms(50);P0=0xFF;}else{P0=~P0;delayms(500);}}}2.C51的数据类型位变量型 bit字符型无符号字符型 unsigned char有符号字符型 signed charC51的数据类型整数型无符号整数型 unsigned int基本类型有符号整数型 signed int长整数型无符号长整数型 unsigned long int有符号长整数型signed long int实数型(浮点型)单精度浮点型float双精度浮点型double数组类型array结构体类型struct构造类型共用体union枚举enum指针类型空类型(void)表3-1 C51基本数据类型的长度和值域3.C51的标识符和关键字标识符是由字母、数字和下划线组成的字符串,第一个字符必须是字母或下划线,不超过32个字符。
单片机89C51汇编模块化编程
高手从菜鸟忽略作起之(七)一,汇编模块类别
1.1子过程:无参数,无返回值的一段功能代码。
1.2函数:参数,返回值至少有一项的功能代码。
1.3中断处理:中断发生时的处理代码。
二,子过程框架
2.1 标签+LJMP:
2.2 函数框架:
详见函数框架。
三,函数框架:
3.1 函数传递参数:调用前,将参数从右到左压入栈,函数中从左到右弹出栈。
3.2 函数返回值:用Acc寄存器保存返回值。
3.3 函数传址参数:将地址作为参数,传递。
3.4 代码框架:
四,中断处理:
3.1 定入中断入口及跳转。
3.2 中断处理设定:保护现场+中断处理+恢复现场3.2 代码框架。
1.闪烁灯1.实验任务如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。
2.电路原理图图4.1.13.系统板上硬件连线把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。
4.程序设计内容(1).延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒MOV R6,#20 2个 2D1: MOV R7,#248 2个 2 2+2×248=498 20× DJNZ R7,$ 2个2×248 (498DJNZ R6,D1 2个2×20=4010002因此,上面的延时程序时间为10.002ms。
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。
如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5.程序框图如图4.1.2所示图4.1.26.汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void) {while(1){L1=0;delay02s();L1=1;delay02s();}2.模拟开关灯1.实验任务如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。
模块化编程设计题
一、简述模块化编程的必要性(模块化的优点)
参考答案:
大多数的编程学习者一开始接触和学习到的程序很小,代码量很少,甚至只有几十行。
对于这样短小的程序进行模块化设计不是完全必要的。
很多情况下程序模块化设计需要“浪费”很多时间,例如增加了代码的数量,增加了构思的时间。
把所有的程序代码都写在一个main()函数中程序完全可以运行。
但是随着学习的深入,代码量的增加,将所有的代码都放在同一个.C文件中的做法越发使得程序结构混乱,虽然可以运行,但是可读性、可移植性变差。
即使是自己写的程序,时间长以后对程序的阅读和修改也要花一些时间。
模块化编程使得程序的组织结构更加富有层次感,立体感和降低程序的耦合度。
在大规模程序开发中,一个程序由很多个模块组成,很可能,这些模块的编写任务被分配到不同的人。
几乎所有商用程序都必须使用模块化程序设计理念。
在程序的设计过程中各个开发者分工合作,分别完成某一模块特定的功能,减少开发时间等。
二、模块化编程设计步骤
(1)、创建头文件
在模块化编程中,往往会有多个C文件,而且每个C文件的作用不尽相同。
在我们的C 文件中,由于需要对外提供接口,因此还必须有一些函数或者是变量提供给外部其它文件进行调用。
对于每一个模块都有相应的.c文件和.h文件,为了阅读调试方便,原则上.c文件和.h文件同名,如和。
(2)防重复包含
例如文件
#ifndef__DELAY_H__
#define__DELAY_H__
void delay(uint t);
#endif
假如有两个不同源文件需要调用delay(uint t)这个函数,他们分别都通过#include “”把这个头文件包含了进去。
在第一个源文件进行编译时候,由于没有定义过因此#ifndef__DELAY_H__条件成立,于是定义_DELAY_H_ 并将下面的声明包含进去。
在第二个文件编译时候,由于第一个文件包含时候,已经将_DELAY_H_定义过了。
因此#ifndef__DELAY_H__不成立,整个头文件内容就没有被包含。
假设没有这样的条件编译语句,那么两个文件都包含了delay(uint t);就会引起重复包含的错误。
所以在.h文件中,为了防止出现错误都进行防重复包含。
(3)代码封装
将需要模块化的进行代码封装
头文件的作用可以称其为一份接口描述文件。
其文件内部不应该包含任何实质性的函数代码。
我们可以把这个头文件理解成为一份说明书,说明的内容就是我们的模块对外提供的接口函数或者是接口变量。
同时该文件也包含了一些很重要的宏定义以及一些结构体的信息,离开了这些信息,很可能就无法正常使用接口函数或者是接口变量。
但是总的原则是:不该让外界知道的信息就不应该出现在头文件里(不需要外部调用的函数不在头文件中申明),而外界调用模块内接口函数或者是接口变量所必须的信息就一定要出现在头文件里(需要被外部调用的函数一定要在头文件中申明),否则,外界就无法正确的调用我们提供的接口功能。
(4)使用源文件(将文件加到工程之中)
将.c文件添加到工程之中,同时在需要调用.h文件中的宏或函数的.c文件中将.h文件包含进去(.h文件中的宏和函数可以在.c文件中自由调用)。
三、程序实例
以简单的52单片机LCD例程为例,将下面的程序模块化。
将延时函数独立成一个模块,为了使程序简化,将所有的和LCD相关的函数(包括LCD初始化函数、写命令函数、写数据函数、显示函数等)独立成一个模块。
#include <>
#include <>
#define uchar unsigned char
#define uint unsigned int
sbit rs = P2^5;
sbit rw = P2^6;
sbit e = P2^7;
uint i;
/*********************************************/
void delay1ms(uint z)
{ 文件加入到工程之中编译即可,在工程中可以清楚地看到各个.c文件包含的.h文件,以及各个模块包含的子函数,层次分明,很方便进行调试修改。