起源:
以前制作過一臺模擬的936焊臺,感覺升溫慢,控溫不準。于是就有了制作一臺數控焊臺的想法。在市場看到這個調壓器(8元)購回,重新繞制變壓器,研究單片機,最終就是這樣一臺,焊臺制作完成。總體比較滿意,正常使用變壓器幾乎沒有溫升,性能穩定。目前還沒有出現死機等現象。程序參考了很多網上得程序,在此一并感謝。
性能:
1:恒溫100-480可調;
2:修眠;60-999秒可調
3:修眠溫度:100-250
4;定時關機;最小為睡眠時間,最大999秒
5:溫度修正:-99到+99
6:調溫步長(旋轉編碼器一格數):1-10
特點:
1:線路簡單,成本低
2:采用0.56寸3位LED紅色數碼管,顯示清晰
3:元器件均為常見器件,獲得容易
4:功率大(取決于變壓器),本機最大實測65W
5:用洞洞板手工焊接
制作出來的實物圖如下:
外觀.jpg (138.09 KB, 下載次數: 52)
下載附件
2023-12-1 10:55 上傳
內部圖.jpg (176.43 KB, 下載次數: 55)
下載附件
2023-12-1 10:55 上傳
背面.jpg (120.6 KB, 下載次數: 59)
下載附件
2023-12-1 10:55 上傳
正面.jpg (105.88 KB, 下載次數: 56)
下載附件
2023-12-1 10:56 上傳
電路原理圖如下:
電路圖.jpg (38.83 KB, 下載次數: 46)
下載附件
2023-12-1 10:56 上傳
單片機主程序:
- #include "config.h"
- #include "main.h"
- void main(void) {
- Init_IO();
- Ext_init();
- Adc_Init();
- Timer0Init(); //監視EC11中間按鍵
- Timer1Init(); //計數器
- Timer2Init(); //Sleep計數器
- UART_init(); // 波特率:9600 /22.1184MHZ
- beep=0; Beep_One();
- EA = 1;
- Read_Eeprom(); //讀出EEPROM數據
- TM1651_Light(LIGHT_NORMAL); //開亮度LIGHT_NORMAL
- Time1_count = STime; //延時1S 防止開機進入中斷
- EA = 1;
- while (1) {
-
- Get_Temperature(1); //獲取當前936溫度,在變量ActualTemperature中
- if(T936_ActualTemperature>1000){
- Power_OFF(); //關機
- Display_Err();
- return;
- }
-
- switch (Key()) {
- case Single_click: { //Single_click:
- S936_FLAG = ~S936_FLAG;
- if (!S936_FLAG) { //開機
- 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:打開設置菜單
- Beep_One();
- S936_State = S936_FLAG; //保存當前開關機狀態
- Power_OFF(); //關機
- Delay_ms(500);
- Menu(); //打開設置菜單
- Beep_One();
- Delay_ms(1000);
- S936_FLAG = !S936_State; //恢復原開關機狀態
- }
- 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;
-
- //穩定溫度顯示
- if ( abs(T936_ActualTemperature - Temp_SetTemperature) <8)
- TM1651_NUM(Temp_SetTemperature); //顯示設置溫度
- else
- TM1651_NUM(T936_ActualTemperature); //顯示當前溫度
- }
- if (T936_SetTemperature > T936_ActualTemperature) {
- Power_ON(); //打開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:恢復默認設置,
-
- 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:退出設置,數據數據寫入EEPROM
- Save_Eeprom();
- return;
- }
- break;
- }
- switch (Menu_Digital) {
- case 1: { //顯示調溫:-1-
- if (Num == 0) {
- Menu_Mnu[1] = 18; //- 號
- Menu_Mnu[2] = 1;
- Menu_Mnu[3] = 18; //- 號
- 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時間:-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時間:-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溫度修正數:-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: { //調溫步數:-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)次轉換ADC結果
- ADC[i] = Get_ADC12bitResult(channel);
- // Delay_us(20);
- }
- // 對結果進行排序
- 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);
- }
- //測試程序,Led閃
- void Led_Light(void) {
- Led_Red = 0;
- Delay_ms(1000);
- Beep_One();
- Led_Red = 1;
- Delay_ms(1000);
- }
- //@函數名: Ext_init
- // @描 述:中斷初始化 中斷0,1,2
- // @參 數:無
- // @返回值:無
- void Ext_init(void) {
- // IT0 = 1; //外部中斷0跳變(下降沿或上升沿)中斷。為1時(下降沿)電平中斷
- IT1 = 1; //外部中斷0跳變(下降沿或上升沿)中斷。為1時(下降沿)電平中斷
- // EX0 = 1; //使能外部中斷0
- EX1 = 1; //使能外部中斷1
-
- // EA = 1; //使能全局中斷
- }
- //****************外部中斷0 中斷服務程序******************************************
- void ExINT0() interrupt 0 { //外部中斷0,觸發時,
- 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; //清除中斷標志,消除二次進入中斷
- EX0 = 1;
- }
- //****************外部中斷1 中斷服務程序******************************************
- void ExINT1() interrupt 2 { //外部中斷1,觸發時,
- 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; //清除中斷標志,消除二次進入中斷
- EX1 = 1;
- }
- void Timer0Init(void) { //1毫秒@11.0592MHz 1ms
- AUXR |= 0x80; //定時器時鐘1T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0xCD; //設置定時初始值
- TH0 = 0xD4; //設置
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- ET0 = 1; //開啟定時器0中斷
- }
- void Timer1Init(void) { //1毫秒@11.0592MHz 1ms
- AUXR |= 0x40; //定時器時鐘1T模式
- TMOD &= 0x0F; //設置定時器模式
- TL1 = 0xCD; //設置定時初始值
- TH1 = 0xD4; //設置定時初始值
- TF1 = 0; //清除TF1標志
- TR1 = 1; //定時器1開始計時
- ET1 = 1; //開啟定時器1中斷
- }
- void Timer2Init(void) { //1毫秒@11.0592MHz
- AUXR |= 0x04; //定時器時鐘1T模式
- T2L = 0xCD; //設置定時初始值
- T2H = 0xD4; //設置定時初始值
- AUXR |= 0x10; //定時器2開始
- IE2 |= 0x04; //開定時器2中斷
- }
- void Timer0() interrupt 1 { //監視EC11中間按鍵
- static unsigned int T0Count, T1Count;
- T0Count++;
- if (T0Count >= 20) { //每20ms掃描一次按鍵
- T0Count = 0;
- Loop_Key();
- }
- if (OnceKey) {
- T1Count++;
- if (T1Count >= 215) { //單擊后230ms按鍵值判斷時間(可調節參數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 { //計時器
- if (Time1_count > 0)
- Time1_count--;
- }
- void timer2(void) interrupt 12 {
- if (Sleep_Ctrl == 1) { //Sleep開始計時
- Ms_count++;
- if (Ms_count >= 38300) { //毫秒計數,到1000記一秒 38300
- Ms_count = 0; //秒清零
- Time2_count++; //增加1S
- if (Time2_count >= Sleep_Time) {
- Sleep_Flag = 0; //休眠
- if (Time2_count >= PowerOff_Time) {
- S936_FLAG = 1; //軟關機
- 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;
- }
- /*******************************************************************************
- * 函 數 名 : Loop_Key
- * 函數功能 : 按鍵處理函數,判斷按鍵KEY1是否按下
- *******************************************************************************/
- void Loop_Key(void) {
- LastKey = NowKey; //LastKey:上一次的按鍵值
- NowKey = !KEY1; //NowKey:當前的按鍵值
- if (LastKey) { //當按鍵按下時開始計時
- KeyNumber = LastKey;
- KeyTime++;
- if (KeyTime < 50 && NowKey == 0) { //如果按鍵的時間小于500ms
- KeyTime = 0;
- OnceKey++; //OnceKey每松手一次加1
- } else if (KeyTime >= 20 && NowKey) { //如果按鍵時間大于500ms且現按鍵還在按下
- if (LastKey == 1) {
- Key_KeyNumber = Long_click; //給按鍵賦值
- }
- }
- if (NowKey == 0 && LastKey && KeyTime >= 25) { //防止長按后立即被當成短按再次賦值
- 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); //寫入設置溫度到EEPROM
- EEPROM_write_n(ADDRESS_SLEEP_TIME, Sleep_Time, 8); //寫入SLEEP時間到EEPROM
- EEPROM_write_n(ADDRESS_SLEEP_TEMPERATURE, Sleep_Temperature, 8); //寫入SLEEP溫度到EEPROM
- EEPROM_write_n(ADDRESS_POWEROFF_TIME, PowerOff_Time, 8); //寫入軟關機時間到EEPROM
- EEPROM_write_n(ADDRESS_TEMPERATURE_COMPENSATION, Temperature_Compensation, 8); //936溫度修正數
- EEPROM_write_n(ADDRESS_STEP, Step, 8); //溫度步數
- }
- 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);
- }
復制代碼 pdf格式的原理圖:
電路圖.pdf
(157.03 KB, 下載次數: 105)
2023-12-1 10:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
hex文件:
附件內只有hex文件.7z
(6.07 KB, 下載次數: 51)
2023-12-4 22:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
源碼:無
|