找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3106|回复: 8
收起左侧

一个单片机定时器控制可调频率和占空比的pwm波,仿真出来pwm端口一直处于高电平状态

[复制链接]
回帖奖励 10 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次
ID:393736 发表于 2018-9-4 21:57 | 显示全部楼层 |阅读模式
程序自己模仿的  可是仿真出来pwm端口一直处于高电平状态 想问问是什么问题

电路原理图如下:
2018-09-04_213334.png

单片机源程序:
  1. #include <reg52.h>
  2. #define  uchar unsigned char
  3. #define  uint unsigned int
  4. #define  ALL  65536     //定时器工作方式1时,最大基数长度 65536;
  5. #define  F_osc 12000000    //晶振频率12M;
  6. sbit s1=P3^2;//上调频率(500-9500hz)
  7. sbit s2=P3^3;
  8. sbit s3=P3^4;//上调占空比(0.1-0.9)
  9. sbit s4=P3^5;
  10. sbit pwm=P1^0;
  11. int  i=0,q=0.5,f=500;//设置初值占空比0.5 频率0.5khz
  12. void delay(uchar t);          //延时函数,用于按键去抖;
  13. void init();                  //初始化函数,用于定时器的初始化;
  14. void key_scan();             //按键扫描函数;
  15. void timer0;
  16. void delay(uchar t);
  17. void delay(uchar t)
  18. {
  19.      uchar a,b;
  20.      while(t--)             //每个脉冲为1us
  21.       {
  22.        for(a=0;a<100;a++)
  23.         for(b=0;b<100;b++);
  24.       }
  25.    }
  26. void key_scan()
  27.    {
  28.      delay(4);

  29.      if(!s1)   
  30.      {
  31.        f=f+500;;   
  32.        {
  33.                                  if(f>9500)
  34.          f=500;
  35.                          }
  36.       }

  37.     if(!s2)
  38.                 {
  39.                 f=f-500;
  40.                         {
  41.                         if(f<500)
  42.                                 f=9500;
  43.                         }
  44.                 }

  45.                 if(!s3)
  46.                 {
  47.                 q=q+0.1;
  48.                         {
  49.                                 if(q>0.9)
  50.                                 q=0.1;
  51.                         }
  52.                 }
  53.                 if(!s4)
  54.     {
  55.                         q=q-0.1;
  56.       {
  57.                         if(q<0.1)
  58.                                 q=0.9;
  59.                         }               
  60.                 }
  61.         }               
  62. void timer0() interrupt 1      
  63.     {  TR0=1;
  64.       TH0=(65536-(10000*(double (1/f)))/256;
  65.       TL0=(65536-(10000*(double (1/f)))%256;
  66.                         i++;
  67.                         if(i<=100*q)
  68.       pwm=1;
  69.                         if(100*q<i<=100)
  70.                         pwm=0;
  71.                         if(i>100)
  72.                         i=0;

  73. void init()
  74.     {
  75.       TMOD=0x01;   
  76.       ET0=1;
  77.       EA=1;
  78.       TR0=1;
  79.                 }

  80. void main()
  81. {
  82. init();
  83.         while(1)
  84. {
  85. key_scan();
  86. }
  87. }
复制代码

回复

使用道具 举报

ID:354282 发表于 2018-9-5 08:45 | 显示全部楼层
pwm=0的部分你好像没有写。。。                                                                                                     看这个 对照一下#include   <reg51.h>      typedef   unsigned   char   uchar;      sbit   P0_0=P0^0;   sbit   P0_1=P0^1;    sbit   P0_2=P0^2;   sbit   P0_3=P0^3;   sbit   P0_4=P0^4;   sbit   P2_0=P2^0;   sbit   P2_1=P2^1;   sbit   P2_2=P2^2;   sbit   P2_3=P2^3;   sbit   P2_4=P2^4;   sbit   P3_4=P3^4;        uchar   time=0;      uchar   period=30;      uchar   high=10;    uchar   th0=0;   uchar   tl0=1;   bit    dir;           void dealy()   {    uchar i;    for(i=0;i<100;i++);    }        void   timer0()   interrupt   1   using   1      {                TH0=0xfc;     /*¶¨ê±Æ÷3õÖμÖØ×°ÔØ*/                TL0=0x18;                          time++;                          P3_4=~P3_4;         if(dir==1)           {                                                  if(time==high)   /*¸ßμçƽ3ÖDøê±¼ä½áêø£¬±äμí*/                   P2_0=th0;                 /*¾-1y·′ÏàÆ÷·′Ïà*/                                                                       else   if(time==period)     /*ÖüÆúê±¼äμ½£¬±ä¸ß*/                          {   time=0;                              P2_0=tl0;                /*¾-1y·′ÏàÆ÷·′Ïà*/                                                                                                                              }                                           }                  else          if(time==high)   /*¸ßμçƽ3ÖDøê±¼ä½áêø£¬±äμí*/                                            P2_1=th0;                 /*¾-1y·′ÏàÆ÷·′Ïà*/                                                                            else   if(time==period)     /*ÖüÆúê±¼äμ½£¬±ä¸ß*/                          {   time=0;                              P2_1=tl0;                /*¾-1y·′ÏàÆ÷·′Ïà*/                                                                          }                      }      void   main()      {                     P0=0x00;                 P2=0x00;          TMOD=0x01;   /*¶¨ê±Æ÷0·½ê½1*/            TH0=0xfc;     /*¶¨ê±Æ÷×°ÔØ3õÖ죬éèÖÃÂö3åDÅoÅμÄÕ¼¿Õ±èÎa1£ˉ5*/            TL0=0x18;                                     ET0=1;   /*¿a¶¨ê±Æ÷0ÖD¶Ï*/            TR0=1;    /*Æô¶ˉ¶¨ê±Æ÷0*/                                      while(1)             {                         if(P0_0==1)                 EA=1;     /*¿aCPUÖD¶Ï*/                           if(P0_1==1)                         EA=0;         /*1ØCPUÖD¶Ï*/                          if(P0_2==1)                         {                         dir=~dir;  /*×aÏò¿ØÖÆ*/                         while(P0_2!=0)                         {};                          }                          if(P0_3==1)                         {                           high++;                          if(high==30)                          high=0;                         while(P0_3!=0)                         {};                          }                  }          }            
回复

使用道具 举报

ID:393736 发表于 2018-9-5 09:54 来自手机 | 显示全部楼层
jefelee 发表于 2018-9-5 08:45
pwm=0的部分你好像没有写。。。                                                                        ...

pwm=0我放到中断里面了 在后面。我是一个个定时器控制的频率和占空比
回复

使用道具 举报

ID:393736 发表于 2018-9-5 14:14 | 显示全部楼层
急啊  有没有人能回答一下
回复

使用道具 举报

ID:139455 发表于 2018-9-5 19:55 | 显示全部楼层
q变量设置的不对,q变量在定义中设置成了int型,应该设置成float 或 double型。改下试试

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:394504 发表于 2018-9-6 15:18 | 显示全部楼层
int  i=0,q=0.5,f=500;//设置初值占空比0.5 频率0.5khz  这里 q为整型  所以 q一直为0  
回复

使用道具 举报

ID:394504 发表于 2018-9-6 15:29 | 显示全部楼层
  int  i=0,q=0.5,f=500;//设置初值占空比0.5 频率0.5khz  //这里q为整型 所以 之后的q 一直为0

                      if(100*q<i<=100)  //这里有 语法错误  应该 是 if (100*q<i && i<=100)
给楼主个建议  按键 消抖 别用延时 用几毫秒查键判断按键是否按下 如果连续多次判定检测为按下则按键确认为按下  
回复

使用道具 举报

ID:398692 发表于 2018-9-16 16:38 | 显示全部楼层
q变量设置的不对,q变量在定义中设置成了int型,应该设置成float 或 double型。
回复

使用道具 举报

ID:398736 发表于 2018-9-16 19:25 | 显示全部楼层
q设置的不对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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