因為要求不高 剛好需要的芯片有庫存 做了個簡單的加熱焊臺 也可以加熱金屬的水杯什么的 
設定溫度最大280攝氏度,最小10度,可以在程序中修改, 程序很簡單沒有注釋,
12v供電 線盡量粗一點 我用的2.5平方的 開關電源200w以上吧
示意圖.png (2.05 MB, 下載次數: 85)
下載附件
示意圖
2022-7-17 04:40 上傳
單片機源程序如下:- //#include <reg51.H>
- #include <STC12C5A60S2.H>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- #define FOSC 11059200L
- uint MAX6675_Temper;
- unsigned char EC11_Dir = 0;//方向標志
- unsigned char TestValue = 0;
- sbit PIN_EC11_A = P1^6;
- sbit PIN_EC11_B = P1^4;
- sbit PIN_EC11_c = P1^5;
- sbit PIN_EC11_key = P1^7;
- sbit P2_0 = P2^0;
- sbit P2_1 = P2^1;
- sbit P2_2 = P2^2;
- sbit P2_3 = P2^3;
- sbit sh=P3^0;
- sbit st=P3^1;
- sbit oe=P3^2;
- sbit ds=P3^3;
- sbit MAX6675_CS = P3^5;
- sbit MAX6675_CLK = P3^6;
- sbit MAX6675_DAT = P3^4;
- sbit jiare = P3^7;
- sbit beep = P0^1;
- bit wdbg;//設定溫度變更標志位
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};
- uint num;
- uint shedingwd,sdjs;
- uint shijiwd;
- void Delay2us() //@11.0592MHz
- {
- unsigned char i;
- _nop_();
- _nop_();
- i = 2;
- while (--i);
- }
- void Delay2ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 22;
- j = 128;
- do
- {
- while (--j);
- } while (--i);
- }
- void Timer0Init(void) //1毫秒@11.0592MHz
- {
- //TMOD &= 0xF0; //設置定時器模式
- TMOD &= 0xF0; //設置定時器模式
- TMOD |= 0x01; //設置定時器模式
- TL0 = 0x91; //設置定時初始值
- TH0 = 0xFF; //設置定時初始值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- }
- void Timer1Init(void) //1毫秒@11.0592MHz
- {
- AUXR |= 0x40; //定時器時鐘1T模式
- TMOD &= 0x0F; //設置定時器模式
- TL1 = 0xCD; //設置定時初始值
- TH1 = 0xD4; //設置定時初始值
- TF1 = 0; //清除TF1標志
- TR1 = 1; //定時器1開始計時
- }
- void HC595SendData(unsigned char Data)
- {
- unsigned char i;
- st=0;
- sh=0;
- for(i=0;i<8;i++)
- {
- ds=Data&0x80;
- Data=Data<<1;
- sh=1;
- sh=0;
- }
- st=1;
- st=0;
- }
- uint MAX6675_ReadDat()
- {
- uint d;
- uchar i;
- MAX6675_CS=0;
- MAX6675_CLK=0;
-
- Delay2us();
- for(i=0;i<16;i++)
- {
- d<<=1;
- Delay2us();
- MAX6675_CLK=1;
- if(MAX6675_DAT)
- d++;
- Delay2us();
- MAX6675_CLK=0;
- }
- MAX6675_CS=1;
- return d;
- }
- void MAX6675_ReadTemper()
- {
- uint d;
-
- d=MAX6675_ReadDat();//讀取MAX6675當前的溫度值
- MAX6675_Temper=((d>>3)&0x0fff)*0.25;
- }
- void display(void);
- void _ec11_drives(void);
- uint a,b;
- void delay(uchar t) // 延時函數
- {
- uchar t1;
- unsigned long t2;
- for(t1=0;t1<t;t1++)
- {
- for(t2=0;t2<b;t2++);
- }
-
- }
- uint sd;
- void beep2()
- {
- b=11;
- for(a=0;a<300;a++)
- {
- beep=~beep;
- delay(1);
- }
- }
-
- /***************************************/
- /***************************************/
- /***************************************/
- void main()
- {
-
-
- b=25;
- for(a=0;a<600;a++)
- {
- beep=~beep;
- delay(1);
- }
-
- b=20;
- for(a=0;a<850;a++)
- {
- beep=~beep;
- delay(1);
- }
-
- b=15;
- for(a=0;a<1000;a++)
- {
- beep=~beep;
- delay(1);
- }
-
- beep=1;
- Timer0Init();
- Timer1Init();
- EA=1;
- ET0=1;
- oe=0;
-
- shedingwd=20;
-
- jiare=1;
-
- PIN_EC11_c = 0;
- sd=shedingwd;
- while(1)
- {
-
-
- if(wdbg==1)
- {
- ET1=1;
- num=shedingwd;
- }
- else
- {
- num= MAX6675_Temper;
- }
-
- if(MAX6675_Temper+2<shedingwd)
- jiare=0;
- else
- jiare=1;
-
- display();
-
- if(!PIN_EC11_key)
- shedingwd=100;
-
- if(shedingwd>=280)
- shedingwd=280;
- if(shedingwd<=10)
- shedingwd=10;
- if(sd!=shedingwd)
- {beep2();
- sd=shedingwd;
- beep=1;
- }
- }
-
- }
- void time0(void) interrupt 1
- {
- uint i;
- TL0 = 0x91; //設置定時初始值
- TH0 = 0xFF; //設置定時初始值
- _ec11_drives();
-
- i++;
- if(i==5000)
- {i=0;
- MAX6675_ReadTemper();
- }
- }
- void time1(void) interrupt 3
- {
- uint j,k;
- TL1 = 0xCD; //設置定時初始值
- TH1 = 0xD4; //設置定時初始值
-
- if(k++>1000)
- {
- k=0;
- sdjs++;
- j++;
-
- }
-
- if(j<3)
- oe=1;
- else
- oe=0;
- if(j>5)
- j=0;
-
-
- if(sdjs>30)
- {
- sdjs=0;
- ET1=0;
- wdbg=0;
- oe=0;
- }
- }
- void display(void)
- {
- HC595SendData(table[num%10]);
- P2_3=0;
- Delay2ms();
- P2_3=1;
-
- HC595SendData(table[num%100/10]);
- P2_2=0;
- Delay2ms();
- P2_2=1;
- HC595SendData(table[num%1000/100]);
- P2_1=0;
- Delay2ms();
- P2_1=1;
- HC595SendData(table[num/1000]);
- P2_0=0;
- Delay2ms();
- P2_0=1;
- }
- void _ec11_drives(void)//中斷10us中調用
- {
-
- static unsigned char CheckCnt,EC11Status=0;
- if(PIN_EC11_A)
- {
-
- if(++CheckCnt > 10)//在中斷中調用 值為2即可,快速掃描,適當加長可提高防抖效果。
- {
- CheckCnt = 12;
- if(EC11Status==0)
- {
- if(PIN_EC11_B)
- {
- EC11_Dir = 0x55;
- shedingwd-=5;
- }
- }
- EC11Status =1;
- }
- }
- else
- {
- wdbg=1;sdjs=0;
- if(CheckCnt)
- {
- CheckCnt--;
- }
- else
- {
- if(EC11Status)
- {
- EC11Status=0;
- if(PIN_EC11_B)
- {
- EC11_Dir = 0xaa;
- shedingwd+=5;
- }
- }
- }
- }
- }
復制代碼
|