首页 > 编程知识 正文

8位数码管,单片机中断程序代码

时间:2023-05-06 08:15:42 阅读:111158 作者:645

目录一、实验要求二、知识点(一)码管)2)八段码管字形码(三) C51变量定义四要素)4)中断源)5)相关特殊功能寄存器1、定时器/计数器控制寄存器TCON2、分配

一.实验要求

【实验目的】

1、熟悉51单片机五个中断源;

2、掌握外部中断的中断初始化和中断服务函数的编程方式,对数码管显示外部中断计数进行编程。

【实验内容】

1、用Proteus绘制硬件原理图,设置零件参数;

2、KeilC51软件编程在数码管上显示外部中断计数。

【硬件要求】

连接方法:连接P2.0-P2.7共阳型七级LED数码管,钥匙K1接单片机p3.2(int0)接口。

二、知识点(一)数码管是半导体发光器件,基本单元是发光二极管,玻璃管中含有一个金属丝网阳极和多个阴极,可以显示数字和其他信息。

根据其内部结构、即发光二极管单元连接方式,可以分为公共阳极和公共阳极两种数码管,公共阳极是指连接数码管内部的发光二极管的阳极而连接公共阳极(COM 意味着某个场发光二极管的阴极为低电平时对应的场点亮,某个场的阴极为高电平时对应的场不点亮; 共阴极数据管与共阳极数码管相反。

共阳的LED数码管在应用时必须将公共极COM接入5V; 共阴的LED数码管在应用时,应将公共极COM与地线GND连接。

(二)八段码管字形码以下为八段码管字形码表,使用时便于参考。

字符共阳极共阴极0 C0 H3FH1F9h 06 H2A 4H 5B H3B0H4H 4499 H66 H592 H6 DH 682 H7F8H07 H880 H7FH 990 H6FH (三) C51变量定义的四要素C51变量定义的四要素为:

1,http://www.Sina.com /

存储器类型分为四种:自动(auto )、外部(extern )、静态(static )、注册(register )和寄存器类型。默认存储器类型为自动变量(auto ),一般不需要写入。

自动型变量的作用范围是定义它的函数体或语句块内,执行结束后变量占用的存储器被释放;

外部类型的变量在其源文件中定义后,必须在其他源文件中用extern进行说明

静态型与自动型相反,即使在执行结束后,占用存储器单元也继续保留;

寄存器型变量是指,通过将与变量对应的存储单元指定为通用寄存器,可以提高程序的执行速度。

2、存储种类(重点!)

数据类型有五种类型:整数型、长整型、字符型、浮点型和指针型。

3、数据类型

C51编译器的三种编译方式支持三种缺省存储类型。 SMALL支持data类型,COMPACT支持pdata类型,LARGE支持xdata类型,一般情况下,如果没有特殊声明,就是SMALL编译模式。

data型变量的存储区域位于直接地址区域(片上低128B RAM ),数据访问速度最快且容量小。 设为常用变量或临时变量存储器;

idata型变量的存储区域为间接地址区域(片上高度128B RAM );

xdata型变量的存储区域位于外部寄存器(片外64KB RAM ),经常用于存储不经常使用的变量和要处理的数据。

pdata型变量的存储区域位于寻呼地址区域(片外低256B RAM ),经常用于外部设备访问;

code类型变量的存储区域位于程序存储区域(ROM )中,经常用于存储数据表等固定信息。

bdata型变量的存储区域位于位地址区域(片内的位可寻址区域),可以混合访问位和字节。

(4)中断源C51单片机的中断系统有五个中断源,分为两个外部中断源和三个内部中断源,它们是两个外部中断int0(P3.2 )和int0(P3.2 )、两个外部中断源

另外,中断优先级有两个阶段,由中断优先级控制寄存器IP控制,每个中断源的优先级高低可以通过编程控制,中断许可由CPU中断接通和中断源中断接通两个阶段控制。

(五)相关联的特殊功能寄存器1、计时器/计数器控制寄存器TCON计时器/计数器控制寄存器TCON控制计时器/计数器的启动/停止以及标记计时器的溢出和中断。 当51单片机系统被复位时,TCON的所有位都被清零。

TCON的形式如下,高位4位控制计时器/计数器的启动和中断请求,低位4位控制外部中断。

)1) TR1和TR0是运转控制位,在等于0时停止计时器动作,在等于1时开始计时器动作(例起动计时器T1动作: TR1=1);

)2) TF1和TF0是溢出中断标志位,计时器溢出由硬件自动设置为1,在CPU响应中断后自动清除)示例TF1=0无溢出,TF1

(3) IT1和IT0是外部中断INT0、INT1的触发方式控制

位,由软件来置1或清0,以控制外部中断的触发方式。(例IT1=1时,外部中断INT1为下降沿触发,IT1=0时,外部中断INT1为低电平触发);
(4)IE1和IE0为外部中断的请求标志位,当引脚上出现中断请求信号(低电平或脉冲下降沿)时,硬件自动将IEX置1,从而产生中断请求标志,而当CPU响应中断时,由硬件消除(例外部中断INT0P3.2引脚有中断请求信号时,IE0置1,即IE0=1)。

2、中断允许控制寄存器IE

