单片机C51语言程序设计基础

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

3.4 实训三 简易十字路口交通信号灯控制
简易十字路口交通信号灯控制仅考虑以下简单情况: 若东西方向为放行线,则南北方向为禁止线;反之亦然。 交通信号灯的变化是固定的,变化规律见表3-3。
表3-3 简易十字路口交通信号灯的变化规律
1. 硬件电路设计
图3.23 系统硬件电路
2. 软件设计
根据图3.23,当Pl口有关引脚输出高电平1时,则点亮 相应的“信号灯”;当Pl口有关引脚输出低电平0时,则熄 灭相应的“信号灯”。为了实现交通运行状态的控制要求, Pl口输出的控制码有4种,见表3-4。
有关51系列单片机的中断控制及中断函数编写,将在 第4章详细讲述。
3.2.2 重入函数
在主函数和中断函数中都可调用的函数容易产生问题。 51系列单片机一般使用寄存器传递函数参数,局部变量一 般存放在片内RAM中。由于片内RAM的容量很小(只有 128B),函数再入时会破坏或覆盖上次调用的数据。为此, C51语言提供了关键字reentrant,用于将相应的函数指定 为可重入函数。
第3章 单片机C51语言程序设计基础
3.1 语句与流程控制 3.2 函数 3.3 本章小结 3.4 实训三 简易十字路口交通信号灯控制
返回首页
3.2 函数
3.2.1 中断函数 3.2.2 重入函数 3.2.3 标准库函数
C51语言程序是由一个个函数构成的。所谓函数,是 指可以被其他程序调用的具有特定功能的一段相对独立的 程序。引入函数的主要目的有两个:一是为了解决代码的 重复;二是结构化模块化编程的需要。
所谓重入函数,是指可以在函数体内间接调用其自身 的函数。
重入函数可以被递归调ຫໍສະໝຸດ Baidu和多重调用,而不用担心变
量被覆盖,因为每次函数调用中的局部变量都会被单独保 存起来。
重入函数的定义格式: 函数类型 函数名(形参列表) reentrant { 局部变量说明 可执行语句 }
【例3.13】重入函数的定义与使用。
中断函数的定义格式:
函数类型 函数名()interrupt 中断编号 using 工作寄存器组编号 {
可执行语句 }
例如,下列程序片段为定时器/计数器0的中断服务程 序,指定使用第2组工作寄存器。
……
unsigned int CNT1; unsigned char CNT2;
void Timer( ) interrupt 1 using 2
{ if( ++CNT1==1000 ) // CNT1计数到1000
{
CNT2++;
// CNT2开始计数
CNT1=0;
// CNT1清零
}
}
……
在编写中断函数时,应特别注意以下几点:
(1) 中断函数为无参函数,即不能在中断函数中定义任何变量,否则将 导致编译错误。 (2) 中断函数没有返回值,即应将中断函数定义为void类型。 (3) 中断函数不能直接被调用,否则将导致编译错误。 (4) 中断函数使用浮点运算时要保存浮点寄存器的状态。 (5) 如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器 组必须与中断函数相同。 (6) 由于中断的产生不可预测,中断函数对其他函数的调用可能形成递 归调用,必要时可将被中断函数调用的其他函数定义成再入函数。
C51语言中函数定义的一般格式 :
[return_type]funcname([args])[{small | compact | large}] [reentrant][interrupt n][using n] {
局部变量定义 可执行语句 }
其中,大括号以外的部分称为函数头;大括号以内的部分 称为函数体。如果函数体内无语句,则称之为空函数。空 函数不执行任何操作,定义它的目的只是为了以后程序功 能的扩充。
表3-4 不同运行状态时的控制码
根据交通灯的运行状态,主程序流程图如图3.24所示。
图3.24 主程序流程图
思考与练习
2. 在实训三中,如果让黄灯闪烁,应如何修改程序? 3.设计一个鸣笛报警程序,要求(1)能交替发出频率为1600HZ和800HZ的声音, (2)高音(1600HZ)发音时间为0.5ms,低音(800HZ)发音时间为0.25秒 4.利用字符型数组控制P1口8为LED灯流水点亮,间隔1秒 5.利用指针数组控制P1口8为LED灯流水点亮,间隔1秒 6.利用数组的指针控制P1口8为LED灯流水点亮,间隔1秒 7.用数组作为函数参数控制P1口8为LED灯流水点亮,间隔1秒 8.利用指针做函数参数控制P1口8为LED灯流水点亮,间隔1秒
3.2.1 中断函数
51系列单片机通常有5个中断源,为了方便使用,C51 语言对它们进行了编号,见表3-1。
表3-1 51系列单片机的中断源及其编号
当CPU正在执行一个特定任务时,可能有更紧急的事 情需要CPU处理,这就涉及中断优先级。高优先级中断可 以中断正在处理的低优先级中断程序,因此最好给每种不 同优先级程序分配不同的工作寄存器组,以达到压栈保护 的目的。
提示
for(i=0;i<n;i++) ; 所消耗的机器周期为N=3n+2 For(j=0;j<m;j++) for(i=0;i<n;i++) ; 所消耗的机器周期为N=3*n*m+5*m+2
第3章 结束
相关文档
最新文档