单片机时钟频率12MHZ,T0做定时器使用,定时时长为0.1ms,要求用P1.0口输出周期为10ms,脉冲宽度按以下规律变化的信号:
第一个脉冲周期,P1.0引脚高电平持续时间为1*0.1ms;
第二个脉冲周期,P1.0引脚高电平持续时间为2*0.1ms;
第三个脉冲周期,P1.0引脚高电平持续时间为3*0.1ms;
第i个脉冲周期,P1.0引脚高电平持续时间为i*0.1ms(0=
////////////////////////实现目标//////////////////////////////
//单片机时钟频率12MHZ,T0做定时器使用,定时时长为0.1ms,要求用P1.0口输出周期为10ms,脉冲宽度按以下规律变化的信号:
//第一个脉冲周期,P1.0引脚高电平持续时间为1*0.1ms;
//第二个脉冲周期,P1.0引脚高电平持续时间为2*0.1ms;
//第三个脉冲周期,P1.0引脚高电平持续时间为3*0.1ms;
//第i个脉冲周期,P1.0引脚高电平持续时间为i*0.1ms(0=<i<=100).
//即:占空比1%--100% PWM
///////////////////////定时器初值/////////////////////////////////
//单片机Fosc=12Mhz,T0的定时时长为0.1ms, T0的计数次数为:
// n=(t*Fosc)/12=(0.1ms*12MHz)/12=100
//
//
////////////////////////////////////////////////////////////
#include<reg52.h>
#define uchar unsigned char
#define out P1^0
uchar PWM,count;
void display(uchar);
void init()
{
TMOD=0X51; //T0:定时、方式1,
TH0=(65536-100)/256;
TL0=(65536-100)%256;
ET0=1; //开T0中断
EA=1; //开全局中断、
TR0=1; //启动定时器/计数器T0
}
void main()
{
//up=100-down;
//count=1;
init();
while(1)
{
if(count==1)
out=1;
else
out=0;
}
}
void time0() interrupt 1 using 1 //T0中断服务函数,中断型号为1
{
TH0=(65536-100)/256; //T0重置初值:0.1ms
TL0=(65536-100)%256;
count++;
if(count==101) count=1;
}
//一个周期分成100份,每份0.1ms;在一个周期中,高电平占有的分量不断增加。