当前位置:   article > 正文

第十四届蓝桥杯单片机组省赛_蓝桥杯单片机第十四届省赛实物展示

蓝桥杯单片机第十四届省赛实物展示

整体来说这届省赛是历史最难,考试的时候没有把所有功能全部实现,但是还是拿了省一

 

考完试把代码回顾了一遍,现在完整代码,全部功能已实现,
测频率 T0计数 T1定时
矩阵按键采用2×4,中断扫描法写的,强烈推荐终端扫描的方法,一点都不抖,而且可以决定是按下按键执行我们需要的功能还是松手按键执行功能,还可以实现长短按功能

  1. //完美代码
  2. //测频率 T0计数 T1定时
  3. //学会用中间变量和测量最大值和平均值
  4. #include "stc15f2k60s2.h"
  5. #include "intrins.h"
  6. #include "ds1302.h"
  7. #include "iic.h"
  8. #include "onewire.h"
  9. /*11- 12C 13H 14F 15P 16E 17A*/
  10. unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xc6,0x89,0x8e,0x8c,0x86, 0x88};
  11. unsigned char dscom=0;
  12. unsigned char dsbuff[8]={0};
  13. extern unsigned char clk[3];
  14. unsigned char keysta[2][4]={{1,1,1,1},{1,1,1,1}};
  15. unsigned char keyback[2][4]={{1,1,1,1},{1,1,1,1}};
  16. unsigned char keybuff[2][4]={{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}};
  17. unsigned char code keycode[2][4]={{5,9,13,17},{4,8,12,16}};
  18. unsigned char number=0;
  19. unsigned char ds_count=0;
  20. unsigned char ad_count=0;
  21. unsigned int wendu_count=0;
  22. unsigned char fre_count=0;
  23. unsigned int ym_count=0;
  24. unsigned int frequence;
  25. unsigned char ym_mode=1;// 页面标志位 1时间界面 2回显界面 3参数界面
  26. unsigned char hx_mode=1;// 回显标志位 1温度回显 2湿度回显 3时间回显
  27. unsigned char ad_value; //光照
  28. unsigned char ad_value_last;//上个光照
  29. unsigned int tempurture; //温度
  30. unsigned int tempurture_caiji;//采集的温度
  31. unsigned int tempurture_last;
  32. unsigned int tempurture_max;
  33. unsigned int tempurture_ave=250;
  34. unsigned int shidu=0; //湿度
  35. unsigned int shidu_caiji; //采集的湿度
  36. unsigned int shidu_last;
  37. unsigned int shidu_max=100;
  38. unsigned int shidu_ave=200;
  39. unsigned char ym; //进入手势页面 把当前页面值存给ym
  40. unsigned int key_count=0;
  41. unsigned int tempurture_sum=0;
  42. unsigned char i=0;
  43. unsigned int shidu_sum=0;
  44. unsigned char led_number=0xff;
  45. char canshu=27;
  46. bit ds_read_flag=0; //
  47. bit ad_flag=0; //
  48. bit wendu_flag=0; //
  49. bit wuxiao_flag=0;
  50. bit key_bit=0;
  51. bit longthing=0;
  52. bit l1_flag=0;
  53. bit l2_flag=0;
  54. bit l3_flag=0;
  55. bit l4_flag=0;
  56. bit l5_flag=0;
  57. bit l6_flag=0;
  58. sbit h0=P3^0;
  59. sbit h1=P3^1;
  60. sbit h2=P3^2;
  61. sbit h3=P3^3;
  62. sbit l0=P4^4;
  63. sbit l1=P4^2;
  64. sbit l2=P3^5;
  65. sbit l3=P3^4;
  66. void keysong(unsigned char keydat);
  67. void keyaction(unsigned char dat);
  68. void yemian();
  69. void led_handle();
  70. void LED_function();
  71. void select573(unsigned char channel)
  72. {
  73. P2&=0x1f;
  74. P0=0xff;
  75. switch(channel)
  76. {
  77. case 4:P2=(P2&0x1f)|0x80;break;
  78. case 5:P2=(P2&0x1f)|0xa0;break;
  79. case 6:P2=(P2&0x1f)|0xc0;break;
  80. case 7:P2=(P2&0x1f)|0xe0;break;
  81. }
  82. }
  83. void allinit()
  84. {
  85. select573(4);P0=0xff;
  86. select573(5);P0=0x00;
  87. select573(6);P0=0xff;
  88. select573(7);P0=0xff;
  89. }
  90. void display()
  91. {
  92. select573(7);P0=0xff;
  93. select573(6);
  94. P0=1<<dscom;
  95. select573(7);
  96. P0=tab[dsbuff[dscom]];
  97. if(++dscom==8)
  98. dscom=0;
  99. }
  100. void timerinit()
  101. {
  102. TH1=(65535-1000)/256;
  103. TL1=(65535-1000)%256;
  104. TMOD=0x05;
  105. TF1=0;
  106. TR1=1;
  107. ET1=1;
  108. EA=1;
  109. TH0=0;
  110. TL0=0;
  111. TF0=0;
  112. ET0=0;
  113. TR0=1;
  114. }
  115. //===================按键函数=====================================================================================================================
  116. //============按键扫描=====================
  117. void keyscan()
  118. {
  119. unsigned char i;
  120. static unsigned char j=0;
  121. keybuff[j][0]=keybuff[j][0]<<1|l0;
  122. keybuff[j][1]=keybuff[j][1]<<1|l1;
  123. keybuff[j][2]=keybuff[j][2]<<1|l2;
  124. keybuff[j][3]=keybuff[j][3]<<1|l3;
  125. for(i=0;i<2;i++)
  126. {
  127. if((keybuff[i][j]&0x0f)==0)
  128. {
  129. keysta[i][j]=0;
  130. }
  131. else if((keybuff[i][j]&0x0f)==0x0f)
  132. {
  133. keysta[i][j]=1;
  134. }
  135. }
  136. j++;
  137. if(j>=2)
  138. {
  139. j=0;
  140. }
  141. switch(j)
  142. {
  143. case 0:h2=0;h3=1;break;
  144. case 1:h3=0;h2=1;break;
  145. }
  146. }
  147. //============按键处理==========================
  148. void keyhandle()
  149. {
  150. unsigned char i,j;
  151. for(i=0;i<2;i++)
  152. {
  153. for(j=0;j<4;j++)
  154. {
  155. if(keyback[i][j]!=keysta[i][j])
  156. {
  157. if(keysta[i][j]==0)
  158. {
  159. keyaction(keycode[i][j]);
  160. }
  161. else if(keysta[i][j]==1)
  162. {
  163. keysong(keycode[i][j]);
  164. }
  165. keyback[i][j]=keysta[i][j];
  166. }
  167. }
  168. }
  169. }
  170. //============按键按下====================
  171. void keyaction(unsigned char dat)
  172. {
  173. if(dat==4) //界面按键
  174. {
  175. if(ym_mode==1)//从时间页面切换到回显界面 处于回显界面
  176. {
  177. ym_mode=2; //2回显界面
  178. hx_mode=1; //1温度回显
  179. }
  180. else if(ym_mode==2) ym_mode=3; //3参数界面
  181. else if(ym_mode==3) ym_mode=1; //1时间界面
  182. }
  183. if(dat==5) //回显按键
  184. {
  185. if(ym_mode==2)//如果在2回显界面
  186. {
  187. if(hx_mode==1) hx_mode=2;//2湿度回显
  188. else if(hx_mode==2) hx_mode=3;//3时间回显
  189. else if(hx_mode==3) hx_mode=1;//1温度回显
  190. }
  191. }
  192. if(dat==8) //在参数界面下 加参数
  193. {
  194. if(ym_mode==3) //如果在参数界面下
  195. {
  196. canshu+=1;
  197. if(canshu>=99)
  198. canshu=99;
  199. }
  200. }
  201. if(dat==9) //在参数界面下 减参数
  202. {
  203. if(ym_mode==3) //如果在参数界面下
  204. {
  205. canshu-=1;
  206. if(canshu<=0)
  207. canshu=0;
  208. }
  209. key_bit=1;
  210. }
  211. }
  212. //============按键松开=============
  213. void keysong(unsigned char keydat)
  214. {
  215. if(ym_mode==3&&keydat==9) //=清除所有记录,触发次数重置为0
  216. {
  217. if(longthing==1) //=执行的操作
  218. {
  219. longthing=0;
  220. number=0;
  221. tempurture_max=200;
  222. shidu_max=100;
  223. }
  224. key_bit=0;
  225. key_count=0;
  226. }
  227. }
  228. //=====================main函数===============================================================================================
  229. void main(void)
  230. {
  231. allinit();
  232. timerinit();
  233. ds1302init();
  234. while(1)
  235. {
  236. keyhandle();
  237. if(ds_read_flag==1) //读取时间
  238. {
  239. ds_read_flag=0;
  240. ds1302read();
  241. }
  242. ad_value_last=ad_value;
  243. if(ad_flag==1) //读取光照
  244. {
  245. ad_flag=0;
  246. ad_value=pcf_ad(1);
  247. }
  248. if(wendu_flag==1) //读取温度
  249. {
  250. wendu_flag=0;
  251. tempurture=read_temperature();
  252. }
  253. //=====光照触发采集======================================================================
  254. //防止巧合,刚从第四个页面出来main函数刚好执行到这里再次进入,ym_mode的值还没来得及改变,
  255. //又被赋值,一直会是4,就不会跳出所以这里加一个条件 (ym_mode!=4)
  256. if(((ad_value_last-ad_value)>50)&&(ym_mode!=4))
  257. {
  258. ym=ym_mode;
  259. ym_mode=4;
  260. //=====频率转换为湿度=数据无效这组数据放弃
  261. if(frequence<=200)
  262. {
  263. wuxiao_flag=1; //无效标志位置一
  264. shidu=100; //保留一位小数 *10
  265. }
  266. else if(frequence>=2000)
  267. {
  268. wuxiao_flag=1;
  269. shidu=900; //保留一位小数 *10
  270. }
  271. else
  272. {
  273. wuxiao_flag=0;
  274. }
  275. if(wuxiao_flag==0) // 数据有效的时候才进行数据采集
  276. {
  277. number++;
  278. i++;
  279. //=====温度最大值平均值=================================== tempurture_last shidu_last
  280. tempurture_last=tempurture_caiji;
  281. if(tempurture>tempurture_max)
  282. {
  283. tempurture_max=tempurture;
  284. }
  285. else
  286. {
  287. tempurture_max=tempurture_max;
  288. }
  289. tempurture_caiji=tempurture;
  290. tempurture_sum+=tempurture;
  291. tempurture_ave=tempurture_sum/i;
  292. //=====频率转换为湿度===============
  293. if(frequence<2000&&frequence>200)
  294. {
  295. shidu=(0.044445*frequence+1.11111)*10;//保留一位小数 *10
  296. }
  297. //=====求出最大湿度=========================
  298. shidu_last=shidu_caiji;
  299. if(shidu>shidu_max)
  300. {
  301. shidu_max=shidu;
  302. }
  303. else
  304. shidu_max=shidu_max;
  305. shidu_caiji=shidu;
  306. //=====平均湿度==========================
  307. shidu_sum+=shidu;
  308. shidu_ave=shidu_sum/i;
  309. }
  310. }
  311. LED_function();
  312. //========
  313. }
  314. }
  315. //=====================中断函数===============================================================================================
  316. unsigned char l4_count=0;
  317. void timer1()interrupt 3
  318. {
  319. led_handle();
  320. display();
  321. yemian();
  322. keyscan();
  323. //======读取时间=========
  324. ds_count++;
  325. if(ds_count>=50)
  326. {
  327. ds_read_flag=1;
  328. ds_count=0;
  329. }
  330. //======读取光照ad=======
  331. ad_count++;
  332. if(ad_count>=200)
  333. {
  334. ad_count=0;
  335. ad_flag=1;
  336. }
  337. //======读取温度=========
  338. wendu_count++;
  339. if(wendu_count>=500)
  340. {
  341. wendu_count=0;
  342. wendu_flag=1;
  343. }
  344. //======读取频率=========
  345. fre_count++;
  346. if(fre_count==200)
  347. {
  348. TR0=0;
  349. fre_count=0;
  350. frequence=(TH0*256+TL0)*5;
  351. TH0=0;
  352. TL0=0;
  353. TR0=1;
  354. }
  355. //====3秒切换页面========
  356. if(ym_mode==4)
  357. {
  358. ym_count++;
  359. if(ym_count>=3000)
  360. {
  361. ym_count=0;
  362. ym_mode=ym;
  363. }
  364. }
  365. //======按键长按=========
  366. if(key_bit==1)
  367. {
  368. key_count++;
  369. if(key_count>=2000)
  370. {
  371. key_count=0;
  372. longthing=1;
  373. }
  374. }
  375. //=====LED功能部分======================================
  376. //=====L1===========
  377. if(l1_flag==1)
  378. {
  379. led_number&=0xfe;
  380. }
  381. else
  382. {
  383. led_number|=0x01;
  384. }
  385. //=====L2===========
  386. if(l2_flag==1)
  387. {
  388. led_number&=0xfd;
  389. }
  390. else
  391. {
  392. led_number|=0x02;
  393. }
  394. //=====L3===========
  395. if(l3_flag==1)
  396. {
  397. led_number&=0xfb;
  398. }
  399. else
  400. {
  401. led_number|=0x04;
  402. }
  403. //=====L4===========
  404. if(l4_flag==1)
  405. {
  406. l4_count++;
  407. if(l4_count<=100)
  408. {
  409. led_number&=0xf7;
  410. }
  411. else if((l4_count>100)&&(l4_count<=200))
  412. {
  413. led_number|=0x08;
  414. }
  415. else if(l4_count>200)
  416. {
  417. l4_count=0;
  418. }
  419. }
  420. else
  421. {
  422. led_number|=0x08;
  423. }
  424. //=====L5===========
  425. if(l5_flag==1)
  426. {
  427. led_number&=0xef;
  428. }
  429. else
  430. {
  431. led_number|=0x10;
  432. }
  433. //=====L6===========
  434. if(l6_flag==1)
  435. {
  436. led_number&=0xdf;
  437. }
  438. else
  439. {
  440. led_number|=0x20;
  441. }
  442. }
  443. //=====LED功能部分================================================================================
  444. void LED_function()
  445. {
  446. //========界面指示灯=================
  447. //=====L1=========
  448. if(ym_mode==1) //时间界面
  449. l1_flag=1;
  450. else
  451. l1_flag=0;
  452. //=====L2=========
  453. if(ym_mode==2) //回显界面
  454. l2_flag=1;
  455. else
  456. l2_flag=0;
  457. //=====L3=========
  458. if(ym_mode==4) //湿度界面
  459. l3_flag=1;
  460. else
  461. l3_flag=0;
  462. //========报警指示灯=================
  463. //=====L4=========
  464. if(tempurture_caiji>(canshu*10)) //采集温度大于温度参数
  465. {
  466. l4_flag=1; //L4以0.1s间隔闪烁
  467. }
  468. else
  469. l4_flag=0;
  470. //=====L5=========
  471. if(wuxiao_flag==1) //采集到无效数据L5亮,直到有效数据出现L5灭
  472. {
  473. l5_flag=1;
  474. }
  475. else
  476. l5_flag=0;
  477. //=====L6=========
  478. if((tempurture_caiji>tempurture_last)&&(shidu_caiji>shidu_last)&&(number>=2)) //采集温度和湿度均比上次高L6亮,否则灭
  479. {
  480. l6_flag=1;
  481. }
  482. else
  483. l6_flag=0;
  484. }
  485. //==============LED中断函数=============
  486. void led_handle()
  487. {
  488. P0=0xff;
  489. select573(4);
  490. P0=led_number;
  491. }
  492. //=====================页面函数===============================================================================================
  493. void yemian()
  494. {
  495. if(ym_mode==1) //1时间界面
  496. {
  497. dsbuff[0]=clk[2]/16;
  498. dsbuff[1]=clk[2]%16;
  499. dsbuff[2]=11;
  500. dsbuff[3]=clk[1]/16;
  501. dsbuff[4]=clk[1]%16;
  502. dsbuff[5]=11;
  503. dsbuff[6]=clk[0]/16;
  504. dsbuff[7]=clk[0]%16;
  505. }
  506. else if(ym_mode==2) //2回显界面
  507. {
  508. if(number==0)
  509. {
  510. if(hx_mode==1) //1温度回显
  511. {
  512. dsbuff[0]=12;
  513. dsbuff[1]=10;
  514. dsbuff[2]=10;
  515. dsbuff[3]=10;
  516. dsbuff[4]=10;
  517. dsbuff[5]=10;
  518. dsbuff[6]=10;
  519. dsbuff[7]=10;
  520. }
  521. else if(hx_mode==2) //2湿度回显
  522. {
  523. dsbuff[0]=13;
  524. dsbuff[1]=10;
  525. dsbuff[2]=10;
  526. dsbuff[3]=10;
  527. dsbuff[4]=10;
  528. dsbuff[5]=10;
  529. dsbuff[6]=10;
  530. dsbuff[7]=10;
  531. }
  532. else if(hx_mode==3) //3时间回显
  533. {
  534. dsbuff[0]=14;
  535. dsbuff[1]=10;
  536. dsbuff[2]=10;
  537. dsbuff[3]=10;
  538. dsbuff[4]=10;
  539. dsbuff[5]=10;
  540. dsbuff[6]=10;
  541. dsbuff[7]=10;
  542. }
  543. }
  544. else
  545. {
  546. if(hx_mode==1) //1温度回显
  547. {
  548. dsbuff[0]=12;
  549. dsbuff[1]=10;
  550. dsbuff[2]=tempurture_max/100;
  551. dsbuff[3]=tempurture_max/10%10;
  552. dsbuff[4]=11;
  553. dsbuff[5]=tempurture_ave/100;
  554. dsbuff[6]=tempurture_ave/10%10;
  555. dsbuff[7]=tempurture_ave%10;
  556. }
  557. else if(hx_mode==2) //2湿度回显
  558. {
  559. dsbuff[0]=13;
  560. dsbuff[1]=10;
  561. dsbuff[2]=shidu_max/100;
  562. dsbuff[3]=shidu_max/10%10;
  563. dsbuff[4]=11;
  564. dsbuff[5]=shidu_ave/100;
  565. dsbuff[6]=shidu_ave/10%10;
  566. dsbuff[7]=shidu_ave%10;
  567. }
  568. else if(hx_mode==3) //3时间回显
  569. {
  570. dsbuff[0]=14;
  571. dsbuff[1]=number/10;
  572. dsbuff[2]=number%10;
  573. dsbuff[3]=clk[2]/16;
  574. dsbuff[4]=clk[2]%16;
  575. dsbuff[5]=11;
  576. dsbuff[6]=clk[1]/16;
  577. dsbuff[7]=clk[1]%16;
  578. }
  579. }
  580. }
  581. else if(ym_mode==3) //3参数界面
  582. {
  583. dsbuff[0]=15;
  584. dsbuff[1]=frequence/10000;
  585. dsbuff[2]=frequence%10000/1000;
  586. dsbuff[3]=frequence%1000/100;
  587. dsbuff[4]=frequence%100/10;
  588. dsbuff[5]=frequence%10;
  589. dsbuff[6]=canshu/10;
  590. dsbuff[7]=canshu%10;
  591. }
  592. //=============4采集触发界面===========================
  593. if(ym_mode==4)
  594. {
  595. if(wuxiao_flag==1)
  596. {
  597. dsbuff[0]=16;
  598. dsbuff[1]=10;
  599. dsbuff[2]=10;
  600. dsbuff[3]=tempurture/100;
  601. dsbuff[4]=tempurture/10%10;
  602. dsbuff[5]=11;
  603. dsbuff[6]=17;
  604. dsbuff[7]=17;
  605. }
  606. else
  607. {
  608. dsbuff[0]=16;
  609. dsbuff[1]=10;
  610. dsbuff[2]=10;
  611. dsbuff[3]=tempurture/100;
  612. dsbuff[4]=tempurture/10%10;
  613. dsbuff[5]=11;
  614. dsbuff[6]=shidu/100;
  615. dsbuff[7]=shidu/10%10;
  616. }
  617. }
  618. }

