欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2805|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

STC12C5A60S2單片機(jī)pwm可調(diào)之旋轉(zhuǎn)編碼器動(dòng)態(tài)賦值問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:254747 發(fā)表于 2019-8-9 23:14 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
經(jīng)過(guò)不斷的努力調(diào)試  現(xiàn)在程序基本可以動(dòng)態(tài)賦值給定時(shí)器了 可以實(shí)現(xiàn)連續(xù)可調(diào)頻率   但是需要把定時(shí)器重裝初值的過(guò)程放到 旋轉(zhuǎn)編碼器的函數(shù)里面才可以 “  //  pinlvgengxin(Sd_Key_Value );”就是這個(gè)函數(shù)我放里面就能正常工作      如果通過(guò)旋轉(zhuǎn)編碼器的返回值來(lái)賦值的話,就不能正常工作了,請(qǐng)問(wèn)有什么辦法解決嗎  單片機(jī)程序如下
  1. #include <STC12C5A60S2.H>
  2. #define FOSC 18432000
  3. unsigned char  Data_key();
  4. unsigned int TH,TL;XHZ;          //xhz在下面算出來(lái)的時(shí)候是一個(gè)長(zhǎng)整形的數(shù)所以用 long
  5. unsigned char  Last_Bmb_Status;      //上一個(gè)B口的狀態(tài)
  6. unsigned char  Curent_Bmb_Status;  //當(dāng)前的狀態(tài)
  7. unsigned char   Sd_flag=10;              //按鍵被轉(zhuǎn)動(dòng),標(biāo)志位,初始狀態(tài)為0;     flag不是C語(yǔ)句的關(guān)鍵語(yǔ)言,可以是其它名字,但是在語(yǔ)句里面主要起
  8.                                            //暫停程序,轉(zhuǎn)去執(zhí)行其它程序的作用,在當(dāng)前狀態(tài)要做一個(gè)標(biāo)記,故用標(biāo)志這個(gè)單詞;
  9. unsigned char  Sd_Key_Value;        //   鍵值  初始值為0
  10. sbit    BUZ=P3^0;
  11. sbit    Pin_Portry_A=P2^4;
  12. sbit    Pin_Portry_B=P2^3;      //編碼器三個(gè)腳的定義,sd為開(kāi)關(guān)按鍵,sd為按下的縮寫(xiě)單詞;
  13. sbit    Pin_Portry_Sd=P2^2;
  14. sbit    LED=P3^7;
  15. void    pinlvgengxin(unsigned char x );

  16. /*
  17. void delay1_key_ms(unsigned int xms)          //表示在key.c這個(gè)文件中使用的延時(shí)函數(shù)
  18. {                                       
  19.      unsigned int i,j;                                         
  20.          for(i=xms;i>0;i--)
  21.            for (j=960;j>0;j--);
  22. }  */


  23. static void   Timer0Init(void)        
  24. {


  25.          XHZ=10;
  26.     AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
  27.     TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  28.     TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  29.         TH0 =TH=(65536-18432000/((unsigned long)XHZ*256))/256;                //設(shè)置定時(shí)初值
  30.     TL0 =TL=(65536-18432000/((unsigned long)XHZ*256))%256;                //設(shè)置定時(shí)初值
  31.         TF0 = 0;                //清除TF0標(biāo)志
  32.         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)        
  33.         EA=1;
  34.         ET0=1;
  35. }

  36. void main()
  37. {
  38.         Timer0Init();
  39.     CCON = 0;                       
  40.     CL = 0;                        
  41.     CH = 0;
  42.     CMOD = 0x04;                    
  43.     CCAP0H = CCAP0L = 0x80;         //PWM0 port output 50% duty cycle square wave
  44.     CCAPM0 = 0x42;                  //PCA module-0 work in 8-bit PWM mode and no PCA interrupt
  45.          
  46.     CCAP1H = CCAP1L = 0x80;         //PWM1 port output 0% duty cycle square wave
  47.     PCA_PWM1 = 0x00;
  48.     CCAPM1 = 0x42;
  49.     CR = 1;                         //PCA timer start run

  50.     while (1)
  51.         {
  52.                
  53.            pinlvgengxin(Data_key() );
  54.             
  55.          }  

  56. }

  57. void  pinlvgengxin(unsigned char x )

  58. {

  59.                  
  60.                  TR0=0;
  61.                 XHZ=x;//Sd_Key_Value;//把Sd_Key_Value每次變化的值寫(xiě)XHZ
  62.          TH0 =TH=(65536-18432000/((unsigned long)XHZ*256))/256;                //設(shè)置定時(shí)初值
  63.          TL0 =TL=(65536-18432000/((unsigned long)XHZ*256))%256;                //設(shè)置定時(shí)初值
  64.                  TR0=1;
  65.                  
  66.         
  67. }  




  68. /*按鍵函數(shù)*/
  69. unsigned char  Data_key()
  70. {
  71.         
  72.            Last_Bmb_Status=Pin_Portry_B; //第一步讀出B口的值,b口接在P2.1上面的,上電后單片機(jī)默認(rèn)高電平,故B口也是高電平;
  73.         while(!Pin_Portry_A)  //當(dāng)A口等于0表示,開(kāi)個(gè)被轉(zhuǎn)動(dòng),然后while取反為1,此時(shí)為真進(jìn)入while語(yǔ)句,
  74.         {
  75.            Sd_flag=1;
  76.            Curent_Bmb_Status=Pin_Portry_B;//在把B口的值保存為當(dāng)前狀態(tài)加以判斷;
  77.                                    //當(dāng)flag為1的時(shí)候,表示開(kāi)個(gè)被旋動(dòng)過(guò);
  78.         }

  79.         if(1== Sd_flag)  
  80.         {                                       
  81.             Sd_flag=0;     //開(kāi)關(guān)旋動(dòng)標(biāo)志位清0      
  82.                     

  83.         if((0==Last_Bmb_Status)&&(1==Curent_Bmb_Status))  //順時(shí)針旋轉(zhuǎn)   如果Last __Bmb__Status=0,并且Curent__Bmb__Status=1;
  84.         {                                                                                                   //的時(shí)候滿足條件,也就是if(0,1),故B口當(dāng)前為(0,1)狀態(tài)為順時(shí)針模式
  85.         
  86.            
  87.            if(Sd_Key_Value<255)          //判斷Sd_Key_Value是否小于225,如果是自++1
  88.               {
  89.                   Sd_Key_Value++;
  90.                         
  91.               }
  92.           else                                         //否則
  93.              {
  94.                   Sd_Key_Value=0;   //如果大于255的時(shí)候就 清0;防止溢出;
  95.                         
  96.              }
  97.            }
  98.             
  99.         if((1==Last_Bmb_Status)&&(0==Curent_Bmb_Status))  //逆時(shí)針旋轉(zhuǎn)    如果Last __Bmb__Status=1,并且Curent__Bmb__Status=0;
  100.         {                                                                                                   //的時(shí)候滿足條件,也就是if(1,0),故B口當(dāng)前為(1,0)狀態(tài)為逆時(shí)針模式
  101.         
  102.            
  103.           if(Sd_Key_Value>0)       //判斷Sd_Key_Value是否大于255.如果大于就--1
  104.             {
  105.                     Sd_Key_Value--;
  106.                  
  107.             }
  108.          else                                    //否則
  109.             {
  110.              Sd_Key_Value=255;   //如果小于0的時(shí)候就給 Sd__Key___Value賦值為255.
  111.                           
  112.             }
  113.          
  114.          }
  115.            //  pinlvgengxin(Sd_Key_Value );
  116.                  


  117.         
  118.     }

  119.    return  Sd_Key_Value;    //把Sd_Key_Value的值返回到unsigned char  Data_key()函數(shù)里面  
  120.                             //在調(diào)用unsigned char  Data_key()這個(gè)函數(shù)的時(shí)候就相當(dāng)于是調(diào)用
  121.                                                         //這個(gè)Sd_Key_Valued的實(shí)時(shí)值
  122. }





  123. void tm0_isr() interrupt 1 using 1
  124. {
  125.          

  126.      TH0 =TH;                //設(shè)置定時(shí)初值
  127.      TL0 =TL;                //設(shè)置定時(shí)初值
  128. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:401564 發(fā)表于 2019-8-10 09:16 | 只看該作者
1,編碼開(kāi)關(guān)設(shè)定為1mS左右的中斷,在定時(shí)器的中斷程序中判斷編碼開(kāi)關(guān)是正轉(zhuǎn)動(dòng)還是反轉(zhuǎn)動(dòng)
2,設(shè)定一個(gè)變量,進(jìn)入定時(shí)器中斷一次就減1,編碼開(kāi)關(guān)有效轉(zhuǎn)動(dòng)一次就賦值一次,可以是100或者200之類的,這樣一來(lái)就可以實(shí)現(xiàn):只要你編碼開(kāi)關(guān)還在轉(zhuǎn)動(dòng),這個(gè)變量就一直在賦值,當(dāng)編碼開(kāi)關(guān)不再轉(zhuǎn)動(dòng),也要進(jìn)入定時(shí)器中斷很多次才能讓這個(gè)變量為0
3,寫(xiě)入PWM要先查詢之前設(shè)定的變量,不為0就不寫(xiě)入
回復(fù)

使用道具 舉報(bào)

板凳
ID:254747 發(fā)表于 2019-8-10 11:22 | 只看該作者
Y_G_G 發(fā)表于 2019-8-10 09:16
1,編碼開(kāi)關(guān)設(shè)定為1mS左右的中斷,在定時(shí)器的中斷程序中判斷編碼開(kāi)關(guān)是正轉(zhuǎn)動(dòng)還是反轉(zhuǎn)動(dòng)
2,設(shè)定一個(gè)變量 ...

非常感謝您的回答   我去嘗試一下  那我就需要在開(kāi)一個(gè)定時(shí)器了哦  因?yàn)槎〞r(shí)器0的溢出是隨時(shí)發(fā)生變化的
回復(fù)

