找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4484|回复: 4
收起左侧

关于单片机温度控制系统的课设 有源代码和仿真文件

[复制链接]
ID:347268 发表于 2018-6-7 23:17 | 显示全部楼层 |阅读模式
做了两周的课程设计,是关于温度控制系统的
附件里有源代码,和仿真文件,
第一次做,也在图书馆里查询了一些资料
解决了一些问题
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. unsigned char code digit[10]={"0123456789"};
  4. unsigned char code D1[]={"Temp:       C"};
  5. unsigned char code Error[]={"Error!Check!"};
  6. unsigned char code D2[]={"Motor: "};
  7. unsigned char code TS1[]={"COOL DOWN!"};
  8. unsigned char code TS2[]={" STOP! "};
  9. unsigned char code TS3[]={"HOT UP!"};
  10. sbit LED_RED=P2^3;
  11. sbit LED_GREEN=P2^4;
  12. sbit P1_0=P1^0;
  13. sbit P1_1=P1^1;
  14. unsigned char cwFlag;
  15. sbit RS=P2^0;
  16. sbit RW=P2^1;
  17. sbit E=P2^2;
  18. sbit BF=P0^7;
  19. void delay(unsigned int m)
  20. {
  21. unsigned int i,j;
  22. for(i=m;i>0;i--)
  23. for(j=110;j>0;j--);
  24. }
  25. bit BusyTest(void)
  26. {
  27. bit result;
  28. RS=0;
  29. RW=1;
  30. E=1;
  31. _nop_();
  32. _nop_();
  33. _nop_();
  34. _nop_();
  35. result=BF;
  36. E=0;
  37. return result;
  38. }
  39. void WriteInstruction(unsigned char dictate)
  40. {
  41. while(BusyTest()==1);
  42. RS=0;
  43. RW=0;
  44. E=0;
  45. _nop_();
  46. _nop_();
  47. P0=dictate;
  48. _nop_();
  49. _nop_();
  50. _nop_();
  51. _nop_();
  52. E=1;
  53. _nop_();
  54. _nop_();
  55. _nop_();
  56. _nop_();
  57. E=0;
  58. }
  59. void WriteAddress(unsigned char x)
  60. {
  61. WriteInstruction(x|0x80);
  62. }
  63. void WriteData(unsigned char y)
  64. {
  65. while(BusyTest()==1);
  66. RS=1;
  67. RW=0;
  68. E=0;
  69. P0=y;
  70. _nop_();
  71. _nop_();
  72. _nop_();
  73. _nop_();
  74. E=1;
  75. _nop_();
  76. _nop_();
  77. _nop_();
  78. _nop_();
  79. E=0;
  80. }
  81. void LcdInitiate(void)
  82. {
  83. delay(15);
  84. WriteInstruction(0x38);
  85. delay(5);
  86. WriteInstruction(0x38);
  87. delay(5);
  88. WriteInstruction(0x38);
  89. delay(5);
  90. WriteInstruction(0x0c);
  91. delay(5);
  92. WriteInstruction(0x06);
  93. delay(5);
  94. WriteInstruction(0x01);
  95. delay(5);
  96. }
  97. sbit DQ=P3^3;
  98. unsigned char time;
  99. bit Init_DS18B20(void)
  100. {
  101. bit flag;
  102. DQ=1;
  103. for(time=0;time<2;time++);
  104. DQ=0;
  105. for(time=0;time<200;time++);
  106. DQ=1;
  107. for(time=0;time<10;time++);
  108. flag=DQ;
  109. for(time=0;time<200;time++);
  110. return(flag);
  111. }
  112. unsigned char ReadOneChar(void)
  113. {
  114. unsigned char i=0;
  115. unsigned char dat=0;
  116. for(i=0;i<8;i++)
  117. {
  118. DQ=1;
  119. _nop_();
  120. DQ=0;
  121. dat>>=1;
  122. _nop_();
  123. DQ=1;
  124. for(time=0;time<2;time++);
  125. if(DQ==1)
  126. dat|=0x80;
  127. else
  128. dat|=0x00;
  129. for(time=0;time<8;time++);
  130. }
  131. return(dat);
  132. }
  133. WriteOneChar(unsigned char dat)
  134. {
  135. unsigned char i=0;
  136. for(i=0;i<8;i++)
  137. {
  138. DQ=1;
  139. _nop_();
  140. DQ=0;
  141. DQ=dat&0x01;
  142. for(time=0;time<10;time++);
  143. DQ=1;
  144. for(time=0;time<1;time++);
  145. dat>>=1;
  146. }
  147. for(time=0;time<4;time++);
  148. return(dat);
  149. }
  150. void red(void)
  151. {
  152. LED_RED=0;
  153. delay(200);
  154. LED_RED=1;
  155. delay(200);
  156. }
  157. void green(void)
  158. {
  159. LED_GREEN=0;
  160. delay(200);
  161. LED_GREEN=1;
  162. delay(200);
  163. }
  164. void display_error(void)
  165. {
  166. unsigned char i;
  167. WriteAddress(0x00);
  168. i=0;
  169. while(Error[i]!='\0')
  170. {
  171. WriteData(Error[i]);
  172. i++;
  173. delay(100);
  174. }
  175. while(1);
  176. }
  177. void display_explain(void)
  178. {
  179. unsigned char i;
  180. WriteAddress(0x00);
  181. i=0;
  182. while(Error[i]!='\0')
  183. {
  184. WriteData(D1[i]);
  185. i++;
  186. delay(100);
  187. }
  188. }
  189. void display_symbol(void)
  190. {
  191. unsigned char i;
  192. WriteAddress(0x40);
  193. i=0;
  194. while(D2[i]!='\0')
  195. {
  196. WriteData(D2[i]);
  197. i++;
  198. delay(50);
  199. }
  200. }
  201. void display_dot(void)
  202. {
  203. WriteAddress(0x09);
  204. WriteData('.');
  205. delay(50);
  206. }
  207. void display_du(void)
  208. {
  209. WriteAddress(0x0C);
  210. WriteData(0xDF);
  211. delay(50);
  212. }
  213. void display_temp1(unsigned char x)
  214. {
  215. unsigned char j,k,l;
  216. j=x/100;
  217. k=(x%100)/10;
  218. l=x%10;
  219. WriteAddress(0x06);
  220. WriteData(digit[j]);
  221. WriteData(digit[k]);
  222. WriteData(digit[l]);
  223. delay(50);
  224. }
  225. void display_temp2(unsigned char x)
  226. {
  227. WriteAddress(0x0A);
  228. WriteData(digit[x]);
  229. delay(50);
  230. }
  231. void display_TS1(void)
  232. {
  233. unsigned char i;
  234. WriteAddress(0x46);
  235. i=0;
  236. while(TS1[i]!='\0')
  237. {
  238. WriteData(TS1[i]);
  239. i++;
  240. delay(50);
  241. }
  242. }
  243. void display_TS2(void)
  244. {
  245. unsigned char i;
  246. WriteAddress(0x46);
  247. i=0;
  248. while(TS2[i]!='\0')
  249. {
  250. WriteData(TS2[i]);
  251. i++;
  252. delay(50);
  253. }
  254. }
  255. void display_TS3(void)
  256. {
  257. unsigned char i;
  258. WriteAddress(0x46);
  259. i=0;
  260. while(TS3[i]!='\0')
  261. {
  262. WriteData(TS3[i]);
  263. i++;
  264. delay(50);
  265. }
  266. }
  267. void ReadyReadTemp(void)
  268. {
  269. Init_DS18B20();
  270. WriteOneChar(0xCC);
  271. WriteOneChar(0x44);
  272. for(time=0;time<100;time++);
  273. Init_DS18B20();
  274. WriteOneChar(0xCC);
  275. WriteOneChar(0xBE);
  276. }
  277. void main(void)
  278. {
  279. unsigned char TL;
  280. unsigned char TH;
  281. unsigned char TN;
  282. unsigned char TD;
  283. LcdInitiate();
  284. delay(5);
  285. if(Init_DS18B20()==1)
  286. display_error();
  287. display_explain();
  288. display_symbol();
  289. display_dot();
  290. display_du();
  291. while(1)
  292. {
  293. ReadyReadTemp();
  294. TL=ReadOneChar();
  295. TH=ReadOneChar();
  296. TN=TH*16+TL/16;
  297. TD=(TL%16)*10/16;
  298. display_temp1(TN);
  299. display_temp2(TD);
  300. delay(10);
  301. if(TN>30)
  302. {
  303. P1_0=1;P1_1=0;
  304. display_TS1();
  305. green();
  306. }
  307. if((TN<=30)&(TN>=25))
  308. {
  309. P1_0=1;P1_1=1;
  310. display_TS2();
  311. EA=0;
  312. }
  313. if(TN<25)
  314. {
  315. P1_0=0;P1_1=1;
  316. display_TS3();
  317. red();
  318. }
  319. }
  320. }

复制代码

所有资料51hei提供下载:
课程设计.zip (18.28 KB, 下载次数: 164)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:431155 发表于 2018-11-22 14:04 | 显示全部楼层
很好,非常实用的一个网站
回复

使用道具 举报

ID:431155 发表于 2018-11-22 14:06 | 显示全部楼层
很好,网站很实用
回复

使用道具 举报

ID:432699 发表于 2018-12-7 21:24 | 显示全部楼层
很好 非常实用
回复

使用道具 举报

ID:1035250 发表于 2022-6-21 00:26 来自手机 | 显示全部楼层
那个继电器是起升温降温的吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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