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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6699|回復: 7
打印 上一主題 下一主題
收起左側

單片機NTC溫敏電阻的模擬溫度傳感器 仿真+PCB+源程序

  [復制鏈接]
跳轉到指定樓層
樓主

1、功能:實現溫度的測量,溫度達到或超過設定溫度時,蜂鳴器發出報警聲 。2、性能指標:溫度范圍:-40℃~300℃,分辨率 0.1℃,溫度誤差≤±2℃,轉換時間:100ms
     在上電之后,STC89C52 單片機進行相關的初始化,并啟動 ADC,初始化完畢之后,進入 while 循環并不斷通過串行口的移位寄存器功能掃描數碼管,實時顯示所控溫度值和當前溫度值,當達到所控溫度時,蜂鳴器發出報警。
溫度測量:當啟動 ADC 之后,每間隔 100ms 進行一次測量,ADC 測量完畢之后產生一個下降沿觸發,單片機的外部中斷口檢測到外部中斷后立即通過一根時鐘線和一根數據線完成 ADC 數據的讀取,并計算出溫敏電阻的壓降和電流,根據歐姆定律再計算出溫敏電阻的阻值,再通過該溫敏電阻的溫度計算公式計算出當前的溫度,并更新溫度值,更新報警標志。
鍵盤檢測:按鍵的功能是增減所控溫度,鍵盤檢測由或非門和外部中斷組成,當按下按鍵時產生一個下降沿,觸發外部中斷進入鍵盤處理函數,根據所按下的
鍵位來確定溫度的增減,與此同時啟動定時器,檢測按鍵是否處于長按狀態,如果是則每隔一定時間增減一定的溫度值。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


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


