新人貼,如果有什么錯誤歡迎留言斧正
這是電路原理圖:
9檔點焊機.png (88.71 KB, 下載次數(shù): 49)
下載附件
2023-2-26 23:43 上傳
下邊是單片機程序,
- /*----------------- ------------------------------
- 基于 STC15W408AS 點焊機控制程序
- 參考來源 STC89C52
- 20230204
- 由兩個按鍵控制時間加減,一個按鍵控制開始
- 兩次脈沖
- 根據(jù)需要可選進入掉電模式或空閑模式
- 15W408AS
- 仿真時請選用STC15W4K32S4,更改頻率為12Mhz
- STC15W408AS頻率12Mhz
-
- ------------------------------------------------*/
- #include <STC15F2K60S2.H>//頭文件定義 STC15W408AS專用//STC15W4K32S4通用
- #include <intrins.h>
- /*位清零:& //位設(shè)置:|
- 設(shè)置、讀取位的方法
- '位與
- '第7位'01111111'7F
- '第6位'10111111'BF
- '第5位'11011111'DF
- '第4位'11101111'EF
- '第3位'11110111'F7
- '第2位'11111011'FB
- '第1位'11111101'FD
- '第0位'11111110'FE*///位于運算判斷結(jié)果值是否是255,是255則是1,否則改位是0
- #define GET_BIT(x, bit) ((x & (1 << bit)) >> bit) /* 獲取第bit位 *///取0-7位的bit數(shù)據(jù)//詳解:與運算同為1得1,位與后位移相當于刪去目標bit兩邊的數(shù)據(jù)位
- #define D P1 //數(shù)碼管段用D代替//把P1引腳段改個名字//引腳P1.0-1.7,引腳不足:P1.0-P1.5
- sbit D2=P3^7;//數(shù)碼管G//16腳單片機段引腳不足7位,附加一個引腳P3.7
- sbit s1=P3^2;//定義加按鍵//按鍵默認電平 低電平//引腳P3.2
- sbit s2=P3^3;//定義減按鍵//按鍵默認電平 低電平//引腳不足未設(shè)置
- sbit s3=P3^6;//定義點焊開始//按鍵默認電平 低電平//檢測引腳P3.6
- sbit m=P5^4;//定義點焊脈沖輸出//默認電平為 低電平//實際引腳P5.4//仿真引腳P3.4
- sbit q1=P5^5;//定義蜂鳴器//蜂鳴器默認電平為 高電平//引腳P3.3
- unsigned int a;//定義全局變量毫秒延時計數(shù)//延時范圍更改為0-F對應(yīng)0-15毫秒
- //unsigned int ma;//記憶a
- unsigned char LED_code[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值//數(shù)碼管真值表//
- //當引腳段不足7個引腳時,另定義引腳,取某一位(GET_BIT)的值賦予之,取位是6
- void DelayMs(unsigned int t);//毫秒延時
- //void Delay1us12(unsigned int ui);//12Mhz,1微秒延時
- //void Delay1us35(unsigned int ti);//35Mhz,1微秒延時
- //void Timer0us(unsigned int ut);//35Mhz定時器微秒延時
- void anjian();//按鍵處理程序
- void maichong();//脈沖處理程序
- //定時器1的中斷程序過程//65毫秒設(shè)定,用于數(shù)碼管刷新
- void Timer1_Isr(void) interrupt 3
- {
- TL1 = 0x18; //設(shè)置定時初始值
- TH1 = 0xFC; //設(shè)置定時初始值
- D=LED_code[a];//數(shù)碼管顯示數(shù)字
- D2=GET_BIT(LED_code[a],6);//取第7位數(shù)據(jù)值作為7段數(shù)碼管的G控制
- }
- /*------------------------------------------------
- 主函數(shù)
- ------------------------------------------------*/
- void main (void)
- {
- //初始定時器
- EA=1;//中斷總開關(guān),默認是0?
- //AUXR=0x1B;//默認值(復(fù)位值)//默認T0、T1時鐘12分頻,T2是計數(shù)不分頻,串口6分頻
- TMOD=0x11;//啟用定時器1,定時器0
- //65毫秒@12.000MHz//中斷
- TL1 = 0x18; //設(shè)置定時初始值
- TH1 = 0xFC; //設(shè)置定時初始值
- TF1 = 0; //清除TF1標志
- TR1 = 1; //定時器1開始計時
- ET1 = 1; //使能定時器1中斷
- //1毫秒@12MHz不中斷
- TL0 = 0x18; //設(shè)置定時初始值
- TH0 = 0xFC; //設(shè)置定時初始值
- TF0 = 0;//清除TF0溢出標志
- TR0 = 1;//定時器0開始計時
- D=0;
- D2=0;//數(shù)碼管電平重置
- a=0;//程序開始時0//保護擋位
- m=1;//脈沖初始為高電平,脈沖關(guān)閉
- q1=1;//蜂鳴器默認高電平關(guān)閉
- q1=0;//蜂鳴器打開//用于開機提示
- DelayMs(60);
- q1=1;//蜂鳴器關(guān)閉
- DelayMs(50);
- q1=0;//蜂鳴器打開//用于開機提示
- DelayMs(60);
- q1=1;//蜂鳴器關(guān)閉
- DelayMs(40);
- q1=0;//蜂鳴器打開//用于開機提示
- DelayMs(60);
- q1=1;//蜂鳴器關(guān)閉
- //前置程序完成
- while (1) //主循環(huán)
- {
- //D=LED_code[a];//數(shù)碼管顯示數(shù)字
- //D2=GET_BIT(LED_code[a],6);//取第7位數(shù)據(jù)值作為7段數(shù)碼管的G控制
- anjian( );//按鍵判斷
- if(a!=0)//0擋位不作輸出
- maichong( );//脈沖檢測
- }
- }
- void anjian( )//按鍵函數(shù)//原代碼是中斷式執(zhí)行模式,即按下后陷入循環(huán)體,釋放后再執(zhí)行功能代碼
- {
- if(s1==0)//時間加按鍵
- {
- if(s1==0)
- {
- a++;//a,a=a+1
- if(a>9)//達到10時改為1//a 時間毫秒變量,最大值 9//更改范圍為0-9
- a=0;//越界則固定一個值 1
- //ma=a;
- while(!s1);//等待按鍵釋放 ,S1==0則!S1==true//按鍵按下時循環(huán),松開后向下執(zhí)行
- }
- }
- if(s2==0)//時間減按鍵
- {
- if(s2==0)
- {
- if(a==0)
- a=9;//注意變量a的類型和范圍,不能為0,long int范圍0-65535
- else
- a--;//a,a=a-1//范圍為0-9
- //ma=a;
- while(!s2);//等待按鍵釋放
- }
- }
- }
- /*毫秒延時是循環(huán)體執(zhí)行,類似于中斷,中斷期間無法執(zhí)行和判斷按鍵按下,
- 可能導(dǎo)致的情況:點焊時誤觸點焊筆立即拿開,但此時已經(jīng)進入了延時階段,
- 如果在延時結(jié)束時恰好放下點焊筆,此時會導(dǎo)致下次的按鍵判斷為點焊確認狀態(tài),則會開始執(zhí)行脈沖輸出(焊接)功能代碼。
- 這種情況下沒什么影響。
- 情況二:第一次誤觸,第二次又誤觸的情況下,會導(dǎo)致誤焊。
- 解決方法一:在延時程序內(nèi)每個時間單位內(nèi)加入檢測點焊開關(guān)的判斷,如果等待確認時間段內(nèi)離開點焊筆,此時立即退出脈沖輸出函數(shù)過程;
- 建議另寫脈沖輸出專用的延時函數(shù)。
- */
- void maichong()//脈沖輸出函數(shù)
- {
- if(s3==0)//S3 P1^0 電焊開始按鍵為 0 低電平 執(zhí)行
- {
- unsigned int tus;
- q1=0;//焊接等待提示
- DelayMs(60);
- q1=1;
- //等待確認點焊,防止誤焊
-
- tus=900;//900毫秒
- //12Mhz晶振1000微秒延時
- TH0 = 0xFC;//設(shè)置定時初始值
- TL0 = 0x18;//設(shè)置定時初始值
- TF0 = 0;//清除TF0溢出標志
- TR0 = 1;//定時器0開始計時
- while(tus--)//t;t=t-1//先判斷t,再-1
- {
- while(TF0==0)//等待TF0為1//等待溢出
- {
- if(s3==1)
- return;//按鍵釋放立即返回
- }
- TH0 = 0xFC;//設(shè)置定時初始值
- TL0 = 0x18;//設(shè)置定時初始值
- TF0 = 0;//清除TF0溢出標志
- TR0 = 1;//定時器0開始計時
- //a=tus/100;//數(shù)碼管倒計時
- }
- TR0 = 0;//定時器0停止計時
- //a=ma;//重置顯示
- if(s3==0)//S3 P1^0 電焊開始按鍵為 0 低電平 執(zhí)行//等待時間結(jié)束后開始判斷是否焊接
- {
- DelayMs(100);//延時100 //脈沖第一次
-
- q1=0;//低電平,蜂鳴器提示
- m=0;//低電平,脈沖打開
- DelayMs(a);//延時毫秒,值是變量a//設(shè)定毫秒時間后斷開電流//leilv測試用延時倍率
- m=1;//高電平,脈沖關(guān)閉
- q1=1;//蜂鳴器關(guān)閉,高電平
- DelayMs(100);//延時毫秒 100 //脈沖第二次
-
- q1=0;//低電平,蜂鳴器提示
- m=0;//低電平,脈沖打開
- DelayMs(a);//延時毫秒,值是變量a//測試是時請刪除*leilv
- m=1;//高電平,脈沖關(guān)閉
- q1=1;//蜂鳴器關(guān)閉,高電平
- while(!s3);//等待按鍵(點焊筆)松開
- }
-
- }
- }
- /*------------------------------------------------
- STC15Wxx系列35Mhz,1微秒延時
- unsigned int0-65535
- ------------------------------------------------*/
- /*
- void Delay1us35(unsigned int ti)//1微秒延時晶振33.1776MHz
- {
- unsigned char i;
- while(--ti)
- {
- _nop_();
- _nop_();
- _nop_();
- i = 5;
- while (--i);
- }
- }
- */
- /*
- //STC15Wxx系列12Mhz,1微秒延時
- void Delay1us12(unsigned int ui)//1微秒延時晶振11.0592MHz
- {
- while(--ui)
- {
- _nop_();
- _nop_();
- _nop_();
- }
- }
- */
- //毫秒延時程序
- void DelayMs(unsigned int t) //延時單位約1mS
- {
- //1毫秒@12.000MHz
- TL0 = 0x18; //設(shè)置定時初始值
- TH0 = 0xFC; //設(shè)置定時初始值
- TF0 = 0;//清除TF0溢出標志
- TR0 = 1;//定時器0開始計時
- while(t--)//t;t=t-1//先判斷t,再-1
- {
- while(TF0==0);//等待TF0為1//等待溢出
- TF0 = 0;//清除溢出標記
- TL0 = 0x18; //設(shè)置定時初始值
- TH0 = 0xFC; //設(shè)置定時初始值
- }
- TR0 = 0;//定時器0停止計時
- }
- //硬件定時器延時
- /*
- void Timer0us(unsigned int ut)//微秒延時程序//35Mhz//ut范圍0-23703微秒
- {
- //12Mhz下是65536*1微秒;35Mhz下是12/35M*65536=22469.48571428571微秒
- //12Mhz下是65536微秒的溢出值,35Mhz下需要/12;
- //33.1776Mhz=35Mhz?;11.0592Mhz=12Mhz?;
- //t=t*0.9216;//11059200÷12000000=0.9216//12Mhz
- ut=ut*2.7648;//33177600÷12000000 =2.7648//35Mhz
- TH0 = (65536-ut)/256;//設(shè)置定時初始值
- TL0 = (65536-ut)%256;//設(shè)置定時初始值
- TF0 = 0; //清除TF0溢出標志
- TR0 = 1; //定時器0開始計時
- while(TF0==0);//等待TF0為1//等待溢出
- TF0 = 0;//清除溢出標記
- TR0 = 0;//停止計時
- TH0 =0;//清除值
- TL0=0;
- }
- */
- /*
- 定時器使用方法
- 機器周期:機器周期=晶振頻率/12
- ET0:定時器0中斷開關(guān),0開1關(guān) ,會觸發(fā)中斷函數(shù)過程
- 賦初值:開始計數(shù)的初始值
- 中斷條件:開啟中斷會觸發(fā)interrupt 函數(shù)過程
- 65536是溢出值,此時定時器停止
- 12Mhz的機器周期是1微秒,一個機器周期計數(shù)+1
- 1、TMOD :控制,8位;GATE;C/T;M1;M0;GATE;C/T;M1/M0;
- C/T為0是定時功能,反之是計數(shù);
- M1M0:為工作模式,0;1是16為定時/計時器。
- 2、置初值TH0;TL0,5us:TH0=(65536-5000)/256;TL0=(65536-5000)%256; 到達目標后溢出
- 3、TCON:啟動,8位可單獨設(shè)置,TF1;TR1;TF0;TR0;IE1;IT1;IE0;IT0;
- TR0:為1定時器開始,反之停止;
- TF0:溢出后變?yōu)?,需手動清零;由此可得延時函數(shù),while(TF0==0);//TF0為0的情況下始終循環(huán),TF0為1時向下執(zhí)行
- */
復(fù)制代碼
Keil代碼下載:
STC408AS點焊機程序?qū)嶒?無倒計時).zip
(103.67 KB, 下載次數(shù): 122)
2023-2-26 23:45 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|