|
起源:
以前制作過(guò)一臺(tái)模擬的936焊臺(tái),感覺(jué)升溫慢,控溫不準(zhǔn)。于是就有了制作一臺(tái)數(shù)控焊臺(tái)的想法。在市場(chǎng)看到這個(gè)調(diào)壓器(8元)購(gòu)回,重新繞制變壓器,研究單片機(jī),最終就是這樣一臺(tái),焊臺(tái)制作完成?傮w比較滿(mǎn)意,正常使用變壓器幾乎沒(méi)有溫升,性能穩(wěn)定。目前還沒(méi)有出現(xiàn)死機(jī)等現(xiàn)象。程序參考了很多網(wǎng)上得程序,在此一并感謝。
性能:
1:恒溫100-480可調(diào);
2:修眠;60-999秒可調(diào)
3:修眠溫度:100-250
4;定時(shí)關(guān)機(jī);最小為睡眠時(shí)間,最大999秒
5:溫度修正:-99到+99
6:調(diào)溫步長(zhǎng)(旋轉(zhuǎn)編碼器一格數(shù)):1-10
特點(diǎn):
1:線(xiàn)路簡(jiǎn)單,成本低
2:采用0.56寸3位LED紅色數(shù)碼管,顯示清晰
3:元器件均為常見(jiàn)器件,獲得容易
4:功率大(取決于變壓器),本機(jī)最大實(shí)測(cè)65W
5:用洞洞板手工焊接
制作出來(lái)的實(shí)物圖如下:
外觀(guān).jpg (138.09 KB, 下載次數(shù): 52)
下載附件
2023-12-1 10:55 上傳
內(nèi)部圖.jpg (176.43 KB, 下載次數(shù): 55)
下載附件
2023-12-1 10:55 上傳
背面.jpg (120.6 KB, 下載次數(shù): 59)
下載附件
2023-12-1 10:55 上傳
正面.jpg (105.88 KB, 下載次數(shù): 56)
下載附件
2023-12-1 10:56 上傳
電路原理圖如下:
電路圖.jpg (38.83 KB, 下載次數(shù): 46)
下載附件
2023-12-1 10:56 上傳
單片機(jī)主程序:
- #include "config.h"
- #include "main.h"
- void main(void) {
- Init_IO();
- Ext_init();
- Adc_Init();
- Timer0Init(); //監(jiān)視EC11中間按鍵
- Timer1Init(); //計(jì)數(shù)器
- Timer2Init(); //Sleep計(jì)數(shù)器
- UART_init(); // 波特率:9600 /22.1184MHZ
- beep=0; Beep_One();
- EA = 1;
- Read_Eeprom(); //讀出EEPROM數(shù)據(jù)
- TM1651_Light(LIGHT_NORMAL); //開(kāi)亮度LIGHT_NORMAL
- Time1_count = STime; //延時(shí)1S 防止開(kāi)機(jī)進(jìn)入中斷
- EA = 1;
- while (1) {
-
- Get_Temperature(1); //獲取當(dāng)前936溫度,在變量ActualTemperature中
- if(T936_ActualTemperature>1000){
- Power_OFF(); //關(guān)機(jī)
- Display_Err();
- return;
- }
-
- switch (Key()) {
- case Single_click: { //Single_click:
- S936_FLAG = ~S936_FLAG;
- if (!S936_FLAG) { //開(kāi)機(jī)
- Ms_count = 0;
- Sleep_Flag = 1;
- Time2_count = 0;
- }
- Beep_One();
- }
- break;
- case Double_click: { //Double_click:
- T936_SetTemperature = Double_Click_Temp;
- TM1651_NUM(T936_SetTemperature);
- Beep_One();
- Delay_ms(1000);
- }
- break;
- case Long_click: { //Long_click:打開(kāi)設(shè)置菜單
- Beep_One();
- S936_State = S936_FLAG; //保存當(dāng)前開(kāi)關(guān)機(jī)狀態(tài)
- Power_OFF(); //關(guān)機(jī)
- Delay_ms(500);
- Menu(); //打開(kāi)設(shè)置菜單
- Beep_One();
- Delay_ms(1000);
- S936_FLAG = !S936_State; //恢復(fù)原開(kāi)關(guān)機(jī)狀態(tài)
- }
- break;
- }
- if (Right_one == 1) { //增加
- Time1_count=500;
- Right_one = 0;
- if (T936_SetTemperature < TEMPER_HIGH) {
- T936_SetTemperature = T936_SetTemperature + Step;
- }
- }
- if (Left_one == 1) { //減少
- Time1_count=500;
- Left_one = 0;
- if (T936_SetTemperature > TEMPER_LOW) {
- T936_SetTemperature = T936_SetTemperature - Step;
- }
- }
- if (Time1_count){
- TM1651_NUM(T936_SetTemperature);
- }
- else {
- if (S936_FLAG) { //Power OFF
- Display_OFF();
- // Ms_count=0;
- // Sleep_Flag=1;
- // Time2_count=0;
- Power_OFF();
- } else { //Power On
- TEMP();
- }
- }
- }
- //初始化各端口
- void Init_IO(void) {
- P1M0 = 0x01; P1M1 = 0x02; //1.0 推挽,1.1高阻
- P3M0 = 0x00; P3M1 = 0x00; //3.7 推挽
- P5M0 = 0x20; P5M1 = 0x00; //5.5 推挽
- }
- void TEMP(void) {
-
- if (Sleep_Flag == 0) {
- Temp_SetTemperature =Sleep_Temperature + Temperature_Compensation;
- Display_SLP();
- } else {
- Temp_SetTemperature = T936_SetTemperature + Temperature_Compensation;
-
- //穩(wěn)定溫度顯示
- if ( abs(T936_ActualTemperature - Temp_SetTemperature) <8)
- TM1651_NUM(Temp_SetTemperature); //顯示設(shè)置溫度
- else
- TM1651_NUM(T936_ActualTemperature); //顯示當(dāng)前溫度
- }
- if (T936_SetTemperature > T936_ActualTemperature) {
- Power_ON(); //打開(kāi)936Power_ON()
- return;
- } else {
- Power_OFF();
- }
- }
- void Menu(void) {
- u8 Num = 0;
- u8 Menu_Digital = 0;
- u8 Menu_Mnu[4];
- Delay_ms(300);
- while (1) {
- switch (Key()) {
- case Single_click: { //Single_click:
- Menu_Digital++;
- if (Menu_Digital > Menu_Num)
- Menu_Digital = 1;
- Beep_One();
- Num = 0;
- }
- break;
-
- case Double_click: { //Double_click:恢復(fù)默認(rèn)設(shè)置,
-
- T936_SetTemperature =320;
- Sleep_Time = 60;
- Sleep_Temperature = 120;
- PowerOff_Time = 120;
- Temperature_Compensation=0;
- Step=5;
- TM1651_NUM(8888);
- Beep_One();
- Delay_ms(1000);
- }
- break;
-
- case Long_click: { //Long_click:退出設(shè)置,數(shù)據(jù)數(shù)據(jù)寫(xiě)入EEPROM
- Save_Eeprom();
- return;
- }
- break;
- }
- switch (Menu_Digital) {
- case 1: { //顯示調(diào)溫:-1-
- if (Num == 0) {
- Menu_Mnu[1] = 18; //- 號(hào)
- Menu_Mnu[2] = 1;
- Menu_Mnu[3] = 18; //- 號(hào)
- TM1651_LED(Menu_Mnu);
- Delay_ms(500);
- }
- Num = 1;
- if (Right_one == 1) {
- Right_one = 0;
- if (T936_SetTemperature < TEMPER_HIGH) {
- T936_SetTemperature = T936_SetTemperature + 1;
- }
- }
- if (Left_one == 1) {
- Left_one = 0;
- if (T936_SetTemperature > TEMPER_LOW) {
- T936_SetTemperature = T936_SetTemperature - 1;
- }
- }
- TM1651_NUM(T936_SetTemperature);
- }
- break;
- case 2: { //顯示Sleep時(shí)間:-2-
- if (Num == 0) {
- Menu_Mnu[1] = 18;
- Menu_Mnu[2] = 2;
- Menu_Mnu[3] = 18; //消隱
- TM1651_LED(Menu_Mnu);
- Delay_ms(500);
- }
- Num = 1;
- if (Right_one == 1) {
- Right_one = 0;
- if (Sleep_Time < SLEEP_TIMPER_HIGH) {
- Sleep_Time = Sleep_Time + 1;
- }
- }
- if (Left_one == 1) {
- Left_one = 0;
- if (Sleep_Time > SLEEP_TIMPER_LOW) {
- Sleep_Time = Sleep_Time - 1;
- }
- }
- TM1651_NUM(Sleep_Time);
- }
- break;
- case 3: { //顯示Sleep溫度:-3-
- if (Num == 0) {
- Menu_Mnu[1] = 18;
- Menu_Mnu[2] = 3;
- Menu_Mnu[3] = 18; //消隱
- TM1651_LED(Menu_Mnu);
- Delay_ms(500);
- }
- Num = 1;
- if (Right_one == 1) {
- Right_one = 0;
- if (Sleep_Temperature < SLEEP_TEMPER_HIGH) {
- Sleep_Temperature = Sleep_Temperature + 1;
- }
- }
- if (Left_one == 1) {
- Left_one = 0;
- if (Sleep_Temperature > SLEEP_TEMPER_LOW) {
- Sleep_Temperature = Sleep_Temperature - 1;
- }
- }
- TM1651_NUM(Sleep_Temperature);
- }
- break;
- case 4: { //顯示Power_off時(shí)間:-4-
- if (Num == 0) {
- Menu_Mnu[1] = 18;
- Menu_Mnu[2] = 4;
- Menu_Mnu[3] = 18; //消隱
- TM1651_LED(Menu_Mnu);
- Delay_ms(500);
- }
- Num = 1;
- if (PowerOff_Time < Sleep_Time)
- PowerOff_Time = Sleep_Time;
- if (Right_one == 1) {
- Right_one = 0;
- if (PowerOff_Time < PowerOff_TIME_HIGH) {
- PowerOff_Time = PowerOff_Time + 1;
- }
- }
- if (Left_one == 1) {
- Left_one = 0;
- if (PowerOff_Time > (Sleep_Time + 60)) {
- PowerOff_Time = PowerOff_Time - 1;
- }
- }
- TM1651_NUM(PowerOff_Time);
- }
- break;
- case 5: { //936溫度修正數(shù):-5-
- if (Num == 0) {
- Menu_Mnu[1] = 18;
- Menu_Mnu[2] = 5;
- Menu_Mnu[3] = 18; //消隱
- TM1651_LED(Menu_Mnu);
- Delay_ms(500);
- }
- Num = 1;
- if (Right_one == 1) {
- Right_one = 0;
- if (Temperature_Compensation < TEMPERATURE_COMPENSATION_HIGH) {
- Temperature_Compensation++;
- }
- }
- if (Left_one == 1) {
- Left_one = 0;
- if (Temperature_Compensation > TEMPERATURE_COMPENSATION_LOW) {
- Temperature_Compensation--;
- }
- }
- TM1651_NEGATIVE_NUM(Temperature_Compensation);
- }
- break;
- case 6: { //調(diào)溫步數(shù):-6-
- if (Num == 0) {
- Menu_Mnu[1] = 18;
- Menu_Mnu[2] = 6;
- Menu_Mnu[3] = 18; //消隱
- TM1651_LED(Menu_Mnu);
- Delay_ms(500);
- }
- Num = 1;
- if (Right_one == 1) {
- Right_one = 0;
- if (Step < STEP_HIGH) {
- Step++;
- }
- }
- if (Left_one == 1) {
- Left_one = 0;
- if (Step > STEP_LOW) {
- Step--;
- }
- }
- TM1651_NUM(Step);
- }
- break;
- }
- }
- }
- void Get_Temperature(u8 channel) {
- u8 i, j;
- u16 ADC[Result_n], result;
- for (i = 0; i < Result_n; i++){ //取Result_n(main.h)次轉(zhuǎn)換ADC結(jié)果
- ADC[i] = Get_ADC12bitResult(channel);
- // Delay_us(20);
- }
- // 對(duì)結(jié)果進(jìn)行排序
- for (i = 0; i < Result_n - 1; i++) {
- for (j = 0; j < Result_n - 1 - i; j++) {
- if (ADC[j] < ADC[j + 1]) {
- result = ADC[j];
- ADC[j] = ADC[j + 1];
- ADC[j + 1] = result;
- }
- }
- }
- //去掉最大和最小的后平均
- T936_ActualTemperature = 0;
- for (i = 1; i < Result_n - 1; i++) {
- T936_ActualTemperature = T936_ActualTemperature + ADC[i];
- }
- T936_ActualTemperature = T936_ActualTemperature / (Result_n - 2);
- // T936_ActualTemperature = (2.5699 * T936_ActualTemperature - 395.18);
- T936_ActualTemperature = (2.4773 * T936_ActualTemperature - 312.75);
- }
- //測(cè)試程序,Led閃
- void Led_Light(void) {
- Led_Red = 0;
- Delay_ms(1000);
- Beep_One();
- Led_Red = 1;
- Delay_ms(1000);
- }
- //@函數(shù)名: Ext_init
- // @描 述:中斷初始化 中斷0,1,2
- // @參 數(shù):無(wú)
- // @返回值:無(wú)
- void Ext_init(void) {
- // IT0 = 1; //外部中斷0跳變(下降沿或上升沿)中斷。為1時(shí)(下降沿)電平中斷
- IT1 = 1; //外部中斷0跳變(下降沿或上升沿)中斷。為1時(shí)(下降沿)電平中斷
- // EX0 = 1; //使能外部中斷0
- EX1 = 1; //使能外部中斷1
-
- // EA = 1; //使能全局中斷
- }
- //****************外部中斷0 中斷服務(wù)程序******************************************
- void ExINT0() interrupt 0 { //外部中斷0,觸發(fā)時(shí),
- EX0 = 0;
- Delay_us(20);
- Beep_One();
- if (Encoderb == 1) {
- Delay_us(20);
- if (Encodera == 1) {
- Right_one = 1;
- } else {
- Left_one = 1;
- }
- } else {
- Delay_us(20);
- if (Encodera == 0) {
- Right_one = 1;
- } else {
- Left_one = 1;
- }
- }
- Beep_One();
- IE0 = 0; //清除中斷標(biāo)志,消除二次進(jìn)入中斷
- EX0 = 1;
- }
- //****************外部中斷1 中斷服務(wù)程序******************************************
- void ExINT1() interrupt 2 { //外部中斷1,觸發(fā)時(shí),
- EX1 = 0;
- Delay_us(20);
- Beep_One();
- if (Encoderb == 1) {
- if (Encodera == 1) {
- Right_one = 1;
- } else {
- Left_one = 1;
- }
- } else {
- if (Encodera == 0) {
- Right_one = 1;
- } else {
- Left_one = 1;
- }
- }
- Beep_One();
- IE1 = 0; //清除中斷標(biāo)志,消除二次進(jìn)入中斷
- EX1 = 1;
- }
- void Timer0Init(void) { //1毫秒@11.0592MHz 1ms
- AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TL0 = 0xCD; //設(shè)置定時(shí)初始值
- TH0 = 0xD4; //設(shè)置
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
- ET0 = 1; //開(kāi)啟定時(shí)器0中斷
- }
- void Timer1Init(void) { //1毫秒@11.0592MHz 1ms
- AUXR |= 0x40; //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0x0F; //設(shè)置定時(shí)器模式
- TL1 = 0xCD; //設(shè)置定時(shí)初始值
- TH1 = 0xD4; //設(shè)置定時(shí)初始值
- TF1 = 0; //清除TF1標(biāo)志
- TR1 = 1; //定時(shí)器1開(kāi)始計(jì)時(shí)
- ET1 = 1; //開(kāi)啟定時(shí)器1中斷
- }
- void Timer2Init(void) { //1毫秒@11.0592MHz
- AUXR |= 0x04; //定時(shí)器時(shí)鐘1T模式
- T2L = 0xCD; //設(shè)置定時(shí)初始值
- T2H = 0xD4; //設(shè)置定時(shí)初始值
- AUXR |= 0x10; //定時(shí)器2開(kāi)始
- IE2 |= 0x04; //開(kāi)定時(shí)器2中斷
- }
- void Timer0() interrupt 1 { //監(jiān)視EC11中間按鍵
- static unsigned int T0Count, T1Count;
- T0Count++;
- if (T0Count >= 20) { //每20ms掃描一次按鍵
- T0Count = 0;
- Loop_Key();
- }
- if (OnceKey) {
- T1Count++;
- if (T1Count >= 215) { //單擊后230ms按鍵值判斷時(shí)間(可調(diào)節(jié)參數(shù)T1Count)
- T1Count = 0;
- if (OnceKey == 2) { //按鍵按下2次后給按鍵賦值
- OnceKey = 0;
- T1Count = 0;
- Key_KeyNumber = Double_click;
- } else if (OnceKey == 1) { //按鍵按下1次后給按鍵賦值
- OnceKey = 0;
- T1Count = 0;
- Key_KeyNumber = Single_click;
- }
- }
- }
- }
- void timer1(void) interrupt 3 { //計(jì)時(shí)器
- if (Time1_count > 0)
- Time1_count--;
- }
- void timer2(void) interrupt 12 {
- if (Sleep_Ctrl == 1) { //Sleep開(kāi)始計(jì)時(shí)
- Ms_count++;
- if (Ms_count >= 38300) { //毫秒計(jì)數(shù),到1000記一秒 38300
- Ms_count = 0; //秒清零
- Time2_count++; //增加1S
- if (Time2_count >= Sleep_Time) {
- Sleep_Flag = 0; //休眠
- if (Time2_count >= PowerOff_Time) {
- S936_FLAG = 1; //軟關(guān)機(jī)
- Sleep_Flag = 1; //解除休眠
- Time2_count = PowerOff_Time + 10; //Time2_count不再增加
- }
- }
- }
- } else { //清除Sleep
- Ms_count = 0;
- Time2_count = 0;
- Sleep_Flag = 1; //解除休眠
- }
- }
- u8 Key(void) {
- unsigned char Temp; //中間變量Temp,便于賦值一次消零
- Temp = Key_KeyNumber;
- Key_KeyNumber = 0;
- return Temp;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Loop_Key
- * 函數(shù)功能 : 按鍵處理函數(shù),判斷按鍵KEY1是否按下
- *******************************************************************************/
- void Loop_Key(void) {
- LastKey = NowKey; //LastKey:上一次的按鍵值
- NowKey = !KEY1; //NowKey:當(dāng)前的按鍵值
- if (LastKey) { //當(dāng)按鍵按下時(shí)開(kāi)始計(jì)時(shí)
- KeyNumber = LastKey;
- KeyTime++;
- if (KeyTime < 50 && NowKey == 0) { //如果按鍵的時(shí)間小于500ms
- KeyTime = 0;
- OnceKey++; //OnceKey每松手一次加1
- } else if (KeyTime >= 20 && NowKey) { //如果按鍵時(shí)間大于500ms且現(xiàn)按鍵還在按下
- if (LastKey == 1) {
- Key_KeyNumber = Long_click; //給按鍵賦值
- }
- }
- if (NowKey == 0 && LastKey && KeyTime >= 25) { //防止長(zhǎng)按后立即被當(dāng)成短按再次賦值
- Key_KeyNumber = 0;
- KeyTime = 0;
- }
- }
- }
- void Beep_One(void) {
- beep = ~beep;
- Delay_ms(1);
- beep = ~beep;
- }
- void Save_Eeprom(void) {
- EEPROM_write_n(ADDRESS_TEMPERATURE, T936_SetTemperature, 8); //寫(xiě)入設(shè)置溫度到EEPROM
- EEPROM_write_n(ADDRESS_SLEEP_TIME, Sleep_Time, 8); //寫(xiě)入SLEEP時(shí)間到EEPROM
- EEPROM_write_n(ADDRESS_SLEEP_TEMPERATURE, Sleep_Temperature, 8); //寫(xiě)入SLEEP溫度到EEPROM
- EEPROM_write_n(ADDRESS_POWEROFF_TIME, PowerOff_Time, 8); //寫(xiě)入軟關(guān)機(jī)時(shí)間到EEPROM
- EEPROM_write_n(ADDRESS_TEMPERATURE_COMPENSATION, Temperature_Compensation, 8); //936溫度修正數(shù)
- EEPROM_write_n(ADDRESS_STEP, Step, 8); //溫度步數(shù)
- }
- void Read_Eeprom(void) {
- T936_SetTemperature = EEPROM_read_n(ADDRESS_TEMPERATURE, 8);
- Sleep_Time = EEPROM_read_n(ADDRESS_SLEEP_TIME, 8);
- Sleep_Temperature = EEPROM_read_n(ADDRESS_SLEEP_TEMPERATURE, 8);
- PowerOff_Time = EEPROM_read_n(ADDRESS_POWEROFF_TIME, 8);
- Temperature_Compensation = EEPROM_read_n(ADDRESS_TEMPERATURE_COMPENSATION, 8);
- Step=EEPROM_read_n(ADDRESS_STEP, 8);
- }
復(fù)制代碼 pdf格式的原理圖:
電路圖.pdf
(157.03 KB, 下載次數(shù): 105)
2023-12-1 10:58 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
hex文件:
附件內(nèi)只有hex文件.7z
(6.07 KB, 下載次數(shù): 51)
2023-12-4 22:41 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
源碼:無(wú)
|
評(píng)分
-
查看全部評(píng)分
|