單片機程序:
  1. #include <REG52.H>
  2. #include <INTRINS.H>
  3. #include <MATH.H>

  4. typedef unsigned int u16;
  5. typedef unsigned char u8;
  6. typedef char int8;

  7. #define ENABLE 1
  8. #define DISABLE 0

  9. //-------------pin-define---------------

  10. sbit STORE = P2 ^ 0;
  11. sbit OE = P2 ^ 1;
  12. sbit MR = P2 ^ 2;

  13. sbit TRIG_DB = P3 ^ 3;
  14. sbit PD_SCK = P3 ^ 4;
  15. sbit ADC_CTRL = P3 ^ 5;
  16. sbit DAT = P1 ^ 3;

  17. sbit BUZZER = P2 ^ 4;

  18. #define KEYBOARD P1

  19. //-------------------------------------

  20. #define ALARM_INIT_VALUE 25.0f

  21. #define TABLE_SIZE 17
  22. #define SYMBOL_NEGATIVE 16

  23. #define POINT_MASK 0x7F //&

  24. u8 segTable[TABLE_SIZE] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, 0xbf};

  25. u8 dispVal[8];
  26. u8 t0_loopCount;

  27. float alarmVal, currentVal;

  28. //-------------------------

  29. #define Delay10Us()                              \
  30.     _nop_(), _nop_(), _nop_(), _nop_(), _nop_(); \
  31.     _nop_(), _nop_(), _nop_(), _nop_(), _nop_();

  32. #define Delay50Us() \
  33.     Delay10Us();    \
  34.     Delay10Us();    \
  35.     Delay10Us();    \
  36.     Delay10Us();    \
  37.     Delay10Us()

  38. #define UpdateAlarmVal() UpdateValue(alarmVal, 0)
  39. #define UpdateCurrentVal() UpdateValue(currentVal, 4)
  40. #define SetOverflow() \
  41.     dispVal[4] = dispVal[5] = dispVal[6] = dispVal[7] = segTable[SYMBOL_NEGATIVE]

  42. //---------------------

  43. #define BUZZER_CMD(val) BUZZER = (val)

  44. #define SEG_INIT() \
  45.     SCON = 0x00;   \
  46.     OE = 1

  47. #define SEG_UPDATE(ledx, val) \
  48.     OE = 1;                   \
  49.     P0 = (val);               \
  50.     SBUF = 0x80U >> (ledx);   \
  51.     while (TI == 0)           \
  52.         ;                     \
  53.     TI = 0;                   \
  54.     STORE = 0;                \
  55.     STORE = 1;                \
  56.     OE = 0

  57. #define KEYBOARD_INIT() \
  58.     KEYBOARD = 0x00;    \
  59.     IT0 = 1;            \
  60.     EX0 = 1
  61. #define KEY_ADD() alarmVal = alarmVal < 300.0f ? (alarmVal + 0.5f) : alarmVal
  62. #define KEY_DEC() alarmVal = alarmVal > -40.0f ? (alarmVal - 0.5f) : alarmVal

  63. #define ADC_INIT()     \
  64.     currentVal = 0.0f; \
  65.     ADC_CTRL = 1;      \
  66.     TRIG_DB = 1;       \
  67.     DAT = 1;           \
  68.     PD_SCK = 0;        \
  69.     IT1 = 1
  70. #define ADC_IT_CMD(val) EX1 = (val)
  71. #define ADC_START() ADC_CTRL = 0

  72. #define T0_LOOP_MAX 6
  73. #define T0_INIT() \
  74.     TMOD = 0x01;  \
  75.     TH0 = 0x3C;   \
  76.     TL0 = 0xB0;   \
  77.     ET0 = 1;      \
  78.     t0_loopCount = 0

  79. #define T0_CMD(val) TR0 = (val)

  80. //----------------------

  81. void DisplayAll(void);
  82. void UpdateValue(float v, u8 offset) reentrant;
  83. float ADC_Measure(void);
  84. void Delay(u16 x);
  85. void HandleKey(void) reentrant;

  86. //----------------------

  87. void main()
  88. {
  89.     alarmVal = ALARM_INIT_VALUE; //報警值初始化

  90.     BUZZER_CMD(DISABLE); // 關閉蜂鳴器

  91.     SEG_INIT(); // 初始化串口
  92.     T0_INIT();  // 初始化定時器T0, 50ms

  93.     KEYBOARD_INIT();  // 初始化鍵盤,外部中斷0,下降沿觸發
  94.     UpdateAlarmVal(); // 溫度報警值初始化
  95.     SetOverflow();    // 當前溫度值初始化為 “----”

  96.     ADC_INIT();         // 初始化ADC的控制引腳
  97.     ADC_IT_CMD(ENABLE); // 使能ADC的觸發中斷(外部中斷1)

  98.     EA = 1; // 開總中斷

  99.     Delay(100);

  100.     ADC_START(); // 啟動ADC

  101.     while (1)
  102.     {
  103.         EA = 0;
  104.         DisplayAll(); // 顯示所有數碼管
  105.         EA = 1;
  106.         Delay(4);
  107.     }
  108. }

  109. void HandleKey(void) reentrant
  110. {
  111.     switch (KEYBOARD & 0x03)
  112.     {
  113.     case 0x01:
  114.         KEY_ADD();
  115.         UpdateAlarmVal();
  116.         T0_CMD(ENABLE);
  117.         break;
  118.     case 0x02:
  119.         KEY_DEC();
  120.         UpdateAlarmVal();
  121.         T0_CMD(ENABLE);
  122.         break;
  123.     default:
  124.         T0_CMD(DISABLE);
  125.         break;
  126.     }
  127. }

  128. void Delay(u16 x)
  129. {
  130.     u16 i;
  131.     while (x--)
  132.         for (i = 0; i < 62; i++)
  133.             ;
  134. }

  135. void DisplayAll()
  136. {
  137.     u8 i;
  138.     for (i = 0; i < 8; i++)
  139.     {
  140.         SEG_UPDATE(i, dispVal[i]);
  141.         Delay(4);
  142.     }
  143. }

  144. void UpdateValue(float v, u8 offset) reentrant
  145. {
  146.     u16 val = (v > 0.0f ? v : -v) * 10;

  147.     if (v > 0.0f)
  148.     {
  149.         dispVal[0 + offset] = segTable[val / 1000];
  150.         dispVal[1 + offset] = segTable[(val % 1000) / 100];
  151.         dispVal[2 + offset] = segTable[(val % 100) / 10] & POINT_MASK;
  152.         dispVal[3 + offset] = segTable[val % 10];
  153.     }
  154.     else
  155.     {
  156.         dispVal[0 + offset] = segTable[SYMBOL_NEGATIVE];
  157.         dispVal[1 + offset] = segTable[val / 100];
  158.         dispVal[2 + offset] = segTable[(val % 100) / 10] & POINT_MASK;
  159.         dispVal[3 + offset] = segTable[val % 10];
  160.     }
  161. }
