钰平电子 发表于 2023-9-2 16:00:31

基于STC15W408AS单片机设计的双路输入双路输出可编程工控板可做上下限位控制










【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
*********************************************************************

测试功能程序
*********************************************************************/
#include "STC15W408AS.h"
#include <intrins.H>
#define uchar unsigned char //宏定义字符型变量
#define uintunsigned int        //宏定义整型变量

/********************************************************************
                            初始定义
*********************************************************************/
//uchar keycnt=0;//按下次数值
uint tcnt1,tcnt2; //键值判断
bit flag;
uint bjz=0;//设置报警值
uint tcnt=0;
//sfr WDT_CONTR=0XC1;                  //看门狗设置寄存器
uint bjsj=0;
uint bjsj1=0;
bit bjbz=0;
bit bjkz=0;
/********************************************************************
                            I/O定义
*********************************************************************/
sbit OUT1=P5^4; //继电器输出控制端
sbit OUT2=P5^5; //继电器输出控制端
sbit IN1=P3^6;//输入端
sbit IN2=P3^7;//输入端
sbit S1=P1^2;//检测时间调节
sbit S2=P1^3;//检测时间调节
sbit S3=P1^4;//检测时间调节
sbit S4=P1^5;//检测时间调节

sbit D0=P3^3;//遥控接口
sbit D1=P3^2;//遥控接口
sbit D2=P1^1;//遥控接口
sbit D3=P1^0;//遥控接口


bit bz1=0;
bit bz2=0;
uchar k=50;
/********************************************************************
                            函数声明
*********************************************************************/
void delay(uint t);
void timer0_init();
void jctime();
void KEY();
/********************************************************************
                            延时函数
*********************************************************************/
void delay(uint t)
{
uint i,j;
   for(i=0;i<t;i++)
   {
          for(j=130;j>0;j--);
       { ;
       }
   }
}
/********************************************************************
                        定时器T0初始化
*********************************************************************/
void timer0_init()
{
        TMOD=0x02; //定时器工作在方式2
        TH0=0x06; //对TH0 TL0 赋值
        TL0=0x06;
        TR0=1; //开始定时
        ET0=1;
        EA=1;
}
/********************************************************************
                           检测时间设置函数
*********************************************************************/
void jctime()
{
        if((S1==1)&&(S2==1)&&(S3==1)&&(S4==1)){bjz=100;}//1秒
        if((S1==0)&&(S2==1)&&(S3==1)&&(S4==1)){bjz=200;}//2秒
        if((S1==1)&&(S2==0)&&(S3==1)&&(S4==1)){bjz=300;}//3秒
        if((S1==0)&&(S2==0)&&(S3==1)&&(S4==1)){bjz=400;}//4秒
        if((S1==1)&&(S2==1)&&(S3==0)&&(S4==1)){bjz=500;}//5秒
        if((S1==0)&&(S2==1)&&(S3==0)&&(S4==1)){bjz=600;}//6秒
        if((S1==1)&&(S2==0)&&(S3==0)&&(S4==1)){bjz=700;}//7秒
        if((S1==0)&&(S2==0)&&(S3==0)&&(S4==1)){bjz=800;}//8秒
        if((S1==1)&&(S2==1)&&(S3==1)&&(S4==0)){bjz=900;}//9秒
        if((S1==0)&&(S2==1)&&(S3==1)&&(S4==0)){bjz=1000;}//10秒
        if((S1==1)&&(S2==0)&&(S3==1)&&(S4==0)){bjz=1100;}//11秒
        if((S1==0)&&(S2==0)&&(S3==1)&&(S4==0)){bjz=1200;}//12秒
        if((S1==1)&&(S2==1)&&(S3==0)&&(S4==0)){bjz=1300;}//13秒
        if((S1==0)&&(S2==1)&&(S3==0)&&(S4==0)){bjz=1400;}//14秒
        if((S1==1)&&(S2==0)&&(S3==0)&&(S4==0)){bjz=1500;}//15秒
        if((S1==0)&&(S2==0)&&(S3==0)&&(S4==0)){bjz=1600;}//16秒
}

/********************************************************************
                            遥控函数
*********************************************************************/
void KEY()
{
if((D0==1)&&(D1==0)&&(D2==0)&&(D3==0)&&(bjbz==0)){delay(k);bjbz=1;tcnt1=0;OUT1=0;delay(k);}//A
if((D0==0)&&(D1==1)&&(D2==0)&&(D3==0)&&(bjbz==0)){delay(k);bjbz=1;tcnt1=0;OUT2=0;delay(k);}//B
if((D0==0)&&(D1==0)&&(D2==1)&&(D3==0)&&(bjbz==0)){delay(k);bjbz=1;tcnt1=0;OUT1=0;OUT2=0;delay(k);}//C
if((D0==0)&&(D1==0)&&(D2==0)&&(D3==1)){delay(k);tcnt1=0;bjbz=0;OUT1=1;OUT2=1;delay(k);}//D
if((D0==0)&&(D1==0)&&(D2==0)&&(D3==0))
{
delay(k);delay(k);
if((D0==0)&&(D1==0)&&(D2==0)&&(D3==0)){}//按键谈起
}
}
/********************************************************************
                            主函数
*********************************************************************/
void main()
{

S1=1;
S2=1;
S3=1;
S4=1;
timer0_init();
while(1)
{
jctime();
KEY();       
if((IN1==0)&&(bz1==0)){delay(1);if((IN1==0)&&(bz1==0)){OUT1=0;bz1=1;}}
if((IN1==1)&&(bz1==1)){OUT1=1;bz1=0;}

if((IN2==0)&&(bz2==0)){delay(k);if((IN2==0)&&(bz2==0)){OUT2=0;bz2=1;}}
if((IN2==1)&&(bz2==1)){OUT2=1;bz2=0;}       
}
}

/********************************************************************
                                  定时器T0中断服务函数
*********************************************************************/
void t0(void) interrupt 1 using 0 //定时中断服务函数
{
        tcnt++; //每过250ust tcnt 加一
        if(tcnt==40) //计满400 次(1/10 秒)时
        {
        tcnt=0; //重新再计
               
        if(bjbz==1)
        {
        tcnt1++;
        if(tcnt1>=bjz){OUT1=1;OUT2=1;tcnt1=0;bjbz=0;}
        }

        }
}

/********************************************************************
                              结束
*********************************************************************/




页: [1]
查看完整版本: 基于STC15W408AS单片机设计的双路输入双路输出可编程工控板可做上下限位控制