使用定時器中斷動態顯示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文章
5009瀏覽量
140279 -
數碼管
+關注
關注
32文章
1883瀏覽量
91340 -
中斷
+關注
關注
5文章
900瀏覽量
41655 -
定時器
+關注
關注
23文章
3255瀏覽量
115182 -
IO口
+關注
關注
3文章
170瀏覽量
24140
發布評論請先 登錄
相關推薦
八位數碼管的相關資料推薦
我們在了解八位數碼管的時候,提到了定時器的概念,因為后面很多情況都會涉及到,所以就來認真學習一下啦基本介紹MCS51系列的單片機通常有2個16位可編程定時/計數
發表于 12-01 08:16
評論