这程序出现redefinition和non-address/-constant initializer报错怎么办

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
#include<reg51.h>
unsigned char code table[]="speed:";                  //想要显示的字符
unsigned char code table_error[]="error!";
unsigned char code table_none[]="none";
unsigned char code table_unit[]="rpm";
unsigned char code table_set[]="set";
unsigned char code table_high_tem[]="high_tem!";
unsigned int speed;                                    //数据
unsigned int setspeed=2000;
unsigned int control=0;

unsigned int count=0;                                   //计数
unsigned char ms=0;                                    //定时
unsigned int o_f=0;                                    //开关

unsigned int pwm;
unsigned int pwm1;
unsigned int pwm2;                                    //速度控制

sbit IN0=P2^3;                                            //电机控制
sbit IN1=P2^4;                                            //电机控制
sbit E=P2^5;                                            //电机控制

sbit RS=P2^0;                                           //寄存器选择引脚
sbit RW=P2^1;                                           //读写引脚
sbit EN=P2^2;                                           //片选引脚

sbit tem=P1^1;                                           //过温断路

sbit key1 = P1^5;                            //加速按钮
sbit key2 = P1^6;                           //减速按钮
sbit key3 = P1^7;                            //程序开关

sbit p=P2^7;                                   //测试口
sbit P2_6=P2^6;
/*
sbit key1=P3^6;
sbit key2=P3^7;
sbit key3=P3^5;        

bit key1_flag=0;
bit key2_flag=0;
bit key3_flag=0;

sbit LED1=P1^2;
sbit LED0=P1^3;    

*/

void delay(unsigned int x){                               //延时函数
    unsigned int i;
    for(i=x;i>0;i--);
}

void write_com(unsigned char com){                     //写指令函数
    P0 = com;                                          //送出指令
    RS=0;RW=0;EN=1;                                     //写指令时序
    delay(200);
    EN=0;
}

void write_dat(unsigned char dat){                      //写数据函数
    P0 = dat;                                           //送出数据
    RS=1;RW=0;EN=1;                                       //写数据时序
    delay(200);
    EN=0;
}

void init(){                                           //初始化
    write_com(0x01);                                   //清屏
    write_com(0x38);                                   //设置16*2显示,5*7点阵
    //write_com(0x0f);                                   //开显示,显示光标且闪烁
    write_com(0x0c);                                   //开显示,光标不显示
    write_com(0x06);                                   //地址加1,写入数据时光标右移一位
}
void interrupt_int() {                       //转速测量-开计数器
   TMOD=0x21;      //启动T0,定时方式一
   TH0=0x3C;      //装载计数初值
   TL0=0xb0;      

   TH1=0xe7;
   TL1=0xe7;

   ET0=1;          //开T0中断
   TR0=1;          //启动T0

   ET1=1;
   TR1=1;

   EX0=1;          //开INT0
   IT0=1;          //设置INT0为边沿触发

   EA=1;          //开总中断
 }

void int0() interrupt 0{
   count++;    
}
void key(){               //按钮控制
    if (key1 == 0){
        delay(10);            //消抖
        if (key1 == 0){
                if (setspeed < 9999)
                setspeed++;
                while (key1 == 0);
        }
    }
    if (key2 == 0){
        delay(10);
        if (key2 == 0){
            if (setspeed>0)
                setspeed--;
            while (key2 == 0);
        }
    }
}              
void t0() interrupt 1{
   TH0=0x3C;      
   TL0=0xb0;      
   ms++;                             //定时变量,每50ms加一
   key();
   if(ms>=20){                          //1S定时
       ms=0;                        //清除计时
       speed=count/2;                 //每秒转动的圈数
       speed=speed/60;                //rps换算成rpm
       count=0;                        //重新计数                  
    }

 }

       pwm=speed/96;                                               //算占空比
       pwm1=pwm*100;                                              //周期内高电平持续的时间
       pwm2=100-pwm1;                                          //周期内低电平持续的时间

void t1() interrupt 3{
    control++;
    if(control==5){
        P2_6=!P2_6;
        control=0;
    }
}

