标题:
继电器延时直流电机正反转带4位数码管芯片程序如何编写?
[打印本页]
作者:
hzxty
时间:
2020-10-6 05:02
标题:
继电器延时直流电机正反转带4位数码管芯片程序如何编写?
接线端口说明
1、DC:输入电源直流12V
2、IN1:信号输入端1(负极触发)
3、IN2:信号输入端2(负极触发)
4、IN3:信号输入端3(负极触发)
要如下功能:
P-1:给信号1,继电器1吸合到A时间自动停止,在这延时期间再给信号1或信号2没有反应; 给信号2,继电器2吸合到B时间自动停止,在这期间再给信号1或信号2都没有反应;信号3是急停复位信号,在继电器1或2吸合期间都会停止。
P-2: 通电继电器1吸合到A时间自动停止,在这延时期间再给信号1或2没有反应,当继电器1停止后,再给信号1继电器1吸合到A时间自动停止; 给信号2,继电器2吸合到B时间自动停止,在这期间再给信号1或信号2都没有反应; 信号3是急停复位信号,在继电器1或2吸合期间都会停止。
芯片脚位连接说明:STC15W408AS的1脚是信号3通过光耦使1脚低电平时急停;2脚是信号2通过光耦使2脚低电平时使12脚低电平时通过光耦使继电器2启动工作;3脚是信号1通过光耦使3脚低电平使11脚低电平时通过光耦使继电器1启动工作。也就是说1脚低电平是急停;2脚低电平是继电器2工作;3脚低电平是继电器1工作,(平时都是高电平),11、12脚低电平启动继电器1、2(平时高电平),13、14脚到数码管TM1650IC的2、3脚。
按键设置说明
通电显示
表示进入待机状态
按第一次K1屏幕显示:Pー1: K2和K3调节模式,按第二次K1,屏幕显示:A001:K2和K3调节第一个时间A,K4调节小数点(时间单位)按第三次K1,屏幕显示:B001:K2和K3调节第二个时间B,按第四次K1,显示“-----”表示进入待机状态。
比如;需要设定模式为:P-2;时间为:A010,B005。
表示第二个工作方式;给信号1后;继电器1启动10秒之后关闭; 继电器2再给信号2之后延时5秒之后自动关闭。
计时范围:0.1秒~99秒。
作者:
hzxty
时间:
2020-10-6 09:39
标题:
RE: 求继电器延时直流电机正反转带4位数码管芯片程序
STC8F1K08S2或STC8F2K08S2芯片也可以
作者:
hzxty
时间:
2020-10-6 20:10
求助继电器延时直流电机正反转带4位数码管芯片程序
作者:
hzxty
时间:
2020-10-8 23:10
请教大师傅,200黑币
作者:
wulin
时间:
2020-10-9 11:43
给你一个演示程序,按实际电路配置端口即可满足你的需求。
//按楼主意图优化编写
//双路0.1~99.9秒倒计时演示程序
//此程序适合51单片机和STC1T单片机
//也适合共阳/共阴数码管
#include<reg51.h>
#include<intrins.h>
#define key_S 10 //宏定义短按(约10ms)
#define key_L key_S*50 //宏定义长按(约500ms)
#define key_I key_S*38 //宏定义长按连+/-间隔(约120ms)
#define uchar unsigned char
#define uint unsigned int
//端口根据实际电路重新定义
sbit K1 =P1^0;
sbit K2 =P1^1;
sbit K3 =P1^2;
sbit IN1=P1^3;
sbit IN2=P1^4;
sbit IN3=P1^5;
sbit OUT1=P1^6;
sbit OUT2=P1^7;
/*
uchar code table[]={//共阳数码管段码"0~f-."
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
*/
uchar code table[]={//共阴数码管段码"0~f-."
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40,0x80};
uchar data dis_buf[4];//显示数据缓存
bit state1,state2;//倒计时状态
int time1=115,time2=225;
uchar KeySec;
int num=0,num1=0;
bit flashing=0;
//12T51单片机
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void Timer0Init() //10毫秒@11.0592MHz
{
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
// TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
//STC1T单片机
/*void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
i = 15;
j = 90;
do
{
while (--j);
} while (--i);
}
void Timer0Init() //10毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
*/
//按键扫描
void keyscan()
{
static unsigned int count=0;
if(!K1||!K2||!K3)
{
count++;
if(count>key_L)//长按有效
count=key_I;//连+/-间隔
if(count==key_S)//短按消抖
{
if(!K1)//预设
{
KeySec++;
if(KeySec>=3)
{
KeySec=0;
}
}
}
if(count==key_S||count==key_L)//短按+/-,长按连+/-
{
if(!K2 && KeySec>0)
{
switch(KeySec)
{
case 1: if(time1<999)time1++; break;
case 2: if(time2<999)time2++; break;
}
}
if(!K3 && KeySec>0)
{
switch(KeySec)
{
case 1: if(time1>1)time1--; break;
case 2: if(time2>1)time2--; break;
}
}
}
}
else count=0;
}
void INscan()
{
if(KeySec==0 && TR0==0)
{
if(!IN1)
{
TR0=1;
OUT1=0;
OUT2=1;
state1=1;
state2=0;
num1=0;
num=time1;
}
if(!IN2)
{
TR0=1;
OUT1=1;
OUT2=0;
state1=0;
state2=1;
num1=0;
num=time2;
}
}
if(!IN3)
{
OUT1=1;
OUT2=1;
state1=0;
state2=0;
num1=0;
num=0;
}
}
void display()//显示
{
static uchar i=0;
uchar j=0;
if(KeySec==0)
{
if(state1==0 && state2==0)
{//显示----
// for(j=0;j<4;j++)
// dis_buf[j] = 0xbf;//共阳-
for(j=0;j<4;j++)
dis_buf[j] = 0x40;//共阴-
}
else
{
if(state1==1)//显示A倒计时时间
// dis_buf[0] = 0x88;//共阳A
dis_buf[0] = 0x77;//共阴A
else if(state2==1)//显示B倒计时时间
// dis_buf[0] = 0x83;//共阳b
dis_buf[0] = 0x7c;//共阴b
dis_buf[1] = table[num/100%10];
// dis_buf[2] = table[num/10%10]&0x7f;//共阳加小数点
dis_buf[2] = table[num/10%10]|0x80;//共阴加小数点
dis_buf[3] = table[num%10];
}
}
if(KeySec==1)
{//显示A预设时间
// dis_buf[0] = 0x88; //共阳A
dis_buf[0] = 0x77; //共阳A
dis_buf[1] = table[time1/100%10];
// dis_buf[2] = table[time1/10%10]&0x7f;//共阳加小数点
dis_buf[2] = table[time1/10%10]|0x80;//共阴加小数点
dis_buf[3] = table[time1%10];
}
if(KeySec==2)
{//显示B预设时时间
// dis_buf[0] = 0x83; //共阳b
dis_buf[0] = 0x7c; //共阳b
dis_buf[1] = table[time2/100%10];
// dis_buf[2] = table[time2/10%10]&0x7f;//共阳加小数点
dis_buf[2] = table[time2/10%10]|0x80;//共阴加小数点
dis_buf[3] = table[time2%10];
}
//共阳数码管驱动
/* P2&=0xf0;//消隐
P0=dis_buf[i];//送段码
P2|=0x01<<i;//送位码
*/
//共阴数码管驱动
P0=0x00;//消隐
P2&=0xf0;//清低4位
P0=dis_buf[i];//送段码
P2|=~(0x01<<i);//送位码
i++;i%=4;
}
void main()//主函数
{
Timer0Init();//定时器初始化程序
while(1)
{
keyscan(); //按键扫描
INscan(); //输入扫描
display(); //数码管显示
Delay1ms(); //控制主循环约1ms
}
}
void Timer0Interrupt(void) interrupt 1
{
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
num1++;
if(num1>=10)
{
num1=0;
num--;
if(num<=0)
{
num=0;
OUT1=1;
OUT2=1;
state1=0;
state2=0;
TR0=0;
}
}
}
复制代码
作者:
hzxty
时间:
2020-10-9 21:23
谢谢前辈指点
作者:
hzxty
时间:
2020-10-9 23:34
谢谢总工
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1