微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第一部分 常用的几个程序模块

第一部分 常用的几个程序模块

时间:11-17 来源:互联网 点击:
在做单片机的控制程序开发中,有一些程序段是很通用的、可以移植的。控制蜂鸣器蜂鸣时间所应用的延时程序,在流水灯或数码管的中也可以应用;中断系统程序,也很常用。我们就称这些程序段叫功能模块。对于编程人员,模块的概念应该是很清楚的,把可移植的程序块制定成模块,以后就可以直接应用,既省时间也省精力。下面就是一些常见的标准模块可直接应用。

1.1 简单延时子程序

在做单片机控制时,经常要遇到到延时的问题。比如要让蜂鸣器响1s,然后停1s,然后再响1s,反复下去。这个例子,要求延时的时间已经很准确了(1s),一般情况下,如果要求延时的时间不需要很精确,那么可以写一个简单的延时程序,然后通过调试,最后达到延时的目的。

这种方法适合大概的延时,可以通过while或for循环实现。为方便后续研究,我用for循环方式。

程序可以这样写:

#include
#define uint unsigned int
#define uchar unsigned char //宏定义
void delay()//延时函数

{

uint x,y;

for(x=100;x>0;x--)

for(y=5000;y>0;y--);

}

void main()

{

delay();

}

通过调试循环次数x,y值,改变延时间,最后达到满意的数值为止。

1.2带参数的延时子程序

#define uint unsigned int

#define uchar unsigned char

void delay(uint z)//延时函数

{

uint x,y;

for(x=100;x>0;x--)

for(y=z;y>0;y--);

}

void main()

{

delay(k)//k为常数

}

在主函数main中调整常数k,方可达到延时目的。

1.3中断程序

中断:CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。

理解上述中断的定义,有两点需要注意:1,中断程序执行完,又返回中断前的地方(断点)接着执行程序;2,中断的函数不需要声明,且该函数放在main函数的外面(附中断程序)。

附:80C51的中断系统

80C51的中断系统有5个中断源(见图1)(8052有6个),2个优先级,可实现二级中断嵌套。

图1

图2

说明:图1,外部中断上的横线表示低电平有效。

1中断请求标志寄存器TCON:

说明:

IT0(TCON.0),外部中断0触发方式控制位。

当IT0=0时,为电平触发方式。

当IT0=1时,为边沿触发方式(下降沿有效)。

IE0(TCON.1),外部中断0中断请求标志位。

IT1(TCON.2),外部中断1触发方式控制位。

IE1(TCON.3),外部中断1中断请求标志位。

TF0(TCON.5),定时/计数器T0溢出中断请求标志位。(硬件控制)

TF1(TCON.7),定时/计数器T1溢出中断请求标志位。(硬件控制)

注意:低四位用于控制外部中断,高四位用于控制和申请定时/计数器中断;TF0、TF1由硬件自动控制;TR0(TR1)为1时,定时器0(1)启动,反之停止(软件控制)。可直接进行位操作。

2中断标志寄存器IE:为1,中断允许。(可进行位操作)

3中断优先级寄存器IP:

说明:

80C51单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的。

§PX0(IP.0),外部中断0优先级设定位;

§PT0(IP.1),定时/计数器T0优先级设定位;

§PX1(IP.2),外部中断0优先级设定位;

§PT1(IP.3),定时/计数器T1优先级设定位;

§PS(IP.4),串行口优先级设定位;

§PT2(IP.5),定时/计数器T2优先级设定位。

§CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。

§正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。

§正在进行的低优先级中断服务,能被高优先级中断请求所中断。

总结:

中断响应条件

§中断源有中断请求;(TCON)

§此中断源的中断允许位为1;(IE)

§CPU开中断(即EA=1)。(EA)

以上三条同时满足时,CPU才有可能响应中断。

中断子程序(定时器0(1)中断响应):

void main()

{

EA=1;//开CPU中断

ET0=1;//开定时器0(中断允许)

ET1=1;

TR0=1;//启动定时器0

TR1=1;

}

void time0() interrupt 1 //中断函数time0()不需要声明,数字1与优先级有关,如外部中断0,应设置为0(interrupt 0)。

{}

void time1() interrupt 3

{}

1.4定时器和计数器

前面已经介绍了延时,但是那种方法延时的时间做不到很精确,今天介绍一种精确的方法,就是定时器/计数器。

1.41 与定时器/计数器有关的寄存器

lTCON:前面已经介绍过,它主要是控制启动和申请中断。

lTMOD:控制定时器的控制方式。可用下图描述:

说明:

l高四位与T1操作有关,低四位与T0操作有关

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top