STC15W104的程序能直接写进STC15F104E吗???写进去没效果
买错芯片了,求大神指导哈,程序如下,多谢#include<reg51.h>
#include<intrins.h>
#define u8 unsigned char
#define u16 unsigned int
//----------------------------------------------------------
//STC15¼Ä´æÆ÷ÉùÃ÷
sfr P3M1=0xb1;
sfr P3M0=0xb2;
sfr AUXR=0x8e;
sfr T2H=0xd6;
sfr T2L=0xd7;
sfr IE2=0xaf;
//----------------------------------------------------------
//Òý½Å¶¨Òå
sbit A1=P3^0;
sbit A2=P3^1;
sbit B1=P3^2;
sbit B2=P3^3;
sbit IN1=P3^5;
sbit IN2=P3^4;
//----------------------------------------------------------
//Èí¼þPWM
u8 PWM_count;
u8 PWM_duty_A;
u8 PWM_duty_B;
u8 PWM_value;
//----------------------------------------------------------
//¿ØÖÆ
u16 timer1,timer2;
u16 pulse;
u16 IN1_H_time,IN2_H_time;
bit IN1_last,IN2_last;
bit get_pulse1,get_pulse2;
bit get_new;
int mix_x,mix_y;
bit Direction_A,Direction_B;
int pulse1=150,pulse2=150;
u8 lose_A=20,lose_B=20;//¸üУºÉϵçĬÈÏ´¦ÓÚʧ¿Ø״̬£¬·ÀÖ¹µÚÒ»´ÎÐźżì²â´íÎó
//----------------------------------------------------------
//»ì¿ØÉèÖÃ
bit mix_en=0;//¹Ø±Õ»ì¿Ø£¬Á½Â·¶ÀÁ¢
//bit mix_en=1;//¿ªÆô»ì¿Ø
void delay_ms(u16 ms) //STC15 @12.000MHz
{
u16 i;
do{
i = 12000000 / 13022;
_nop_(),_nop_(),_nop_();
while(--i) ;
}while(--ms);
}
void delay_us(u8 us) //@12.000MHz
{
while(--us)
_nop_(),_nop_();
}
void shock( u8 n) //Õ𶯷¢Éù
{
u8 i;
for(i=0;i<250;i++)
{
A1=0,A2=0;
B1=0,B2=0;
delay_us(n);
A1=1;B1=1;
delay_us(n);
A1=0;B1=0;
delay_us(n);
A2=1;B2=1;
delay_us(n);
}
A1=0,A2=0;
B1=0,B2=0;
delay_us(n);
}
main()
{
P3=0xF0; //Éϵç¹Ø±ÕÊä³ö
P3M0=0x0F; //IOÍÆÍìÊä³ö
delay_ms(400);
shock(200); //ÐÂÔö ÉϵçÒôÀÖ£¬±íÃ÷Õý³£¹¤×÷
shock(150);
shock(100);
IE=0x80;
IE2=0x04;
T2L=0xF6;T2H=0xFF;//¿ªÆôÈí¼þPWM
AUXR=0x10;
while(1)
{
if(get_pulse1)
{
get_pulse1=0;
pulse =IN1_H_time;
IN1_H_time=0;
if(pulse >85 && pulse <215) //Ö»ÊÜÀíºÏÀí¶æÁ¿·¶Î§
{
timer1=0;
if(pulse <105)pulse =105;
if(pulse >195)pulse =195;
if(lose_A)lose_A--;//¶ªÐźÅÖØÁ¬±£»¤
else get_new=1,pulse1=pulse;
}
}
if(get_pulse2)
{
get_pulse2=0;
pulse =IN2_H_time;
IN2_H_time=0;
if(pulse >85 && pulse <215)
{
timer2=0;
if(pulse <105)pulse =105;
if(pulse >195)pulse =195; //¶æÁ¿ÏÞ·ù 1050~1950
if(lose_B)lose_B--;//¶ªÐźÅÖØÁ¬±£»¤
else get_new=1,pulse2=pulse;
}
}
if(get_new)
{
get_new=0;
if(mix_en)//Òý½Å¸ßµçƽ ʹÄÜ»ì¿Ø
{
if(pulse2>152 || pulse2<148) //ͨµÀ2Ϊ²îÏòÊäÈ룬ÖÐλËÀÇø
{
mix_x=pulse1 + pulse2 -150;
mix_y=pulse1 - pulse2 +150;
}
else
{
mix_x=pulse1; //ͨµÀ1ΪͬÏòÊäÈ룬
mix_y=pulse1;
}
}
else //Òý½ÅµÍµçƽ Á½Í¨µÀ¶ÀÁ¢
{
mix_x=pulse1;
mix_y=pulse2;
}
if(mix_x<105)mix_x=105;
if(mix_x>195)mix_x=195;
if(mix_y<105)mix_y=105;
if(mix_y>195)mix_y=195;
if(mix_x>=153 ) //Õýת
{
PWM_duty_A= (mix_x-151)*100/44; //²¹³¥Ä¦²ÁÁ¦
Direction_A=0;
}
else if(mix_x<=147 )//·´×ª
{
PWM_duty_A= (149-mix_x)*100/44;
Direction_A=1;
}
else //Í£Ö¹
{
PWM_duty_A=0;
}
if(mix_y>=153 ) //Õýת
{
PWM_duty_B= (mix_y-151)*100/44; //²¹³¥Ä¦²ÁÁ¦
Direction_B=0;
}
else if(mix_y<=147 )//·´×ª
{
PWM_duty_B= (149-mix_y)*100/44;
Direction_B=1;
}
else //Í£Ö¹
{
PWM_duty_B=0;
}
}
}
}
void T2_isr()interrupt 12//Èí¼þPWM 1Khz
{
if(IN1) //ͨµÀ1Âö¿í¼ì²â
{
IN1_last=1;
IN1_H_time++;
}
else
{
if(IN1_last)get_pulse1=1;
IN1_last=0;
}
if(IN2) //ͨµÀ2Âö¿í¼ì²â
{
IN2_last=1;
IN2_H_time++;
}
else
{
if(IN2_last)get_pulse2=1;
IN2_last=0;
}
PWM_count++;
if(PWM_count==100) //100¼¶·Ö±æÂÊ
{
PWM_count=0;
timer1++;
if(timer1>500)//0.5SÎÞÐźű£»¤
{
timer1=0; lose_A=30;
pulse1=150,get_new=1;
}
timer2++;
if(timer2>500)//0.5SÎÞÐźű£»¤
{
timer2=0; lose_B=30;
pulse2=150,get_new=1;
}
}
if(PWM_duty_A > PWM_count)
{
if(Direction_A)A1=1;
else A2=1;
}
else A1=0,A2=0;
if(PWM_duty_B > PWM_count)
{
if(Direction_B)B1=1;
else B2=1;
}
else B1=0,B2=0;
}
本来应该是用STC15W104芯片的,买成了STC15F104E还买了十个。。。求大神帮我看看怎么修改程序。
应该可以吧,,,,,,,,,,,, wszyz 发表于 2021-6-24 05:47
应该可以吧,,,,,,,,,,,,
不行,写到15f104e不能运行 重新定义各管脚及用到的寄存器,应该能用 zjs500217 发表于 2021-6-24 15:55
重新定义各管脚及用到的寄存器,应该能用
怎么修改?你知道吗?
应该可以的吧,下载的时候单片机选择F104的,这个芯片只支持3.7V的吧 看了一下手册,15W和15F的定时/计数器不同,15W中是T0,T2,15F中是T0,T1,程序中使用了T2,所以不行,你试一下把程序中的T2改成T0或T1,重新设置计数中断试试。
zjs500217 发表于 2021-6-24 15:55
重新定义各管脚及用到的寄存器,应该能用
怎么修改?你知道吗? zy888035 发表于 2021-6-24 18:54
怎么修改?你知道吗?
先下载了15f的规格书,找到t1的中断号对应是多少!然后把萝莉的双路混控程序中的main函数中的t2定时器代码给改成t1的,具体参考stc-isp软件中的软件定时器就完了!中断服务函数也要改个中断号程序部分就没啥问题了!然后是硬件!然后15f是3.3的工作电压还是5v的电压!如果是5v的就用7805,如果是3.3的就可以用1117(主要1117的主供电不能超过12v,我已经炸了一个了,如果你要用高电压可以前端套个7805!超过30v的话.7805前面再套个7812!当然你的7886也承受不了这么大的电压了,这只是个人经验)!主要要注意滤波!因为电机的浪涌电流非常大!会导致单片机重启!联系主供电滤波用470uf以上电容,稳压后端用100uf的基本就没问题了!然后rz7886要注意散热!最好是加散热的铝块!我做了一个基本带385电机没啥问题!用个775的电机也没烧,当然775是空载!带负荷的还没试!在工地做事没时间! 抽了点时间给你改了下,主要把定时器T2改到T0,理论上来说是同时支持了15W104和15F104的,因我没有15F的芯片。你自己去测试一下吧{:1_12:} q158354184 发表于 2021-6-28 09:41
抽了点时间给你改了下,主要把定时器T2改到T0,理论上来说是同时支持了15W104和15F104的,因我没有15F的芯 ...
多谢!我自己改了哈失败了!谢谢
zy888035 发表于 2021-6-30 02:51
多谢!我自己改了哈失败了!谢谢
可以用不? STC15F104E是有bug的,因为中断不正常。都已经停产了,现有的都是以前的呆滞库存。 q158354184 发表于 2021-7-7 06:19
可以用不?
好像不行呢
才测试了哈,原来程序还有两个通道有输出,现在都没反映
页:
[1]