在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个回答  2010-12-14
以前回答过这样的问题:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/110ca42d0a1ee8e18b1399d4.html本回答被网友采纳
第2个回答  2010-12-14
void <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar q;
sbit a=P0^0;
sbit b=P0^1;
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
while(1)
{
b=1;
for(q=24;q>0;q--)
{
a=1;
delay(2);
a=0;
delay(2);
}
b=0;
for(q=24;q>0;q--)
{
a=1;
delay(2);
a=0;
delay(2);
}

}
}
相似回答