找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C51单片机实现8按钮和1串口 双作用控制8继电器程序

[复制链接]
跳转到指定楼层
楼主
ID:115923 发表于 2020-12-17 21:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
*********************************************************************
输入控制:
第1路输入信号,第1路继电器吸合。
第2路输入信号,第1路继电器断开。
第3路输入信号,第2路继电器吸合。
第4路输入信号,第2路继电器断开。
第5路输入信号,第3路继电器吸合。
第6路输入信号,第3路继电器断开。
第7路输入信号,第4路继电器吸合。
第8路输入信号,第4路继电器断开。

单片机与PC机采用max232  max485通讯或者TTL通信,波特率默认为9600.
单片机接收PC机发送的数据码表如下:
PC向单片机发送字符'A'第1路继电器吸合单片机返回值'A'。
PC向单片机发送字符'B'第1路继电器吸合单片机返回值'B'。
PC向单片机发送字符'C'第1路继电器吸合单片机返回值'C'。
PC向单片机发送字符'D'第1路继电器吸合单片机返回值'D'。
PC向单片机发送字符'a'第1路继电器断开单片机返回值'a'。
PC向单片机发送字符'b'第1路继电器断开单片机返回值'b'。
PC向单片机发送字符'c'第1路继电器断开单片机返回值'c'。
PC向单片机发送字符'd'第1路继电器断开单片机返回值'd'。

PC向单片机发送字符'1'查询第1路输入状态,有输入单片机返回值'F'无输入单片机返回值'f'。
PC向单片机发送字符'2'查询第2路输入状态,有输入单片机返回值'F'无输入单片机返回值'f'。
PC向单片机发送字符'3'查询第3路输入状态,有输入单片机返回值'F'无输入单片机返回值'f'。
PC向单片机发送字符'4'查询第4路输入状态,有输入单片机返回值'F'无输入单片机返回值'f'。
PC向单片机发送字符'5'查询第5路输入状态,有输入单片机返回值'F'无输入单片机返回值'f'。
PC向单片机发送字符'6'查询第6路输入状态,有输入单片机返回值'F'无输入单片机返回值'f'。
PC向单片机发送字符'7'查询第7路输入状态,有输入单片机返回值'F'无输入单片机返回值'f'。
PC向单片机发送字符'8'查询第8路输入状态,有输入单片机返回值'F'无输入单片机返回值'f'。

PC向单片机发送字符'E'所有继电器输出状态取反单片机返回值'E'。
*********************************************************************/
#include "STC15W408AS.h"
#include <intrins.H>
#define uchar unsigned char //宏定义字符型变量
#define uint  unsigned int        //宏定义整型变量
/********************************************************************
                            波特率设定
*********************************************************************/
//#define BAUD 0XF400  //1200bps@ 11.0592MHZ
//#define BAUD 0XFA00  //2400bps@ 11.0592MHZ
//#define BAUD 0XFD00  //4800bps@ 11.0592MHZ
#define BAUD 0XFE80  //9600bps@ 11.0592MHZ
//#define BAUD 0XFF40  //19200bps@ 11.0592MHZ
//#define BAUD 0XFFA0  //38400bps@ 11.0592MHZ

uchar dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容

             sbit IN1 = P1^2;                        /*单片机1.2引脚检测IN1是否动作*/
           sbit IN2 = P1^3;                        /*单片机1.3引脚检测IN2是否动作*/
           sbit IN3 = P1^4;                        /*单片机1.4引脚检测IN3是否动作*/
           sbit IN4 = P1^5;                        /*单片机1.5引脚检测IN4是否动作*/
           sbit IN5 = P1^6;                    /*单片机1.6引脚检测IN5是否动作*/
           sbit IN6 = P1^7;                        /*单片机1.7引脚检测IN5是否动作*/
           sbit IN7 = P5^4;                        /*单片机5.4引脚检测IN5是否动作*/
           sbit IN8 = P5^5;                        /*单片机5.5引脚检测IN5是否动作*/
           
  sbit COM1 = P3^7;                  /*单片机3.7引脚控制继电器COM1*/
  sbit COM2 = P3^6;                  /*单片机3.6引脚控制继电器COM2*/
  sbit COM3 = P3^5;                  /*单片机3.5引脚控制继电器COM3*/
  sbit COM4 = P3^4;                  /*单片机3.4引脚控制继电器COM4*/

/********************************************************************
                            定义特殊寄存器
*********************************************************************/
sbit RXB=P3^0;
sbit TXB=P3^1;
/********************************************************************
                           定义数据类型
*********************************************************************/
uchar TBUF,RBUF;
uchar TDAT,RDAT;
uchar TCNT,RCNT;
uchar TBIT,RBIT;
uint TING,RING;
uint TEND,REND;

void UART_INIT(); //声明函数

