找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2594|回复: 2
打印 上一主题 下一主题
收起左侧

两个定时器产生频率固定为10hz的方波 求大神改下程序

[复制链接]
跳转到指定楼层
楼主
ID:225076 发表于 2017-9-26 09:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我利用两个定时器产生频率固定为10hz的方波,占空比随着按键变化,但是观察不到方波,请大神指出程序的错误
#include <reg52.h>
#define  uchar unsigned char
#define  uint unsigned int
#define  ALL  65536             //定时器工作方式1时,最大基数长度 65536;
#define  F_osc 12000000         //晶振频率12M;

sbit PWM_out=P0^7;
sbit led=P2^0;
sbit duty_up=P3^0;    //占空比增加按键
sbit duty_down=P3^1;  //占空比减少按键
uint duty=1;                  //初始占空比为10%
float T=0.1;          //周期定为0.1s

uchar num;
/*****延时******/
void delay(uint z)
{
  uint i,j;
  for(i=z;i>0;i--)
     for(j=110;j>0;j--);
}
/*****键盘扫描******/
void key_scan()
{
   if(duty_up==0)
   delay(5);
   if(duty_up==0)
     {
            duty=duty+1;
                if(duty>9)
                duty=1;
         }
        if(duty_down==0)
        delay(5);
        if(duty_down==0)
          {
            duty=duty-1;
                if(duty<1)
                duty=9;
          }
}
/******主函数*******/
void main()
{
   TMOD=0x11;  //定时器0,工作方式1;定时器1,工作方式1;
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256; //定时0.1s,方波频率10HZ
   TH1=(65536-duty*10000)/256;
   TL1=(65536-duty*10000)%256;         //计算脉宽时间,晶振频率12
   EA=1;         //开总中断
   ET0=1;    //开定时器0中断
   ET1=1;
   TR0=1;    //启动定时器0
   TR1=1;
   while(1) //程序在这里等待
   {
             key_scan();    //键盘扫描确定占空比
         
   }
}
/*****T0定时器中断*****/
void T0_time() interrupt 1
{
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;   //重装定时器初值
   TR0=1;
   PWM_out=1;
   num=num++;
   if(num==4)
     {
                 led=~led;
                num=0;
         }
}
/****T1定时器中断*****/
void T1_time() interrupt 3
{
   TH1=(65536-duty*10000)/256;
   TL1=(65536-duty*10000)%256;
   TR0=0;
   PWM_out=0;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2017-9-27 06:53 | 只看该作者
12M晶振,传统51:12分频后,1us一个定时器CLK,定时器最大容量65536,即最大定时为65536us,楼主的0.1S从何处而来?
你想像一下,或画一个PWM波的图象,看一下PMW的上沿与上沿的时间间隔,再看一下下沿与下沿的时间间隔,它俩的周期一定是一样的,且相位保持一下距离。你的T0置1,是一个时间间隔,T1清0又是另一个时间间隔,周期不一样。
楼主构思设计错误,不是程序不会写,是主导思想不正确。
回复

使用道具 举报

板凳
ID:213173 发表于 2017-9-27 08:55 | 只看该作者
/****T1定时器中断*****/
void T1_time() interrupt 3
{
   TH1=(65536-duty*10000)/256;//duty不能大于6,否则逻辑错误
   TL1=(65536-duty*10000)%256;
   TR0=0;                                                        //T0关闭,哪来T0中断工作?
   PWM_out=0;
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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