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

发布者:大橙子5511最新更新时间:2016-09-25 来源: eefocus关键字:程序模块  单片机 手机看文章 扫描二维码
随时随地手机看文章
在做单片机的控制程序开发中,有一些程序段是很通用的、可以移植的。控制蜂鸣器蜂鸣时间所应用的延时程序,在流水灯或数码管的中也可以应用;中断系统程序,也很常用。我们就称这些程序段叫功能模块。对于编程人员,模块的概念应该是很清楚的,把可移植的程序块制定成模块,以后就可以直接应用,既省时间也省精力。下面就是一些常见的标准模块可直接应用。

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   与定时器/计数器有关的寄存器

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

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

说明:

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

l         M1MO为工作方式设置位。一般工作在方式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

}

关键字:程序模块  单片机 引用地址:第一部分 常用的几个程序模块

上一篇:第二部分 与外围设备的接口实例
下一篇:基于GSM网络的汽车防盗报警系统设计

推荐阅读最新更新时间:2024-03-16 15:11

用PIC单片机实现50Hz锁相信号发生器
    摘要: 在UPS不间断电源系统的设计中,与外部交流电压锁相的50Hz正弦信号发生器是十分关键的一部分,本文介绍了一种利用数字信号处理技术通过PIC单片机实现此电路的方法。     关键词: 单片机 信号发生器 数字信号处理 引言 不间断电源(UPS)通过逆变向用电设备提供纯净、稳定的电能,保证设备的正常运行,50Hz锁相正弦信号发生器则是其中的关键部分,作为系统输出电压的基准,不但要求它的输出信号频率和幅度稳定,还要与外部交流电的电压相位同步。 传统的交流信号发生方式采用反馈振荡电路,利用电路的自激振荡和选频作用输出正弦波,但是低频模拟振荡器有一个缺点:受电压和温度影响大,输出信号的频率和幅度
[应用]
单片机液晶滚动显示(AT89C51、LCD1602)
一、简介 此电路由AT89C51最小系统和LCD1602液晶模块组成。可实现上线垂直滚动、左右滚动和播放暂停。 二、执行效果 上下滚动 左右滚动 三、代码 /*更多项目私wo!!!*/ #include reg52.h #include string.h #define uchar unsigned char #define uint unsigned int void Initialize_LCD(); void ShowString(uchar,uchar,uchar *); sbit K1 = P3^0; sbit K2 = P3^1; sbit K3 = P3^2; uchar code Prompt
[单片机]
<font color='red'>单片机</font>液晶滚动显示(AT89C51、LCD1602)
P87LPC764单片机的I2C总线显示电路
      摘要: I2C总线是Philips公司推出的芯片间串行传输总线。目前,已有不少大电气公司半导体厂商推出了不少带有I2C总线接口的单片机。本文介绍一种利用Philips公司生产的P87LPC764单片机作为I2C总线控制器与I2C总线显示器件SAA1064构成的I2C显示电路,并给出相应的程序清单。    关键词: I2C总线 P87LPC764单片机 SAA1064 显示电路   I2C总线是Philips公司推出的芯片间串行传输总线。它以串行数据线(SDA)和串行时钟线(SCL)2根连线实现了完善的全双工同步数据传送,可以极方便地构成多机系统和外围器件扩展系统。关于I2C总线的结构和工作原理详见参考文献1。
[单片机]
P87LPC764<font color='red'>单片机</font>的I2C总线显示电路
嵌入式学习笔记18——AVR单片机之熔丝位设置
1.熔丝位简介: 熔丝位状态为 1 表示未编程,熔丝位状态为 0 表示编程,因为在AVR的器件手册中是使用已编程和未编程定义熔丝位的。 AVR单片机的熔丝位是可以多次编程的。 AVR单片机芯片加密锁定之后(LB2/LB1=1/0,0/0)不能通过任何方式读取芯片内部的Flash和EEPROM的数据。 下载编程的正确步骤是:下载运行代码和数据,配置相关的熔丝位,最后配置芯片的加密位。 2. AVR单片机加密熔丝位的设置 3. 功能熔丝位的设置 4. Bootloader熔丝位简介 5. 系统时钟源选择熔丝位 6. 使用外部晶体时的工作模式设置 7.
[单片机]
嵌入式学习笔记18——AVR<font color='red'>单片机</font>之熔丝位设置
pic18单片机在BootLoader中的应用
  引 言   在PIC系列单片机中,只有PIC18系列和PIC16F87X系列的单片机才有IAP功能,才能够使用BootLoader功能。下面只介绍PIC18的BootLoader,PIC16F87X的BootLoader与它类似。   1 BootLoader程序的工作原理   BootLoader是一段引导程序,在单片机上电/复位后在用户程序之前先运行。运行后判断当前是否需要进入升级状态。如果不需要升级,就直接运行Flash中原有的程序;如果需要升级,首先擦除旧的程序,然后从串口接收用户程序,同时写入Flash中。接收数据时,需要进行校验,保证接收到的数据是正确的,避免将错误的程序写入到芯片中。   PIC18单片
[单片机]
pic18<font color='red'>单片机</font>在BootLoader中的应用
51单片机驱动触摸屏综合实验源程序
第1步:根据开发板单片机型号选择“实验28:开发板资源数据下载 - 1、开发板资源数据下载”程序下载到STC8A开发板中运行,下载程序时ISP软件设置:用户程序运行时的IRC频率22.1184MHZ 第2步:光盘资料 - 上位机数据下载源程序- 运行串口文件下载V1.0 - 下载 (“开发板资源数据:开发板触摸屏综合实验资源数据.bin(地址:实验30-准备工作)”)资源数据到开发板,起始扇区设置为0,波特率设置57600; 第3步:根据开发板单片机型号选择“实验28:开发板资源数据下载 - 2、触摸屏资源数据下载”程序下载到STC8A开发板中运行,下载程序时ISP软件设置:用户程序运行时的IRC频率22.1184MHZ
[单片机]
51单片机IO口模拟串口通讯的设计
#include sbit BT_SND =P1^0; sbit BT_REC =P1^1; IO 口模拟232通讯程序 使用两种方式的C程序 占用定时器0 #define MODE_QUICK #define F_TM F0 #define TIMER0_ENABLE TL0=TH0; TR0=1; #define TIMER0_DISABLE TR0=0; sbit ACC0= ACC^0; sbit ACC1= ACC^1; sbit ACC2= ACC^2; sbit ACC3= ACC^3; sbit ACC4= ACC^4; sbit ACC5= ACC^5; sbit ACC6= ACC^6; sbit AC
[单片机]
基于单片机的太阳能环境参数测试仪设计方案
引 言   为了确保太阳能发电系统能够正常的工作,需要对太阳能发电系统的各项环境参数进行测量,从而有效地控制其运行。本文介绍了一种基于单片机的太阳能参数测试仪,提供了3种参数的测量功能和通信接口,以及2种供电方式,既可作为手持设备使用,又能安装在发电系统中,具有较高的实用价值。   1 硬件 电路设计   1.1 总体结构   该测试仪以AT89S52单片机为核心,外接温湿度传感器SHTll、照度传感器TSL2561、四位共阴数码管、RS485总线通信接口以及显示切换按键。单片机上电工作后,对当前温度、湿度、光强度进行实时测量,通过按键切换将测得的3种参数通过LED数码管进行轮流显示;此外,还可以通过RS485总线与PC
[单片机]
基于<font color='red'>单片机</font>的太阳能环境参数测试仪设计方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved