很多新手在單片機(jī)上走的第一步是點(diǎn)亮第一個(gè)LED燈,實(shí)際上因?yàn)殚_(kāi)發(fā)板的不同,所編寫(xiě)的代碼也不同,關(guān)鍵是你要去了解你用的開(kāi)發(fā)板的電路布局。對(duì)于電路方面的知識(shí)我這里也不詳講,我要做的是無(wú)論你用哪一種開(kāi)發(fā)板我的文章都能幫助你。
P0 = 0xFE;
這句代碼大家不陌生。
void main(){
unsigned char count = 0;
while(1){
P0 = ~(0x01 << count);
Delay();//單獨(dú)實(shí)現(xiàn)一個(gè)延時(shí)函數(shù)
count++;
if(count > =8){
count = 0;
}
}
}
以上就是實(shí)現(xiàn)流水燈的基本代碼,這里沒(méi)有電路供你分析,但是無(wú)論什么開(kāi)發(fā)板,核心代碼可以用以上代碼實(shí)現(xiàn)。
我相信你能看到這里也是有點(diǎn)基礎(chǔ)的,這里的延時(shí)函數(shù)Delay,接下來(lái)要講的是定時(shí)器,定時(shí)器就是可以替代延時(shí)函數(shù)的。
定時(shí)器
標(biāo)準(zhǔn)的51單片機(jī)內(nèi)部有T0和T1兩個(gè)定時(shí)器,實(shí)際上就是TCON特殊功能的寄存器來(lái)控制這兩個(gè)定時(shí)器的。
除此之外,定時(shí)值存儲(chǔ)寄存器有TH和TL,給TL賦值后,TL會(huì)自動(dòng)加1,加到255后TH加1,有趣的TH也可以提前賦值,但這只是定時(shí)器工作的一種模式,定時(shí)器有四種模式,這里我不祥講,而且我們幾乎用的模式就是這種,后面涉及到會(huì)詳細(xì)講解。這里只需要知道TCON(地址0x88)位分配,以后會(huì)經(jīng)常用到。
還有一個(gè)TMOC就是定時(shí)器作用的模式,位分配如下圖:
代碼:
void main()
{TH0 = 0xB8; //給TH0賦值,后面的0代表是給定時(shí)器T0的TH賦值
TL0 = 0x00;
TR0 = 1;//啟動(dòng)T0定時(shí)器
if(TF0 == 1) //判斷T0是否溢出,TF是個(gè)標(biāo)志位
{ //重置
TH0 = 0xB8;
TL0 = 0x00;}}
以上就是定時(shí)器,時(shí)間多少呢?
我們以晶振位11.0592為例,時(shí)鐘周期是1/11059200,機(jī)器周期(1ms)12/11059200,如果我們定時(shí)20ms,那個(gè)要執(zhí)行20*(12/110592)次,算出來(lái)是18432次,換成十六進(jìn)制是B800,所以對(duì)TH0賦值B8,對(duì)TL0賦值00;
#include
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main() {
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 1;
ADDR3 = 1;
ENLED = 0;
P0 = 0XF8;
while(1);}
上面代碼是用位STC-51開(kāi)發(fā)板寫(xiě)的,在最后一個(gè)數(shù)碼管上顯示數(shù)字7,數(shù)碼管難度簡(jiǎn)單,只需要針對(duì)數(shù)碼管等的排布編程即可。
下面我們用關(guān)鍵字code定義數(shù)碼管所能夠顯示所有字符的數(shù)組,這里再結(jié)合定時(shí)器一起。
#include
//數(shù)組
unsigned char code led[] =
{ 0xC0, 0xF9, 0xA4,
0xB0, 0x99, 0x92,
0x82, 0xF8, 0x80,
0x90, 0x88, 0x83,
0xC6, 0xA1, 0x86,0x8E};
void main() { unsigned char count = 0;
//記錄T0中斷次數(shù)
unsigned char secnt = 0;
//記錄經(jīng)過(guò)的秒數(shù)
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 0;
ADDR3 = 1;
ENLED = 0;
//設(shè)置T0模式
TMOD = 0x01;
//為T0的TH0,TL0初始化
TH0 = 0xB8;
TL0 = 0x00;
//啟動(dòng)T0 TR0 = 1;
while(1){
if(TF0 ==1)
{ TH0 = 0xB8;
TL0 = 0x00;
count++;
TF0 = 0; }
if(count >=50)
{ count = 0;
P0 = led[secnt];
secnt++;
if(secnt>=16)
{ secnt = 0; } } }}
這里代碼比較緊湊,不過(guò)不影響。上面的代碼我相信你也能懂,但是你能發(fā)現(xiàn)定時(shí)器在這里起到了一個(gè)定時(shí)中斷的作用。
這里講一下中斷。
中斷
下面是中斷IE寄存器位分配圖:
直接上代碼:
#include
//數(shù)碼管顯示字符真值數(shù)組
unsigned char code ledchar[]=
{0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90,
0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E };
//數(shù)碼管顯示區(qū)數(shù)組
unsigned char ledbuff[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;sbit ENLED = P1^4;
unsigned char i = 0;
//動(dòng)態(tài)掃描索引
unsigned int c = 0;
//記錄中斷次數(shù)
void main() {
unsigned long s = 0;
//記錄秒數(shù)
//使能U3
ADDR3 = 1;
ENLED = 0;
//設(shè)置T0模式
TMOD = 0x01;
//初始化TH0,TL0
TH0 = 0xFC; TL0 = 0x66;
//啟動(dòng)TR0
TR0 = 1;
//使能總中斷
EA = 1;
//使能T0中斷
ET0 = 1;
//主循環(huán)
while(1) { //1s中斷 if(c>=1000) { s++; c=0; //為數(shù)碼管顯示區(qū)賦值 ledbuff[0] = ledchar[s%10]; ledbuff[1] = ledchar[s/10%10]; ledbuff[2] = ledchar[s/100%10]; ledbuff[3] = ledchar[s/1000%10]; ledbuff[4] = ledchar[s/10000%10]; ledbuff[5] = ledchar[s/100000%10]; } }}
//定時(shí)器T0中斷服務(wù)void InterruptTimer0() interrupt 1{ //重新賦值 TH0 = 0xFC; TL0 = 0x66; c++; //顯示消隱 P0 = 0xFE; //完成數(shù)碼管動(dòng)態(tài)掃描 switch(i) { case 0: ADDR2 = 1;ADDR1 = 0; ADDR0 = 1; i++; P0 = ledbuff[0]; break;
case 1: ADDR2 = 1;ADDR1 = 0; ADDR0 = 0;i++; P0 = ledbuff[1]; break;
case 2: ADDR2 = 0;ADDR1 = 1; ADDR0 = 1;i++; P0 = ledbuff[2]; break;
case 3: ADDR2 = 0;ADDR1 = 1; ADDR0 = 0; i++; P0 = ledbuff[3]; break;
case 4: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1;i++; P0 = ledbuff[4]; break;
case 5: ADDR2 = 0;ADDR1 = 0; ADDR0 = 0;i=0; P0 = ledbuff[5]; break; default:break;
}
}
這組代碼能夠按照我們計(jì)算好的時(shí)間為單位顯示秒數(shù)。
我們能夠提出中斷核心代碼
EA = 1//中斷總開(kāi)關(guān)
ET0 = 1//確認(rèn)使用T0定時(shí)器中斷開(kāi)關(guān)
TR0 = 1//肯定要啟動(dòng)T0定時(shí)器
void InterruptTimer0() interrupt 1//定時(shí)器T0中斷服務(wù),中斷代碼寫(xiě)在這里面,至于interrupt 1是因?yàn)閕nterrupt會(huì)去尋找地址' 1 ',而T0定時(shí)器中斷的地址就是1,所以我們可以直接在此函數(shù)中寫(xiě)中斷期間的代碼。至于各種中斷的地址我也不再這里多寫(xiě)了。值得一談的是IP——中斷優(yōu)先級(jí)寄存器位分配
各級(jí)中斷都差不多,中斷發(fā)生的也很多,當(dāng)同時(shí)有許多中斷發(fā)生時(shí),可以通過(guò)置上面的值為1升級(jí)成優(yōu)先級(jí)中斷。
-
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1882瀏覽量
91255 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3251瀏覽量
115024
原文標(biāo)題:?jiǎn)纹瑱C(jī)定時(shí)器與數(shù)碼管靜態(tài)顯示
文章出處:【微信號(hào):mcugeek,微信公眾號(hào):MCU開(kāi)發(fā)加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論