IIC.c 函数

  1. #include "iic.h"
  2. #include "intrins.h"
  3. #define DELAY_TIME 5
  4. sbit scl=P2^0;
  5. sbit sda=P2^1;
  6. //
  7. static void I2C_Delay(unsigned char n)
  8. {
  9. do
  10. {
  11. _nop_();_nop_();_nop_();_nop_();_nop_();
  12. _nop_();_nop_();_nop_();_nop_();_nop_();
  13. _nop_();_nop_();_nop_();_nop_();_nop_();
  14. }
  15. while(n--);
  16. }
  17. //
  18. void I2CStart(void)
  19. {
  20. sda = 1;
  21. scl = 1;
  22. I2C_Delay(DELAY_TIME);
  23. sda = 0;
  24. I2C_Delay(DELAY_TIME);
  25. scl = 0;
  26. }
  27. //
  28. void I2CStop(void)
  29. {
  30. sda = 0;
  31. scl = 1;
  32. I2C_Delay(DELAY_TIME);
  33. sda = 1;
  34. I2C_Delay(DELAY_TIME);
  35. }
  36. //
  37. void I2CSendByte(unsigned char byt)
  38. {
  39. unsigned char i;
  40. for(i=0; i<8; i++){
  41. scl = 0;
  42. I2C_Delay(DELAY_TIME);
  43. if(byt & 0x80){
  44. sda = 1;
  45. }
  46. else{
  47. sda = 0;
  48. }
  49. I2C_Delay(DELAY_TIME);
  50. scl = 1;
  51. byt <<= 1;
  52. I2C_Delay(DELAY_TIME);
  53. }
  54. scl = 0;
  55. }
  56. //
  57. unsigned char I2CReceiveByte(void)
  58. {
  59. unsigned char da;
  60. unsigned char i;
  61. for(i=0;i<8;i++){
  62. scl = 1;
  63. I2C_Delay(DELAY_TIME);
  64. da <<= 1;
  65. if(sda)
  66. da |= 0x01;
  67. scl = 0;
  68. I2C_Delay(DELAY_TIME);
  69. }
  70. return da;
  71. }
  72. //
  73. unsigned char I2CWaitAck(void)
  74. {
  75. unsigned char ackbit;
  76. scl = 1;
  77. I2C_Delay(DELAY_TIME);
  78. ackbit = sda;
  79. scl = 0;
  80. I2C_Delay(DELAY_TIME);
  81. return ackbit;
  82. }
  83. //
  84. void I2CSendAck(unsigned char ackbit)
  85. {
  86. scl = 0;
  87. sda = ackbit;
  88. I2C_Delay(DELAY_TIME);
  89. scl = 1;
  90. I2C_Delay(DELAY_TIME);
  91. scl = 0;
  92. sda = 1;
  93. I2C_Delay(DELAY_TIME);
  94. }
  95. unsigned char pcf_ad(unsigned char channel)
  96. {
  97. unsigned char temp;
  98. EA=0;
  99. I2CStart();
  100. I2CSendByte(0x90);
  101. I2CWaitAck();
  102. I2CSendByte(channel);
  103. I2CWaitAck();
  104. I2CStart();
  105. I2CSendByte(0x91);
  106. I2CWaitAck();
  107. temp=I2CReceiveByte();
  108. I2CSendAck(1);
  109. I2CStop();
  110. EA=1;
  111. return temp;
  112. }

