找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2886|回复: 13
打印 上一主题 下一主题
收起左侧

STC15W408AS单片机九档点焊机程序

  [复制链接]
跳转到指定楼层
楼主
ID:993738 发表于 2023-2-26 23:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新人贴,如果有什么错误欢迎留言斧正
这是电路原理图:

下边是单片机程序,
  1. /*----------------- ------------------------------
  2. 基于 STC15W408AS 点焊机控制程序
  3. 参考来源 STC89C52
  4. 20230204
  5. 由两个按键控制时间加减,一个按键控制开始
  6. 两次脉冲
  7. 根据需要可选进入掉电模式或空闲模式
  8. 15W408AS
  9. 仿真时请选用STC15W4K32S4,更改频率为12Mhz
  10. STC15W408AS频率12Mhz
  11.         
  12. ------------------------------------------------*/
  13. #include <STC15F2K60S2.H>//头文件定义 STC15W408AS专用//STC15W4K32S4通用

  14. #include <intrins.h>

  15. /*位清零:&        //位设置:|
  16. 设置、读取位的方法
  17. '位与
  18. '第7位'01111111'7F
  19. '第6位'10111111'BF
  20. '第5位'11011111'DF
  21. '第4位'11101111'EF
  22. '第3位'11110111'F7
  23. '第2位'11111011'FB
  24. '第1位'11111101'FD
  25. '第0位'11111110'FE*///位于运算判断结果值是否是255,是255则是1,否则改位是0
  26. #define GET_BIT(x, bit) ((x & (1 << bit)) >> bit)   /* 获取第bit位 *///取0-7位的bit数据//详解:与运算同为1得1,位与后位移相当于删去目标bit两边的数据位

  27. #define D P1   //数码管段用D代替//把P1引脚段改个名字//引脚P1.0-1.7,引脚不足:P1.0-P1.5
  28. sbit D2=P3^7;//数码管G//16脚单片机段引脚不足7位,附加一个引脚P3.7

  29. sbit s1=P3^2;//定义加按键//按键默认电平 低电平//引脚P3.2
  30. sbit s2=P3^3;//定义减按键//按键默认电平 低电平//引脚不足未设置

  31. sbit s3=P3^6;//定义点焊开始//按键默认电平 低电平//检测引脚P3.6

  32. sbit m=P5^4;//定义点焊脉冲输出//默认电平为 低电平//实际引脚P5.4//仿真引脚P3.4

  33. sbit q1=P5^5;//定义蜂鸣器//蜂鸣器默认电平为 高电平//引脚P3.3

  34. unsigned int a;//定义全局变量毫秒延时计数//延时范围更改为0-F对应0-15毫秒
  35. //unsigned int ma;//记忆a

  36. unsigned char LED_code[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值//数码管真值表//
  37. //当引脚段不足7个引脚时,另定义引脚,取某一位(GET_BIT)的值赋予之,取位是6

  38. void DelayMs(unsigned int t);//毫秒延时
  39. //void Delay1us12(unsigned int ui);//12Mhz,1微秒延时
  40. //void Delay1us35(unsigned int ti);//35Mhz,1微秒延时

  41. //void Timer0us(unsigned int ut);//35Mhz定时器微秒延时
  42. void anjian();//按键处理程序
  43. void maichong();//脉冲处理程序

  44. //定时器1的中断程序过程//65毫秒设定,用于数码管刷新
  45. void Timer1_Isr(void) interrupt 3
  46. {
  47.         TL1 = 0x18;                                //设置定时初始值
  48.         TH1 = 0xFC;                                //设置定时初始值
  49.         D=LED_code[a];//数码管显示数字
  50.         D2=GET_BIT(LED_code[a],6);//取第7位数据值作为7段数码管的G控制
  51. }

  52. /*------------------------------------------------
  53.                     主函数
  54. ------------------------------------------------*/
  55. void main (void)
  56. {        
  57.         //初始定时器
  58.         EA=1;//中断总开关,默认是0?
  59.         //AUXR=0x1B;//默认值(复位值)//默认T0、T1时钟12分频,T2是计数不分频,串口6分频
  60.         TMOD=0x11;//启用定时器1,定时器0
  61.         //65毫秒@12.000MHz//中断
  62.         TL1 = 0x18;                                //设置定时初始值
  63.         TH1 = 0xFC;                                //设置定时初始值
  64.         TF1 = 0;                                //清除TF1标志
  65.         TR1 = 1;                                //定时器1开始计时
  66.         ET1 = 1;                                //使能定时器1中断

  67.         //1毫秒@12MHz不中断
  68.         TL0 = 0x18;                                //设置定时初始值
  69.         TH0 = 0xFC;                                //设置定时初始值
  70.         TF0 = 0;//清除TF0溢出标志
  71.         TR0 = 1;//定时器0开始计时

  72.         D=0;
  73.         D2=0;//数码管电平重置

  74.         a=0;//程序开始时0//保护挡位

  75.         m=1;//脉冲初始为高电平,脉冲关闭
  76.         q1=1;//蜂鸣器默认高电平关闭

  77.         q1=0;//蜂鸣器打开//用于开机提示
  78.         DelayMs(60);
  79.         q1=1;//蜂鸣器关闭
  80.         DelayMs(50);
  81.         q1=0;//蜂鸣器打开//用于开机提示
  82.         DelayMs(60);
  83.         q1=1;//蜂鸣器关闭
  84.         DelayMs(40);
  85.         q1=0;//蜂鸣器打开//用于开机提示
  86.         DelayMs(60);
  87.         q1=1;//蜂鸣器关闭

  88.         //前置程序完成
  89.         while (1)        //主循环
  90.         {
  91.                 //D=LED_code[a];//数码管显示数字
  92.                 //D2=GET_BIT(LED_code[a],6);//取第7位数据值作为7段数码管的G控制
  93.                 anjian( );//按键判断
  94.                 if(a!=0)//0挡位不作输出
  95.                         maichong( );//脉冲检测
  96.          }

  97. }

  98. void anjian( )//按键函数//原代码是中断式执行模式,即按下后陷入循环体,释放后再执行功能代码
  99. {  
  100.          if(s1==0)//时间加按键
  101.     {
  102.                  if(s1==0)
  103.                 {
  104.                         a++;//a,a=a+1         
  105.                         if(a>9)//达到10时改为1//a 时间毫秒变量,最大值 9//更改范围为0-9
  106.                                 a=0;//越界则固定一个值 1
  107.                         //ma=a;
  108.                         while(!s1);//等待按键释放 ,S1==0则!S1==true//按键按下时循环,松开后向下执行        
  109.                 }                 
  110.         }
  111.         if(s2==0)//时间减按键
  112.     {
  113.                  if(s2==0)
  114.                 {
  115.                         if(a==0)
  116.                                 a=9;//注意变量a的类型和范围,不能为0,long int范围0-65535
  117.                         else
  118.                                 a--;//a,a=a-1//范围为0-9
  119.                         //ma=a;
  120.                         while(!s2);//等待按键释放         
  121.                 }
  122.         }
  123. }

  124. /*毫秒延时是循环体执行,类似于中断,中断期间无法执行和判断按键按下,
  125. 可能导致的情况:点焊时误触点焊笔立即拿开,但此时已经进入了延时阶段,
  126. 如果在延时结束时恰好放下点焊笔,此时会导致下次的按键判断为点焊确认状态,则会开始执行脉冲输出(焊接)功能代码。
  127. 这种情况下没什么影响。
  128. 情况二:第一次误触,第二次又误触的情况下,会导致误焊。
  129. 解决方法一:在延时程序内每个时间单位内加入检测点焊开关的判断,如果等待确认时间段内离开点焊笔,此时立即退出脉冲输出函数过程;
  130. 建议另写脉冲输出专用的延时函数。
  131. */
  132. void maichong()//脉冲输出函数
  133. {        
  134.         if(s3==0)//S3 P1^0 电焊开始按键为 0 低电平 执行
  135.         {
  136.                 unsigned int tus;
  137.                 q1=0;//焊接等待提示
  138.                 DelayMs(60);
  139.                 q1=1;
  140.                 //等待确认点焊,防止误焊
  141.                
  142.                 tus=900;//900毫秒
  143.                 //12Mhz晶振1000微秒延时
  144.                 TH0 = 0xFC;//设置定时初始值
  145.                 TL0 = 0x18;//设置定时初始值
  146.                 TF0 = 0;//清除TF0溢出标志
  147.                 TR0 = 1;//定时器0开始计时
  148.                 while(tus--)//t;t=t-1//先判断t,再-1
  149.                 {
  150.                         while(TF0==0)//等待TF0为1//等待溢出
  151.                         {
  152.                                 if(s3==1)
  153.                                         return;//按键释放立即返回
  154.                         }
  155.                         TH0 = 0xFC;//设置定时初始值
  156.                         TL0 = 0x18;//设置定时初始值
  157.                         TF0 = 0;//清除TF0溢出标志
  158.                         TR0 = 1;//定时器0开始计时
  159.                         //a=tus/100;//数码管倒计时
  160.                 }
  161.                 TR0 = 0;//定时器0停止计时
  162.                 //a=ma;//重置显示                                                                                       
  163.                  if(s3==0)//S3 P1^0 电焊开始按键为 0 低电平 执行//等待时间结束后开始判断是否焊接
  164.                  {
  165.                          DelayMs(100);//延时100                //脉冲第一次
  166.                         
  167.                          q1=0;//低电平,蜂鸣器提示
  168.                          m=0;//低电平,脉冲打开
  169.                          DelayMs(a);//延时毫秒,值是变量a//设定毫秒时间后断开电流//leilv测试用延时倍率
  170.                          m=1;//高电平,脉冲关闭
  171.                          q1=1;//蜂鸣器关闭,高电平

  172.                          DelayMs(100);//延时毫秒 100 //脉冲第二次
  173.                         
  174.                          q1=0;//低电平,蜂鸣器提示
  175.                          m=0;//低电平,脉冲打开
  176.                          DelayMs(a);//延时毫秒,值是变量a//测试是时请删除*leilv
  177.                          m=1;//高电平,脉冲关闭
  178.                          q1=1;//蜂鸣器关闭,高电平

  179.                          while(!s3);//等待按键(点焊笔)松开
  180.                  }                          
  181.         
  182.         }   
  183. }


  184. /*------------------------------------------------
  185. STC15Wxx系列35Mhz,1微秒延时
  186. unsigned int0-65535
  187. ------------------------------------------------*/
  188. /*
  189. void Delay1us35(unsigned int ti)//1微秒延时晶振33.1776MHz
  190. {
  191.         unsigned char i;
  192.         while(--ti)
  193.         {
  194.                 _nop_();
  195.                 _nop_();
  196.                 _nop_();
  197.                 i = 5;
  198.                 while (--i);
  199.         }
  200. }
  201. */
  202. /*
  203. //STC15Wxx系列12Mhz,1微秒延时
  204. void Delay1us12(unsigned int ui)//1微秒延时晶振11.0592MHz
  205. {        
  206.         while(--ui)
  207.         {
  208.                 _nop_();
  209.                 _nop_();
  210.                 _nop_();
  211.         }
  212. }
  213. */
  214. //毫秒延时程序
  215. void DelayMs(unsigned int t) //延时单位约1mS
  216. {        
  217.         //1毫秒@12.000MHz
  218.         TL0 = 0x18;                                //设置定时初始值
  219.         TH0 = 0xFC;                                //设置定时初始值
  220.         TF0 = 0;//清除TF0溢出标志
  221.         TR0 = 1;//定时器0开始计时
  222.         while(t--)//t;t=t-1//先判断t,再-1
  223.         {
  224.                 while(TF0==0);//等待TF0为1//等待溢出
  225.                  TF0 = 0;//清除溢出标记
  226.                 TL0 = 0x18;                        //设置定时初始值
  227.                 TH0 = 0xFC;                        //设置定时初始值        
  228.         }
  229.         TR0 = 0;//定时器0停止计时
  230. }
  231. //硬件定时器延时
  232. /*
  233. void Timer0us(unsigned int ut)//微秒延时程序//35Mhz//ut范围0-23703微秒
  234. {
  235.         //12Mhz下是65536*1微秒;35Mhz下是12/35M*65536=22469.48571428571微秒
  236.         //12Mhz下是65536微秒的溢出值,35Mhz下需要/12;
  237.         //33.1776Mhz=35Mhz?;11.0592Mhz=12Mhz?;
  238.         //t=t*0.9216;//11059200÷12000000=0.9216//12Mhz
  239.         ut=ut*2.7648;//33177600÷12000000 =2.7648//35Mhz
  240.         TH0 = (65536-ut)/256;//设置定时初始值
  241.         TL0 = (65536-ut)%256;//设置定时初始值
  242.         TF0 = 0;                                //清除TF0溢出标志
  243.         TR0 = 1;                                //定时器0开始计时
  244.         while(TF0==0);//等待TF0为1//等待溢出
  245.          TF0 = 0;//清除溢出标记
  246.         TR0 = 0;//停止计时
  247.         TH0 =0;//清除值
  248.         TL0=0;
  249. }
  250. */
  251. /*
  252. 定时器使用方法
  253. 机器周期:机器周期=晶振频率/12
  254. ET0:定时器0中断开关,0开1关 ,会触发中断函数过程
  255. 赋初值:开始计数的初始值
  256. 中断条件:开启中断会触发interrupt 函数过程
  257. 65536是溢出值,此时定时器停止
  258. 12Mhz的机器周期是1微秒,一个机器周期计数+1
  259. 1、TMOD    :控制,8位;GATE;C/T;M1;M0;GATE;C/T;M1/M0;
  260. C/T为0是定时功能,反之是计数;
  261. M1M0:为工作模式,0;1是16为定时/计时器。
  262. 2、置初值TH0;TL0,5us:TH0=(65536-5000)/256;TL0=(65536-5000)%256; 到达目标后溢出
  263. 3、TCON:启动,8位可单独设置,TF1;TR1;TF0;TR0;IE1;IT1;IE0;IT0;
  264. TR0:为1定时器开始,反之停止;
  265. TF0:溢出后变为1,需手动清零;由此可得延时函数,while(TF0==0);//TF0为0的情况下始终循环,TF0为1时向下执行
  266. */
复制代码

Keil代码下载:
STC408AS点焊机程序实验(无倒计时).zip (103.67 KB, 下载次数: 95)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏19 分享淘帖 顶1 踩
回复

使用道具 举报

来自 2#
ID:993738 发表于 2024-3-15 17:15 | 只看该作者
楼下有人想要源文件,诺,满足你们的要求,不过,时间有些久,不知道有没有改动,用之前记得检查下,另外,不要商业化哦。自己diy玩玩就行了。双电容版本。刚开始做记得百度下,别搞错电源了,另外PCB还可以继续优化下,懒得整了。

九档两键点焊机.zip

211.64 KB, 下载次数: 9, 下载积分: 黑币 -5

回复

使用道具 举报

板凳
ID:1004282 发表于 2023-2-27 08:42 | 只看该作者
牛逼了 ,有电路文件就更完美了  
回复

使用道具 举报

地板
ID:68189 发表于 2023-2-27 13:35 | 只看该作者
sx1308的EN脚接到VIN才能升压。
回复

使用道具 举报

5#
ID:283361 发表于 2023-3-11 19:53 | 只看该作者
电路实际可以使用吗?
回复

使用道具 举报

6#
ID:834124 发表于 2023-3-12 12:20 | 只看该作者
这代码也非常适合学习定时器和数码管的用法
回复

使用道具 举报

7#
ID:77511 发表于 2023-3-21 13:29 | 只看该作者
非常不错 nice 。不过MOS驱动对我感觉有点不爽,不如换成图腾柱或者TI 的UCC27517DBVT。
回复

使用道具 举报

8#
ID:140733 发表于 2023-11-15 12:02 | 只看该作者
先升到12再降5?
回复

使用道具 举报

9#
ID:430492 发表于 2023-11-16 12:45 | 只看该作者
升压是为了控制MOS管的,顺便取5V给MCU供电。
回复

使用道具 举报

10#
ID:993738 发表于 2024-3-15 16:56 | 只看该作者
dianziren12 发表于 2023-3-11 19:53
电路实际可以使用吗?

可以啊
回复

使用道具 举报

11#
ID:993738 发表于 2024-3-15 16:57 | 只看该作者

对的。因为双电容电压容易过低
回复

使用道具 举报

12#
ID:993738 发表于 2024-3-15 16:57 | 只看该作者
wpppmlah 发表于 2023-2-27 13:35
sx1308的EN脚接到VIN才能升压。

是的,修改后的图没上传,
回复

使用道具 举报

13#
ID:993738 发表于 2024-3-15 17:21 | 只看该作者
无人深空 发表于 2024-3-15 17:15
楼下有人想要源文件,诺,满足你们的要求,不过,时间有些久,不知道有没有改动,用之前记得检查下,另外, ...

直接导入立创eda即可。
回复

使用道具 举报

14#
ID:89072 发表于 2024-3-15 21:34 | 只看该作者
无人深空 发表于 2024-3-15 17:15
楼下有人想要源文件,诺,满足你们的要求,不过,时间有些久,不知道有没有改动,用之前记得检查下,另外, ...

谢谢,下载学习下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表