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

標題: 單片機NTC溫敏電阻的模擬溫度傳感器 仿真+PCB+源程序 [打印本頁]

作者: 調查    時間: 2020-2-28 17:49
標題: 單片機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)


作者: yygdzjs    時間: 2020-4-13 00:42
點贊!這個是負溫度系數的,沒有看到正溫度系數.
作者: aking991    時間: 2020-4-13 09:00
個人認為用不著這么麻煩吧,單片機用自帶ADC功能的就可以省掉外掛ADC,控制也可以直接用單片機的兩個外部中斷口來操作也可以得到即時響應;由于電路原理看得不是很清,所以只是提個小意見
作者: allen98    時間: 2020-4-13 11:32
謝謝樓主的分享
作者: 調查    時間: 2020-4-24 17:48
aking991 發表于 2020-4-13 09:00
個人認為用不著這么麻煩吧,單片機用自帶ADC功能的就可以省掉外掛ADC,控制也可以直接用單片機的兩個外部中 ...

為了完成師傅要求改的
作者: chjchj816    時間: 2020-12-30 16:41
來見一見 代碼寫得工整
作者: xiaxiao1127    時間: 2022-9-8 18:15
下來學習下NTC的用法。
作者: xiaxiao1127    時間: 2022-9-8 18:26
有點貨不對版,仿真用不了,原理圖不全。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲精品久久久久久首妖 | 一区二区三区在线播放 | 中文字字幕一区二区三区四区五区 | 日本黄色激情视频 | 亚洲精品久久久一区二区三区 | 久久精品99久久 | 在线国产视频 | 蜜桃精品视频在线 | 国产999精品久久久 精品三级在线观看 | 欧美一级片在线观看 | 在线观看黄免费 | 国产日韩欧美 | 日本在线综合 | 国产亚洲精品精品国产亚洲综合 | 亚洲精品二区 | 不卡一二区 | 中文字幕亚洲区一区二 | 我要看一级片 | 亚洲色图插插插 | 一区天堂 | 四虎影音 | 91免费看片 | 国产精品久久久免费 | 亚洲三级av | 韩国精品一区二区三区 | 欧美在线 | 日韩视频观看 | 九九看片 | 亚洲精品一区二区三区中文字幕 | av在线一区二区三区 | 国产精品久久 | 久久久久久久久久久国产 | 久草免费在线视频 | 在线成人精品视频 | 久久久精彩视频 | 国产一区欧美 | 国产福利观看 | 午夜影院黄 | 九一在线观看 | 色婷婷综合久久久久中文一区二区 | 中文字幕一区在线 |