使用定时器中断动态显示8位数码管。基于定时器的八位数字显示器实验电路如图所示。
分析: 要动态显示8位数码管,其数据的刷新频率应不低于50Hz(0.02S),也就是说每位数据的刷新时间应小于2.5ms(0.02S/8)。使用定时器T1以定时1ms,当定时器溢出中断时,刷新数据位。其程序在结构上可分为三大部分:主函数等、定时器中断服务函数、初始化函数。下面依次介绍各个部分。
1.主函数等
主函数前面这部分程序主要包括基本的IO口定义、全局变量定义、头文件包含、函数声明等。主函数首先调用初始化函数,对各个资源进行初始化操作,然后等待中断发生。
#define user_test//测试用
typedef unsigned char uint8;
typedef unsigned short int uint16;
uint8 LED_Code_buf[8];
uint8 Disply_temp;
sfr LED_Date=0xa0;//user P2
void main(void)
{
Int_Initialize();
Other_Initialize();
while(1)
{
}
}
2.定时器T1中断服务函数
定时器T1中断服务函数主要是刷新显示数据位,根据条件每次刷新一位数码管。
//8位数码管动态显示
void Timer1 (void) interrupt 3 using 1
{
//1ms 刷新1次
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
switch(Disply_temp++)
{
case 0:
LED_Date=LED_Code_buf[0];//显示高位
break;
case 1:
LED_Date=LED_Code_buf[1];
break;
case 2:
LED_Date=LED_Code_buf[2];
break;
case 3:
LED_Date=LED_Code_buf[3];
break;
case 4:
LED_Date=LED_Code_buf[4];
break;
case 5:LED_Date=LED_Code_buf[5];
break;
case 6:
LED_Date=LED_Code_buf[6];
break;
case 7:
LED_Date=LED_Code_buf[7];//显示低位
break;
default:
Disply_temp=0;
break;
}
}
3.初始化函数
初始化函数包括中断初始化函数和其它资源的初始化函数。中断初始化函数配置了中断的触发方式,是否允许中断等操作。其它资源初始化函数主要配置开机显示的字符。
void Int_Initialize(void)
{
TMOD|=0x10;//T1计数模式,方式1
//1ms 刷新1次 12MHz晶振
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
EA=1;
ET1=1;
TR1=1;
}
//其它初始化函数
void Other_Initialize(void)
{
//显示87654321
LED_Code_buf[0]=0x08;//最高位处理
LED_Code_buf[1]=0x17;
LED_Code_buf[2]=0x26;
LED_Code_buf[3]=0x35;
LED_Code_buf[4]=0x44;
LED_Code_buf[5]=0x53;
LED_Code_buf[6]=0x62;
LED_Code_buf[7]=0x71;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
显示器
+关注
关注
21文章
5021浏览量
140521 -
数码管
+关注
关注
32文章
1887浏览量
91491 -
中断
+关注
关注
5文章
900浏览量
41838 -
定时器
+关注
关注
23文章
3256浏览量
115514 -
IO口
+关注
关注
3文章
170浏览量
24245
发布评论请先 登录
相关推荐
八位数码管的相关资料推荐
我们在了解八位数码管的时候,提到了定时器的概念,因为后面很多情况都会涉及到,所以就来认真学习一下啦基本介绍MCS51系列的单片机通常有2个16位可编程定时/计数
发表于 12-01 08:16
评论