一.首先这套题目难度还可以,不是那么的简单,我也做了好一会,主要是不会操作蜂鸣器!
下面就直接贴代码了。想要工程文件的可以到博主的资源中下载(免费)点点关注就行!
主函数main.c
1. #include "dmx.h" 2. #include "onewire.h" 3. void main() 4. { 5. 6. Init_System(); 7. 8. 9. while(1) 10. { 11. if(flag_t) 12. { 13. temp=Read_temp(); 14. flag_t=0; 15. } 16. 17. scan_kbd(); //扫描按键 18. key_real(); //按键操作 19. Read_time(); //读时间 20. SMG_show(); //赋值显示 21. led_work(); //led和继电器 22. 23. 24. } 25. 26. 27. }
二. 然后就是配置文件了 也是程序核心
1. #include <STC15F2K60S2.H> 2. #include "dmx.h" 3. #include "onewire.h" 4. #include "ds1302.h" 5. 6. unsigned char mod1=0; //界面切换 7. bit mod2=0; //模式切换 8. unsigned int temp=0; //温度 9. unsigned int para=23; //温度参数 10. unsigned int key_num=20; //按键值 11. unsigned int count=0; //计数获取温度 12. bit flag_L1=0; //点亮L1标志位 13. bit flag_L3=0; //点亮L3标志位 14. unsigned int count_L1=0; //L1计数 15. unsigned int count_L3=0; //L3计数 16. bit flag_temp=0; //获取温度标志位 17. bit flag_t=0; //时间满足标志位 18. bit flag_jdq_t=0; //时间控制继电器标志位 19. bit flag_jdq_w=0; //温度控制继电器标志位 20. 21. unsigned char stat_jdq=0xaf; 22. unsigned count_jdq=0; 23. unsigned char stat_led=0xff; 24. unsigned char Read_ds1302[3]={0}; 25. unsigned char tp[8]={12,2,10,0,0,11,0,0}; 26. unsigned char Read[8]={10,10,10,10,10,10,10,10}; 27. unsigned char segbuff[8]={10,10,10,10,10,11,0,1}; 28. unsigned char segtab[]={0xc0, //0 29. 0xf9, //1 30. 0xa4, //2 31. 0xb0, //3 32. 0x99, //4 33. 0x92, //5 34. 0x82, //6 35. 0xf8, //7 36. 0x80, //8 37. 0x90, //9 38. 0xff, // 39. 0xbf, //- 40. 0xc1 //U 12 41. }; 42. 43. void time0() //1ms 44. { 45. TMOD=0x11; 46. TH0=(0-1000)/256; 47. TL0=(0-1000)%256; 48. TR0=1; 49. ET0=1; 50. EA=1; 51. TH1=(0-5000)/256; 52. TL1=(0-5000)%256; 53. TR1=1; 54. ET1=1; 55. 56. } 57. void Timer3() interrupt 3 //5ms 58. { 59. 60. TH1=(0-5000)/256; 61. TL1=(0-5000)%256; 62. if(flag_L1) 63. { 64. stat_led=stat_led&0xfe; 65. if(++count_L1==1000) 66. { 67. flag_L1=0; 68. stat_led=stat_led|0x01; 69. count_L1=0; 70. 71. } 72. } 73. if(flag_L3) 74. { 75. if(++count_L3==20)count_L3=0; 76. if(count_L3<=10) 77. stat_led&=0xfb; 78. else stat_led|=0x04; 79. 80. } 81. else stat_led|=0x04; 82. 83. if( mod2==1) 84. { 85. if(flag_jdq_t) 86. { 87. stat_jdq=0x1f; 88. if(++count_jdq==1000) 89. { 90. count_jdq=0; 91. flag_jdq_t=0; 92. stat_jdq=0xaf; 93. 94. } 95. } 96. 97. 98. } 99. else flag_jdq_t=0; 100. 101. 102. 103. 104. 105. } 106. 107. void Timer0() interrupt 1 108. { 109. TH0=(0-2000)/256; 110. TL0=(0-2000)%256; 111. segs(); 112. count++; 113. if(count==150) 114. { 115. flag_t=1; 116. count=0; 117. } 118. 119. } 120. 121. void led_work() 122. { 123. 124. 125. 126. if(Read_ds1302[2]==0x00&&Read_ds1302[1]==0x00) 127. { 128. if(mod2==1)flag_jdq_t=1; 129. else flag_jdq_t=0; 130. 131. flag_L1=1; 132. 133. } 134. 135. if(mod1==0) stat_led=stat_led&0xfd; 136. else stat_led=stat_led|0x02; 137. 138. if(mod2==0 ) 139. { 140. if( temp/10>para) {stat_jdq=0x1f; flag_jdq_w=1;} 141. else 142. {stat_jdq=0xaf; 143. flag_jdq_w=0; 144. } 145. } 146. if(flag_jdq_t || flag_jdq_w) 147. { 148. flag_L3=1; 149. 150. } 151. else flag_L3=0; 152. 153. 154. 155. P2=P2&0x1f|0x80; 156. P0=stat_led; 157. 158. P2=P2&0x1f|0xa0; 159. P0=stat_jdq; 160. 161. 162. } 163. 164. 165. void scan_kbd() 166. { 167. static char kbd_state = 0; 168. unsigned char kbd_press; 169. char row; 170. switch(kbd_state){ 171. 172. case state_0: 173. kbd_io=0x0f;P42=0;P44=0; 174. kbd_press=kbd_io; 175. if(kbd_press != kbd_maskrow) 176. kbd_state=state_1; 177. break; 178. 179. case state_1: 180. kbd_press=kbd_io; 181. if(kbd_press!=kbd_maskrow) 182. { 183. if((kbd_io&0x08)==0) row=4; 184. if((kbd_io&0x04)==0) row=5; 185. if((kbd_io&0x02)==0) row=6; 186. if((kbd_io&0x01)==0) row=7; 187. 188. 189. kbd_io=0xf0;P42=1;P44=1; 190. if(P44==0)key_num=row; 191. if(P42==0)key_num=row+4; 192. if((kbd_io&0x20)==0)key_num=row+8; 193. if((kbd_io&0x10)==0)key_num=row+12; 194. 195. while((!(kbd_io&0x10))&&(row==5)&&(mod1==1)) 196. { 197. tp[3]=Read_ds1302[1]>>4; 198. tp[4]=Read_ds1302[1]%16; 199. tp[6]=Read_ds1302[2]>>4; 200. tp[7]=Read_ds1302[2]%16; 201. flag_temp=1; 202. 203. 204. 205. } 206. flag_temp=0; 207. 208. kbd_state=state_2; 209. 210. } 211. else { 212. kbd_state=state_0; 213. } 214. break; 215. 216. case state_2: 217. kbd_io=0x0f; P42=0; P44=0; 218. kbd_press=kbd_io; 219. if(kbd_press==0x0f)kbd_state=state_0; 220. break; 221. 222. default : 223. break; 224. } 225. 226. 227. } 228. void key_real() 229. { 230. 231. switch(key_num) 232. { 233. 234. case 12: 235. if(++mod1==3)mod1=0; 236. break; 237. 238. case 13: 239. mod2=~mod2; 240. break; 241. case 16: 242. if(mod1==2) 243. { 244. para+=10; 245. if(para>99)para=0; 246. 247. } 248. break; 249. case 17: 250. if(mod1==2) 251. { 252. para-=10; 253. if(para<10) 254. para=99; 255. } 256. break; 257. default :break; 258. 259. 260. } 261. 262. key_num=20; 263. 264. 265. 266. } 267. void Slect_fun(unsigned char n) 268. { 269. 270. P2=P2&0x1f; 271. 272. switch(n) 273. { 274. case 0:P2|=0x00; break; 275. case 4:P2|=0x80; break; 276. case 5:P2|=0xa0; break; 277. case 6:P2|=0xc0; break; 278. case 7:P2|=0xe0; break; 279. default : break; 280. 281. 282. 283. } 284. 285. } 286. void Init_System() 287. { 288. unsigned char i; 289. Slect_fun(4);P0=0xff; 290. Slect_fun(5);P0=0xaf; 291. for(i=0;i<3;i++) 292. { 293. Read_temp(); 294. 295. } 296. time0(); 297. Init_ds1302(); 298. 299. } 300. void segs() 301. { 302. static unsigned char wei=0; 303. Slect_fun(7); 304. P0=0xff; 305. 306. Slect_fun(6); 307. P0=1<<wei; 308. 309. Slect_fun(7); 310. if(!flag_temp) 311. { 312. P0=segtab[segbuff[wei]]; 313. } 314. 315. else P0=segtab[tp[wei]]; 316. wei++; 317. if(wei==8)wei=0; 318. 319. Slect_fun(0); 320. 321. } 322. void Init_ds1302() 323. { 324. 325. 326. Write_Ds1302_Byte(0x8e,0x00); 327. Write_Ds1302_Byte(0x84,0x23); 328. Write_Ds1302_Byte(0x82,0x59); 329. Write_Ds1302_Byte(0x80,0x50); 330. Write_Ds1302_Byte(0x8e,0x80); 331. 332. 333. } 334. void Read_time() 335. { 336. 337. Read_ds1302[0]=Read_Ds1302_Byte(0x85); 338. Read_ds1302[1]=Read_Ds1302_Byte(0x83); 339. Read_ds1302[2]=Read_Ds1302_Byte(0x81); 340. 341. 342. } 343. void SMG_show() 344. { 345. if(mod1==0) 346. { 347. segbuff[0]=12; 348. segbuff[1]=1; 349. segbuff[2]=10; 350. segbuff[3]=10; 351. segbuff[4]=10; 352. segbuff[7]=temp%10; 353. segbuff[5]=temp/100; 354. segbuff[6]=temp/10%10; 355. 356. } 357. 358. 359. else if(mod1==1) 360. { 361. 362. 363. segbuff[0]=12; 364. segbuff[1]=2; 365. 366. segbuff[2]=10; 367. 368. segbuff[3]=Read_ds1302[0]>>4; 369. segbuff[4]=Read_ds1302[0]%16; 370. 371. segbuff[5]=11; 372. 373. segbuff[6]=Read_ds1302[1]>>4; 374. segbuff[7]=Read_ds1302[1]%16; 375. 376. } 377. else if(mod1==2) 378. { 379. 380. segbuff[0]=12; 381. segbuff[1]=3; 382. segbuff[2]=10; 383. 384. 385. segbuff[3]=10; 386. segbuff[4]=10; 387. 388. 389. segbuff[5]=10; 390. 391. segbuff[6]=para/10; 392. segbuff[7]=para%10; 393. 394. 395. 396. } 397. 398. 399. }
下面是各种.h文件了
1. #ifndef _DMX_H 2. #define _DMX_H 3. 4. #define state_0 0 5. #define state_1 1 6. #define state_2 2 7. #define kbd_io P3 8. #define kbd_maskrow 0x0f 9. extern unsigned int temp; 10. extern bit flag_t; 11. void time0(); 12. void scan_kbd(); 13. void key_real(); 14. void Slect_fun(unsigned char n) ; 15. void segs(); 16. void Init_ds1302(); 17. void Read_time(); 18. void SMG_show(); 19. void Init_System(); 20. void led_work(); 21. #endif