|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
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. }
|
|