如何将PIC单片机的程序移到51单片机上

如何将这段代码移植到STC15F104W才能正常工作?


#include
__CONFIG(0X1B4);
#define uchar unsigned char//宏定义,相当于uchar=unsigned char
#define uint unsigned int//宏定义,相当于uint=unsigned  int




uint key2_time_cnt;//按键去抖计数器
uchar key2_lock;//按键有效标志
uchar key2_num_s;//功能散转变量
uchar key2_touch_s_flag;//交流断电信号有效标志
uint shuzi;//时标计数变量
uchar SYS1MS;//时标开关标志

void PORT_init()
{
ANSEL=0X00;//普通端口设置
CMCON=0X07;//比较器关闭
TRISA=0b00110100;
TRISC=0b00110000;
PORTC=0X00;
PORTA=0X00;
T0CS=0;//定时器内部时钟选择
;
T0IF=0;//定时器中断标志清零
T0IE=1;//定时器中断使能
GIE=1;//全局中断使能
TMR0=9;//定时器初值为零
}

void key_scan2()
{
if(RA5==1)//如果RA5上按键没有按下
{
  key2_lock=0;//2号键标志清零
  key2_time_cnt=0;//去抖计数器清零
  if(key2_touch_s_flag==1)//如果交流断电信号有效
  {
     
      key2_touch_s_flag=0;//清交流信号标志
      key2_num_s++;//功能号开始自加
      if(key2_num_s>3)key2_num_s=0;//一共4种功能
  }

}
else if(key2_lock==0)//如果有键第一次按下
{
   key2_time_cnt++;//去抖计数器开始计数
   if(key2_time_cnt>149)//当计数器值大于149,说明低电平持续的时间大于10MS,而交流电高低电平的持续时间是8——10MS,这就表示交流电被断电了。
  {
     key2_touch_s_flag=1;//交流断电有效,标志置一。
     key2_time_cnt=0;//清去抖动计数器
     key2_lock=1;//自锁标志置1,避免一直触发
     
  }
}
}

void key_service2()
{

switch(key2_num_s)
{
  case 0:
        RC2=1;
  RC3=0;
  RA0=0;
  RA1=0;
        //key2_num_s=0;
        break;
   case 1:
      RC2=0;
  RC3=1;
  RA0=0;
  RA1=0;
        //key2_num_s=0;
        break;
   case 2:
        RC2=1;
  RC3=1;
  RA0=0;
  RA1=0;
       // key2_num_s=0;
        break;
  case 3:
      RC2=0;
  RC3=0;
  RA0=0;
  RA1=0;
        //key2_num_s=0;
        break;
  }
  
}

void main()
{
PORT_init();
while(1)
{
if(SYS1MS==1)
{
SYS1MS=0;
key_scan2();
}
key_service2();
}
}
void interrupt isr()//定时器0中断函数
{
      if((T0IE&T0IF)==1)//判断定时器中断
  {   
      T0IF=0;//清定时器中断标志
            T0IE=0;//关定时器中断
            TMR0=9;//9加到256所用时间是250US
            shuzi++;
            if(shuzi==4)
            {
               shuzi=0;
               SYS1MS=1;
            }
           
            
            T0IE=1;//开定时器中断
  }
}

代码移植要换底层的,建议以例程为源进行移植,有疑问可私信,望采纳。

你要把两个单片机的寄存器用法看懂,把PIC单片机上面寄存器的配置用51单片机的寄存器配置方法写出来,逻辑部分可以照搬。建议代码要分HAL层和APL层,HAL层做寄存器配置,APL做逻辑层,下次你移植的时候就只需要移植HAL层就可以了

了解一下PIC的IO和定时器相关寄存器。
需要注意的是,PIC的IO有方向设置,而51没有。

不同单片机的移植最大问题就是寄存器、地址空间和io等硬件上的差异,我的建议是涉及硬件的部分就在新单片机上先实现功能,然后把纯软件的部分(例如数字滤波,数学计算等等)直接copy就可以了,当然,如果有自定义的数据类型,也一并迁移

打开“stc-isp”软件。
打开后,我们可以看到此软件的界面。
选择单片机型号,例如:STC89C51单片机。
选择串口,例如本机的串口COM1。或者点击“扫描”,检查串口是否正确
选择最低及最高波特比,然后打开文件。
点击“下载/编程”,打开单片机开关,等待烧录进单片机。