oid PwmAddChk(void)
{
if(PWMH!=PWMT)
{
PWMH++;
FMQ=0;
}
else
FMQ=1;
}
void PwmSubChk(void)
{
if(PWMH!=0x02)
{
PWMH--;
FMQ=0;
}
else
FMQ=1;
}
main()
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
PWMT=0x15;
PWMH=0x02;
counter=0x01;
ET0=1;
EA=1;
TR0=1;
FMQ=0;
while(1)
{
if(pwmadd==0)
{
delay_50ms(1);
if(pwmadd==0)
{
while(pwmadd==0);
PwmAddChk();
}
}
if(pwmsub==0)
{
delay_50ms(1);
if(pwmsub==0)
{
while(pwmsub==0);
PwmSubChk();
}
}
}
}
不知道这段程序什么意思,希望能解释 ps:51单片机能不能不需要外部时钟,只使能pwm功能就行?
答案:2 悬赏:0 手机版
解决时间 2021-12-24 05:49
- 提问者网友:骨子里的高雅
- 2021-12-23 08:09
最佳答案
- 五星知识达人网友:往事隔山水
- 2021-12-23 09:38
有的51是可以不需要外部时钟的,入STC系列的单片机,有内部RC电路产生的时钟。
oid PwmAddChk(void) //设置脉宽不到最宽时加1
{
if(PWMH!=PWMT) //如果脉宽不到最宽则加1
{
PWMH++;
FMQ=0; //脉冲置0
}
else //否则脉冲置1
FMQ=1;
}
void PwmSubChk(void) //设置脉宽不到最低时减1
{
if(PWMH!=0x02) //如果脉宽不为最低则减1
{
PWMH--;
FMQ=0; //脉冲置0
}
else
FMQ=1;
}
main()
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
PWMT=0x15;
PWMH=0x02;
counter=0x01;
ET0=1;
EA=1;
TR0=1;
FMQ=0;
while(1)
{
if(pwmadd==0) //如果加1键有效则
{
delay_50ms(1); //延时去抖
if(pwmadd==0) //如果加1键任然有效则
{
while(pwmadd==0); //等待加1键抬起
PwmAddChk(); //设置脉宽加1
}
}
if(pwmsub==0) //如果减1件有效则
{
delay_50ms(1); //延时去抖
if(pwmsub==0) //如果减1键任然有效则
{
while(pwmsub==0); //等待减1键抬起
PwmSubChk(); //设置脉宽减1
}
}
}
}
oid PwmAddChk(void) //设置脉宽不到最宽时加1
{
if(PWMH!=PWMT) //如果脉宽不到最宽则加1
{
PWMH++;
FMQ=0; //脉冲置0
}
else //否则脉冲置1
FMQ=1;
}
void PwmSubChk(void) //设置脉宽不到最低时减1
{
if(PWMH!=0x02) //如果脉宽不为最低则减1
{
PWMH--;
FMQ=0; //脉冲置0
}
else
FMQ=1;
}
main()
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
PWMT=0x15;
PWMH=0x02;
counter=0x01;
ET0=1;
EA=1;
TR0=1;
FMQ=0;
while(1)
{
if(pwmadd==0) //如果加1键有效则
{
delay_50ms(1); //延时去抖
if(pwmadd==0) //如果加1键任然有效则
{
while(pwmadd==0); //等待加1键抬起
PwmAddChk(); //设置脉宽加1
}
}
if(pwmsub==0) //如果减1件有效则
{
delay_50ms(1); //延时去抖
if(pwmsub==0) //如果减1键任然有效则
{
while(pwmsub==0); //等待减1键抬起
PwmSubChk(); //设置脉宽减1
}
}
}
}
全部回答
- 1楼网友:梦中风几里
- 2021-12-23 11:09
你用定时器开中断吧,如果只是简单的用io口的话,得到的频率很不准确的!
思路:根据单片机的晶振大小计算定时器的初值,在中断程序里给对要输出脉冲的引脚取反操作就是了,例如:p1^0=~p1^0;
还有脉冲频率不能太高哦,要保证定时器的计时时间大于中断程序执行时间~~
程序大体结构:
void init_timer() //定时器初始化
{
}
void main() //主程序
{
}
void t0() interrupt 1//t0的中断程序
{
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