找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 879|回复: 1
打印 上一主题 下一主题
收起左侧

希望大佬们能帮我改一下单片机温控程序 本人不才 很难查找 谢谢大家 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:707525 发表于 2020-4-1 09:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本设计的功能是pid温控
这个程序数组哪里有问题   在编译的时候会出现文件打不开的警告   
  1. #include <reg52.h>
  2. #include "ds18b20ce.h"
  3. #include "delay.h"
  4. #include "jipan.h"
  5. sbit P10=P1^0;
  6. sbit led0=P1^4;
  7. sbit beep=P1^5;
  8. unsigned char flag=0;
  9. unsigned int set_temper;
  10. unsigned int temper;
  11. unsigned int a;
  12. unsigned int b;
  13. unsigned int c,tp,tp2;
  14. unsigned int Ep,Ed,rout=0;
  15. unsigned char kp,ki,kd;
  16. unsigned char high_time,low_time=50;
  17. unsigned char count=0;
  18. int  d[4];
  19. void compare_temper(void);
  20. unsigned int pid_com(void);
  21. void main(void)
  22. {
  23. TMOD=0x01;
  24. TH0=(65536-20000)/256;
  25. TL0=(65536-20000)%256;
  26. EA=1;
  27. EX0=1;
  28. ET0=1;
  29. IT0=0;
  30. TR0=1;
  31. kp=10;
  32. ki=8;
  33. kd=6;
  34. while(1)
  35. {
  36. if(flag)
  37. {
  38. key_jian();
  39. set_temper=(d[0]*100+d[1]*10+d[2])*10+d[3];
  40. }
  41. else
  42. {
  43. tp=UpDataDS18B20();
  44. display();
  45. temper=tp*10+tp2;
  46. }
  47. }
  48. }
  49. unsigned int pid_com(void)
  50. {
  51. unsigned int n;
  52. a=(set_temper-temper)*100;
  53. Ep=kp*(a-b);
  54. Ed=kd*(a-2*b+c);
  55. n=Ep+ki*a+Ed;
  56. c=b;
  57. b=a;
  58. return n;
  59. }
  60. //PWM????????
  61. void compare_temper(void)
  62. {
  63. if(set_temper>temper)
  64. {
  65. beep=1;
  66. if(set_temper-temper>20)
  67. {
  68. high_time=100;
  69. low_time=0;
  70. }
  71. else
  72. {
  73. rout=pid_com();
  74. high_time=(unsigned char)(rout/80);
  75. if(high_time>=100)
  76. {
  77. high_time=100;
  78. }
  79. low_time=100-high_time;
  80. }
  81. }
  82. else if(set_temper<=temper)
  83. {
  84. if(temper-set_temper>0)
  85. {
  86. high_time=0;
  87. low_time=100;
  88. beep=0;
  89. }
  90. else
  91. {
  92. rout=pid_com();
  93. high_time=(unsigned char)(rout/100);
  94. if(high_time>=100)
  95. {
  96. high_time=0;
  97. }
  98. low_time=100-high_time;
  99. }
  100. }
  101. }
  102. void int0 ()
  103. interrupt 0
  104. {
  105. flag=~flag;
  106. }
  107. //?????T0?ж??????
  108. void timer_t0()
  109. interrupt 1
  110. {
  111. TH0=(65536-30000)/256;
  112. TL0=(65536-30000)%256;
  113. count++;
  114. led0=1;
  115. if(count>100)
  116. {
  117. count=0;
  118. }
  119. if(count<high_time)
  120. {
  121. P10=0;
  122. }
  123. else
  124. {
  125. P10=1;
  126. }
  127. if(count==0)
  128. {
  129. led0=0;
  130. compare_temper();
  131. }
  132. }
  133. //DS18B20?????,DS18B20????
  134. #include"ds18b20ce.h"
  135. #include"delay.h"
  136. #include<reg52.h>
  137. #define DQ_HIGH()DQ=1
  138. #define DQ_LOW() DQ=0
  139. sbit DQ = P1^1;
  140. bit DS18B20Init(void)
  141. {
  142. bit flag;
  143. DQ_LOW();
  144. delay(80);
  145. DQ_HIGH();
  146. delay(7);
  147. if(DQ==0)
  148. {
  149. flag=1;
  150. }
  151. else
  152. {
  153. flag=0;
  154. }
  155. delay(20);
  156. return flag;
  157. }
  158. void WriteDS18B20(unsigned char ch)
  159. {
  160. unsigned char i;
  161. for(i=0;i<8;i++)
  162. {
  163. if(ch&0x01)
  164. {
  165. DQ_LOW();
  166. delay(1);
  167. DQ_HIGH();
  168. delay(5);
  169. }
  170. else
  171. {
  172. DQ_LOW();
  173. delay(7);
  174. DQ_HIGH();
  175. }
  176. ch>>=1;
  177. }
  178. }
  179. unsigned char ReadDS18B20(void)
  180. {
  181. unsigned char i,ReValue;
  182. for(i=0;i<8;i++)
  183. {
  184. DQ_LOW();
  185. delay(0);
  186. DQ_HIGH();
  187. ReValue>>=1;
  188. if(DQ==1)
  189. {
  190. ReValue|=0x80;
  191. }
  192. else
  193. {
  194. ReValue&=0x7f;
  195. }
  196. delay(2);
  197. }
  198. return ReValue;
  199. }
  200. unsigned char UpDataDS18B20(void)
  201. {
  202. unsigned char Temp_H,Temp_L;
  203. DS18B20Init();
  204. WriteDS18B20(0xcc);
  205. WriteDS18B20(0x44);
  206. delay(800);
  207. DS18B20Init();
  208. WriteDS18B20(0xcc);
  209. WriteDS18B20(0xbe);
  210. Temp_L=ReadDS18B20();
  211. Temp_H=ReadDS18B20();
  212. tp2=Temp_L&0x0f;
  213. tp2=tp2*6.25/10;
  214. Temp_L>>=4;
  215. Temp_H<<=4;
  216. Temp_L|=Temp_H;
  217. return Temp_L;
  218. }
  219. //??????????????????????????
  220. #include"jipan.h"
  221. #include"delay.h"
  222. #include"ds18b20ce.h"
  223. #include<reg52.h>
  224. unsigned char tp2;
  225. unsigned int tp;
  226. sbit k1=P3^0;//?????
  227. sbit k2=P3^1;//?????
  228. sbit k3=P3^2;//??????????
  229. unsigned char num1,num2,n=0;
  230. unsigned char b[4]={0,5,0,0};
  231. unsigned char code smg_du1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  232. unsigned char code smg_du2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  233. unsigned char code smg_we[]={0x01,0x02,0x04,0x08};
  234. void key_jian()
  235. {
  236. unsigned char i;
  237. if((k1==1)&&(k2==1))
  238. {
  239. for(i=0;i<4;i++)
  240. {
  241. P2=smg_we[i];
  242. n=b[i];
  243. if(i==2)
  244. {
  245. P0=smg_du2[n];
  246. }
  247. else
  248. {
  249. P0=smg_du1[n];
  250. }
  251. delay_50us(15);
  252. }
  253. }
  254. if(k1==0)
  255. {
  256. delay_50us(200);
  257. if(k1==0)
  258. {
  259. num1++;
  260. if(num1==10)num1=0;
  261. while(!k1);
  262. }
  263. delay_50us(200);
  264. while(!k1);
  265. }
  266. else
  267. {
  268. P0=smg_du1[num1];
  269. switch(num2)
  270. {
  271. case 0:b[0]=num1;
  272. break;
  273. case 1:b[1]=num1;
  274. break;
  275. case 2:b[2]=num1;
  276. break;
  277. case 3:b[3]=num1;
  278. break;
  279. }
  280. }
  281. if(k2==0)
  282. {
  283. delay_50us(200);
  284. if(k2==0)
  285. {
  286. num2++;
  287. num1=0;
  288. if(num2==4)num2=0;
  289. while(!k2);
  290. }
  291. delay_50us(200);
  292. while(!k2);
  293. }
  294. else
  295. {
  296. P2=smg_we[num2];
  297. }
  298. }
  299. void display(void)
  300. {
  301. if((tp/100)==0)
  302. {
  303. P2=0x00;
  304. }
  305. else
  306. {
  307. P2=smg_we[0];
  308. P0=smg_du1[tp/100];
  309. }
  310. delay_50us(20);
  311. if((((tp%100)/10)==0)&&((tp/100)==0))
  312. {
  313. P2=0x00;
  314. }else
  315. {
  316. P2=smg_we[1];
  317. P0=smg_du1[(tp%100)/10];
  318. }
  319. delay_50us(20);
  320. P2=smg_we[2];
  321. P0=smg_du2[tp%100%10];
  322. delay_50us(20);
  323. P2=smg_we[3];
  324. P0=smg_du1[tp2];
  325. delay_50us(20);
  326. }
  327. //???????????????
  328. #include"delay.h"
  329. void delay_50us(uint?t)
  330. {
  331. unsigned char j;
  332. for(;t>0;t--)
  333. for(j=19;j>0;j--);
  334. }
  335. void delay(uint us)
  336. {
  337. while(us--);
  338. }
复制代码

仿真图.7z

22.99 KB, 下载次数: 5, 下载积分: 黑币 -5

proteus文件

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:619594 发表于 2020-4-2 14:10 | 只看该作者
你好!
就发了这么多程序,就不说点什么吗!
1、把你所要实现的功能要求说清楚
2、现在的程序存在的问题是什么?
3、验收的时候直接看仿真吗?还是要做实物?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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