找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3345|回复: 7
收起左侧

求大家指导将点焊机单片机程序改为99个挡

[复制链接]
ID:126608 发表于 2018-10-11 09:47 | 显示全部楼层 |阅读模式
原程序是本坛下的点焊机程序,只有1个数码管10个挡,自己用2个数码管
改为20个挡,想改为99个挡,不会了,求大家指导将程序改为99个挡,
2个数码管静态的动态的都可以,共阴共阳都行。/
#include "reg51.h"               //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u20;        //对数据类型进行声明定义
typedef unsigned char u10;      //对数据类型进行声明定义
sbit P31=P3^0;//数码管第1位
sbit P30=P3^1;//数码管第2位
sbit k1=P3^2;        //将单片机的P3.2端口定义为档位上
sbit k2=P3^3;        //将单片机的P3.3端口定义为档位下
sbit k3=P3^4;        //将单片机的P3.4端口定义为手控
sbit k4=P3^5;        //将单片机的P3.5端口定义为脚踏
sbit out=P3^7;         //继电器输出
//数码管真值表//
u10 code LED_CODE[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
                            0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};//显示0~20的值
//延时函数 //
void delay(u20 x)
        {
        u20 i,j;
            for(i = x; i > 0; i --)
                for(j = 110; j > 0; j --);        
        }
//主函数//
void main()
    {
      
        u10 i = 1;
              out=1;
        while(1)
        {
        P2 = LED_CODE[ i];
P31=0;
                                   if(i>=10)
       P30=0;
       P1 =0x06;            
       if(i<10)
       P30=1;
              if(i<0)
       i=19;                                          
            
                                   if(k1==0)
            {
        delay(5);
                if(k1==0)
                    {
                        while(!k1)      //档位功能0-9
                        delay(5);
                        P2 = LED_CODE;
                        i = (i + 1) % 20;
                        delay(10);
                    }
                                                                     
            }
                      if(k2==0)
            {
              delay(5);
                if(k2==0)
                    {
                        while(!k2)      //档位功能0-9
                        delay(5);
                        P2 = LED_CODE;
                        i = (i - 1) % 20;
                        delay(10);
                    }
                                   }
            if(k3==0)
            {
            delay(5);
                if(k3==0)
                    {
                        while(!k3)
                        delay(5);
                     out=0;
                        delay(i*200);//手控输出延时
                        out=1;
                    }
          }
         if(k4==0)
            {
        delay(5);
                if(k4==0)
                    {
                        while(!k4)
                        delay(5);
                     out=0;
                        delay(i*300);//脚蹋输出延时
                        out=1;
                    }
          }   
   }
}

//这是原程序
#include "reg51.h"               //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;        //对数据类型进行声明定义
typedef unsigned char u8;        //对数据类型进行声明定义
sbit k1=P3^2;        //将单片机的P3.2端口定义为档位上
sbit k2=P3^3;        //将单片机的P3.3端口定义为档位下
sbit k3=P3^4;        //将单片机的P3.4端口定义为手控
sbit k4=P3^5;        //将单片机的P3.5端口定义为脚踏
sbit out=P3^7;         //继电器输出
//数码管真值表//
u8 code LED_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
//延时函数 //
void delay(u16 x)
        {
        u16 i,j;
            for(i = x; i > 0; i --)
                for(j = 110; j > 0; j --);        
        }
//主函数//
void main()
    {
      
        u8 i = 1;
              out=0;
        while(1)
        {
        P1 = LED_CODE;
            if(k1==0)
            {
        delay(5);
                if(k1==0)
                    {
                        while(!k1)      //档位功能0-9
                        delay(5);
                        P1 = LED_CODE;
                        i = (i + 1) % 10;
                        delay(10);
                    }
            }
                      if(k2==0)
            {
              delay(5);
                if(k2==0)
                    {
                        while(!k2)      //档位功能0-9
                        delay(5);
                        P1 = LED_CODE;
                        i = (i - 1) % 10;
                        delay(10);
                    }
                                   }
            if(k3==0)
            {
            delay(5);
                if(k3==0)
                    {
                        while(!k3)
                        delay(5);
                     out=1;
                        delay(i*200);//手控输出延时
                        out=0;
                    }
          }
         if(k4==0)
            {
        delay(5);
                if(k4==0)
                    {
                        while(!k4)
                        delay(5);
                     out=1;
                        delay(i*300);//脚蹋输出延时
                        out=0;
                    }
          }   
   }
}

回复

使用道具 举报

ID:258566 发表于 2018-10-11 14:57 | 显示全部楼层
本帖最后由 cccc888 于 2018-10-11 16:15 编辑

