久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11168|回復: 8
收起左側

原創:我上周弄的溫度傳感器AD原理圖+pcb文件+單片機源程序

  [復制鏈接]
ID:275162 發表于 2018-1-12 12:18 | 顯示全部樓層 |閱讀模式
我上周弄的溫度傳感器課程設計
QQ圖片20180112121708.jpg
里面包含單片機代碼

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.jpg 0.jpg 0.png

單片機源程序如下:
  1. #include"reg52.h"
  2. #include "intrins.h"
  3. /*******************宏定義**************************************************/
  4. #define uchar unsigned char
  5. #define uint unsigned int //宏定義
  6. #define IE_value 0x82
  7. #define XIA 20
  8. #define SHANG 90
  9. //#define P0_value 0x3f
  10. /*******************端口定義及開辟相應的存儲單元***************************/
  11. sbit DQ = P2^0; //DS18B20單總線接入點
  12. bit flag; //檢測芯片是否存在的標志位
  13. bit signal; //溫度符號標志位

  14. sbit L1=P2^4; //芯片存在P1.0置0點亮LED燈
  15. sbit L2=P2^3; //芯片不存在P1.1置0點亮LED燈

  16. uchar buf[3] ; //存儲轉換后溫度的高8位與低8位
  17. uchar buf1[3];
  18. uchar temper_value; //存儲轉化后溫度的結果值

  19. sbit lcd_ce=P2^7; //使能端
  20. sbit lcd_rs=P2^5; //數據/命令選擇端
  21. sbit lcd_rw=P2^6; //讀/寫選擇端

  22. sbit K1=P1^0;
  23. sbit K2=P1^1;
  24. sbit K3=P1^2;
  25. sbit K4=P1^3;

  26. sbit beep=P2^2;

  27. uchar count,k1num,beepp;
  28. char shi,fen,miao;

  29. uchar code table[]="     00-00-00    ";
  30. uchar code table1[]="T: 00C S:90 X:00";
  31. uchar num,aa,gao,di;
  32. uchar shang,xia;                //上下限溫度設置

  33. void chushihua(); //申明初始化子函數
  34. void delay_1(uint z); //申明延時函數
  35. void write_ml(uchar m); //申明寫命令子函數
  36. void write_data(uchar s); //申明寫數據子函數
  37. void write_sfm(uchar add,uchar da);
  38. void write_fsm2(uchar add,uchar dat);

  39. /********************************************************************
  40. 函 數 名:蜂鳴器控制
  41. 功 能:蜂鳴器箱
  42. 說 明:
  43. 入口參數: 無
  44. 返 回 值:無
  45. 日 期:2018-1-2
  46. ***********************************************************************/
  47. void beepf()
  48. {
  49.         if(temper_value<=xia || temper_value>=shang)
  50.                 {
  51.                         beepp=1;
  52.                 }
  53.                 else
  54.                 {
  55.                         beepp=0;
  56.                 }
  57.         if(beepp==1){
  58.                 ET1=1; //開定時器0中斷
  59.                 TR1=1; //啟動定時器0
  60.         }
  61.                
  62.         else{
  63.                 ET1=0; //開定時器0中斷
  64.                 TR1=0; //啟動定時器0
  65.         }
  66. }


  67. /********************************************************************
  68. 函 數 名:按鍵控制
  69. 功 能:判斷按鍵
  70. 說 明:
  71. 入口參數: 無
  72. 返 回 值:無
  73. 日 期:2018-1-2
  74. ***********************************************************************/
  75. void anjian()
  76. {
  77.         if(K1==0)
  78.         {
  79.                 xia++;
  80.                 while(K1!=1);
  81.         }
  82.         if(K2==0)
  83.         {
  84.                 xia--;
  85.                 while(K2!=1);
  86.         }
  87.         if(K3==0)
  88.         {
  89.                 shang++;
  90.                 while(K3!=1);
  91.         }
  92.         if(K4==0)
  93.         {
  94.                 shang--;
  95.                 while(K4!=1);
  96.         }
  97. }


  98. /********************************************************************
  99. 函 數 名:延時子函數delay
  100. 功 能:延時
  101. 說 明:
  102. 入口參數: i
  103. 返 回 值:無
  104. 日 期:2018-1-2
  105. ***********************************************************************/
  106. void delay(uchar i)
  107. {
  108.         while(--i);
  109. }
  110. /********************************************************************
  111. 函 數 名:初始化子函數 reset_signal
  112. 功 能:信號復位進行初始化
  113. 說 明:
  114. 入口參數:
  115. 返 回 值:無
  116. 設 計: 日 期:2018-1-2
  117. ***********************************************************************/
  118. reset_signal()
  119. {
  120.         DQ = 1;
  121.         _nop_(); //空語句延時1uS
  122.         DQ = 0; //主機發送復位脈沖至少持續480uS
  123.         delay(250); //480uS~960uS之間
  124.         DQ = 1; //復位結束,將單總線拉高
  125.         delay(20); //延時至少16uS
  126.         flag = DQ; //等待16uS后發送存在脈沖(低電平)持續60uS~240uS,DS18B20與MCU達成基本協議
  127.         if(flag==0) //若flag=0則表示存在
  128.         {
  129.                 L1= 0; //P1.4亮
  130.                 delay(90); //延時60uS~240uS之間
  131.         }
  132.         else
  133.                 L2=0;
  134.                 //不存在則P2.3亮
  135.         DQ = 1;
  136. }

  137. /********************************************************************
  138. 函 數 名: w_order
  139. 功 能:寫入將要執行操作的命令
  140. 說 明:
  141. 入口參數:cmd
  142. 返 回 值:無
  143. 設 計: 日 期:2018-1-2
  144. ***********************************************************************/
  145. void w_order(uchar cmd)
  146. {
  147.         uchar i;
  148.         for(i=0;i<8;i++)
  149.         {
  150.                 if(cmd&(0x01<<i)) //寫1
  151.                 {
  152.                         DQ = 0; //主機將數據線拉至低電平產生寫時間片
  153.                         _nop_(); //最好是拉至低電平后就釋放(但延時至少1uS以上),這樣才能在15uS內恢復到高電平
  154.                         _nop_();
  155.                         DQ = 1; //15uS內必須拉至高電平(因為DS18B20在15uS~60uS之間對數據線進行采樣)
  156.                         delay(28); //延時60uS(因為一個寫周期至少延時60uS)
  157.                 }
  158.                 else //寫0
  159.                 {
  160.                         DQ = 0; //主機將數據線拉至低電平產生寫時間片
  161.                         delay(40); //延時60uS以上(因為一個寫周期至少延時60uS)
  162.                         DQ = 1;
  163.                         _nop_(); //恢復延時(因為個寫周期之間至少有1uS的恢復時間)
  164.                         _nop_();
  165.                         _nop_();
  166.                         _nop_();
  167.                 }
  168.         }
  169. }
  170. /********************************************************************
  171. 函 數 名:r_data
  172. 功 能:讀出轉換后的溫度結果存入 buf 1中
  173. 說 明:
  174. 入口參數:
  175. 返 回 值:無
  176. 設 計: 日 期:2018-1-2
  177. ***********************************************************************/
  178. void r_data()
  179. {
  180.         uint i,j;
  181.         for(j=0;j<2;j++)
  182.         {
  183.                 buf[j] = 0;
  184.                 for(i=0;i<8;i++)
  185.                 {
  186.                         DQ = 1;
  187.                         _nop_();
  188.                         DQ = 0; //主機將數據線拉至低電平產生讀時間片
  189.                         _nop_(); //最好是拉至低電平后就釋放(但延時至少1uS以上),這樣才能在15uS內恢復到高電平
  190.                         _nop_(); //15uS內必須驅動至高電平(因為DS18B20輸出數據在讀時間片下降沿后15uS有效)
  191.                         DQ = 1;
  192.                         _nop_();
  193.                         if(DQ) //提高總線后馬上讀取
  194.                         {
  195.                                 buf[j]|=(1<<i);
  196.                         }
  197.                         else
  198.                         {
  199.                                 buf[j]&=~(1<<i);
  200.                         }
  201.                         delay(28); //每個讀周期至少持續60uS
  202.                         DQ = 1;
  203.                         _nop_(); //恢復延時(因為個讀周期之間至少有1uS的恢復時間)
  204.                 }
  205.         }
  206. }
  207. /********************************************************************
  208. 函 數 名:get_temper_value
  209. 功 能:獲得當前的溫度值
  210. 說 明:
  211. 入口參數:
  212. 返 回 值:無
  213. 設 計: 日 期:2018-1-2
  214. ***********************************************************************/
  215. void get_temper_value()
  216. {
  217.         DQ = 1;
  218.         reset_signal(); //初始化 ,檢測是否存在 DS18B20
  219.         if(flag==0)
  220.         {
  221.                 w_order(0xcc); //跳過ROM
  222.                 w_order(0x44); //啟動溫度變換
  223.                 reset_signal(); //復位
  224.                 w_order(0xcc); //跳過ROM
  225.                 w_order(0xbe); //準備讀暫存器
  226.                 r_data(); //讀暫存器中溫度變化的結果
  227.         }
  228. }
  229. /********************************************************************
  230. 函 數 名:二-十進制轉換子函數Conversion
  231. 功 能:將二進制數轉入十進制中
  232. 說 明:
  233. 入口參數:
  234. 返 回 值:無
  235. 設 計: 日 期:2018-1-2
  236. ***********************************************************************/
  237. void Conversion()
  238. {
  239.         signal = (buf[1]&0xf8); //檢溫度測是正還是負
  240.         buf1[2] = 0; //溫度的符號位
  241.         if(signal)
  242.         {
  243.                 buf[0]=~buf[0];
  244.                 buf[1]=~buf[1];
  245.                 buf1[2]=10;
  246.         }
  247.         buf[0]=(buf[0]>>4); //將溫度轉換結果的低8位的高4位移入低4位
  248.         //這里我們拋棄了溫度轉換結果的第四位(小數部分,因為我們不需要那么準確)
  249.         buf[0]=(buf[0]&0x0f); //保留低4位并存入buf[0]中
  250.         buf[1]=(buf[1]<<4); //將溫度轉換結果的高8位的低4位移入高4位
  251.         buf[1]=(buf[1]&0xf0); //保留高4位并存入buf[1]中
  252.         temper_value=(buf[0]|buf[1]); //將buf[0]與buf[1]相或得溫度轉換結果存入temper_value中
  253.         if(signal)
  254.         {temper_value++;} //為負時取反加1
  255.         buf1[0]=temper_value%10; //將個位保存在buf1[0]中
  256.         buf1[1]=temper_value/10; //將十位保存在buf1[1]中
  257. }
  258. /********************************************************************
  259. 函 數 名:void timer0() interrupt 1
  260. 功 能:定時對DS18B20的轉換溫度進行更新
  261. 說 明:定時器0中斷
  262. 入口參數:
  263. 返 回 值:無
  264. 設 計: 日 期:2018-1-2
  265. ***********************************************************************/
  266. void timer0() interrupt 1
  267. {
  268.         TH0 =0x3c; //(65536-50000)/256;
  269.         TL0 =0xb0; //(65536-50000)%256;
  270.         get_temper_value();
  271.         Conversion();
  272.         count++;
  273.         aa++;
  274.         if(aa==18) //大約1S
  275.         {
  276.                 aa=0;
  277.                 write_ml(0x80+0x47);
  278.                 /*write_ml(0x80+0x00);
  279.                 for(num=0;num<15;num++)
  280.                 {write_data(table[num]);delay_1(5);}
  281.                 write_ml(0x80+0x40); //重新設置數據指針
  282.                 for(num=0;num<16;num++)
  283.                 {write_data(table1[num]);delay_1(5);} */
  284.                 write_sfm(3,gao);
  285.                 write_sfm(4,di);
  286.                 write_fsm2(14,xia);
  287.                 write_fsm2(9,shang);       
  288.         }
  289. }

  290. void timer1() interrupt 3
  291. {
  292.         TH1 =0xfd; //(65536-50000)/256;
  293.         TL1 =0xfd; //(65536-50000)%256;
  294.         beep=~beep;
  295. }

  296. /********************************************************************
  297. 函 數 名:void chushihua()
  298. 功 能:初始化子函數
  299. 說 明: 見注釋
  300. 返 回 值:無
  301. 設 計: 日 期:2018-1-2
  302. ***********************************************************************/
  303. void chushihua() //初始化子函數
  304. {
  305.         TMOD=0x11; //定時器0設為工作方式1
  306.         TH0 =0x3c; //(65536-50000)/256;
  307.         TL0 =0xb0; //(65536-50000)%256;
  308.         TH1 =0x3c; //(65536-50000)/256;
  309.         TL1 =0xb0; //(65536-50000)%256;
  310.         EA=1; //開總中斷
  311.         ET0=1; //開定時器0中斷
  312.         TR0=1; //啟動定時器0
  313.         IE = IE_value;
  314.         shang=SHANG;
  315.         xia=XIA;
  316.         beepp=0;
  317.         beep=0;
  318.         lcd_ce=0;
  319.         lcd_rw=0;
  320.         write_ml(0x38); //顯示模式設置
  321.         //write_ml(0x08); //顯示關閉
  322.         write_ml(0x0c); //顯示開關及光標設置
  323.         write_ml(0x06); //地址加1整屏不移動
  324.         write_ml(0x01); //清零
  325.         //write_ml(0x80); //將數據指針移動
  326.         write_ml(0x80+0x00);
  327.         for(num=0;num<15;num++)
  328.         {
  329.                 write_data(table[num]);delay_1(5);}
  330.                 write_ml(0x80+0x40); //重新設置數據指針
  331.                 for(num=0;num<16;num++)
  332.                 {write_data(table1[num]);delay_1(5);}
  333. }
  334. /********************************************************************
  335. 函 數 名:void write_sfm(uchar add,uchar da)
  336. 功 能:函數
  337. 說 明: 見注釋
  338. 返 回 值:無
  339. 設 計: 日 期:2018-1-2
  340. ***********************************************************************/
  341. void write_sfm(uchar add,uchar da)
  342. {
  343.         //uchar shi,ge;
  344.         //shi=da/10;
  345.         //ge=da%10;
  346.         write_ml(0x80+0x40+add);
  347.         write_data(0x30+da);
  348.         //write_data(0x30+da);
  349. }



  350. void write_fsm1(uchar add,uchar date)
  351. {
  352.         uchar shi,ge;
  353.         shi=date/10;
  354.         ge=date%10;
  355.         write_ml(0x80+add);
  356.         write_data(0x30+shi);
  357.         write_data(0x30+ge);
  358. }

  359. void write_fsm2(uchar add,uchar dat)
  360. {
  361.         uchar shi,ge;
  362.         shi=dat/10;
  363.         ge=dat%10;
  364.         write_ml(0x80+0x40+add);
  365.         write_data(0x30+shi);
  366.         write_data(0x30+ge);
  367. }
  368. /********************************************************************
  369. 函 數 名:void write_ml(uchar m)
  370. 功 能:寫命令子函數
  371. 說 明: 見注釋
  372. 返 回 值:無
  373. 設 計: 日 期:2018-1-2
  374. ***********************************************************************/
  375. void write_ml(uchar m)
  376. {
  377.         lcd_rs=0;
  378.         P0=m;
  379.         delay_1(5);
  380.         lcd_ce=1;
  381.         delay_1(5);
  382.         lcd_ce=0;
  383. }
  384. /********************************************************************
  385. 函 數 名:void write_data(uchar s)
  386. 功 能:寫數據子函數
  387. 說 明: 見注釋
  388. 返 回 值:無
  389. 設 計: 日 期:2018-1-2
  390. ***********************************************************************/
  391. void write_data(uchar s)
  392. {
  393.         lcd_rs=1;
  394.         P0=s;
  395.         delay_1(5);
  396.         lcd_ce=1;
  397.         delay_1(5);
  398.         lcd_ce=0;
  399. }
  400. /********************************************************************
  401. 函 數 名:void delay_1(uint z)
  402. 功 能:延時ms函數
  403. 說 明:
  404. 入口參數:延時時間
  405. 返 回 值:無
  406. 設 計: 日 期:2018-1-2
  407. ***********************************************************************/
  408. void delay_1(uint z) //延時子函數
  409. {
  410.         uint x,y;
  411.         for(x=z;x>0;x--)
  412.         for(y=110;y>0;y--); //大約1毫秒
  413. }
  414. /********************************************************************
  415. 函 數 名:jianxian()
  416. ……………………

  417. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
程序和圖.zip (992.91 KB, 下載次數: 191)


評分

參與人數 1黑幣 +5 收起 理由
WEIDADETG + 5 贊一個!感覺調試上有一些需要改善

查看全部評分

回復

使用道具 舉報

ID:275162 發表于 2018-1-12 12:18 | 顯示全部樓層
可以實現上下限溫度調控
回復

使用道具 舉報

無效樓層,該帖已經被刪除
ID:297728 發表于 2018-6-14 16:01 | 顯示全部樓層
用了你的程序,但是溫度顯示是00
回復

使用道具 舉報

ID:419742 發表于 2019-5-19 13:51 | 顯示全部樓層
芯片下面的是什么器件
回復

使用道具 舉報

ID:549790 發表于 2019-5-28 23:40 | 顯示全部樓層
有封裝庫嗎
回復

使用道具 舉報

ID:262632 發表于 2019-9-3 19:44 | 顯示全部樓層
有軟件仿真嗎
回復

使用道具 舉報

ID:116584 發表于 2019-12-26 10:58 | 顯示全部樓層
學習學習!棒棒的!
回復

使用道具 舉報

9#
無效樓層,該帖已經被刪除
10#
無效樓層,該帖已經被刪除
ID:675190 發表于 2019-12-27 11:39 | 顯示全部樓層
這個帖子很棒  可以學習學習
回復

使用道具 舉報

12#
無效樓層,該帖已經被刪除
13#
無效樓層,該帖已經被刪除
ID:1071032 發表于 2023-4-11 11:35 | 顯示全部樓層
有封裝庫嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 97超在线视频 | 在线观看第一区 | 国产成人综合久久 | 亚洲人成人一区二区在线观看 | 欧美黄色大片在线观看 | 国产精品久久久久久久久 | 99久久精品国产麻豆演员表 | 久久亚洲一区 | 欧美精品综合 | 天天操,夜夜爽 | 成人免费观看视频 | caoporn国产精品免费公开 | 亚洲精品久久久久久一区二区 | 高清欧美性猛交xxxx黑人猛交 | 国产精品成人一区二区三区 | 久久久免费 | 夜夜骑首页 | 国产精品a久久久久 | 精品久久香蕉国产线看观看亚洲 | 成年人免费看的视频 | 精品久久香蕉国产线看观看亚洲 | 亚洲国产精品久久 | 国产欧美一区二区精品忘忧草 | 一区二区三区在线 | 欧 | 久久精品久久久久久 | 国产精品美女久久久久aⅴ国产馆 | 日韩中文字幕一区 | 欧美成人h版在线观看 | 久久久久国产精品一区三寸 | 欧美男人天堂 | 精品久久久一区二区 | 国产视频精品视频 | 日韩一区二区在线观看视频 | 四虎成人免费电影 | 美女视频网站久久 | 久久国产欧美日韩精品 | 欧美日韩一 | 亚洲理论在线观看电影 | 在线欧美激情 | 色姑娘综合网 | 午夜影视网 |