在8051单片机的时钟频率为12MHz,用T0定时,试编程使P1.0和P1.1分别输出周期为2ms和500ms的方波

如题所述

有很多方法的,第一种是用模拟PWM,设置好占空比为1/2,根据周期设定好频率就可以了,你这个不需要变动的话,不用PWM也可以,可以这样写:
#define
T0_delay
1000
sbit
P10=P1^0;
sbit
P11=P1^1;
unsigned
int
Pwm_Count=0;
void
Timer0_init();
void
main()
{
Timer0_init();
while(1);//空循环
}
void
Timer0_init()
{
TMOD
|=0x01;
//采用16位定时器
TH0
=
(65536-T0_delay)/256;
//定时器装初值1000
TL0
=
(65536-T0_delay)%256;
EA=1;
ET0=1;
TR0=1;
}
void
timer0()
interrupt
1
{
TH0
=
(65536-T0_delay)/256;
//装初值1000,1ms中断一次
TL0
=
(65536-T0_delay)%256;
P10=~P10;//取反,1ms后电平变换,输出周期为2ms的方波
Pwm_Count++;//计数
if(Pwm_Count==250)
{
Pwm_Count=0;//归零,下次重新从零开始累加计数
P11=~P11;//取反,250ms电平转换一次,输出方波
}
}
要采用模拟PWM函数的话,可以这样写:
定时器装1ms的初值(同上)
#define
LED_ON
1
#define
LED_OFF
0
主要代码如下:
P10=~P10;
//---------------------------------------------------------------------
Pwm_Count_500
++;
if(Pwm_Count>500)
{
Pwm_Count_500
=0;
}
(Pwm_Count
_500<
250)?(P11=
LED_ON):(P11=
LED_OFF);//问号语句来代替if语句,更为
简洁一点,实效上测试两者耗时相同,多路时耗时比if更短,代码占有空间在多路PWM时问号语句明显可以占更少空间。这些方面也许是标准C库函数在实现比较两个数大小时采用问号语句的原因之一。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-10-05
你好!
以前回答过这样的问题:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/110ca42d0a1ee8e18b1399d4.html
打字不易,采纳哦!