有毛病是肯定的,
1、你为什么要用两个定时器去控制,为什么不用一个去控制呢。浪费资源。写起来别扭。
2、问题所在:你的程序中没有加死循环,你的程序运行到最后一行,然后程序就要复位从main起始处执行,然后又开始赋值定时计数器,如果你main里面的程序运行时间不超过50us你永远无法进入中断,即使超过了,输出的波形也是不正确的。
下面的程序是我改过的,没有测试,由于时间匆忙也可能存在问题,你可以试试,另外,100US的周期频率会不会太高了?有什么问题,可以追问。或者qq:363861789.
#include
sbit key=P3^4;
sbit key1=P3^5;
unsigned char tone_H,tone_L;
unsigned char tone1_H,tone1_L;
unsigned char i,j;
sbit PWM=P3^6;
main()
{ PWM=1;
IE=0x8a;
TMOD=0x11;
i=j=50;
TH0=(65536-50)/256;
TL0=65536-50)%256;
tone_H=(65536-i)/256;
tone_L=(65536-i)%256;
tone1_H=(65536-j)/256;
tone1_L=(65536-j)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
tone_H=(65536-i)/256;
tone_L=(65536-i)%256;
tone1_H=(65536-j)/256;
tone1_L=(65536-j)%256;
if(key==1&i<100)
{ i=i+10;
j=j-10;
}
else if(key1==1&j<100)
{ j=j+10;
i=i-10;
}
}
}
void Add10(void) interrupt 1
{ TH0=tone_H;
TL0=tone_L;
PWM=0;
TR0=0;
TR1=1;
}
void Red10(void) interrupt 3
{ TH1=tone1_H;
TL1=tone1_L;
PWM=1;
TR1=0;
TR0=1;
}
首先你的主函数中没有while()循环来执行捕捉按键,当程序执行完了,就结束了,按键就执行一次捕捉,根本没有用,你的ji永远是50,占空比始终一定,无法调速.
2就你这定时就有问题50us要用方式2,并且进入中断先关定时器,不然在执行赋值时,需要时间的,这时定时器还在走,会有很大误差
while(1)
{
if(key==1&i<100)
{ i=i+10;
j=j-10;
}
else if(key1==1&j<100)
{ j=j+10;
i=i-10;
}
}
#include
#define uchar unsigned char
#define uint unsigned int
sbit KEY1= P3^4; //定义按钮
sbit KEY2= P3^5; //定义按钮
sbit PWM= P1^7;//PWM输出的管脚定义
#define PERIOD 1000 //pwm周期
#define MIN_POSITIVE 100 //最小占空比100/1000
#define MAX_POSITIVE 900 //最大占空比900/1000
#define STEP 10 //步长
uint POSITIVE=MIN_POSITIVE;
void delay(uint i)//延时函数
{
while(--i);
}
void init_timer0()//设置定时器
{
TMOD=0X01;
TL0=(POSITIVE-PERIOD)%256;//具体怎么实现的你看一下51单片机定时器的东西,TLO,THO。
TH0=(POSITIVE-PERIOD)/256;
ET0=1;
}
void init_timer1() // 初始化定时器
{
TMOD|=0X10;
TL1=(0-POSITIVE)%256;
TH1=(0-POSITIVE)/256;
ET1=1;
EA=1;
}
void TIMER0_ISR(void)interrupt 1 //中断响应函数
{
TL0=(POSITIVE-PERIOD)%256;
TH0=(POSITIVE-PERIOD)/256;
TR0=0;
TR1=1;
PWM=0;
}
void TIMER1_ISR(void)interrupt 3 //中断响应函数
{
TL1=(0-POSITIVE)%256;
TH1=(0-POSITIVE)/256;
TR1=0;
TR0=1;
PWM=1;
}
void key_scan() 按钮扫描函数
{
uint step=0;
step=(PERIOD-MIN_POSITIVE-100)/STEP;
KEY1=1;
KEY2=1;
if(KEY1==0||KEY2==0)
{
delay(100);
if(KEY1==0)
{
POSITIVE+=step;
if(POSITIVE>MAX_POSITIVE)
POSITIVE=MAX_POSITIVE;
}
if(KEY2==0)
{
POSITIVE-=step;
if(POSITIVE
}
while(KEY1==0||KEY2==0);
}
}
void main() //主函数
{
init_timer0();
init_timer1();
TR0=1;
while(1)key_scan();
}
//这里的意思就是高电平使用一个定时器,低电平使用一个定时器,其实可以使用一个定时器就可以完成这个任务。他的左右只是1ms响应一个中断,然后计数。
/****************************************/
#include
#define TIMER0_COUNT 0xFC18 //每秒中端1000次
unsigned long int m,a;
static void timer0_isr(void) interrupt 1 using 1
{
TR0=0;
TL0=(TIMER0_COUNT & 0x00FF);
TH0=(TIMER0_COUNT >> 8);
TR0=1;
m++;
}
static void timer0_initialize(void)
{
EA=0; /* 设定系统不接受所有的中断 */
m=0;
TR0=0; /* 关闭Timer0 */
TMOD =0x01; /* 设定计时器0为16位的工作模式 */
TL0=(TIMER0_COUNT & 0x00FF); /* 设定TL0的数值 */
TH0=(TIMER0_COUNT >> 8); /* 设定TH0的数值 */
PT0=0; /* 设定计时器0有比较高的优先级 */
ET0=1; /* 设定接受Timer0的中断 */
TR0=1; /* 启动Timer0 */
EA=1; /* 设定系统接受中断 */
}
void main (void)
{
timer0_initialize();
P2_0=0;
P2_1=1;
P3_0=0;
P3_1=1;
a=25;
while(1)
{
if(m==a)
{
P2_2=0;
P3_2=0;
}
if(m==50)
{
P2_2=1;
P3_2=1;
m=0;
}
}
}
/****************************************/
这是我之前写的程序,你看看吧。希望对你有帮助,这个好理解点
没有详细看程序,在TR0=1,TR1=1 之前各加一条 ET0=1,ET1=1,最后再加一条EA=1,我感觉你程序时间中断根本没有执行
问题补充:谢谢了大哥,我会追分感谢 #include