您的位置 首页 嵌入式

榜首部分 常用的几个程序模块

在做单片机的控制程序开发中,有一些程序段是很通用的、可以移植的。控制蜂鸣器蜂鸣时间所应用的延时程序,在流水灯或数码管的中也可以应用…

在做单片机的操控程序开发中,有一些程序段是很通用的、能够移植的。操控蜂鸣器蜂鸣时刻所使用的延时程序,在流水灯或数码管的中也能够使用;中止体系程序,也很常用。咱们就称这些程序段叫功能模块。关于编程人员,模块的概念应该是很清楚的,把可移植的程序块拟定成模块,今后就能够直接使用,既省时刻也省精力。下面便是一些常见的规范模块可直接使用。

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操作有关;

lM1MO为作业办法设置位。一般作业在办法1下,此刻M1MO=01;

l在GATE=0时,需用软件使TCON中的位TRO(TR1)置1,发动守时器。C/T0=0为守时形式,C/T0=1为计数模式;

1.42守时器/计数器作业原理

守时/计数器的本质是加1计数器(16位),由高8位THO(1)和低8位TL(1)两个寄存器组成。加1计数器输入的计数脉冲有两个来历,一个是由体系的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU宣布中止恳求(守时/计数器中止答应时)。假如守时/计数器作业于守时形式,则表明守时时刻已到;假如作业于计数形式,则表明计数值已满。

可见,由溢出时计数器的值(注:16位全填满1时,数值刚好是65535。而溢出时计数器的值应该是65535+1=65536,即216)减去计数初值才是加1计数器的计数值。

从上面能够得到两个定论:

l计数位数是16位:高8位THO(1)和低8位TL(1);

l计数参数(添入TH和TL)与计数初值的联系:X=216-N;//假定守时时刻是50ms,即N=50000;则计数参数=65536-50000=15536。

附:核算THO(1)和低8位TL(1)初值// 假定延时时刻为50ms

TH=(65536-50000)/256//求模

TL=(65536-50000)%256//求余

守时/计数器初始化程序应完结如下作业:

l对TMOD赋值,以确认T0(1)的作业办法;

l核算初值,并将其写入TH、TL;

l中止办法时,则对IE赋值,敞开中止;

l使TR0或TR1置位发动守时/计数器守时或计数。

守时程序模块:

#include

void main()

{

TMOD=0x01;//守时器T0作业办法1

//送初值,守时为50ms。

TH0=(65536-50000)/256;

TL0=65536-50000)%256;

EA=1;//开总中止

ET0=1;//开守时器0中止

TRO=0;//发动守时器0

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/268321.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部