数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1296|回复: 1

[C51] 问题提问 本人是一个接触C51时间不长的小白

[复制链接]
发表于 2021-12-10 17:49:54 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
大家好,本人是一个接触C51时间不长的小白。今天做了个程序,下面的是其中的子程序。功能是在一组在充电中的电池中逐个的找出单个电池的上下阀值,然后从P3口输出相关的数据控制执行电路运作。其中所有的变量都是全局变量,目前执行的结果是继电器闪动一下就再也不动了,显示是进入了“均衡”请各位论坛里的老师帮看看问题出在什么地方。均衡控制程序是直接在主程序下运行的,各变量也查了没有冲突。h的初始值是FF,其他变量的初始值是0。V1~V5是实测值。通过了编译,烧进片子才知道继电器闪动一下就再也不动了

单片机源程序如下:

01.voidjhkzcx()               //均衡控制程序/*

02.         

03.          {

04.//z=a;

05.      x=k1;

06.      y=g1;

07.      y0=y1;

08.      V0=V1;

09.      z0=0x01;

10.      h0=0x1e;

11.      bj();

12.      y1=y0;             //y0要升级为全局变量???????

13.      g1=y;

14.      k1=x;

15.//a=z;

16.      

17.      x=k2;

18.      y=g2;

19.      y0=y2;

20.      V0=V2;

21.      z0=0x02;

22.      h0=0x1d;

23.      bj();

24.      y2=y0;

25.      g2=y;

26.      k2=x;

27.      

28.      x=k3;

29.      y=g3;

30.      y0=y3;

31.      V0=V3;

32.      z0=0x04;

33.      h0=0x1b;

34.      bj();

35.      y3=y0;

36.      g3=y;

37.      k3=x;

38.      

39.      x=k4;

40.      y=g4;

41.      y0=y4;

42.      V0=V4;

43.      z0=0x08;

44.      h0=0x17;

45.      bj();

46.      y4=y0;

47.      g4=y;

48.      k4=x;

49.     

50.      x=k5;

51.      y=g5;

52.      y0=y5;

53.      V0=V5;

54.      z0=0x10;

55.      h0=0x0f;

56.      bj();

57.      y5=y0;

58.      g5=y;

59.      k5=x;

60.      

61.      _nop_();

62.      P3=z&h;      //???

63.      if(z>0x00)

64.        {

65.          LCDTestWord(0,0x98);

66.          LCDSendWord("均衡");  

67.         // _nop_();

68.          P3=z&h;

69.         // _nop_();

70.          DelayMs(5000);

71.        }

72.      else

73.            Holidays();        //显示“充电”

74.      }

75.voidbj()   //比较程序

76.{

77.if(y0==0)

78.    {

79.      if(V0>=1460 )   

80.           {   

81.            y++;

82.            if(y>=20)//第一个电池电压值大于14.60V的检测次数是否超过20次,而且继电器从未吸动过

83.                 {

84.                   y0=1; //第一个继电器的吸动标志位置1

85.                   z=z+z0; //第一个继电器的工作条件

86.                   y=0;

87.                 }

88.                else

89.              _nop_();

90.           }

91.          else

92.           _nop_();

93.    }

94.else

95.    {

96.           if(y0>0)

97.               {

98.              if(V0<=1430 )   

99.                     {

100.                      x=x+1;

101.                       if(x>=50)

102.                           {

103.                              y0=0;

104.                            h=h&h0;

105.                              x=0;

106.                           }

107.                         else      

108.                        _nop_();

109.                      }

110.                  else      

111.                  _nop_();

112.               }

113.      else      

114.     _nop_();

115.    }

116.  }
发表于 2021-12-11 15:17:19 | 显示全部楼层
1.你可以先画流程图,详细设计好每一步怎么处理,最后才是编代码。
2.变量名字用缩写,不要用什么xyz;每一行加注释,否则别说没人有耐心看,自己过两天也难得看懂。
3.需要考虑不同器件的响应时间,比如继电器的吸合与释放,程序需要等待其完成,还要考虑触点抖动,最简单的方法是在发出执行指令后延时一段时间,一般是100ms以下。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-22 05:05 , Processed in 0.156001 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表