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

 我来答
hyhv126
2010-12-15
知道答主
回答量:38
采纳率:0%
帮助的人:32.7万
展开全部
有很多方法的,第一种是用模拟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库函数在实现比较两个数大小时采用问号语句的原因之一。
做而论道
高能答主

2010-12-14 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.1亿
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
达恩A
2010-12-14 · TA获得超过135个赞
知道答主
回答量:112
采纳率:0%
帮助的人:51.1万
展开全部
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);
}

}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式