在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            萬能PWM子程序

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

            #define uchar unsigned char
            #define uint unsigned int
            #define OUT PORTA
            uint high;
            uint tatal;//定義位數(shù)所對(duì)應(yīng)的滿克度計(jì)數(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í)計(jì)數(shù)值為255;9位時(shí)為512;10位時(shí)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ù)所對(duì)應(yīng)要處理的值,,,定義jk為分頻所對(duì)應(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;//選擇幾位所對(duì)應(yīng)的值//8000000對(duì)應(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輸出時(shí),必順要對(duì)其端口進(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腳輸出 向上配匹時(shí)置位,向下匹配時(shí)清零 后二位為脈寬調(diào)制方式
            //01:8位 10:9位 11:10位
            TCCR1B=0X03;//001:1分頻 010:8分頻 011:64分頻 100:256分頻;101:1024分頻
            high=500;//高電平所占用時(shí)間
            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.biyoush.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;}
            上程序中有錯(cuò)嗎?沒有了,這是我調(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;}
            由此我誤了半天時(shí)間;------總之就是一個(gè)優(yōu)先級(jí)的問題,許多理論能過的問題,但實(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)試的程序;就是開始的時(shí)候中間多加了一else;怎么也出不來,就是這是兩程序,也就是說當(dāng)遇到一個(gè)執(zhí)行條件時(shí),下面的程序就不在執(zhí)行了,不要像傻子一樣在那死調(diào)程序,重要的能夠找到問題的關(guān)健所在;
            3.經(jīng)調(diào)試驗(yàn)證,定時(shí)器的兩PWM能同時(shí)運(yùn)行;
            4.就是在程序初使化時(shí)初使IO口;這一點(diǎn)也誤了很長一段時(shí)間;以后要謹(jǐn)記pwm作為輸出時(shí)要初使IO口.*/



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

            評(píng)論


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

            關(guān)閉