51单片机写的程序,主函数里的两个函数分别调用都能正常运行,向程序里这样同时调用无法运行呢?

2019-07-15 08:52发布

#include<reg52.h>typedef unsigned int u16;typedef unsigned char u8;sbit w1=P2^0;sbit w2=P2^1;sbit w3=P2^2;sbit w4=P2^3;sbit start=P3^0;sbit eoc=P3^1;sbit oe=P3^2;sbit clk=P3^3;sbit in1=P2^4;sbit in2=P2^5;sbit in3=P2^6;sbit in4=P2^7;sbit valve1=P3^4;sbit valve2=P3^5;sbit valve3=P3^6;sbit valve4=P3^7;
u8 getdata,table2[4];u16 t;
#define DATA1 P1#define DATA P0u8 code D_table[]={0xc0,0xf9,0xa4,0xb0,                    0x99,0x92,0x82,0xf8,                     0x80,0x90,0x88,0x83,                    0xc6,0xa1,0x86,0x8e};u8 code W_table[]={0x0e,0x0d,0x0b,0x07};
void init_interrupt(){        TMOD=0x02;        TH0=0xfb;        TL0=0xfb;        EA=1;        ET0=1;        TR0=1;}
void delay(u16 num){        u16 x,y;        for(x=num;x>0;x--)        for(y=110;y>0;y--)        {        ;        }
}


void display_led(u8 which_bit,u8 which_number){        P2=W_table[which_bit];        P0=D_table[which_number];        delay(1);}void shot(){
                if(in1==1)                {                                                valve1=1;                        delay(5000);                        valve1=0;                }                if(in2==1)                {                                                valve2=1;                        delay(5000);                        valve2=0;                }                if(in3==1)                {                                                valve3=1;                        delay(5000);                        valve3=0;                }                if(in4==1)                {                                                valve4=1;                        delay(5000);                        valve4=0;                }

}void adc0809(){       

                oe=0;                start=0;                start=1;                start=0;                while(eoc==1);                oe=1;                getdata=P1;                oe=0;                t=getdata*(5000.0/256);                table2[3]=t/1000;                table2[2]=(t-table2[3]*1000)/100;                table2[1]=(t-table2[3]*1000-table2[2]*100)/10;                table2[0]=0;                display_led(0,table2[3]);                display_led(1,table2[2]);                display_led(2,table2[1]);                display_led(3,table2[0]);
          }
void main(void){                P0=0xff;        P2=0xff;        in1=in2=in3=in4=0;        valve1=valve2=valve3=valve4=0;        init_interrupt();        while(1)        {                        adc0809();        shot();       
        }}void timer_T0(void) interrupt 1{        clk=~clk;}






友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
人中狼
1楼-- · 2019-07-15 14:56
较长的延时都改为定时器方式,通过设置定时标志来判断延时是否完成,其他涉及到延时的部分都需要做更改,算是程序结构的更改
sincosyzer22
2楼-- · 2019-07-15 17:06
人中狼 发表于 2018-3-7 15:54
较长的延时都改为定时器方式,通过设置定时标志来判断延时是否完成,其他涉及到延时的部分都需要做更改,算是程序结构的更改

具体怎么改呢?新手不太会
wulinwl
3楼-- · 2019-07-15 22:11
 精彩回答 2  元偷偷看……
人中狼
4楼-- · 2019-07-16 01:04
首先要确定两部分程序合并后要达到什么效果,其次程序的模块化需要继续细分,例如void shot()部分应该时检测四个按键,并执行动作,这部分应该拆分位按键检测和动作执行两个模块。
去除较长时间的延时程序,采用定时器来延时,以执行动作为例,执行动作部分的程序根据按键执行相应的动作,并设立对应的标志来区别当前动作的编号,并启动定时延时,在定时器中判断延时是否结束,并根据动作标志来停止对应的动作。
改动会比较大,主要时思路上的改动。

一周热门 更多>