做逆變是不行的,我測了下同期160多ms ,頻率6.8HZ,不知道要怎么改,請高手指正。。。(很多人說用PIC,或STC的MCU,可我手上只有AT89s52,再者我也只是拿來玩玩,,,學學單片機的)
貼代碼:
#include "at89x52.h"
sbit led0=P0^0;
sbit led1=P0^1;//這里是spwm輸出第一組
sbit led2=P0^2;//這里是spwm第二組
bit flag_out;//標志位用來切換是第一組輸出還是第二組輸出
unsigned char t_num=0;
unsigned char spwm_tab[16]={0,20,38,56,71,83,92,98,100,98,92,83,71,56,38,20};//用excel算的,只取這幾個簡單些
void delayus()
{
unsigned int tm;
for(tm=2000;tm>0;tm--)
{
{;}
}
}
void int_time0(void)
{
TMOD=0x02;//之前是TMOD=0x11,中斷后還要加初值,現在改為自動重裝。
EA=1;
ET0=1;
TH0=230/256;//
TL0=230%256;//理論上應該256-230=26us
}
void timer0(void) interrupt 1
{
static unsigned char c_time=0;
if(spwm_tab[t_num]>c_time)
{
if(flag_out)led1=1;
else led2=1;
}
else led1=0,led2=0;
c_time=c_time+1;
if(c_time>99)
{
c_time=0;
t_num=t_num+1;
if(t_num>15)t_num=0,flag_out=~flag_out;
}
// TH0=65530/256;
//TL0=65530%256;/*這個因為有重裝就不用了,省了兩條指令*/
}
void main (void)
{
P0=0xff;
int_time0();
TR0=1;
while(1)
{led0=~led0;
delayus();
}
}
今天改了代碼,順便拍了兩張
周期40多ms,22.7HZ,比之前的代碼要高了,但仍不能實用。。。繼續ing。。。