void high_tem(){
    unsigned char i;
    write_com(0x01);
    for(i=0;i<9;i++){                                   
        write_dat(table_high_tem[i]);
    }
    write_com(0x02);    
    
}
void print(){
    
    unsigned char i;
    while(tem==0&&key3==1){
            init();
            write_com(0x80);                                   //起点为第一行第一列
            //speed=1236;                        //测试数据
            //setspeed=1237;                    //测试数据
        
            for(i=0;i<6;i++){                                   //写入第一行,speed:
                write_dat(table[i]);
                //delay(3000);
            }
                    for(i=0;i<3;i++){                                   
                write_dat(' ');
            }
            if(speed>9999)                                    //超过4位数时输出“error”
                for(i=0;i<6;i++){                               
                    write_dat(table_error[i]);
                }
            else{
                                                    
                if(speed>999)                                //数据部分speed
                    write_dat(0x30+speed/1000%10);            //输入千位        
                 else
                    write_dat(' ');
        
                if(speed>99)
                    write_dat(0x30+speed/100%10);            //输入百位    
                 else
                    write_dat(' ');
        
                if(speed>9)
                    write_dat(0x30+speed/10%10);            //输入十位    
                 else
                    write_dat(' ');
                   if(speed>0)write_dat(0x30+speed%10);        //输入个位
                if(speed==0)                                //静止时输出“none”
                    for(i=0;i<4;i++){                               
                        write_dat(table_none[i]);
                    }    
            }
            for(i=0;i<3;i++){                                   //输入单位
                    write_dat(table_unit[i]);
                }
        
        
        
            write_com(0xc0);                                   //起点为第二行第一列
            for(i=0;i<3;i++){                               
                    write_dat(table_set[i]);
                }
            for(i=0;i<6;i++){                               
                write_dat(table[i]);
            }
        
                if(setspeed>9999)                            //超过4位数时输出“error”
                for(i=0;i<6;i++){                               
                    write_dat(table_error[i]);
                }
            else{
                                            
                if(setspeed>999)                            //数据部分setspeed
                    write_dat(0x30+setspeed/1000%10);        //输入千位        
                 else
                    write_dat(' ');
        
                if(setspeed>99)
                    write_dat(0x30+setspeed/100%10);        //输入百位    
                 else
                    write_dat(' ');
        
                if(setspeed>9)
                    write_dat(0x30+setspeed/10%10);            //输入十位    
                 else
                    write_dat(' ');
        
                    write_dat(0x30+setspeed%10);            //输入个位
        
            }
            for(i=0;i<3;i++){                                   //输入单位
                write_dat(table_unit[i]);
            }
        
        
                                                              
        //write_com(0x02);                                    //光标复位
        //if(key3==0)break;        
        //if(key3==0) break;

    }    
}

void delay_deal(unsigned int n){                        //转速控制延时
    unsigned int i=0,j=0;
    for(i=0;i<n;i++){
    
        for(j=0;j<120;j++){
        }
    }
}

void deal(){                                           //转速控制
    IN0=0;
    IN1=1;
    delay_deal(pwm1);
    IN1=0;
    delay_deal(pwm2);
    E=1;
}


void key_o(){               //开关控制
        if (key3 == 0){
        delay(20);
        if(key3==0){            
            write_com(0x01);    
        }
        while(key3==0);
    }
}
/*void control(){
    if(speed!=setspeed){
        if(speed>setspeed){
            if(speed-setspeed>20) pwm=pwm-5;
            else pwm--;
        }
        else {
            if(setspeed-speed>20) pwm=pwm+5;
            else pwm++;
        }
    }
}
*/
void main(){
    interrupt_int();

    tem=0;
    
    if(key3==0) key_o();

    if(tem==1)high_tem();
    p=0;                                                    //测试

        //while(key3==0);
        //control();
        //high_tem();                                        //过温断路                                                        
        //speed();                                            //转速测量函数
        print();                                            //显示函数
        deal();                                                //转速控制函数

}

运行结果及报错内容

..\xs.c(131): error C231: 'pwm': redefinition
..\xs.c(131): error C247: non-address/-constant initializer
..\xs.c(132): error C231: 'pwm1': redefinition
..\xs.c(132): error C247: non-address/-constant initializer
..\xs.c(133): error C231: 'pwm2': redefinition
..\xs.c(133): error C247: non-address/-constant initializer

我的解答思路和尝试过的方法
我想要达到的结果

131 132 133行那个pwm的赋值,在函数之外了,函数之外的变量会被认为是定义,你在前面定义过一次,在这里就会被认为重复定义了。

参考一下