*********************************************************************
输入控制:
第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;
}
/********************************************************************
结束
*********************************************************************/
|