没过零检测.建议使用过零检测 计数一次.

my.gif

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:213173 发表于 2018-10-11 17:48 | 显示全部楼层
在你的程序基础上给你改写,使用定时器精确控制,最大范围1~99,定时时间手动可以从20~1980毫秒,脚踏可以从30~2970毫秒。手动/脚踏开关自锁与互锁。经仿真无误。

#include "reg51.h"       //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;//对数据类型进行声明定义
typedef unsigned char u8;//对数据类型进行声明定义
sbit P30=P3^0;                        //数码管第1位
sbit P31=P3^1;                        //数码管第2位
sbit k1=P3^2;        //将单片机的P3.2端口定义为档位上
sbit k2=P3^3;        //将单片机的P3.3端口定义为档位下
sbit k3=P3^4;        //将单片机的P3.4端口定义为手控
sbit k4=P3^5;        //将单片机的P3.5端口定义为脚踏
sbit out=P3^7;       //继电器输出
//数码管真值表//
u8 code LED_CODE[]={//显示0~F的段码
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u16 Cntms1=0,Cntms2=0,num1,num2;
u8 num;                //定时变量=毫秒
//延时函数 //
void delay(u16 x)
{
        u16 i,j;
        for(i=x;i>0;i--)
                for(j=110;j>0;j--);        
}
void Timer0Init() //1毫秒@12.000MHz
{
        TMOD= 0x01;                //设置定时器模式
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        TR0 = 1;                        //定时器0开始计时
        EA=1;                                //开总中断
        ET0=1;                        //开定时器0中断
}
/********************************
                数码管动态显示程序
********************************/
void display()
{
        static u8 i=0;
        P1=0x00;//消隐
        if(i==0)
        {
                P31=1;
                P30=0;
                P1=LED_CODE[num/10];
                i=1;
        }
        else
        {
                P30=1;
                P31=0;
                P1=LED_CODE[num%10];
                i=0;
        }
}
//主函数//
void main()
{       
        out=0; //初始化输出端口
        num=20;//定时变量赋初值
        Timer0Init();//初始化定时器
        while(1)
        {
                if(k1==0)//加数
                {
                        delay(5);
                        if(k1==0)
                        {
                                if(num<99)
                                        num++;
                                while(!k1);      //档位功能1-99
                        }
                }
                if(k2==0)//减数
                {
                        delay(5);
                        if(k2==0)
                        {
                                if(num>1)
                                        num--;
                                while(!k2);      //档位功能1-99
                        }
                }
                if((k3==0)&&(num1==0)&&(num2==0))//手动/脚踏开关自锁与互锁
                {
                        delay(5);
                        if(k3==0)
                        {
                                num1=num*20;//num1=num毫秒*20倍,20~1980毫秒
                                while(!k3);
                        }
                }
                if((k4==0)&&(num2==0)&&(num1==0))//手动/脚踏开关自锁与互锁
                {
                        delay(5);
                        if(k4==0)
                        {
                                num2=num*30;//num2=num毫秒*30倍,30~2970毫秒
                                while(!k4);
                        }
                }   
        }
}
/******************************
                中断服务程序
******************************/
void timer0() interrupt        1        //1毫秒@12MHz
{

        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        if(num1!=0)//执行手动
        {
                out=1;
                Cntms1++;       
                if(Cntms1>=num1)
                {       
                        Cntms1=0;
                        out=0;
                        num1=0;
                }
        }
        if(num2!=0)//执行脚踏
        {
                out=1;
                Cntms2++;       
                if(Cntms2>=num2)
                {       
                        Cntms2=0;
                        out=0;
                        num2=0;
                }
        }
        display();//数码管动态显示
}



无标题.jpg

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:7485 发表于 2018-10-11 18:25 | 显示全部楼层
你要求这么多档位,51单片机没有这么多的脚输出,需要扩展IO。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:126608 发表于 2018-10-11 19:19 | 显示全部楼层
问题解决了,用您给的程序和仿真图仿真了,大体能看懂程序,多谢了。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:462163 发表于 2019-1-5 17:25 | 显示全部楼层
断电了再开机,设置的时间数据能保存吗?
回复

使用道具 举报

ID:865461 发表于 2021-1-12 16:50 | 显示全部楼层
装在开发板上正常运行效果很好
回复

使用道具 举报

ID:865461 发表于 2021-1-12 16:52 | 显示全部楼层
wulin 发表于 2018-10-11 17:48
在你的程序基础上给你改写,使用定时器精确控制,最大范围1~99,定时时间手动可以从20~1980毫秒,脚踏可以 ...

已经装在开发板上效果很好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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