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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 11016|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

原創(chuàng):我上周弄的溫度傳感器AD原理圖+pcb文件+單片機(jī)源程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:275162 發(fā)表于 2018-1-12 12:18 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我上周弄的溫度傳感器課程設(shè)計(jì)

里面包含單片機(jī)代碼

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


單片機(jī)源程序如下:
  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. /*******************端口定義及開(kāi)辟相應(yīng)的存儲(chǔ)單元***************************/
  11. sbit DQ = P2^0; //DS18B20單總線接入點(diǎn)
  12. bit flag; //檢測(cè)芯片是否存在的標(biāo)志位
  13. bit signal; //溫度符號(hào)標(biāo)志位

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

  16. uchar buf[3] ; //存儲(chǔ)轉(zhuǎn)換后溫度的高8位與低8位
  17. uchar buf1[3];
  18. uchar temper_value; //存儲(chǔ)轉(zhuǎn)化后溫度的結(jié)果值

  19. sbit lcd_ce=P2^7; //使能端
  20. sbit lcd_rs=P2^5; //數(shù)據(jù)/命令選擇端
  21. sbit lcd_rw=P2^6; //讀/寫(xiě)選擇端

  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;                //上下限溫度設(shè)置

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

  39. /********************************************************************
  40. 函 數(shù) 名:蜂鳴器控制
  41. 功 能:蜂鳴器箱
  42. 說(shuō) 明:
  43. 入口參數(shù): 無(wú)
  44. 返 回 值:無(wú)
  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; //開(kāi)定時(shí)器0中斷
  59.                 TR1=1; //啟動(dòng)定時(shí)器0
  60.         }
  61.                
  62.         else{
  63.                 ET1=0; //開(kāi)定時(shí)器0中斷
  64.                 TR1=0; //啟動(dòng)定時(shí)器0
  65.         }
  66. }


  67. /********************************************************************
  68. 函 數(shù) 名:按鍵控制
  69. 功 能:判斷按鍵
  70. 說(shuō) 明:
  71. 入口參數(shù): 無(wú)
  72. 返 回 值:無(wú)
  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. 函 數(shù) 名:延時(shí)子函數(shù)delay
  100. 功 能:延時(shí)
  101. 說(shuō) 明:
  102. 入口參數(shù): i
  103. 返 回 值:無(wú)
  104. 日 期:2018-1-2
  105. ***********************************************************************/
  106. void delay(uchar i)
  107. {
  108.         while(--i);
  109. }
  110. /********************************************************************
  111. 函 數(shù) 名:初始化子函數(shù) reset_signal
  112. 功 能:信號(hào)復(fù)位進(jìn)行初始化
  113. 說(shuō) 明:
  114. 入口參數(shù):
  115. 返 回 值:無(wú)
  116. 設(shè) 計(jì): 日 期:2018-1-2
  117. ***********************************************************************/
  118. reset_signal()
  119. {
  120.         DQ = 1;
  121.         _nop_(); //空語(yǔ)句延時(shí)1uS
  122.         DQ = 0; //主機(jī)發(fā)送復(fù)位脈沖至少持續(xù)480uS
  123.         delay(250); //480uS~960uS之間
  124.         DQ = 1; //復(fù)位結(jié)束,將單總線拉高
  125.         delay(20); //延時(shí)至少16uS
  126.         flag = DQ; //等待16uS后發(fā)送存在脈沖(低電平)持續(xù)60uS~240uS,DS18B20與MCU達(dá)成基本協(xié)議
  127.         if(flag==0) //若flag=0則表示存在
  128.         {
  129.                 L1= 0; //P1.4亮
  130.                 delay(90); //延時(shí)60uS~240uS之間
  131.         }
  132.         else
  133.                 L2=0;
  134.                 //不存在則P2.3亮
  135.         DQ = 1;
  136. }

  137. /********************************************************************
  138. 函 數(shù) 名: w_order
  139. 功 能:寫(xiě)入將要執(zhí)行操作的命令
  140. 說(shuō) 明:
  141. 入口參數(shù):cmd
  142. 返 回 值:無(wú)
  143. 設(shè) 計(jì): 日 期: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)) //寫(xiě)1
  151.                 {
  152.                         DQ = 0; //主機(jī)將數(shù)據(jù)線拉至低電平產(chǎn)生寫(xiě)時(shí)間片
  153.                         _nop_(); //最好是拉至低電平后就釋放(但延時(shí)至少1uS以上),這樣才能在15uS內(nèi)恢復(fù)到高電平
  154.                         _nop_();
  155.                         DQ = 1; //15uS內(nèi)必須拉至高電平(因?yàn)镈S18B20在15uS~60uS之間對(duì)數(shù)據(jù)線進(jìn)行采樣)
  156.                         delay(28); //延時(shí)60uS(因?yàn)橐粋(gè)寫(xiě)周期至少延時(shí)60uS)
  157.                 }
  158.                 else //寫(xiě)0
  159.                 {
  160.                         DQ = 0; //主機(jī)將數(shù)據(jù)線拉至低電平產(chǎn)生寫(xiě)時(shí)間片
  161.                         delay(40); //延時(shí)60uS以上(因?yàn)橐粋(gè)寫(xiě)周期至少延時(shí)60uS)
  162.                         DQ = 1;
  163.                         _nop_(); //恢復(fù)延時(shí)(因?yàn)閭(gè)寫(xiě)周期之間至少有1uS的恢復(fù)時(shí)間)
  164.                         _nop_();
  165.                         _nop_();
  166.                         _nop_();
  167.                 }
  168.         }
  169. }
  170. /********************************************************************
  171. 函 數(shù) 名:r_data
  172. 功 能:讀出轉(zhuǎn)換后的溫度結(jié)果存入 buf 1中
  173. 說(shuō) 明:
  174. 入口參數(shù):
  175. 返 回 值:無(wú)
  176. 設(shè) 計(jì): 日 期: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; //主機(jī)將數(shù)據(jù)線拉至低電平產(chǎn)生讀時(shí)間片
  189.                         _nop_(); //最好是拉至低電平后就釋放(但延時(shí)至少1uS以上),這樣才能在15uS內(nèi)恢復(fù)到高電平
  190.                         _nop_(); //15uS內(nèi)必須驅(qū)動(dòng)至高電平(因?yàn)镈S18B20輸出數(shù)據(jù)在讀時(shí)間片下降沿后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); //每個(gè)讀周期至少持續(xù)60uS
  202.                         DQ = 1;
  203.                         _nop_(); //恢復(fù)延時(shí)(因?yàn)閭(gè)讀周期之間至少有1uS的恢復(fù)時(shí)間)
  204.                 }
  205.         }
  206. }
  207. /********************************************************************
  208. 函 數(shù) 名:get_temper_value
  209. 功 能:獲得當(dāng)前的溫度值
  210. 說(shuō) 明:
  211. 入口參數(shù):
  212. 返 回 值:無(wú)
  213. 設(shè) 計(jì): 日 期:2018-1-2
  214. ***********************************************************************/
  215. void get_temper_value()
  216. {
  217.         DQ = 1;
  218.         reset_signal(); //初始化 ,檢測(cè)是否存在 DS18B20
  219.         if(flag==0)
  220.         {
  221.                 w_order(0xcc); //跳過(guò)ROM
  222.                 w_order(0x44); //啟動(dòng)溫度變換
  223.                 reset_signal(); //復(fù)位
  224.                 w_order(0xcc); //跳過(guò)ROM
  225.                 w_order(0xbe); //準(zhǔn)備讀暫存器
  226.                 r_data(); //讀暫存器中溫度變化的結(jié)果
  227.         }
  228. }
  229. /********************************************************************
  230. 函 數(shù) 名:二-十進(jìn)制轉(zhuǎn)換子函數(shù)Conversion
  231. 功 能:將二進(jìn)制數(shù)轉(zhuǎn)入十進(jìn)制中
  232. 說(shuō) 明:
  233. 入口參數(shù):
  234. 返 回 值:無(wú)
  235. 設(shè) 計(jì): 日 期:2018-1-2
  236. ***********************************************************************/
  237. void Conversion()
  238. {
  239.         signal = (buf[1]&0xf8); //檢溫度測(cè)是正還是負(fù)
  240.         buf1[2] = 0; //溫度的符號(hào)位
  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); //將溫度轉(zhuǎn)換結(jié)果的低8位的高4位移入低4位
  248.         //這里我們拋棄了溫度轉(zhuǎn)換結(jié)果的第四位(小數(shù)部分,因?yàn)槲覀儾恍枰敲礈?zhǔn)確)
  249.         buf[0]=(buf[0]&0x0f); //保留低4位并存入buf[0]中
  250.         buf[1]=(buf[1]<<4); //將溫度轉(zhuǎn)換結(jié)果的高8位的低4位移入高4位
  251.         buf[1]=(buf[1]&0xf0); //保留高4位并存入buf[1]中
  252.         temper_value=(buf[0]|buf[1]); //將buf[0]與buf[1]相或得溫度轉(zhuǎn)換結(jié)果存入temper_value中
  253.         if(signal)
  254.         {temper_value++;} //為負(fù)時(shí)取反加1
  255.         buf1[0]=temper_value%10; //將個(gè)位保存在buf1[0]中
  256.         buf1[1]=temper_value/10; //將十位保存在buf1[1]中
  257. }
  258. /********************************************************************
  259. 函 數(shù) 名:void timer0() interrupt 1
  260. 功 能:定時(shí)對(duì)DS18B20的轉(zhuǎn)換溫度進(jìn)行更新
  261. 說(shuō) 明:定時(shí)器0中斷
  262. 入口參數(shù):
  263. 返 回 值:無(wú)
  264. 設(shè) 計(jì): 日 期: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); //重新設(shè)置數(shù)據(jù)指針
  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. 函 數(shù) 名:void chushihua()
  298. 功 能:初始化子函數(shù)
  299. 說(shuō) 明: 見(jiàn)注釋
  300. 返 回 值:無(wú)
  301. 設(shè) 計(jì): 日 期:2018-1-2
  302. ***********************************************************************/
  303. void chushihua() //初始化子函數(shù)
  304. {
  305.         TMOD=0x11; //定時(shí)器0設(shè)為工作方式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; //開(kāi)總中斷
  311.         ET0=1; //開(kāi)定時(shí)器0中斷
  312.         TR0=1; //啟動(dòng)定時(shí)器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); //顯示模式設(shè)置
  321.         //write_ml(0x08); //顯示關(guān)閉
  322.         write_ml(0x0c); //顯示開(kāi)關(guān)及光標(biāo)設(shè)置
  323.         write_ml(0x06); //地址加1整屏不移動(dòng)
  324.         write_ml(0x01); //清零
  325.         //write_ml(0x80); //將數(shù)據(jù)指針移動(dòng)
  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); //重新設(shè)置數(shù)據(jù)指針
  331.                 for(num=0;num<16;num++)
  332.                 {write_data(table1[num]);delay_1(5);}
  333. }
  334. /********************************************************************
  335. 函 數(shù) 名:void write_sfm(uchar add,uchar da)
  336. 功 能:函數(shù)
  337. 說(shuō) 明: 見(jiàn)注釋
  338. 返 回 值:無(wú)
  339. 設(shè) 計(jì): 日 期: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. 函 數(shù) 名:void write_ml(uchar m)
  370. 功 能:寫(xiě)命令子函數(shù)
  371. 說(shuō) 明: 見(jiàn)注釋
  372. 返 回 值:無(wú)
  373. 設(shè) 計(jì): 日 期: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. 函 數(shù) 名:void write_data(uchar s)
  386. 功 能:寫(xiě)數(shù)據(jù)子函數(shù)
  387. 說(shuō) 明: 見(jiàn)注釋
  388. 返 回 值:無(wú)
  389. 設(shè) 計(jì): 日 期: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. 函 數(shù) 名:void delay_1(uint z)
  402. 功 能:延時(shí)ms函數(shù)
  403. 說(shuō) 明:
  404. 入口參數(shù):延時(shí)時(shí)間
  405. 返 回 值:無(wú)
  406. 設(shè) 計(jì): 日 期:2018-1-2
  407. ***********************************************************************/
  408. void delay_1(uint z) //延時(shí)子函數(shù)
  409. {
  410.         uint x,y;
  411.         for(x=z;x>0;x--)
  412.         for(y=110;y>0;y--); //大約1毫秒
  413. }
  414. /********************************************************************
  415. 函 數(shù) 名:jianxian()
  416. ……………………

  417. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

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


評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
WEIDADETG + 5 贊一個(gè)!感覺(jué)調(diào)試上有一些需要改善

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂5 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:275162 發(fā)表于 2018-1-12 12:18 | 只看該作者
可以實(shí)現(xiàn)上下限溫度調(diào)控
回復(fù)

使用道具 舉報(bào)

板凳
ID:297728 發(fā)表于 2018-6-14 16:01 | 只看該作者
用了你的程序,但是溫度顯示是00
回復(fù)

使用道具 舉報(bào)

地板
ID:419742 發(fā)表于 2019-5-19 13:51 | 只看該作者
芯片下面的是什么器件
回復(fù)

使用道具 舉報(bào)

5#
ID:549790 發(fā)表于 2019-5-28 23:40 | 只看該作者
有封裝庫(kù)嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:262632 發(fā)表于 2019-9-3 19:44 | 只看該作者
有軟件仿真嗎
回復(fù)

使用道具 舉報(bào)

7#
ID:116584 發(fā)表于 2019-12-26 10:58 | 只看該作者
學(xué)習(xí)學(xué)習(xí)!棒棒的!
回復(fù)

使用道具 舉報(bào)

8#
ID:675190 發(fā)表于 2019-12-27 11:39 | 只看該作者
這個(gè)帖子很棒  可以學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

9#
ID:1071032 發(fā)表于 2023-4-11 11:35 | 只看該作者
有封裝庫(kù)嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产欧美国产综合一区 | 神马九九 | 免费h视频 | 九九在线视频 | 亚洲精品国产一区 | 日本一区二区高清视频 | 亚洲高清在线 | 天天插天天搞 | 欧美久久一区二区 | 亚洲男女激情 | 网页av| 一区二区三区免费 | 国产美女网站 | 黄色毛片免费 | 91精品国产欧美一区二区 | 国内精品视频在线观看 | 亚洲喷水| 免费视频成人国产精品网站 | 天天操天天拍 | 中文字幕亚洲一区二区va在线 | 欧美精品v国产精品v日韩精品 | 亚洲国产成人精品女人 | 成人午夜网站 | 免费国产视频在线观看 | 成人激情视频网 | 97视频网站 | 在线视频一区二区三区 | 亚洲欧美v | 色综合久久天天综合网 | 国产操操操 | 久久久久久国产 | av一级一片| 超碰国产在线 | 国产精品一区视频 | 一级二级三级在线观看 | 一区二区免费 | 免费久久精品 | 野狼在线社区2017入口 | 一级毛片色一级 | 久久久精品一区 | 伊人婷婷 |