谁能帮我看一下这个单片机C程序:我的两个按钮key1和key2怎么达不到控制方波宽度?

来源:百度知道 编辑:UC知道 时间:2024/05/15 02:38:08
这是一个输出方波的程序,目前可以输出方波,但是按钮不起作用
#include<stdio.h>
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//#define T0_init 50000
uchar T0_H,T0_L,a,T0_init;
sbit key1=P3^4;
sbit key2=P3^5;
sbit p10=P1^0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
T0_init=35000;
TMOD=0x01;//T0方式1,定时
EA=1; //中断初始化
ET0=1;
T0_H=(65535-T0_init)/256;
T0_L=(65535-T0_init)%256;
TH0=T0_H;
TL0=T0_L;
TR0=1;
p10=0;

if(key1&key2==0)
{
if(key1==0)
{

delay(10);
if(key1==0)//减小方波宽度
{
while(!key1);
if(key1==1)
{
T0_init=T0_init+10000;
}
}

}
if(key2=

首先有个问题,定义T0_init
uchar T0_H,T0_L,a,T0_init;
然后
T0_init=35000;
这样当然控制不了宽度,所以肯定是要改为
uint T0_init;

定时器初值放在中断里计算会使方波宽度产生偏差吧,还是放在主程序里比较好。
void main()
{
T0_init=35000;
TMOD=0x01;//T0方式1,定时
EA=1; //中断初始化
ET0=1;
T0_H=(65535-T0_init)/256;
T0_L=(65535-T0_init)%256;
TH0=T0_H;
TL0=T0_L;
TR0=1;
p10=0;

if(key1&key2==0)
{
if(key1==0)
{

delay(10);
if(key1==0)//减小方波宽度
{
while(!key1);
if(key1==1)
{
T0_init=T0_init+10000;
}
}

}
if(key2==0)
{
delay(10);
if(key2==0)//增加方波宽度
{
while(!key2);
if(key2==1)
{
T0_init=T0_init-10000;
}
}

}
T0_H=(65535-T0_init)/256;
T0_L=(65535-T0_init)%256;
}
}

这样每次按键就会同时更新T0_H和T0_L,而不必每次在中断中重复计算。

确实还有错误,你的主程序只判断了一次,也就是说当执行到if(key1&key2==0) 时,