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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 23562|回復: 47
收起左側

STC15W408AS單片機白光T12控制器,附帶原理圖和源代碼

  [復制鏈接]
ID:520235 發表于 2020-11-25 09:27 | 顯示全部樓層 |閱讀模式
自己設計和制作的stc白光,附上原理圖,洞洞板走線圖和源代碼。
只實現了簡單的溫控,短按一下編碼器快速設定溫度為300℃,雙擊一下編碼器快速設定為10℃(相當于短暫休眠
STC15W408AS_T12_Controller_sch-publish.png


stc15_baiguang.png


IMG_20200314_123047.jpg


IMG_20200314_123621.jpg


代碼注釋還是很詳細的,適合初學者學習。
51hei截圖_20201125092851.png

單片機源程序如下:
  1. /**
  2. 布滿星星的天空 CZS 編寫
  3. */
  4. #include <STC15.h>
  5. #include <intrins.h>
  6. #include <math.h>

  7. sbit t12 = P3 ^ 7;         //T12控制
  8. sbit encoderb = P1 ^ 0;    //編碼器的b腳
  9. sbit encodera = P1 ^ 1;    //編碼器的a腳
  10. sbit encoderd = P1 ^ 2;    //編碼器的按鍵d腳
  11. sbit DIO = P3 ^ 3;         // TM1650 數碼管驅動的sda引腳
  12. sbit CLK = P3 ^ 2;         // TM1650 數碼管驅動的scl引腳
  13. sbit DO = P5 ^ 5;          //DS18B20數據腳
  14. unsigned long VREF = 2390; // 用萬用表測量基準電壓的真實值,單位mv

  15. bit lastb = 0;
  16. bit lasta = 0;
  17. unsigned short push_last_time = 0; //記錄按下編碼器按鈕的時間,短按和長按

  18. unsigned long t12_voltage;    // 計算t12熱電偶電壓
  19. unsigned long system_voltage; // 計算單片機供電電壓
  20. unsigned long input_voltage;  // 計算整個板子的輸入電壓(12~24V)

  21. // PID控制算法
  22. #define KP 1.2f       // 比例系數
  23. #define KI 0.2f       // 積分系數
  24. #define KD 0.1f       // 微分系數
  25. #define MAX_UK 400.0f // 系統允許輸出的最大控制量,這里表現為加熱數,400個0.5ms加熱周期,最長連續加熱時間為200ms

  26. int ek = 0, ek_1 = 0, ek_2 = 0; // 記錄連續三次的偏差值(設定值-實際測量值)
  27. float uk_1 = 0.0f, uk = 0.0f;   // 記錄當前計算的PID調整值和上次計算的PID調整值
  28. long integralSum = 0;           // 位置式PID算法的累計積分項

  29. // 定義一個數碼管段碼表,0~F
  30. unsigned char CODE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0X7C, 0X39, 0X5E, 0X79, 0X71};

  31. unsigned int t12SetTemperature = 10;   // 記錄當前設定的溫度
  32. unsigned int t12ActualTemperature = 0; // 保存T12當前的實際溫度
  33. bit isChangeTemperature = 0;           // 標記是否更改過設定溫度
  34. unsigned int setTempShowTime = 0;      // 記錄顯示設置溫度的時長

  35. unsigned int need_heat_time = 0;       // 需要加熱的時長
  36. unsigned int heat_time_count = 0;      //當前已經加熱的時長
  37. unsigned int actualTempShowTime = 250; //設定當前溫度的顯示時長,避免采集溫度過快造成數碼管亂跳

  38. /*延時函數,使用STC-ISP自動生成的,比較準確*/
  39. void Delay_ms(unsigned int k) //@12.000MHz
  40. {
  41.   unsigned char i, j;
  42.   for (; k > 0; k--)
  43.   {
  44.     i = 12;
  45.     j = 169;
  46.     do
  47.     {
  48.       while (--j)
  49.         ;
  50.     } while (--i);
  51.   }
  52. }

  53. void Delay_us(unsigned int i)
  54. {
  55.   for (; i > 0; i--)
  56.   {
  57.     _nop_();
  58.     _nop_();
  59.     _nop_();
  60.     _nop_();
  61.   }
  62. }

  63. // 初始化各個IO口
  64. void initIO()
  65. {
  66.   // 配置各個端口的輸入模式,M1M0:00普通,01推挽,10高阻輸入,11開漏
  67.   /*
  68.         以下列出需要配置的端口,其他端口保持默認即可
  69.         t12 = P3^7;             //T12控制  推挽輸出模式
  70.         ADC3:系統輸入電壓檢測 P1^3 輸入模式
  71.         ADC4:T12熱電偶電壓檢測 P1^4 輸入模式
  72.         ADC5:2.5V參考電壓輸入 P1^5 輸入模式
  73.         */

  74.   //P1M0 |= 0x00; //0000 0000
  75.   P1M1 |= 0x38; //0011 1000

  76.   P3M0 = 0x80; //1000 0000
  77.   P3M1 = 0x00; //0000 0000
  78. }

  79. /*初始化ADC*/
  80. void initADC(void)
  81. {
  82.   /*
  83.         開啟相應ADC口的模擬輸入功能(相應位置1)
  84.         ADC3:系統輸入電壓檢測 P1^3
  85.         ADC4:T12熱電偶電壓檢測 P1^4
  86.         ADC5:2.5V參考電壓輸入 P1^5
  87.         */
  88.   P1ASF = 0x38; //0011 1000
  89.   ADC_RES = 0;  // 清楚結果寄存器
  90.   ADC_RESL = 0;
  91.   /*
  92.         ADC控制寄存器
  93.         ADC_POWER | SPEED1 | SPEED0 | ADC_FLAG | ADC_START | CHS2 | CHS1 | CHS0
  94.         */
  95.   // 這里初始化的時候,可以先打開電源和設置轉換速度
  96.   ADC_CONTR = 0x80; // 1000 0000
  97.   Delay_ms(5);      // 上電之后延時等待一段時間
  98. }

  99. // 關閉ADC電源,在進入空閑(休眠)模式的時候啟用,降低功耗
  100. void closeADC(void)
  101. {
  102.   /*
  103.         ADC控制寄存器
  104.         ADC_POWER | SPEED1 | SPEED0 | ADC_FLAG | ADC_START | CHS2 | CHS1 | CHS0
  105.         */
  106.   ADC_CONTR = 0x00;
  107. }

  108. // 直接插入排序
  109. void insertionSort(unsigned int A[], unsigned int n)
  110. {
  111.   unsigned int i, j;
  112.   for (i = 1; i < n; i++)
  113.   {
  114.     for (j = i; j > 0; j--)
  115.     {
  116.       if (A[j] < A[j - 1])
  117.       {
  118.         // 不使用第三變量交換兩個數,使用異或運算速度快
  119.         A[j - 1] ^= A[j];
  120.         A[j] ^= A[j - 1];
  121.         A[j - 1] ^= A[j];
  122.       }
  123.     }
  124.   }
  125. }

  126. #define ADC_FLAG 0x10  // ADC轉換完成標志
  127. #define ADC_START 0x08 // ADC開始置位
  128. // 獲取某個ADC通道的轉換值
  129. // 為了提高結果的準確性,每次測量,測5次,并且去掉一個最高值,一個最低值,最后取中間3個的均值返回
  130. unsigned int getADCResult(unsigned int channel)
  131. {
  132.   unsigned int res[5], i, result = 0;
  133.   for (i = 0; i < 5; i++)
  134.   {
  135.     /*
  136.         ADC控制寄存器
  137.         ADC_POWER | SPEED1 | SPEED0 | ADC_FLAG | ADC_START | CHS2 | CHS1 | CHS0
  138.         */
  139.     ADC_CONTR = (0x80 | channel | ADC_START); // 選擇需要讀取的通道,并開啟轉換
  140.     Delay_us(1);
  141.     while (!(ADC_CONTR & ADC_FLAG))
  142.       ;                                            //等待ADC轉換完成
  143.     res[i] = ((ADC_RES << 2) | (ADC_RESL & 0x03)); // 計算轉換出來的原始結果
  144.     ADC_RES = 0x00;
  145.     ADC_RESL = 0x00; // 清零結果寄存器
  146.   }
  147.   // 對結果進行排序
  148.   insertionSort(res, 5);
  149.   // 去掉一個最高值,去掉一個最低值,剩余三個求平均值
  150.   result = (res[1] + res[2] + res[3]) / 3;
  151.   return result;
  152. }
  153. /*以下是計算各種電壓的函數,返回結果的單位都是mv*/
  154. // 計算公式(mv) output_voltage = (VREF萬用表測的TL431基準電壓值(mv) * 待測通道的ADC值 / TL431基準通道ADC值)
  155. // 計算獲取T12的電壓
  156. void getT12Voltage(void)
  157. {
  158.   t12_voltage = (VREF * getADCResult(4) / getADCResult(5)); //計算t12電壓,單位mV
  159. }

  160. // 計算獲取單片機的電源電壓
  161. void getSystemVoltage(void)
  162. {
  163.   system_voltage = (VREF * 1024 / getADCResult(5)); //計算單片機的電源電壓,單位mV;
  164. }

  165. // 計算獲取輸入電源電壓
  166. void getInputVoltage(void)
  167. {
  168.   input_voltage = (VREF * getADCResult(3) / getADCResult(5) * 11); // 計算下分壓電阻點的電壓,并乘分壓比,獲得實際的輸入電壓
  169. }

  170. /* 計算T12熱電偶溫度 */
  171. void getT12Temperature(void)
  172. {
  173.   float x = 0.0f;
  174.   t12 = 0;         //測溫的時候,關閉電烙鐵
  175.   Delay_us(10);    // 等待一段時間,等電容放完電后再測量溫度比較準確
  176.   getT12Voltage(); // 更新T12熱電偶電壓
  177.                    //T12實際溫度 = (ADC電壓(mV)-失調電壓(mV))/運放增益*熱電偶分度值(℃/mV)+室溫(℃)
  178.                    //t12Temp = 1.0f*getT12Voltage() / 231.0f * 54.0f + 23.0f;

  179.   // 插值函數計算T12溫度,上面的算得不夠準確,自己測量了t12溫度與熱電偶電動勢的關系,用matlab擬合出來的公式
  180.   x = 1.0f * t12_voltage / 231.0f;
  181.   x = -0.9f * x * x + 48.0f * x + 22.0f;
  182.   t12ActualTemperature = (unsigned int)x;
  183. }

  184. /*
  185. // 增量式PID控制算法,該算法用在溫度控制效果不佳,調參調了比較久,不是很理想
  186. // 輸入設定溫度和當前溫度
  187. // 返回當前應該加熱的時長
  188. void incrementalPID(unsigned int setTemperature, unsigned int actualTemperature)
  189. {
  190.   float delta_uk = 0.0f;                   // 用于計算PID增量值
  191.   uk_1 = uk;                               // 記錄上次計算的PID調整值
  192.   ek_2 = ek_1;                             // 記錄上上次計算的偏差值
  193.   ek_1 = ek;                               // 記錄上次計算的偏差值
  194.   ek = setTemperature - actualTemperature; // 計算當前偏差值
  195.   if (ek < 0)
  196.   {
  197.     // 如果實際溫度比設定溫度還要高,那么不執行加熱
  198.     need_heat_time = 0;
  199.     return;
  200.   }
  201.   if (abs(ek) > 100)
  202.   {
  203.     // 如果溫差大于100℃,則執行系統的動態加速,不管比例項為正還是為負,都取正數
  204.     delta_uk = KP * abs(ek - ek_1) + KI * ek + KD * (ek - 2 * ek_1 + ek_2); // 計算PID增量值
  205.   }
  206.   else
  207.   {
  208.     // 當快要接近目標溫度的時候,執行正常的調節
  209.     delta_uk = KP * (ek - ek_1) + KI * ek + KD * (ek - 2 * ek_1 + ek_2); // 計算PID增量值
  210.   }
  211.   uk = uk_1 + delta_uk; // 計算當前應該輸出的PWM值
  212.   // 判斷是否超出了系統控制量的邊界范圍,如果超出,則賦值為邊界
  213.   if (uk < 1e-9)
  214.   {
  215.     uk = 0.0f;
  216.   }
  217.   if (uk > MAX_UK)
  218.   {
  219.     uk = MAX_UK;
  220.   }
  221.   need_heat_time = (unsigned int)uk;
  222. }
  223. */

  224. // 位置式PID控制算法,這個控制算法運行起來比較理想
  225. void positionalPID(unsigned int setTemperature, unsigned int actualTemperature)
  226. {
  227.   ek_1 = ek;                               // 記錄上次計算的偏差值
  228.   ek = setTemperature - actualTemperature; // 計算當前偏差值
  229.   if (ek < 0)
  230.   {
  231.     // 如果實際溫度比設定溫度還要高,那么不執行加熱
  232.     need_heat_time = 0;
  233.     return;
  234.   }
  235.   // 當偏差較大時,取消積分作用
  236.   if (abs(ek) > 100)
  237.   {
  238.     integralSum = 0;
  239.   }
  240.   else
  241.   {
  242.     // 否則,根據情況進行累計積分
  243.     if (integralSum > 100) //積分超過上限時,只累計負的積分量
  244.     {
  245.       if (ek < 0)
  246.       {
  247.         integralSum += ek;
  248.       }
  249.     }
  250.     else if (integralSum < -10) //積分超過下限時,只累計正的積分量
  251.     {
  252.       if (ek > 0)
  253.       {
  254.         integralSum += ek;
  255.       }
  256.     }
  257.     else
  258.     {
  259.       integralSum += ek;
  260.     }
  261.   }
  262.   uk = KP * ek + KI * integralSum + KD * (ek - ek_1); // 計算當前應該輸出的控制量值
  263.   // 判斷是否超出了系統控制量的邊界范圍,如果超出,則賦值為邊界
  264.   if (uk < 1e-9)
  265.   {
  266.     uk = 0.0f;
  267.   }
  268.   if (uk > MAX_UK)
  269.   {
  270.     uk = MAX_UK;
  271.   }
  272.   need_heat_time = (unsigned int)uk; // 更新當前需要加熱的時間數
  273. }

  274. /********************************以下是TM1650數碼管顯示相關的函數****************************************************/

  275. void Start1650(void)
  276. { //開始信號
  277.   CLK = 1;
  278.   DIO = 1;
  279.   Delay_us(5);
  280.   DIO = 0;
  281.   Delay_us(5);
  282.   DIO = 0;
  283. }

  284. void Ask1650(void)
  285. { //ACK信號
  286.   unsigned char timeout = 1;
  287.   CLK = 1;
  288.   Delay_us(5);
  289.   CLK = 0;
  290.   while ((DIO) && (timeout <= 100))
  291.   {
  292.     timeout++;
  293.   }
  294.   Delay_us(5);
  295.   CLK = 0;
  296. }

  297. void Stop1650(void)
  298. { //停止信號
  299.   CLK = 1;
  300.   DIO = 0;
  301.   Delay_us(5);
  302.   DIO = 1;
  303.   Delay_us(5);
  304. }

  305. void WrByte1650(unsigned char oneByte)
  306. { //寫一個字節,高位在前,低位在后
  307.   unsigned char i;
  308.   CLK = 0;
  309.   Delay_us(1);
  310.   for (i = 0; i < 8; i++)
  311.   {
  312.     oneByte = oneByte << 1;
  313.     DIO = CY;
  314.     CLK = 0;
  315.     Delay_us(5);
  316.     CLK = 1;
  317.     Delay_us(5);
  318.     CLK = 0;
  319.   }
  320. }
  321. /*
  322. unsigned char Scan_Key(void)
  323. { // 按鍵掃描
  324.   unsigned char i;
  325.   unsigned char rekey;
  326.   Start1650();
  327.   WrByte1650(0x49); //讀按鍵命令
  328.   Ask1650();
  329.   //DIO = 1;
  330.   for (i = 0; i < 8; i++)
  331.   {
  332.     CLK = 1;
  333.     rekey = rekey << 1;
  334.     if (DIO)
  335.     {
  336.       rekey++;
  337.     }
  338.     Delay_us(5);
  339.     CLK = 0;
  340.   }
  341.   Ask1650();
  342.   Stop1650();
  343.   return (rekey);
  344. }
  345. */

  346. void Set1650(unsigned char add, unsigned char dat)
  347. { //數碼管顯示
  348.   //寫顯存必須從高地址開始寫
  349.   Start1650();
  350.   WrByte1650(add); //第一個顯存地址
  351.   Ask1650();
  352.   WrByte1650(dat);
  353.   Ask1650();
  354.   Stop1650();
  355. }

  356. // 初始化1650,傳入亮度參數,范圍0~7
  357. void init1650(unsigned char light)
  358. {
  359.   Set1650(0x48, ((light << 4) | 0x01));
  360. }

  361. // 數碼管顯示函數
  362. void display(signed int num)
  363. {
  364.   // 計算這個數字對應的千百十個位的數字
  365.   unsigned int tmpnum, qian, bai, shi, ge;
  366.   if (num < 0)
  367.     num = -num;
  368.   tmpnum = num;
  369.   qian = tmpnum / 1000;
  370.   tmpnum %= 1000;
  371.   bai = tmpnum / 100;
  372.   tmpnum %= 100;
  373.   shi = tmpnum / 10;
  374.   ge = tmpnum % 10;

  375.   Set1650(0x68, CODE[qian]);
  376.   Set1650(0x6A, CODE[bai]);
  377.   Set1650(0x6C, CODE[shi]);
  378.   Set1650(0x6E, CODE[ge]);
  379. }

  380. /************************************************************************************************
  381.     函數名稱:Encoder
  382.     函數功能:編碼器旋轉的掃描及處理
  383.     入口參數:無
  384.     出口參數:char型    0-無旋轉   'R'-正轉(向右轉)   'L'-反轉(向左轉)
  385. ************************************************************************************************/
  386. unsigned char Encoder(void)
  387. {
  388.   static bit Enc0 = 0;
  389.   static unsigned char EncOld, EncX = 0;
  390.   unsigned char EncNow;

  391.   encodera = 1; //PINA置高電平
  392.   encoderb = 1; //PINB置高電平
  393.   if (Enc0 == 0)
  394.   {
  395.     EncOld = (encodera ? 0x02 : 0x00) + (encoderb ? 0x01 : 0x00);
  396.     Enc0 = 1; //記住初次調用時編碼器的狀態
  397.   }
  398.   EncNow = (encodera ? 0x02 : 0x00) + (encoderb ? 0x01 : 0x00); //根據兩個IO當前狀態組合成16進制的0x00|0x01|0x02|0x03
  399.   if (EncNow == EncOld)
  400.     return (0); //如果新數據和原來的數據一樣(沒有轉動)就直接返回0

  401.   if (EncOld == 0x00 && EncNow == 0x02 || EncOld == 0x03 && EncNow == 0x01)
  402.     EncX = EncNow;                                                                                          //00-10|11-01
  403.   if (EncOld == 0x00 && EncX == 0x02 && EncNow == 0x03 || EncOld == 0x03 && EncX == 0x01 && EncNow == 0x00) //00-10-11|11-01-00右轉
  404.   {
  405.     EncOld = EncNow, EncX = 0;
  406.     return ('R'); //兩定位一脈沖
  407.   }

  408.   if (EncOld == 0x00 && EncNow == 0x01 || EncOld == 0x03 && EncNow == 0x02)
  409.     EncX = EncNow;                                                                                          //00-01|11-10
  410.   if (EncOld == 0x00 && EncX == 0x01 && EncNow == 0x03 || EncOld == 0x03 && EncX == 0x02 && EncNow == 0x00) //00-01-11|11-10-00左轉
  411.   {
  412.     EncOld = EncNow;
  413.     EncX = 0;
  414.     return ('L'); //兩定位一脈沖
  415.   }
  416.   return (0); //沒有正確解碼返回0
  417. }

  418. // 編碼器函數,用于設置t12的設定溫度
  419. void bianmaqi()
  420. {
  421.   unsigned char enc;
  422.   enc = Encoder(); //掃描編碼器,取得返回值
  423.   if (enc == 'R')
  424.   {
  425.     t12SetTemperature += 5;
  426.     if (t12SetTemperature > 500)
  427.       t12SetTemperature = 500;
  428.     isChangeTemperature = 1;
  429.   }
  430.   else if (enc == 'L')
  431.   {
  432.     t12SetTemperature -= 5;
  433.     if (t12SetTemperature < 10)
  434.       t12SetTemperature = 10;
  435.     isChangeTemperature = 1;
  436.   }

  437.   while (!encoderd)
  438.   {
  439.     push_last_time++;
  440.     Delay_ms(100);
  441.   }
  442.   if (push_last_time > 0 && push_last_time < 8)
  443.   {
  444.     push_last_time = 0;
  445.     Delay_ms(80); // 等待延時一段時間,看看有沒有第二次按下
  446.     while (!encoderd)
  447.     {
  448.       push_last_time++;
  449.       Delay_ms(100);
  450.     }
  451.     if (push_last_time > 0 && push_last_time < 8)
  452.     {
  453.       // 雙擊了編碼器按鈕,關閉電烙鐵輸出
  454.       t12SetTemperature = 10;
  455.       t12 = 0;
  456.       isChangeTemperature = 1;
  457.     }
  458.     else
  459.     {
  460.       // 短按一次編碼器按鈕,設定為300℃輸出
  461.       t12SetTemperature = 300;
  462.       isChangeTemperature = 1;
  463.     }
  464.   }
  465.   else if (push_last_time >= 8)
  466.   {
  467.     // 長按編碼器按鈕,設定為250℃輸出
  468.     t12SetTemperature = 250;
  469.     isChangeTemperature = 1;
  470.   }
  471.   if (isChangeTemperature)
  472.   {
  473.     // 如果有改變設置溫度,那么就要顯示新的設置溫度
  474.     setTempShowTime = 600;
  475.   }
  476.   push_last_time = 0;
  477. }

  478. // 該定時器初始化函數部分使用STC-ISP下載軟件生成,加入開啟中斷的寄存器賦值
  479. void Timer0Init(void) //500微秒 0.5ms @12.000MHz
  480. {

  481.   AUXR |= 0x80; //定時器時鐘1T模式
  482.   TMOD &= 0xF0; //設置定時器模式
  483.   TL0 = 0x90;   //設置定時初值
  484.   TH0 = 0xE8;   //設置定時初值
  485.   TF0 = 0;      //清除TF0標志
  486.   ET0 = 1;      //開啟定時器0中斷
  487.   TR0 = 1;      //定時器0開始計時
  488.   EA = 1;       // CPU總中斷允許控制位
  489. }

  490. //定時0中斷函數,每隔0.5ms執行一次
  491. void timer0(void) interrupt 1
  492. {
  493.   bianmaqi(); // 調用編碼器函數,獲取編碼器當前狀態(左旋,右旋,短按,長按)
  494.   if (heat_time_count < need_heat_time)
  495.   {
  496.     // 如果當前還沒完成需要加熱的時長,就控制t12加熱
  497.     t12 = 1;
  498.     heat_time_count++;
  499.   }
  500.   else
  501.   {
  502.     // 已經完成相應的加熱時長,調用PID函數獲取下一個需要的加熱數
  503.     t12 = 0;
  504.     getT12Temperature();                                    // 獲取當前T12的溫度
  505.     positionalPID(t12SetTemperature, t12ActualTemperature); // 更新當前需要加熱的時間計數
  506.     heat_time_count = 0;                                    //重新開始統計加熱時長
  507.   }

  508.   if (setTempShowTime > 0)
  509.   {
  510.     // 還沒顯示夠顯示設置溫度的時長,需要繼續顯示,這里用7開頭表示顯示設定溫度
  511.     display(t12SetTemperature + 7000);
  512.     setTempShowTime--;
  513.     // 已經顯示了設置溫度了,那么要把這個更改過設置溫度的標志開關關閉
  514.     isChangeTemperature = 0;
  515.   }
  516.   else
  517.   {
  518.     if (actualTempShowTime < 2)
  519.     {
  520.       display(t12ActualTemperature); // 顯示當前的t12實際溫度
  521.       actualTempShowTime = 250;
  522.     }
  523.     actualTempShowTime--;
  524.   }
  525. }

  526. void main()
  527. {
  528.   initIO(); // 初始化IO口
  529.   t12 = 0;
  530.   init1650(1); // 初始化TM1650顯示
  531.   initADC();   // 初始化ADC

  532.   getSystemVoltage(); //檢測單片機電源電壓
  533.   getInputVoltage();  //檢測輸入電壓

  534.   // 顯示輸入電壓,這里的7123和7456僅僅只是用于標識顯示什么內容,畢竟沒有OLED屏幕這么高大上可以顯示很多內容
  535. ……………………

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

壓縮包內容
51hei截圖_20201125092827.png
全部資料51hei下載地址:
51hei_T12白光.zip (352.73 KB, 下載次數: 670)

評分

參與人數 3黑幣 +95 收起 理由
wpppmlah + 30 共享資料的黑幣獎勵!
digger + 15 共享資料的黑幣獎勵!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:328014 發表于 2020-11-25 16:02 | 顯示全部樓層
好資料,51黑有你更精彩!!!
代碼工程:

程序.7z

39.81 KB, 下載次數: 30, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:723157 發表于 2020-12-15 21:58 | 顯示全部樓層
一直在找T12 白光制作 單片機 學習!
回復

使用道具 舉報

ID:156220 發表于 2020-12-16 13:39 | 顯示全部樓層
謝謝樓主的資料分享,好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:35873 發表于 2021-1-4 16:30 | 顯示全部樓層
做的不錯 點個贊  佩服會寫程序的
回復

使用道具 舉報

ID:90685 發表于 2021-1-14 19:02 | 顯示全部樓層
謝謝,等打樣回來試試在評論。
回復

使用道具 舉報

ID:879141 發表于 2021-1-31 18:59 來自手機 | 顯示全部樓層
線路看來不太複雜,學習一下。謝謝分享!
回復

使用道具 舉報

ID:353831 發表于 2021-2-10 17:37 | 顯示全部樓層
樓主你好,程序編譯通不過
回復

使用道具 舉報

ID:95809 發表于 2021-2-11 08:10 | 顯示全部樓層
wl020807 發表于 2021-2-10 17:37
樓主你好,程序編譯通不過

因為程序超過了8K,你在輸出選擇變量在XDATA就可以了。
2021-02-11_08-06-17.jpg
回復

使用道具 舉報

ID:232366 發表于 2021-2-12 13:52 | 顯示全部樓層
樓主您的編程軟件可以共享一下嗎?中文版的?
回復

使用道具 舉報

ID:353831 發表于 2021-2-14 11:54 | 顯示全部樓層
bxyyhan 發表于 2021-2-11 08:10
因為程序超過了8K,你在輸出選擇變量在XDATA就可以了。

謝謝!編譯已成功
回復

使用道具 舉報

ID:353831 發表于 2021-2-14 18:38 | 顯示全部樓層
bxyyhan 發表于 2021-2-11 08:10
因為程序超過了8K,你在輸出選擇變量在XDATA就可以了。

樓主了你好,請問15W408AS下載晶振設置成12M嗎?
回復

使用道具 舉報

ID:95809 發表于 2021-2-15 21:10 | 顯示全部樓層
wl020807 發表于 2021-2-14 18:38
樓主了你好,請問15W408AS下載晶振設置成12M嗎?

我不是樓主,晶振12M可以,他這個只有最基本的溫控功能,沒有其他功能。
回復

使用道具 舉報

ID:224125 發表于 2021-2-16 17:23 | 顯示全部樓層
關注一下,正好學習怎么編程
回復

使用道具 舉報

ID:71535 發表于 2021-2-18 09:35 | 顯示全部樓層
學習一下,排序和編碼器實用價值好,謝謝分享。
回復

使用道具 舉報

ID:137526 發表于 2021-2-19 12:02 | 顯示全部樓層
謝謝樓主的資料分享 注釋清晰 學習起來很好的資料
回復

使用道具 舉報

ID:315554 發表于 2021-6-3 15:48 | 顯示全部樓層
注解很詳細,學習一下,謝謝分享,
回復

使用道具 舉報

ID:496247 發表于 2021-6-14 19:36 | 顯示全部樓層
好評,謝謝分享
回復

使用道具 舉報

ID:1008207 發表于 2022-3-18 09:21 | 顯示全部樓層

謝謝樓主的資料分享,好資料!
回復

使用道具 舉報

ID:44459 發表于 2022-3-24 13:28 | 顯示全部樓層
有個問題需要提醒下,431基準A、R腳之間的電容不能小于4.7uf 不然自激,建議10uf ,看你程序里基準電壓測量出來是2.39V,距離標準2.5V差異較大,很可能是自激造成的。
回復

使用道具 舉報

ID:430492 發表于 2022-3-26 14:17 | 顯示全部樓層
樓上厲害,細節注意得很好!
回復

使用道具 舉報

ID:835869 發表于 2022-6-6 07:33 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:915491 發表于 2022-6-8 09:06 | 顯示全部樓層
很好的資料,不過18B20能測到300度嗎
回復

使用道具 舉報

ID:734899 發表于 2022-7-21 13:56 | 顯示全部樓層
這個能換成3位數碼管的嗎?
回復

使用道具 舉報

ID:961114 發表于 2022-7-21 14:39 | 顯示全部樓層
STC 虛擬 調試接口 VEP[XSBBJ7M]4F@JX@D)[1E.png
回復

使用道具 舉報

ID:82809 發表于 2022-7-21 15:59 | 顯示全部樓層
1.  358的4腳8腳接地?
2.  R9后面不跟分壓電阻?358的7腳輸出不飽和嗎?
回復

使用道具 舉報

ID:1039485 發表于 2022-8-11 13:56 | 顯示全部樓層
學習了,感謝分享
回復

使用道具 舉報

ID:388000 發表于 2022-8-17 17:04 | 顯示全部樓層
烙鐵壞了,修復一下,看電路有點像。
回復

使用道具 舉報

ID:1007907 發表于 2022-8-27 20:59 | 顯示全部樓層
這芯片夠便宜,可以試下
回復

使用道具 舉報

ID:579397 發表于 2022-9-19 18:04 | 顯示全部樓層
請問畫PCB的軟件是啥
回復

使用道具 舉報

ID:688460 發表于 2022-9-19 22:01 | 顯示全部樓層
pfdqwp 發表于 2022-7-21 15:59
1.  358的4腳8腳接地?
2.  R9后面不跟分壓電阻?358的7腳輸出不飽和嗎?

358的第8腳肯定是接電源的,你看一下他的洞洞板的連接就明白了,他這個原理圖上應該的初心大意連錯了地方!
回復

使用道具 舉報

ID:53928 發表于 2023-1-12 00:16 | 顯示全部樓層
這個片子上oled更好一些    204做數碼管足夠用了
回復

使用道具 舉報

ID:269675 發表于 2023-3-21 14:18 | 顯示全部樓層
我就想要最基本的控溫, 如果能加上串口通訊多好,那么大神可以弄個,
回復

使用道具 舉報

ID:433219 發表于 2023-8-18 10:30 | 顯示全部樓層
405616736 發表于 2022-9-19 18:04
請問畫PCB的軟件是啥

一看就是 Protel99
回復

使用道具 舉報

ID:1064915 發表于 2023-8-18 10:51 | 顯示全部樓層
準備元件,有時間仿制一個
回復

使用道具 舉報

ID:1065749 發表于 2023-8-18 14:06 | 顯示全部樓層
電烙鐵輸出插頭有5個腳,是怎樣定義的,哪兩個接烙鐵芯,哪兩個接溫度傳感器,另外一個腳應該是接地。
回復

使用道具 舉報

ID:38187 發表于 2024-2-23 20:04 | 顯示全部樓層
謝謝老師的分享, 正好學習一下PID方法
回復

使用道具 舉報

ID:857072 發表于 2024-2-23 22:51 | 顯示全部樓層
gao687 發表于 2022-6-8 09:06
很好的資料,不過18B20能測到300度嗎

18B20是測量室溫的,烙鐵自帶熱電偶測溫,但是需要環境溫度做冷端補償來校準烙鐵溫度不是用18B20直接測烙鐵頭。
回復

使用道具 舉報

ID:857072 發表于 2024-2-23 22:53 | 顯示全部樓層
18689719961 發表于 2023-8-18 14:06
電烙鐵輸出插頭有5個腳,是怎樣定義的,哪兩個接烙鐵芯,哪兩個接溫度傳感器,另外一個腳應該是接地。

T12烙鐵就只有兩根線,加熱和測溫串在一起的。
回復

使用道具 舉報

ID:67838 發表于 2024-2-29 12:04 | 顯示全部樓層

謝謝樓主的資料分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.日韩高清| 天堂资源最新在线 | 免费国产视频在线观看 | 成人三级电影 | 精彩视频一区二区三区 | 97色在线观看免费视频 | 日韩中文一区二区三区 | 国产成人精品一区 | 国产精品亚洲综合 | 毛片一级网站 | 中文字幕亚洲区一区二 | 午夜电影福利 | 国产视频中文字幕 | 黑人一级黄色大片 | 国产亚洲一区二区在线观看 | 国产在线拍偷自揄拍视频 | 亚洲a视 | 91麻豆精品一区二区三区 | 视频一二三区 | 亚洲精品一区二区在线观看 | 一级毛片观看 | 一区二区三区国产 | www.日本在线播放 | 精品九九在线 | 国产欧美精品一区二区 | 国产精品美女久久久久久免费 | 欧美在线日韩 | 拍戏被cao翻了h承欢 | 亚洲美乳中文字幕 | 国产在线一区二区三区 | 欧美一区二区 | 91网在线观看 | 国产精品毛片一区二区在线看 | 精品久久久久久亚洲精品 | 久优草 | 狠狠草视频 | 性天堂网| 欧美激情国产精品 | 日韩伦理一区二区三区 | 国产精品色| 亚洲黄色视屏 |