onewire.c函数
 

  1. #include "onewire.h"
  2. #include "intrins.h"
  3. sbit DQ=P1^4;
  4. //
  5. void Delay_OneWire(unsigned int t)
  6. {
  7. unsigned char i;
  8. while(t--){
  9. for(i=0;i<12;i++);
  10. }
  11. }
  12. //
  13. void Write_DS18B20(unsigned char dat)
  14. {
  15. unsigned char i;
  16. for(i=0;i<8;i++)
  17. {
  18. DQ = 0;
  19. DQ = dat&0x01;
  20. Delay_OneWire(5);
  21. DQ = 1;
  22. dat >>= 1;
  23. }
  24. Delay_OneWire(5);
  25. }
  26. //
  27. unsigned char Read_DS18B20(void)
  28. {
  29. unsigned char i;
  30. unsigned char dat;
  31. for(i=0;i<8;i++)
  32. {
  33. DQ = 0;
  34. dat >>= 1;
  35. DQ = 1;
  36. if(DQ)
  37. {
  38. dat |= 0x80;
  39. }
  40. Delay_OneWire(5);
  41. }
  42. return dat;
  43. }
  44. //
  45. bit init_ds18b20(void)
  46. {
  47. bit initflag = 0;
  48. DQ = 1;
  49. Delay_OneWire(12);
  50. DQ = 0;
  51. Delay_OneWire(80);
  52. DQ = 1;
  53. Delay_OneWire(10);
  54. initflag = DQ;
  55. Delay_OneWire(5);
  56. return initflag;
  57. }
  58. float read_temperature()
  59. {
  60. unsigned int temp;
  61. unsigned char low,high;
  62. EA=0;
  63. init_ds18b20();
  64. Write_DS18B20(0xcc);
  65. Write_DS18B20(0x44);
  66. init_ds18b20();
  67. Write_DS18B20(0xcc);
  68. Write_DS18B20(0xbe);
  69. low=Read_DS18B20();
  70. high=Read_DS18B20();
  71. EA=1;
  72. temp=high;
  73. temp=temp<<8;
  74. temp=temp|low;
  75. temp*=0.625;
  76. return temp;
  77. }

