标题:
主从机多机通信模型类似云台解码器一样用跳线设置从机地址
[打印本页]
作者:
liuyy
时间:
2015-1-11 20:08
标题:
主从机多机通信模型类似云台解码器一样用跳线设置从机地址
#include //STC12C5AxxS2系列单片机头文件
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
uchar DZ;//地址号,为接线方便本程序占用P1口用做手工地址设置后面的控制会对P1口无效
//一帧标准数据帧
int D=0; //缓冲区指针标志
uchar DATA[3]; //数据帧格式为【地址】【请求OR设置标志(1为请求2为设置,请求时数据位为空数据)】【IO口号0对应P0,1对应P1.....】【数据】
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
/*********************************************************************************************/
/*********************************************************************************************
函数名:UART串口初始化函数
调 用:UART_init();
参 数:无
返回值:无
结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备 注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
/**********************************************************************************************/
void UART_init (void){
EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
ES = 1; //允许UART串口的中断
TMOD = 0x20; //定时器T/C1工作方式2
SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
TH1 = 0xF3; //定时器初值高8位设置
TL1 = 0xF3; //定时器初值低8位设置
PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
TR1 = 1; //定时器启动
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:UART串口接收中断处理函数
调 用:[SBUF收到数据后中断处理]
参 数:无
返回值:无
结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
备 注:过长的处理程序会影响后面数据的接收
/**********************************************************************************************/
void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1
unsigned char UART_data; //定义串口接收数据变量
if(RI&&D<=3){
RI = 0; //令接收中断标志位为0(软件清零)
UART_data = SBUF; //将接收到的数据送入变量 UART_data
DATA[D]=UART_data;
D++;
}
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:UART串口发送函数
调 用:UART_T (?);
参 数:需要UART串口发送的数据(8位/1字节)
返回值:无
结 果:将参数中的数据发送给UART串口,确认发送完成后退出
备 注:
/**********************************************************************************************/
void UART_T (unsigned char UART_data){ //定义串口发送数据变量
SBUF = UART_data; //将接收的数据发送回去
while(TI == 0); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:UART串口发送字符串函数
调 用:UART_TC (?);
参 数:需要UART串口发送的数据(8位/1字节)
返回值:无
结 果:向串口发送一个字符串,长度不限。
备 注:例:UART_TC("d9887321$"); 此函数需要#include 头文件支持。
/**********************************************************************************************/
void UART_TC (unsigned char *str){
while(*str != '\0'){
UART_T(*str);
*str++;
}
*str = 0;
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:主函数
调 用:无
参 数:无
返回值:无
结 果:程序开始处,无限循环
备 注:
/**********************************************************************************************/
void main (void)
{
uint x;
//地址初始化
DZ=P1;
//串口初始化
UART_init ();
while(1)
{
//地址初始化
DZ=P1;
if(D>3)
{
//已经收到一帧控制数据
if(DATA[0]==DZ)
{
if(DATA[1]==1)
{
//返回IO口状态数据
switch( DATA[2])
{
case 0:
DATA[3]=P0;
for(x=0;x<=3;x++)
{
UART_T(DATA[x]);
}
break;
case 2:
DATA[3]=P2;
for(x=0;x<=3;x++)
{
UART_T(DATA[x]);
}
break;
}
}else if(DATA[1]==2)
{
//设置IO口状态
switch( DATA[2])
{
case 0:
P0=DATA[3];
break;
case 2:
P2=DATA[3];
break;
}
}
}
D=0;
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1