uchar t,r;                  //定义数据类型
uchar but;          //数据存储数组
/********************************************************************
                            延时函数
*********************************************************************/
void delay(uchar t)
{
  uchar i,j;
   for(i=0;i<t;i++)
   {
            for(j=13;j>0;j--);
         { ;
         }
   }
}
/********************************************************************
                            延时函数
*********************************************************************
void delays()//延时程序
{
uchar m,n,s;
for(m=20;m>0;m--)
for(n=50;n>0;n--)
for(s=248;s>0;s--);
}
/****************发送函数*********************/
void senduart2()
{        

                    if(TEND)          //允许发送
                        {
                                 TEND=0;
                                 TBUF=but;
                                 TING=1;
                        }
                        while(!TEND);
}
/********************************************************************
                            主函数
*********************************************************************/
void main()
{

TMOD=0X00;           //定时器T0设定
AUXR=0X80;           //辅助寄存器
TL0=BAUD;           //十六位寄存器
TH0=BAUD>>8;   //十六位寄存器
TR0=1;                   //开定时器
ET0=1;
PT0=1;
EA=1;                   //开总中断
UART_INIT();   //串口初始化
while(1)           // 循环
{
if(IN1==0) {COM1=0;}
if(IN2==0) {COM1=1;}
if(IN3==0) {COM2=0;}
if(IN4==0) {COM2=1;}
if(IN5==0) {COM3=0;}
if(IN6==0) {COM3=1;}
if(IN7==0) {COM4=0;}
if(IN8==0) {COM4=1;}

if(REND)
  {
   REND=0;
   r++;
   dat=RBUF;
   }

switch(dat) //接收数据判断
{
uchar k;
k=10;
case 'A': COM1=0;delay(k);but=dat;senduart2();dat=0xee;break;           //  开
case 'B': COM2=0;delay(k);but=dat;senduart2();dat=0xee;break;           //  开
case 'C': COM3=0;delay(k);but=dat;senduart2();dat=0xee;break;           //  开
case 'D': COM4=0;delay(k);but=dat;senduart2();dat=0xee;break;           //  开

case 'a': COM1=1;delay(k);but=dat;senduart2();dat=0xee;break;           //  关
case 'b': COM2=1;delay(k);but=dat;senduart2();dat=0xee;break;           //  关
case 'c': COM3=1;delay(k);but=dat;senduart2();dat=0xee;break;           //  关
case 'd': COM4=1;delay(k);but=dat;senduart2();dat=0xee;break;           //  关

case '1': if(IN1==0){but='F';}if(IN1==1){but='f';}delay(k);senduart2();dat=0xee;break;           //  读输入口状态
case '2': if(IN2==0){but='F';}if(IN1==1){but='f';}delay(k);senduart2();dat=0xee;break;           //  读输入口状态
case '3': if(IN3==0){but='F';}if(IN1==1){but='f';}delay(k);senduart2();dat=0xee;break;           //  读输入口状态
case '4': if(IN4==0){but='F';}if(IN1==1){but='f';}delay(k);senduart2();dat=0xee;break;           //  读输入口状态
case '5': if(IN5==0){but='F';}if(IN1==1){but='f';}delay(k);senduart2();dat=0xee;break;           //  读输入口状态
case '6': if(IN6==0){but='F';}if(IN1==1){but='f';}delay(k);senduart2();dat=0xee;break;           //  读输入口状态
case '7': if(IN7==0){but='F';}if(IN1==1){but='f';}delay(k);senduart2();dat=0xee;break;           //  读输入口状态
case '8': if(IN8==0){but='F';}if(IN1==1){but='f';}delay(k);senduart2();dat=0xee;break;           //  读输入口状态

case 'E': COM1=!COM1;COM2=!COM2;COM3=!COM3;COM4=!COM4;delay(k);but=dat;senduart2();dat=0xee;break;  //  输出口取反
default:break;                                           //  跳出
}

         }
   }


/********************************************************************
                            定时器T0
*********************************************************************/
void tm0()interrupt 1 using 1
{
if(RING)
  {
   if(--RCNT==0)
    {
         RCNT=3;
         if(--RBIT==0)
        {
                 RBUF=RDAT;
                 RING=0;
         REND=1;
                }
                else
                {
                 RDAT>>=1;
                 if(RXB)RDAT|=0X80;
                }

    }
  }
    else if(!RXB)
        {
         RING=1;
         RCNT=4;
         RBIT=9;
        }
    if(--TCNT==0)
        {
        TCNT=3;
        if(TING)
        {
          if(TBIT==0)
          {
          TXB=0;
          TDAT=TBUF;
          TBIT=9;
          }
          else
          {
          TDAT>>=1;
          if(--TBIT==0)
          {
           TXB=1;
           TING=0;
           TEND=1;
          }
          else
          {
          TXB=CY;
          }
          }
        }
        }
}
/********************************************************************
              功能:串口初始化,波特率9600,方式1
*********************************************************************/
void UART_INIT()
{
TING=0;
RING=0;

TEND=1;
REND=0;

TCNT=0;
RCNT=0;
}

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


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

使用道具 举报

沙发
ID:112693 发表于 2024-1-9 17:54 | 只看该作者
不错的程序,谢谢楼主的分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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