新人贴,如果有什么错误欢迎留言斧正
这是电路原理图:
下边是单片机程序,
- /*----------------- ------------------------------
- 基于 STC15W408AS 点焊机控制程序
- 参考来源 STC89C52
- 20230204
- 由两个按键控制时间加减,一个按键控制开始
- 两次脉冲
- 根据需要可选进入掉电模式或空闲模式
- 15W408AS
- 仿真时请选用STC15W4K32S4,更改频率为12Mhz
- STC15W408AS频率12Mhz
-
- ------------------------------------------------*/
- #include <STC15F2K60S2.H>//头文件定义 STC15W408AS专用//STC15W4K32S4通用
- #include <intrins.h>
- /*位清零:& //位设置:|
- 设置、读取位的方法
- '位与
- '第7位'01111111'7F
- '第6位'10111111'BF
- '第5位'11011111'DF
- '第4位'11101111'EF
- '第3位'11110111'F7
- '第2位'11111011'FB
- '第1位'11111101'FD
- '第0位'11111110'FE*///位于运算判断结果值是否是255,是255则是1,否则改位是0
- #define GET_BIT(x, bit) ((x & (1 << bit)) >> bit) /* 获取第bit位 *///取0-7位的bit数据//详解:与运算同为1得1,位与后位移相当于删去目标bit两边的数据位
- #define D P1 //数码管段用D代替//把P1引脚段改个名字//引脚P1.0-1.7,引脚不足:P1.0-P1.5
- sbit D2=P3^7;//数码管G//16脚单片机段引脚不足7位,附加一个引脚P3.7
- sbit s1=P3^2;//定义加按键//按键默认电平 低电平//引脚P3.2
- sbit s2=P3^3;//定义减按键//按键默认电平 低电平//引脚不足未设置
- sbit s3=P3^6;//定义点焊开始//按键默认电平 低电平//检测引脚P3.6
- sbit m=P5^4;//定义点焊脉冲输出//默认电平为 低电平//实际引脚P5.4//仿真引脚P3.4
- sbit q1=P5^5;//定义蜂鸣器//蜂鸣器默认电平为 高电平//引脚P3.3
- unsigned int a;//定义全局变量毫秒延时计数//延时范围更改为0-F对应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的值//数码管真值表//
- //当引脚段不足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毫秒设定,用于数码管刷新
- void Timer1_Isr(void) interrupt 3
- {
- TL1 = 0x18; //设置定时初始值
- TH1 = 0xFC; //设置定时初始值
- D=LED_code[a];//数码管显示数字
- D2=GET_BIT(LED_code[a],6);//取第7位数据值作为7段数码管的G控制
- }
- /*------------------------------------------------
- 主函数
- ------------------------------------------------*/
- void main (void)
- {
- //初始定时器
- EA=1;//中断总开关,默认是0?
- //AUXR=0x1B;//默认值(复位值)//默认T0、T1时钟12分频,T2是计数不分频,串口6分频
- TMOD=0x11;//启用定时器1,定时器0
- //65毫秒@12.000MHz//中断
- TL1 = 0x18; //设置定时初始值
- TH1 = 0xFC; //设置定时初始值
- TF1 = 0; //清除TF1标志
- TR1 = 1; //定时器1开始计时
- ET1 = 1; //使能定时器1中断
- //1毫秒@12MHz不中断
- TL0 = 0x18; //设置定时初始值
- TH0 = 0xFC; //设置定时初始值
- TF0 = 0;//清除TF0溢出标志
- TR0 = 1;//定时器0开始计时
- D=0;
- D2=0;//数码管电平重置
- a=0;//程序开始时0//保护挡位
- m=1;//脉冲初始为高电平,脉冲关闭
- q1=1;//蜂鸣器默认高电平关闭
- q1=0;//蜂鸣器打开//用于开机提示
- DelayMs(60);
- q1=1;//蜂鸣器关闭
- DelayMs(50);
- q1=0;//蜂鸣器打开//用于开机提示
- DelayMs(60);
- q1=1;//蜂鸣器关闭
- DelayMs(40);
- q1=0;//蜂鸣器打开//用于开机提示
- DelayMs(60);
- q1=1;//蜂鸣器关闭
- //前置程序完成
- while (1) //主循环
- {
- //D=LED_code[a];//数码管显示数字
- //D2=GET_BIT(LED_code[a],6);//取第7位数据值作为7段数码管的G控制
- anjian( );//按键判断
- if(a!=0)//0挡位不作输出
- maichong( );//脉冲检测
- }
- }
- void anjian( )//按键函数//原代码是中断式执行模式,即按下后陷入循环体,释放后再执行功能代码
- {
- 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//按键按下时循环,松开后向下执行
- }
- }
- 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);//等待按键释放
- }
- }
- }
- /*毫秒延时是循环体执行,类似于中断,中断期间无法执行和判断按键按下,
- 可能导致的情况:点焊时误触点焊笔立即拿开,但此时已经进入了延时阶段,
- 如果在延时结束时恰好放下点焊笔,此时会导致下次的按键判断为点焊确认状态,则会开始执行脉冲输出(焊接)功能代码。
- 这种情况下没什么影响。
- 情况二:第一次误触,第二次又误触的情况下,会导致误焊。
- 解决方法一:在延时程序内每个时间单位内加入检测点焊开关的判断,如果等待确认时间段内离开点焊笔,此时立即退出脉冲输出函数过程;
- 建议另写脉冲输出专用的延时函数。
- */
- void maichong()//脉冲输出函数
- {
- if(s3==0)//S3 P1^0 电焊开始按键为 0 低电平 执行
- {
- unsigned int tus;
- q1=0;//焊接等待提示
- DelayMs(60);
- q1=1;
- //等待确认点焊,防止误焊
-
- tus=900;//900毫秒
- //12Mhz晶振1000微秒延时
- TH0 = 0xFC;//设置定时初始值
- TL0 = 0x18;//设置定时初始值
- 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;//设置定时初始值
- TL0 = 0x18;//设置定时初始值
- TF0 = 0;//清除TF0溢出标志
- TR0 = 1;//定时器0开始计时
- //a=tus/100;//数码管倒计时
- }
- TR0 = 0;//定时器0停止计时
- //a=ma;//重置显示
- if(s3==0)//S3 P1^0 电焊开始按键为 0 低电平 执行//等待时间结束后开始判断是否焊接
- {
- DelayMs(100);//延时100 //脉冲第一次
-
- q1=0;//低电平,蜂鸣器提示
- m=0;//低电平,脉冲打开
- DelayMs(a);//延时毫秒,值是变量a//设定毫秒时间后断开电流//leilv测试用延时倍率
- m=1;//高电平,脉冲关闭
- q1=1;//蜂鸣器关闭,高电平
- DelayMs(100);//延时毫秒 100 //脉冲第二次
-
- q1=0;//低电平,蜂鸣器提示
- m=0;//低电平,脉冲打开
- DelayMs(a);//延时毫秒,值是变量a//测试是时请删除*leilv
- m=1;//高电平,脉冲关闭
- q1=1;//蜂鸣器关闭,高电平
- 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; //设置定时初始值
- TH0 = 0xFC; //设置定时初始值
- TF0 = 0;//清除TF0溢出标志
- TR0 = 1;//定时器0开始计时
- while(t--)//t;t=t-1//先判断t,再-1
- {
- while(TF0==0);//等待TF0为1//等待溢出
- TF0 = 0;//清除溢出标记
- TL0 = 0x18; //设置定时初始值
- TH0 = 0xFC; //设置定时初始值
- }
- 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;//设置定时初始值
- TL0 = (65536-ut)%256;//设置定时初始值
- TF0 = 0; //清除TF0溢出标志
- TR0 = 1; //定时器0开始计时
- while(TF0==0);//等待TF0为1//等待溢出
- TF0 = 0;//清除溢出标记
- TR0 = 0;//停止计时
- TH0 =0;//清除值
- TL0=0;
- }
- */
- /*
- 定时器使用方法
- 机器周期:机器周期=晶振频率/12
- ET0:定时器0中断开关,0开1关 ,会触发中断函数过程
- 赋初值:开始计数的初始值
- 中断条件:开启中断会触发interrupt 函数过程
- 65536是溢出值,此时定时器停止
- 12Mhz的机器周期是1微秒,一个机器周期计数+1
- 1、TMOD :控制,8位;GATE;C/T;M1;M0;GATE;C/T;M1/M0;
- C/T为0是定时功能,反之是计数;
- M1M0:为工作模式,0;1是16为定时/计时器。
- 2、置初值TH0;TL0,5us:TH0=(65536-5000)/256;TL0=(65536-5000)%256; 到达目标后溢出
- 3、TCON:启动,8位可单独设置,TF1;TR1;TF0;TR0;IE1;IT1;IE0;IT0;
- TR0:为1定时器开始,反之停止;
- TF0:溢出后变为1,需手动清零;由此可得延时函数,while(TF0==0);//TF0为0的情况下始终循环,TF0为1时向下执行
- */
复制代码
Keil代码下载:
STC408AS点焊机程序实验(无倒计时).zip
(103.67 KB, 下载次数: 122)
|