標題:
繼電器延時直流電機正反轉(zhuǎn)帶4位數(shù)碼管芯片程序如何編寫?
[打印本頁]
作者:
hzxty
時間:
2020-10-6 05:02
標題:
繼電器延時直流電機正反轉(zhuǎn)帶4位數(shù)碼管芯片程序如何編寫?
接線端口說明
1、DC:輸入電源直流12V
2、IN1:信號輸入端1(負極觸發(fā))
3、IN2:信號輸入端2(負極觸發(fā))
4、IN3:信號輸入端3(負極觸發(fā))
要如下功能:
P-1:給信號1,繼電器1吸合到A時間自動停止,在這延時期間再給信號1或信號2沒有反應(yīng); 給信號2,繼電器2吸合到B時間自動停止,在這期間再給信號1或信號2都沒有反應(yīng);信號3是急停復(fù)位信號,在繼電器1或2吸合期間都會停止。
P-2: 通電繼電器1吸合到A時間自動停止,在這延時期間再給信號1或2沒有反應(yīng),當(dāng)繼電器1停止后,再給信號1繼電器1吸合到A時間自動停止; 給信號2,繼電器2吸合到B時間自動停止,在這期間再給信號1或信號2都沒有反應(yīng); 信號3是急停復(fù)位信號,在繼電器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腳到數(shù)碼管TM1650IC的2、3腳。
按鍵設(shè)置說明
通電顯示
表示進入待機狀態(tài)
按第一次K1屏幕顯示:Pー1: K2和K3調(diào)節(jié)模式,按第二次K1,屏幕顯示:A001:K2和K3調(diào)節(jié)第一個時間A,K4調(diào)節(jié)小數(shù)點(時間單位)按第三次K1,屏幕顯示:B001:K2和K3調(diào)節(jié)第二個時間B,按第四次K1,顯示“-----”表示進入待機狀態(tài)。
比如;需要設(shè)定模式為:P-2;時間為:A010,B005。
表示第二個工作方式;給信號1后;繼電器1啟動10秒之后關(guān)閉; 繼電器2再給信號2之后延時5秒之后自動關(guān)閉。
計時范圍:0.1秒~99秒。
作者:
hzxty
時間:
2020-10-6 09:39
標題:
RE: 求繼電器延時直流電機正反轉(zhuǎn)帶4位數(shù)碼管芯片程序
STC8F1K08S2或STC8F2K08S2芯片也可以
作者:
hzxty
時間:
2020-10-6 20:10
求助繼電器延時直流電機正反轉(zhuǎn)帶4位數(shù)碼管芯片程序
作者:
hzxty
時間:
2020-10-8 23:10
請教大師傅,200黑幣
作者:
wulin
時間:
2020-10-9 11:43
給你一個演示程序,按實際電路配置端口即可滿足你的需求。
//按樓主意圖優(yōu)化編寫
//雙路0.1~99.9秒倒計時演示程序
//此程序適合51單片機和STC1T單片機
//也適合共陽/共陰數(shù)碼管
#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
//端口根據(jù)實際電路重新定義
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[]={//共陽數(shù)碼管段碼"0~f-."
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
*/
uchar code table[]={//共陰數(shù)碼管段碼"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];//顯示數(shù)據(jù)緩存
bit state1,state2;//倒計時狀態(tài)
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; //設(shè)置定時器模式
TL0 = 0x00; //設(shè)置定時初值
TH0 = 0xDC; //設(shè)置定時初值
// 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; //設(shè)置定時器模式
TMOD |= 0x01; //設(shè)置定時器模式
TL0 = 0x00; //設(shè)置定時初值
TH0 = 0xDC; //設(shè)置定時初值
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)//預(yù)設(shè)
{
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;//共陽加小數(shù)點
dis_buf[2] = table[num/10%10]|0x80;//共陰加小數(shù)點
dis_buf[3] = table[num%10];
}
}
if(KeySec==1)
{//顯示A預(yù)設(shè)時間
// 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;//共陽加小數(shù)點
dis_buf[2] = table[time1/10%10]|0x80;//共陰加小數(shù)點
dis_buf[3] = table[time1%10];
}
if(KeySec==2)
{//顯示B預(yù)設(shè)時時間
// 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;//共陽加小數(shù)點
dis_buf[2] = table[time2/10%10]|0x80;//共陰加小數(shù)點
dis_buf[3] = table[time2%10];
}
//共陽數(shù)碼管驅(qū)動
/* P2&=0xf0;//消隱
P0=dis_buf[i];//送段碼
P2|=0x01<<i;//送位碼
*/
//共陰數(shù)碼管驅(qū)動
P0=0x00;//消隱
P2&=0xf0;//清低4位
P0=dis_buf[i];//送段碼
P2|=~(0x01<<i);//送位碼
i++;i%=4;
}
void main()//主函數(shù)
{
Timer0Init();//定時器初始化程序
while(1)
{
keyscan(); //按鍵掃描
INscan(); //輸入掃描
display(); //數(shù)碼管顯示
Delay1ms(); //控制主循環(huán)約1ms
}
}
void Timer0Interrupt(void) interrupt 1
{
TL0 = 0x00; //設(shè)置定時初值
TH0 = 0xDC; //設(shè)置定時初值
num1++;
if(num1>=10)
{
num1=0;
num--;
if(num<=0)
{
num=0;
OUT1=1;
OUT2=1;
state1=0;
state2=0;
TR0=0;
}
}
}
復(fù)制代碼
作者:
hzxty
時間:
2020-10-9 21:23
謝謝前輩指點
作者:
hzxty
時間:
2020-10-9 23:34
謝謝總工
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1