復制代碼
后續見附件

全部資料51hei下載地址:
DPJ_KS.rar (567.34 KB, 下載次數: 192)

評分

參與人數 2黑幣 +55 收起 理由
ed34 + 5 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏11 分享淘帖 頂3 踩
回復

使用道具 舉報

無效樓層,該帖已經被刪除
板凳
ID:59830 發表于 2020-4-13 00:42 | 只看該作者
點贊!這個是負溫度系數的,沒有看到正溫度系數.
回復

使用道具 舉報

地板
ID:65956 發表于 2020-4-13 09:00 | 只看該作者
個人認為用不著這么麻煩吧,單片機用自帶ADC功能的就可以省掉外掛ADC,控制也可以直接用單片機的兩個外部中斷口來操作也可以得到即時響應;由于電路原理看得不是很清,所以只是提個小意見
回復

使用道具 舉報

5#
ID:668601 發表于 2020-4-13 11:32 | 只看該作者
謝謝樓主的分享
回復

使用道具 舉報

6#
ID:324435 發表于 2020-4-24 17:48 | 只看該作者
aking991 發表于 2020-4-13 09:00
個人認為用不著這么麻煩吧,單片機用自帶ADC功能的就可以省掉外掛ADC,控制也可以直接用單片機的兩個外部中 ...

為了完成師傅要求改的
回復

使用道具 舉報

7#
無效樓層,該帖已經被刪除
8#
ID:120677 發表于 2020-12-30 16:41 | 只看該作者
來見一見 代碼寫得工整
回復

使用道具 舉報

9#
無效樓層,該帖已經被刪除
10#
ID:941205 發表于 2022-9-8 18:15 | 只看該作者
下來學習下NTC的用法。
回復

使用道具 舉報

11#
ID:941205 發表于 2022-9-8 18:26 | 只看該作者
有點貨不對版,仿真用不了,原理圖不全。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 岛国一区 | 欧美久久视频 | 色一情一乱一伦一区二区三区 | 亚洲综合大片69999 | 成人精品一区二区三区 | 婷婷综合 | 婷婷精品 | 三级黄色网址 | 国产一区成人 | 欧美性网 | 精品日韩在线观看 | 亚洲精品白浆高清久久久久久 | 日本不卡免费新一二三区 | 拍拍无遮挡人做人爱视频免费观看 | 中文字幕 欧美 日韩 | 国产中文字幕在线 | 不卡一区 | 亚洲精品在线视频 | 四虎海外 | 一级欧美黄色片 | 久久久久久999 | 国产精品美女久久久久久免费 | 中文字幕高清免费日韩视频在线 | 精品成人佐山爱一区二区 | 涩爱av一区二区三区 | av官网在线 | 人妖videosex高潮另类 | 久久国产一区二区三区 | 亚洲日产精品 | 日本久草 | 国产高清一区二区三区 | 日本欧美黄色片 | 国产一级特黄真人毛片 | 中文字幕亚洲视频 | 一区二区三区四区在线 | 成人亚洲精品久久久久软件 | 日本亚洲欧美 | 天天久久 | 久优草 | 国产精品久久久久久久久久 | 国产精品a一区二区三区网址 |