在中断系统中,中断源向CPU发出中断请求后,由中断允许控制寄存器IE和中断优先级控制寄存器IP(本次实验未使用)来管理CPU。
中断允许控制寄存器IE控制中断源的开放或屏蔽,它共6位,字节地址为A8H,如下:

(1)EA为中断允许总控位,控制CPU的开放中断,当EA=0时,CPU屏蔽所有中断请求;EA=1时,CPU开放中断(5个中断源的中断请求是否允许,要根据其中断请求允许控制位来决定)。
(2)EX0、EX1分别为外部中断0允许位和外部中断1允许位,EX0=0时,禁止外部中断0中断,EX0=1时,允许外部中断0中断;EX1=0时,禁止外部中断1中断,EX1=1时,允许外部中断1中断。
(3)ET0、ET1分别为定时器/计数器Tx(x=0,1)溢出中断允许位,等于0时禁止Tx(x=0,1)中断,等于1时允许Tx(x=0,1中断。
(4)ES为串行口中断允许位,ES=0时禁止串行口中断,ES=1时允许串行口中断。

(六)中断程序

中断程序分为中断初始化和中断服务两个部分组成。

1、中断初始化步骤

中断初始化是指用户对特殊功能寄存器中的各控制位进行赋值,其步骤如下:
第一步,开相应中断源的中断,经中断允许控制寄存器IE;
第二步*(两个以上中断需设定优先级),设定所用中断源的中断优先级,经中断优先级控制寄存器IP;
第三步,若为外部中断,则应规定采取的触发方式,即采取的触发方式是电平触发方式或脉冲触发方式,经定时器控制寄存器TCON。

当外部中断采用电平触发方式时,CPU在每个机器周期的S5P2时刻都检测INT0和INT1引脚的输入电平,若检测到低电平,则认为由中断信号,且在中断服务结束前低电平必须清楚,否则中断返回之前将再次产生中断。
当外部中断采用脉冲触发方式时,CPU在每个机器周期的S5P2时刻都检测INT0和INT1引脚的输入电平,需连续检测两次(第一次检测为高电平,第二次检测为低电平),即检测一个下降沿才被认为是一个有效的中断请求信号。

2、中断服务程序函数

中断服务是指单片机检测到中断后响应中断事件,中断服务的步骤如下:
第一步,在中断向量入口放置一条跳转指令,让程序从该入口跳转到实际代码的起始位置;
第二步,保存当前寄存器的内容;
第三步,清除中断标志位,处理中断事件;
第四步,恢复寄存器的内容,返回到原来主程序的执行处;

也就是创建中断服务程序函数,该函数的定义格式如下,其中n为中断源编号,可以为0-31之间的整数,前面跟上interrupt表示将函数声明为中断服务函数,而using m由于实现工作寄存器组的切换,m即为中断服务子程序中选用的工作寄存器组号(0-3):

返回值 函数名称([参数])interrupt n[using m]{}

要注意中断服务函数不能进行参数传递,且它没有返回值(可以将中断服务函数定义为void类型),另外不能调用中断服务函数,因为会导致编译错误。

三、Proteus仿真软件画原理图

原理图如下,其中的八段数码管为7SEG-MPX1-CA,按键与P3端的P3.2INT0相连(外部中断0请求输入端,低电平有效,这里采用电平触发方式):

四、Keil编程软件编写程序

首先创建一个数组Tab[],根据C51变量定义的四要素,将数组Tab定义为unsigned char code Tab[],其中的code的含义是用code把数组Tab[]定义在程序存储器中,总的来说就是定义一个无符号字符型(自动变量)数组Tab[],且该变量位于ROM中,根据共阳极数码管段码,即unsigned char code Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};。
设置一个延时函数,依然还是设置一个有参数的函数,调用函数delay(1000)即延时1秒:

//延时函数void delay(unsigned int x){unsigned int i,j;for(i=0;i<x;i++)for(j=0;j<125;j++);}

编写中断服务程序函数,如下:

unsigned char m;...//中断服务程序函数void counter(void) interrupt 0{EX0=0; //禁止外部中断0中断m++; //中断计数P2=Tab[m]; //依次取数组Tab内的元素if(m==10){m=0;P2=Tab[m];}EX0=1; //允许外部中断0中断}

完整程序代码如下:

#include<reg51.h>unsigned char m;unsigned char code Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极,对应八段数码管的数字0-9 void delay(unsigned int x)//延时函数{unsigned int i,j;for(i=0;i<x;i++)for(j=0;j<125;j++);}void counter(void) interrupt 0{EX0=0; //禁止外部中断0中断m++; //中断计数P2=Tab[m]; //依次取数组Tab内的元素if(m==10){m=0;P2=Tab[m];}EX0=1; //允许外部中断0中断}void main(){EX0=1;//允许外部中断0中断IT0=1;//外部中断INT0为下降沿触发EA=1;//使能CPU,CPU开放中断while(1){P2=Tab[m];//依次取数组Tab内的元素delay(1000);//调用延时函数,参数为1000,即1s}} 五、实验结果 (一)仿真结果

导入可执行文件,点击开始仿真:

按下按键一次:

按下第二次:

……依次到第九次,数字到9:

(二)连接电路

注意排线的接线方式,否则数码管会显示错误:

(三)烧录并观察实验现象

烧录后,实验现象如下,按下按键:

再次按下按键,数字变为2:

……依次,按第九次按键,显示数字9:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。