标题:
两个定时器产生频率固定为10hz的方波 求大神改下程序
[打印本页]
作者:
浅忆,汐辰!
时间:
2017-9-26 09:53
标题:
两个定时器产生频率固定为10hz的方波 求大神改下程序
我利用两个定时器产生频率固定为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;
}
作者:
yzwzfyz
时间:
2017-9-27 06:53
12M晶振,传统51:12分频后,1us一个定时器CLK,定时器最大容量65536,即最大定时为65536us,楼主的0.1S从何处而来?
你想像一下,或画一个PWM波的图象,看一下PMW的上沿与上沿的时间间隔,再看一下下沿与下沿的时间间隔,它俩的周期一定是一样的,且相位保持一下距离。你的T0置1,是一个时间间隔,T1清0又是另一个时间间隔,周期不一样。
楼主构思设计错误,不是程序不会写,是主导思想不正确。
作者:
wulin
时间:
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;
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1