ds1302.c函数

  1. #include "ds1302.h"
  2. #include "intrins.h"
  3. sbit SCK=P1^7;
  4. sbit SDA=P2^3;
  5. sbit RST=P1^3;
  6. unsigned char clk[3];
  7. //
  8. void Write_Ds1302(unsigned char temp)
  9. {
  10. unsigned char i;
  11. for (i=0;i<8;i++)
  12. {
  13. SCK = 0;
  14. SDA = temp&0x01;
  15. temp>>=1;
  16. SCK=1;
  17. }
  18. }
  19. //
  20. void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
  21. {
  22. RST=0; _nop_();
  23. SCK=0; _nop_();
  24. RST=1; _nop_();
  25. Write_Ds1302(address);
  26. Write_Ds1302(dat);
  27. RST=0;
  28. }
  29. //
  30. unsigned char Read_Ds1302_Byte ( unsigned char address )
  31. {
  32. unsigned char i,temp=0x00;
  33. RST=0; _nop_();
  34. SCK=0; _nop_();
  35. RST=1; _nop_();
  36. Write_Ds1302(address);
  37. for (i=0;i<8;i++)
  38. {
  39. SCK=0;
  40. temp>>=1;
  41. if(SDA)
  42. temp|=0x80;
  43. SCK=1;
  44. }
  45. RST=0; _nop_();
  46. SCK=0; _nop_();
  47. SCK=1; _nop_();
  48. SDA=0; _nop_();
  49. SDA=1; _nop_();
  50. return (temp);
  51. }
  52. void ds1302init()
  53. {
  54. Write_Ds1302_Byte(0x8e,0x00);
  55. Write_Ds1302_Byte(0x80,0x05);
  56. Write_Ds1302_Byte(0x82,0x03);
  57. Write_Ds1302_Byte(0x84,0x13);
  58. Write_Ds1302_Byte(0x8e,0x80);
  59. }
  60. void ds1302read()
  61. {
  62. clk[0]=Read_Ds1302_Byte(0x81);
  63. clk[1]=Read_Ds1302_Byte(0x83);
  64. clk[2]=Read_Ds1302_Byte(0x85);
  65. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/706067
推荐阅读
相关标签
  

闽ICP备14008679号