新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > 51單片機 定時器 流水燈 數(shù)碼管計時

51單片機 定時器 流水燈 數(shù)碼管計時

作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
這個就是前面的歷程的一個綜合定時器T0控制流水燈,T1控制時間,通過數(shù)碼管顯示出來。

代碼如下:

本文引用地址:http://m.butianyuan.cn/article/201611/321309.htm

//Led流水燈,五位數(shù)碼管100000秒計時
#include //頭文件
#include //循環(huán)左旋函數(shù)所在頭文件
#define uint unsigned int //宏定義無符號整形
#define uchar unsigned char //宏定義無符號字符型
sbit weixuan=P2^7; //聲明P2.7為位選端口
sbit duanxuan=P2^6; //聲明P2.6為段選端口
uint number1,number2,aa,number; //number1:T0計滿次數(shù);number2:T1計滿次數(shù);number:顯示的秒數(shù);aa:P0端口顯示賦值
uint no1,no2,no3,no4,no5; //分別代表五個數(shù)碼管顯示的數(shù)字(字符斷碼數(shù)字序號)
void delay(uint); //聲明延時函數(shù)
void display(uint,uint,uint,uint,uint); //聲明數(shù)碼管顯示函數(shù)
uchar code table[]={ //字符斷碼
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //C語言編碼定義

void main() //主函數(shù)入口
{
aa=0xfe; //aa初始化,點亮第一的LED
//定時器初始化
TMOD=0x11; //TMOD賦值,確定T0/T1工作方式
TH0=(65536-46080)/256;//TH0/TL0;TH1/TL1計算初值
TL0=(65536-46080)%6;
TH1=(65536-46080)/256;
TL1=(65536-46080)%6;
EA=1; //總中斷打開
ET0=1; //開T0/T1中斷
ET1=1;
TR0=1; //TR0/TR1置位,啟動定時器
TR1=1;
while(1) //不可少的大循環(huán)
{
display(no1,no2,no3,no4,no5); //數(shù)碼管顯示
}
}
//延時函數(shù)主體
void delay(uint s)
{
uint i,j;
for(i=s;i>0;i--)
{
for(j=110;j>0;j--)
{
}
}
}
//顯示數(shù)碼管顯示函數(shù)主體
void display(uint no1,uint no2,uint no3,uint no4,uint no5) //數(shù)碼管顯示函數(shù)主體
{
//數(shù)碼管1顯示 ①送斷碼;②選擇要顯示數(shù)碼管
duanxuan=1; //打開段選鎖存器
P0=table[no5]; //送斷碼
duanxuan=0; //關(guān)閉(鎖住)鎖存器
P0=0xff; //必不可少的清屏
weixuan=1; //打開位選鎖存器
P0=0xfe; //選擇數(shù)碼管
weixuan=0; //關(guān)閉鎖存器
delay(2); //延時
//數(shù)碼管2顯示
duanxuan=1;
P0=table[no4];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xfd;
weixuan=0;
delay(2);
//數(shù)碼管3顯示
duanxuan=1;
P0=table[no3];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xfb;
weixuan=0;
delay(2);
//數(shù)碼管4顯示
duanxuan=1;
P0=table[no2];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xf7;
weixuan=0;
delay(2);
//數(shù)碼管5顯示
duanxuan=1;
P0=table[no1];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xef;
weixuan=0;
delay(2);
}
//定時器T0方式一中斷服務程序
void T0_time_no1() interrupt 1
{
TH0=(65536-46080)/256; //預裝初始值
TL0=(65536-46080)%6;
number1++; //number1判斷計滿次數(shù),4次為200ms
if(number1==4)
{
number1=0;
aa=_crol_(aa,1); //循環(huán)左旋函數(shù),把aa左旋之后賦值給aa
P1=aa; //P1顯示流水燈
}
}
//定時器T1方式一中斷服務程序
void T1_time_no1() interrupt 3
{
TH1=(65536-46080)/256; //預裝初始值
TL1=(65536-46080)%6;
number2++; //用于判斷T1計滿次數(shù)
if(number2==4) //number2=20,就是1s時間
{
number2=0;
number++; //用于裝總數(shù)字
no5=number/10000; //把一個5位數(shù)分離出來給五個數(shù)碼管顯示
no4=number000/1000;
no3=number00/100;
no2=number0/10;
no1=number;
if(number==1000000) //達到最大值100000,重新開始計時
{
number=0;
}
}
}

以上,結(jié)束。



評論


技術(shù)專區(qū)

關(guān)閉