这个是有限多路的说,因为判断的延迟……做RGB灯或者多路伺服的时候……
频率未知的说,因为决定于晶振、还有多路的延迟以及c_count的最大值~~
T = c_count × T0溢出时间 + 延迟
只是没事干动动脑子……频率什么的自己算的说……Proteus仿真一下……
在6T 16MHz的52上测试了,时钟频率越高,T0的TH TL就不能设太大不然中断太快了%……@#¥(@#&×%(
待会儿测试一下1T的片子……
duty的话……等于 c_count_P[*] / c_count~~不过似乎有点误差的~~
#include <reg52.h>
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
unsigned char c_count_P[4]= {0,0,0,0};
unsigned int c_count=0;
void InitT0(void)
{
TMOD = 0x01;
TH0 = 0x0FF;
TL0 = 0x0CA;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main()
{
P1 |= 0x0f;
InitT0();
while(1)
{
if (c_count_P[0] == 12)
{
P1_0 = 0;
c_count_P[0] = 0;
}
if (c_count_P[1] == 50)
{
P1_1 = 0;
c_count_P[1] = 0;
}
if (c_count_P[2] == 100)
{
P1_2 = 0;
c_count_P[2] = 0;
}
if (c_count_P[3] == 160)
{
P1_3 = 0;
c_count_P[3] = 0;
}
}
}
void T0_Int(void) interrupt 1
{
TH0 = 0x0FF;
TL0 = 0x0CA;
c_count_P[0] += (char)(P1_0);
c_count_P[1] += (char)(P1_1);
c_count_P[2] += (char)(P1_2);
c_count_P[3] += (char)(P1_3);
if (++c_count == 512)
{
P1 |= 0x0f;
c_count = 0;
}
}
200字以内,仅用于支线交流,主线讨论请采用回复功能。