找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6370|回復(fù): 0
收起左側(cè)

學(xué)完中斷和定時(shí)器寫的一個(gè)程序

[復(fù)制鏈接]
ID:80436 發(fā)表于 2015-5-22 00:23 | 顯示全部樓層 |閱讀模式

/*此程序是實(shí)現(xiàn)的功能是8路流水燈以1Hz的頻率閃動(dòng),數(shù)碼管2Hz的頻率靜態(tài)顯示1到F。我用了定時(shí)器實(shí)現(xiàn)2秒數(shù)碼管精確延時(shí),用delay函數(shù)(即用軟件的方法,讓CPU無聊的做著自減運(yùn)算耗時(shí)間。呵呵)實(shí)現(xiàn)1秒延時(shí)。程序運(yùn)行時(shí),LED走倆個(gè),數(shù)碼管變化一個(gè)數(shù),就是這么簡單功能,但就是這么簡單的功能耗了我兩個(gè)小時(shí)呢,慚愧。之前沒用到中斷和定時(shí)器的功能。
#include<reg52.h>
#include<intrins.h>//這個(gè)函數(shù)很給力。
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,num;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay(uint z);
void main()
{
        num=0;
        aa=0;
        TMOD=0x01;/
        TH0=(65536-50000)/256;//裝初值
        TL0=(65536-50000)%256;
        EA=1;//總中斷開
        ET0=1;
        TR0=1;//定時(shí)器置位
        temp=0xfe;
        P1=temp;
    P2=0xfe;
        while(1)
        {
                delay(1000);
                temp=_crol_(temp,1);//只所以不用<<1左移運(yùn)算符是因?yàn)樽笠七\(yùn)算符不是循環(huán)的,用左移的話后面還得寫一串處理函數(shù),來個(gè)intrins.h庫函數(shù),實(shí)現(xiàn)循環(huán)的左移運(yùn)算,暈死,話說這個(gè)指令我下午才學(xué)會,如果要是流水燈方向變換的話很簡單,只要把temp=_crol_(temp,1)換成temp=_cror_(temp,1);就成了,真心便利
                P1=temp;
        }
}


void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}


void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        aa++;
                if(aa==40)
                        {
                                aa=0;
                                num++;
                                if(num==16)
                                        num=0;
                                P0=table[num];
                       
                        }       
}
真心喜歡用C寫程序,方便靈活。匯編神馬的最討厭了。各種麻煩


回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表