使用道具 舉報(bào)

地板
ID:401564 發(fā)表于 2019-8-10 16:20 | 只看該作者
不將就123 發(fā)表于 2019-8-10 11:22
非常感謝您的回答   我去嘗試一下  那我就需要在開(kāi)一個(gè)定時(shí)器了哦  因?yàn)槎〞r(shí)器0的溢出是隨時(shí)發(fā)生變化的

是要在定時(shí)器中斷程序里面檢測(cè)編碼開(kāi)關(guān)的有效與否,定時(shí)器中斷設(shè)定在1mS或者是2mS,這樣的話就不會(huì)丟碼了,而且,編碼開(kāi)關(guān)各類是有幾種的,就算是一樣的型號(hào),編碼有效的確認(rèn)方式也是不同的
像我用的EC11就有兩種:步數(shù)是一樣的,一種是:編碼開(kāi)關(guān)停止轉(zhuǎn)動(dòng)之后,兩邊的引腳和中間的引腳是固定為短路狀態(tài)的。
另一種是:編碼開(kāi)關(guān)停止轉(zhuǎn)動(dòng)之后,有時(shí)候是短路,有時(shí)候是開(kāi)路
所以,你要先確定好你的開(kāi)關(guān)是哪種的的,但如果你的代碼現(xiàn)在已經(jīng)能用了,就說(shuō)明已經(jīng)對(duì)了
回復(fù)

使用道具 舉報(bào)

5#
ID:254747 發(fā)表于 2019-8-12 13:59 | 只看該作者
Y_G_G 發(fā)表于 2019-8-10 16:20
是要在定時(shí)器中斷程序里面檢測(cè)編碼開(kāi)關(guān)的有效與否,定時(shí)器中斷設(shè)定在1mS或者是2mS,這樣的話就不會(huì)丟碼了 ...

哎呀  非常 改下您的解答 ,目前所有的問(wèn)題已經(jīng)得到了解決  
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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