久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7434|回復: 8
打印 上一主題 下一主題
收起左側

stc單片機數碼管顯示旋轉編碼器+pwm輸出源碼

[復制鏈接]
跳轉到指定樓層
樓主
實現功能:
旋轉編碼器按鍵:切換占空比和頻率數碼管顯示編碼器設置的占空比和頻率
單片機輸出根據編碼器設置的占空比和頻率的pwm信號
目前數碼管無法顯示編碼器的數據

電路原理圖如下:



單片機源程序如下:
  1. #include "STC15F2K60S2.H"
  2. #include "intrins.h"
  3. //++++++++++++++pwm輸出
  4. #define        uchar        unsigned char//        0~255,1Byte
  5. #define        uint        unsigned int//0~65535,2Byte
  6. //==變量類型定義區     
  7. uchar  duty=111;//占空比8bit
  8. uchar        rate=11;//頻率
  9. uchar        ratex=0;//顯示"H"
  10. uchar  disp_buffer[]={1,1,1,10,10,1,1,11};//顯示緩沖定義
  11. uchar  led_code[]={0xc0,0xf9,0xa4,0xb0,0x98,0x92,0x82,0xf8,0x80,0x90,0xbf,0x89};//顯示0-9定義
  12. uchar  position[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//八個數碼管定義
  13. uchar                disp_flag[]={0,0,0,0,0,0,0,0};//八個數碼管對應標記
  14. //==位變量區
  15. bit set_flag=0;//按鍵設置標記
  16. //===硬件線路定義
  17. sbit        ECE=P5^5;//編碼器按鍵 ECA
  18. sbit        ECA=P3^2;//編碼器A相
  19. sbit        ECB=P4^0;//B相
  20. sbit  PWM=P3^6;//pwm輸出
  21. sbit  KEY1=P2^6;//預留
  22. sbit  KEY2=P2^7;//預留
  23. //==函數聲明區(函數清單)        
  24. void        display();//函數
  25. void  disp_suju();//顯示緩沖區函數
  26. void delayms(uchar count);//延時函數
  27. void        timer0_init();//定時器初始化函數
  28. void  k1();//編碼器按鍵ECA
  29. void INT_init (void);//外部中斷0
  30. void dutyANDf(duty,rate);//占空比調節函數
  31. //===主函數
  32. void        main()
  33. {               
  34.    while(1)
  35.          {
  36. timer0_init();//定時器函數
  37.         dutyANDf(duty,rate);
  38.                 display();
  39.                  k1();
  40.         INT_init ();
  41.        
  42.          }
  43. }
  44. //==顯示函數定義
  45. void        display()
  46. {                uchar i;
  47.         disp_suju();
  48.   for(i=0;i<8;i++)
  49.   {
  50.         P2=led_code[disp_buffer[i]];
  51.         P0=position[i];
  52.         delayms(1);
  53.         P2=0xff;//熄滅led
  54.         P0=0xff;//關閉led電源
  55.   }
  56. }
  57.        
  58. //顯示數據準備

  59. void  disp_suju()//時鐘程序緩存函數
  60. {
  61.         disp_buffer[0]=duty/100;//占空比百
  62.   disp_buffer[1]=duty%100/10;
  63.         disp_buffer[2]=duty%10;
  64.         disp_buffer[3]=10;//-
  65.         disp_buffer[4]=10;//-
  66.   disp_buffer[5]=rate/10;//頻率十
  67.         disp_buffer[6]=rate%10;//頻率個
  68.         disp_buffer[7]=11;//H       

  69. }                     
  70. void delayms(uchar count)//延時
  71. {
  72.         uchar i,j;
  73.         for(i = 0; i < count; i++)
  74.                 for(j = 0; j < 120; j++);
  75. }                          

  76. void  k1()
  77. {
  78.        
  79.         if(ECE==0)
  80.         {//有按鍵
  81.                 set_flag=0;//頻率
  82.                
  83.         }
  84.         else
  85.                 {
  86.                 set_flag=1;//占
  87.        
  88.         }
  89. }
  90. void  INT_init(void)
  91. {
  92.          EA = 1;  
  93.          EX1 = 1;
  94.          EX0 = 1;
  95.          IT1 = 1;//下降沿觸發
  96.        
  97. }

  98. void exint0() interrupt 0
  99. {               
  100.         if(ECB==0)
  101.         {//正
  102.           if(set_flag==1)//占空比標志
  103.            {
  104.                         duty++;
  105.                         if(duty==255)
  106.                         {
  107.                                 duty=255;
  108.                         }
  109.                         else{;}
  110.                                         display();
  111.                 }
  112.                 else
  113.                 {
  114.                 rate++;
  115.                         if(rate==20)
  116.                                 {
  117.                                 rate=20;
  118.                                 }
  119.                                 else{;}       
  120.                 }
  121.         }
  122.         else
  123.         {               
  124.         //反ecb==1
  125.         if(set_flag==1)//占
  126.                 {duty--;
  127.                         if(duty==1)
  128.                         {        duty=1;
  129.                         }else{;}
  130.        
  131.                 }
  132.                 else
  133.                 {       
  134.                 rate--;
  135.                         if(rate==1)
  136.                         {
  137.                         rate=1;
  138.                         }        display();
  139.                 }
  140.         }

  141.         }

  142. void Timer0Init(void)                //50??@12.000MHz
  143. {
  144.         AUXR &= 0x7F;               
  145.         TMOD &= 0xF0;               
  146.         TL0 = 0xB0;               
  147.         TH0 = 0x3C;               
  148.         TF0 = 0;               
  149.         TR0 = 1;               
  150. }

  151. //-------------------------------------
  152. void        timer0_int()        interrupt        1
  153. {       
  154.         if(ECA==0){
  155.         if(ECB==0)
  156.         {//正
  157.           if(set_flag==1)//占空比標志
  158.            {
  159.                         duty++;
  160.                         if(duty==255)
  161.                         {
  162.                                 duty=255;
  163.                         }
  164.                         else{;}
  165.                                         display();
  166.                 }
  167.                 else
  168.                 {
  169.                 rate++;
  170.                         if(rate==20)
  171.                                 {
  172.                                 rate=20;
  173.                                 }
  174.                                 else{;}       
  175.                 }
  176.         }
  177.         else
  178.         {               
  179.         //反ecb==1
  180.         if(set_flag==1)//占
  181.                 {duty--;
  182.                         if(duty==1)
  183.                         {        duty=1;
  184.                         }else{;}
  185.        
  186.                 }
  187.                 else
  188.                 {       
  189.                 rate--;
  190.                         if(rate==1)
  191.                         {
  192.                         rate=1;
  193.                         }        display();
  194.                 }
  195.         }
  196. }else{;
  197. }
  198. }


  199. void dutyANDf(uchar duty,uchar f)
  200. {
  201.         int Xt1,Xt0;
  202.         float t1,t0;
  203.         uchar h1,l1,h0,l0;
  204.         t1=duty/f;                           
  205.         t0=(1/f)-t1;                     
  206.         Xt1=256-1000000*t1;        
  207.         Xt0=256-1000000*t0;;  
  208.         TMOD=0X01;
  209.         TR0=1;
  210.         h1=(uchar)(Xt1>>4);   
  211.         h0=(uchar)(Xt0>>4);   
  212.         l0=(uchar)Xt0;               
  213.         while(1)
  214.         {
  215.                         TH0=h1;
  216.                         TL0=l1;
  217.                         do{}while(!TF0);        
  218.                         PWM=!PWM;                       
  219.                         TF0=0;
  220.                         TH0=h0;
  221.                         TL0=l0;
  222.                         do{}while(!TF0);
  223.                         PWM=1;
  224.                         TF0=0;                  
  225.                                 
  226.         }
  227.                
  228. }
復制代碼

所有資料51hei提供下載:
編碼.rar (7.93 KB, 下載次數: 77)


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

使用道具 舉報

沙發
ID:415603 發表于 2018-11-7 16:34 | 只看該作者
QQ:求大神指教1476538664
回復

使用道具 舉報

板凳
ID:72649 發表于 2018-11-8 13:22 來自手機 | 只看該作者
給你一個參考代碼可以嗎?
回復

使用道具 舉報

地板
ID:72649 發表于 2018-11-8 13:24 來自手機 | 只看該作者
中斷里面要軟件清零
回復

使用道具 舉報

5#
ID:415603 發表于 2018-11-8 15:32 | 只看該作者
hjx5548 發表于 2018-11-8 13:22
給你一個參考代碼可以嗎?

可以啊非常感謝
回復

使用道具 舉報

6#
ID:415603 發表于 2018-11-8 15:34 | 只看該作者
hjx5548 發表于 2018-11-8 13:24
中斷里面要軟件清零

int0是不是沒有正常工作,感覺數碼管顯示沒有接受到旋轉編碼器的duty,rate的值
回復

使用道具 舉報

7#
ID:401564 發表于 2018-11-8 18:58 | 只看該作者
編碼器不 是應該有一個引腳要接地的嗎?
回復

使用道具 舉報

8#
ID:415603 發表于 2018-11-8 21:27 | 只看該作者
Y_G_G 發表于 2018-11-8 18:58
編碼器不 是應該有一個引腳要接地的嗎?

在電路上接了
回復

使用道具 舉報

9#
ID:164336 發表于 2020-11-17 20:19 | 只看該作者
求大神指教
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区四区五区午夜 | 亚洲高清视频一区二区 | www.日本国产| 国产精品久久二区 | 国产精品特级片 | a中文在线视频 | 中文字幕日韩欧美 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 亚洲精品福利视频 | 在线观看亚洲欧美 | av手机免费在线观看 | 久久精品国产亚洲一区二区 | 久久久999免费视频 999久久久久久久久6666 | 成人影院av | 国产你懂的在线观看 | 成人二区 | 一级毛片在线播放 | 成年网站在线观看 | 麻豆视频在线免费看 | 最新日韩av| 成人欧美一区二区三区在线观看 | 国产精品久久久一区二区三区 | 国产一区二区三区四区五区加勒比 | 欧美日韩国产中文 | 五月综合激情婷婷 | 国产精品久久久久影院色老大 | 欧洲精品在线观看 | 91操操操 | 国产做a爱免费视频 | 91av大全 | 欧美色影院 | 男女免费观看在线爽爽爽视频 | 欧美极品视频 | 一级大片网站 | 午夜小视频在线观看 | 视频二区国产 | 本道综合精品 | 精品国产一区二区久久 | 久久午夜精品福利一区二区 | 日韩三级在线 | 精品自拍视频 |