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