找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6526|回复: 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, 下载次数: 75)


分享到:  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 单片机教程网

快速回复 返回顶部 返回列表