打印

单片机输出PWM波

[复制链接]
4065|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhoulingrong|  楼主 | 2010-10-8 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序是这样的,根据程序走下来能生成PWM波,可是实际不行,请教一下大家,程序那部分有问题,谢谢,程序不长,麻烦大家了
  //*******************函数声明,变量定义*******************
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//端口定义
sfr p0=0x80;
sfr p1=0x90;
sfr p2=0xa0;
sfr p3=0xb0;
//键
sbit add_speed=P1^0;
sbit sub_speed=P1^1;
//PWM控速
uint time_PWM=0;   //PWM时间计数
uint high_PWM=0;   //PWM高电平时间
uint t_PWM=16;    //PWM周期

//*******************延 时  程 序*******************
void delayms(unsigned char ms)
{
   unsigned char i ;
   while(ms--)
    {
      for(i = 0 ; i < 120 ; i++) ;
    }
}
//*******************键盘扫描程序*******************
void key_change()
{
   if(add_speed==0)
   {
       delayms(10);
       if(add_speed==0)
       {
            if(high_PWM < 16)
            {
                high_PWM++;
            }
       }
   }
    if(sub_speed==0)
   {
       delayms(10);
       if(sub_speed==0)
       {
            if(high_PWM > 0)
            {
                high_PWM--;
            }
       }
   }
}
//*******************中断程序*******************
//PWM波生成,T0中断
void PWM_T0(void) interrupt 1
{
  TH0=0Xd8;                  
  TL0=0Xf0;                 
  time_PWM++;
  if(time_PWM < high_PWM)
  {
     p2=0xff;
  }
  if(time_PWM==high_PWM)
  {
     p2=0x00;
  }
  else if(time_PWM==t_PWM)
  {
     p2=0xff;
     time_PWM=0;
  }
}
//*******************主程序*******************
void main()
{
p0=0xff;
p1=0Xff;
p2=0xff;
p3=0xff;
      
TH0=0xd8;    //定时10us
TL0=0xf0;
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;

while(1)
{  
  key_change();
}
}

相关帖子

沙发
冯冯冯冯| | 2010-10-8 16:18 | 只看该作者
:)。可以的啊。

使用特权

评论回复
板凳
zhoulingrong|  楼主 | 2010-10-8 16:36 | 只看该作者
恩,硬件上效果不是很好。有点郁闷,总觉得是程序问题,可我又找不出原因来
谢谢

使用特权

评论回复
地板
Galway-Zhang| | 2010-10-8 20:48 | 只看该作者
不错.改天我也搭一下硬件来玩一下.

使用特权

评论回复
5
芳香花梅| | 2010-10-9 11:55 | 只看该作者
什么时间我能看懂一下

使用特权

评论回复
6
老鱼探戈| | 2010-10-9 12:15 | 只看该作者
按键还用delay 消抖?  不可取,费资源

使用特权

评论回复
7
zsyf0918| | 2010-10-9 12:30 | 只看该作者
建议把程序流程理清楚

使用特权

评论回复
8
冯冯冯冯| | 2010-10-9 12:32 | 只看该作者
那要怎么去除抖动啊?

使用特权

评论回复
9
冯冯冯冯| | 2010-10-9 12:34 | 只看该作者
6# 老鱼探戈
请教一下还可怎么消除抖动啊?

使用特权

评论回复
10
code-03| | 2010-10-9 13:04 | 只看该作者
我也请教,软件方面除了延时消抖,还能怎么消抖啊?

使用特权

评论回复
11
yewuyi| | 2010-10-9 13:40 | 只看该作者
high_PWM是个临界代码。

这个程序不能用是正常的,能用反而是奇怪了。

PWM应该完全让定时器来完成,其它方面不要轻易去碰它。

使用特权

评论回复
12
yuanxinchao| | 2010-10-10 13:22 | 只看该作者
软件用delay()消抖外,还有什么方式可以消抖的??:)

使用特权

评论回复
13
handegang| | 2010-10-11 15:20 | 只看该作者
可以用定时器去抖,如:T0设为2.5ms定时,连续10次检测的键值相同即可认为已消抖。
以下是我做项目中的部分程序段:
=======================================
if(keysDetect++ < 10)    /*  描述  : 按键检测    */
{
        if(keysBuff != keysInput)
        {
                keysDetect = 0;
                keysBuff = keysInput;        // 更新键缓冲
        }
}
else
{
        keysDetect = 0;
        keysData = keysBuff;                          // 更新键值
        if( !keyPush && keysData != 0xFF )
        {
                keyPush = TRUE;        // “键已按下”标志
                setShortSpeak();   
                keyPerform = FALSE;   // 键操作已执行标志
                keysCount = 50;          // 设置连键时间
        }
}

使用特权

评论回复
14
lpz110| | 2010-10-19 13:02 | 只看该作者
不错

使用特权

评论回复
15
善解人意| | 2010-10-21 21:29 | 只看该作者
软件用delay()消抖外,还有什么方式可以消抖的??

使用特权

评论回复
16
songzhige| | 2012-11-11 14:14 | 只看该作者
这个程序不错

使用特权

评论回复
17
songzhige| | 2012-11-11 14:14 | 只看该作者
这个程序不错:) :lol

使用特权

评论回复
18
shanshui90| | 2012-11-11 14:37 | 只看该作者
受用

使用特权

评论回复
19
songzhige| | 2012-11-23 09:28 | 只看该作者
可以用单片机自带的PWM

使用特权

评论回复
20
demaxiya| | 2012-11-23 16:39 | 只看该作者
中断里面内容太多了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

43

帖子

1

粉丝