新聞中心

        萬能PWM子程序

        作者: 時間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
        #include

        #define uchar unsigned char
        #define uint unsigned int
        #define OUT PORTA
        uint high;
        uint tatal;//定義位數(shù)所對應(yīng)的滿克度計數(shù)值
        uchar data[5];//顯示占空比
        uchar data0[4];//顯示頻率
        uchar keyadd,keysub;//定義按鍵
        void output1(uint t);//處理占空比
        void output2(void);//處理顯示的頻率
        void add_sub(void);//加減函數(shù)
        void DelayMs(uint i);//0.25ms
        void display(uchar *p);//數(shù)碼管掃描函數(shù)
        /**************************************************************************/
        void DelayMs(uint i)//0.25ms
        {uchar j;
        for(;i!=0;i--)
        {for(j=250;j!=0;j--) {;}}
        }
        /*************************************************************************/
        void display(uchar *p)//數(shù)碼管掃描函數(shù)
        {
        OUT=0x70+p[0]; DelayMs(15);
        OUT=0xb0+p[1]; DelayMs(15);
        OUT=0xd0+p[2]; DelayMs(15);
        OUT=0xe0+p[3]; DelayMs(15);
        }
        /*************往比較寄存器賦值*********************************************/
        /*8位時計數(shù)值為255;9位時為512;10位時1024;*******************************/
        void set(uint a)//實(shí)現(xiàn)雙路,雙路賦同樣的值
        {OCR1AH=a>>8;OCR1BH=a>>8;
        OCR1AL=a&0x00ff;OCR1BL=a&0x00ff;
        }
        /*************************************************************************/
        /*************************************************************************/
        void output1(uint t)//處理占空比的顯示//此處的t為數(shù)據(jù)寄存器所存放的值
        {uint counter;
        unsigned long j;
        j=(float)t*10000;
        counter=j/tatal;
        data[0]=counter/1000;
        counter=counter%1000;
        data[1]=counter/100;
        counter=counter%100;
        data[2]=counter/10;
        data[3]=counter%10;
        PORTB=0;
        }
        /*************************************************************************/
        /*************************************************************************/
        void output2(void)//處理顯示的頻率
        {uint i=1,jk,k;//定義i為位數(shù)所對應(yīng)要處理的值,,,定義jk為分頻所對應(yīng)的值
        uint counter;
        if((TCCR1A&0X03)==1)
        {i=510;tatal=255;}
        else if((TCCR1A&0X03)==2)
        {i=1022;tatal=511;}
        else if((TCCR1A&0X03)==3)
        {i=2046;tatal=1023;}

        if((TCCR1B&0x07)==5)
        jk=1024;
        else if((TCCR1B&0x07)==4)
        jk=256;
        else if((TCCR1B&0x07)==3)
        jk=64;
        else if((TCCR1B&0x07)==2)
        jk=8;
        else if((TCCR1B&0x07)==1)
        jk=1;
        counter=8000000/i;//選擇幾位所對應(yīng)的值//8000000對應(yīng)該M晶振
        counter=counter/jk;//選擇幾分頻
        data0[0]=counter/1000;
        counter=counter%1000;
        data0[1]=counter/100;
        counter=counter%100;
        data0[2]=counter/10;
        data0[3]=counter%10;
        PORTB=0XFF;
        }
        /*************************************************************************/
        /*********************按鍵電路********************************************/
        void add_sub(void)
        {//調(diào)節(jié)下面的例50的值可以改變每次要加的值,也就增減速度;
        while((PINC&0X01)==0) {keyadd=1;display(data);}
        if(keyadd==1){high+=50;keyadd=0;}
        while((PINC&0X02)==0) {keysub=1; display(data);}
        if(keysub==1){high-=50;keysub=0;}
        if(high>tatal)
        high=tatal-1;
        else if(high<51)
        high=51;
        }
        /***********************************************************************/
        /***********************************************************************/
        void main(void)
        {uchar i;
        DDRD=0XFF;//當(dāng)用使用PWM輸出時,必順要對其端口進(jìn)行初使化
        PORTD=0XFF;
        DDRB=0XFF;//
        PORTB=0XFF;
        DDRC=0X00;//口作為鍵盤輸入,
        PORTC=0XFF;//初使化
        DDRA=0XFF;
        OUT=0X00;//IO口初使化;
        DelayMs(150);
        //TCCR1A=0XE3;//雙路PWM
        TCCR1A=0X82;//在OC1A腳輸出 向上配匹時置位,向下匹配時清零 后二位為脈寬調(diào)制方式
        //01:8位 10:9位 11:10位
        TCCR1B=0X03;//001:1分頻 010:8分頻 011:64分頻 100:256分頻;101:1024分頻
        high=500;//高電平所占用時間
        output1(high);//處理占空比
        output2();//處理頻率
        high=tatal/2;
        /******************************************************/
        while(1)
        {
        set(high);
        output1(high);//處理占空比
        for(i=100;i!=0;i--)
        {display(data);add_sub();}//后為加減函數(shù)
        output2();//處理頻率
        for( i=100;i!=0;i--)
        { display(data0);add_sub();}//后加減函數(shù)
        }

        本文引用地址:http://www.104case.com/article/201611/315788.htm

        /*1.由于C語言的問題(1)while((PINC&0X01)==0) {keyadd=1;display(data);}
        if(keyadd==1){high+=50;keyadd=0;}
        while((PINC&0X02)==0) {keysub=1; display(data);}
        if(keysub==1){high-=50;keysub=0;}
        上程序中有錯嗎?沒有了,這是我調(diào)試的好的程序,但之前我是這樣寫的:while(PINC&0X01==0) {keyadd=1;display(data);}
        if(keyadd==1){high+=50;keyadd=0;}
        while(PINC&0X02==0) {keysub=1; display(data);}
        if(keysub==1){high-=50;keysub=0;}
        由此我誤了半天時間;------總之就是一個優(yōu)先級的問題,許多理論能過的問題,但實(shí)際就是過不了;
        2關(guān)于if else 的問題;————例如以下程序有問題嗎;
        if((TCCR1A&0X03)==1)
        {i=510;tatal=255;}
        else if((TCCR1A&0X03)==2)
        {i=1022;tatal=511;}
        else if((TCCR1A&0X03)==3)
        {i=2046;tatal=1023;}

        if((TCCR1B&0x07)==5)
        jk=1024;
        else if((TCCR1B&0x07)==4)
        jk=256;
        else if((TCCR1B&0x07)==3)
        jk=64;
        else if((TCCR1B&0x07)==2)
        jk=8;
        else if((TCCR1B&0x07)==1)
        jk=1;
        這程序我調(diào)試的程序;就是開始的時候中間多加了一else;怎么也出不來,就是這是兩程序,也就是說當(dāng)遇到一個執(zhí)行條件時,下面的程序就不在執(zhí)行了,不要像傻子一樣在那死調(diào)程序,重要的能夠找到問題的關(guān)健所在;
        3.經(jīng)調(diào)試驗(yàn)證,定時器的兩PWM能同時運(yùn)行;
        4.就是在程序初使化時初使IO口;這一點(diǎn)也誤了很長一段時間;以后要謹(jǐn)記pwm作為輸出時要初使IO口.*/



        關(guān)鍵詞: 萬能PWM子程

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 昆明市| 邻水| 林周县| 鄄城县| 蒙城县| 喀喇沁旗| 泗洪县| 哈密市| 济阳县| 任丘市| 呼和浩特市| 柏乡县| 盐亭县| 东光县| 德保县| 贵南县| 乐安县| 平利县| 孙吴县| 佛山市| 华池县| 天气| 友谊县| 建瓯市| 永康市| 克什克腾旗| 嘉鱼县| 嘉禾县| 蒙城县| 台湾省| 陇川县| 深圳市| 临沂市| 曲阳县| 兴海县| 句容市| 隆德县| 太白县| 明溪县| 黄冈市| 宁强县|