📄 main.c
字号:
/*************************************************************************************************
; *
; 实验平台: YH51-III CAN、USB总线学习开发板 *
; MCU 类型: STC10F08 FOSC:11.0592MHZ *
; 实验内容: 485通讯实验 *
; 实验说明: 程序配合485_Master做实验,把收到的数据原封不动返回,也可以通过4个按键发送数据包 *
; 按不同的按键可以发送不同的数据包,发送数据是自动加入ID(由拨码开关设置),在多 *
; 个节点实验时ID可以用来识别是哪个设备的数据,如果有多个YH51-III实验板则可以把总 *
; 线并行连接实现多节点485通讯,详细介绍请看实验指导书。 *
; *
; 项 目 名: 485通讯实验 *
; 创 建 者: 宇航工作室 *
; 程序版本: v2.01 *
; 创建日期: 2010-04-22 *
; *
; 网站: http://www.eldiy.net *
; 版权: Copyright(c)宇航工作室 *
; 声明: 此程序仅用于学习与参考,引用请注明版权和作者信息! *
; *
;*************************************************************************************************/
#include "main.h"
/********************************************************************************************
** 函数名称: void Sysinit(void)
** 功能描述: 单片机初始化
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
*********************************************************************************************/
void Sysinit(void)
{
Flag = 0;
RT485 = 0; //485处于接收状态
P4SW = 0x50; //P4.4、P4.6做I/O口
TMOD = 0x21; //定时器1定时方式2
SCON = 0x50; //串口方式1,允许接收
TH1 = 0xfd; //设置波特率为9600
TL1 = 0xfd;
TR1 = 1;
ES = 1;
TH0 = 0xdc;
TL0 = 0x00; //11.0592M 10MS
ET0 = 1;
PT0 = 1;
TR0 = 1;
EA = 1;
}
/********************************************************************************************
** 函数名称: void delay(unsigned int k)
** 功能描述: 延时函数 22.1184Mhz
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
*********************************************************************************************/
void DelayMs(unsigned int t)
{
uint i;
while(t--)
for(i=500;i>0;i--);
}
uchar GetID()
{
uchar id;
P1 = 0xff;
id = (P1 << 1);
if(ID0==0) id &= 0x0e;
else id |= 0x01;
id &= 0x0f;
return (id);
}
/********************************************************************************************
** 函数名称: void T0_INT() interrupt 5
** 功能描述: T2中断服务程序
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
*********************************************************************************************/
void T0_INT() interrupt 1
{
TH0 = 0xdc;
TL0 = 0x00; //11.0592M 10MS
if(SystemTime > 0)SystemTime--;
if(UartRecTime > 0) UartRecTime--;
}
/********************************************************************************************
** 函数名称: UartDataSend(uchar len)
** 功能描述: 往串口串口发送一个字节
** 输 入: dat 要发送的字节
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
*********************************************************************************************/
void UartSendByte(uchar dat)
{
ES = 0;
TI = 0;
SBUF = dat;
while(!TI);
TI = 0;
ES = 1;
}
/********************************************************************************************
** 函数名称: UartDataSend(uchar len)
** 功能描述: 往串口发送数据并完成校验计算和帧头帧尾发送
** 输 入: *p指向要发送的数据缓冲区,len缓冲区数据长度
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
*********************************************************************************************/
void UartDataSend(uchar *p,len)
{
RT485 = 1; //485处于发送状态
DelayMs(1);
for(len;len>0;len--)
{
UartSendByte(*p);
p++;
}
DelayMs(1);
RT485 = 0; //485处于接收状态
}
/********************************************************************************************
** 函数名称: UartInt()
** 功能描述: 串口中断处理
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
*********************************************************************************************/
void UartInt() interrupt 4
{
if(RI)
{
UartRecLen = 0;
LED2 = 0; //通讯指示灯
do
{
if(RI)
{
RI = 0;
UartRecTime = 5; //50ms
UartRecBuff[UartRecLen++] = SBUF;
}
}while(UartRecTime > 0);
if(UartRecLen!=0)bUartRecSuccFlag = 1;
}
else TI = 0;
LED2 = 1;
}
/********************************************************************************************
** 函数名称: UartInt()
** 功能描述: 键盘命令处理
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: KeyScan()
*********************************************************************************************/
void KeyProcess()
{
uchar value,id;
value = KeyScan();
id = GetID();
switch(value)
{
case 1:
{
UartRecBuff[0] = id;
UartRecBuff[1] = 0X00;
UartRecBuff[2] = 0X11;
UartRecBuff[3] = 0X22;
UartRecBuff[4] = 0X33;
UartRecBuff[5] = 0X44;
UartRecBuff[6] = 0X55;
UartRecBuff[7] = 0X66;
UartRecBuff[8] = 0X77;
UartRecBuff[9] = 0X88;
UartDataSend(UartRecBuff,10);
}break;
case 2:
{
UartRecBuff[0] = id;
UartRecBuff[1] = 0X00;
UartRecBuff[2] = 0X11;
UartRecBuff[3] = 0X22;
UartRecBuff[4] = 0X33;
UartRecBuff[5] = 0X44;
UartRecBuff[6] = 0X55;
UartRecBuff[7] = 0X66;
UartRecBuff[8] = 0X77;
UartRecBuff[9] = 0X88;
UartDataSend(UartRecBuff,10);
}break;
case 3:
{
UartRecBuff[0] = id;
UartRecBuff[1] = 0X00;
UartRecBuff[2] = 0Xa1;
UartRecBuff[3] = 0Xa2;
UartRecBuff[4] = 0Xa3;
UartRecBuff[5] = 0Xa4;
UartRecBuff[6] = 0Xa5;
UartRecBuff[7] = 0Xa6;
UartRecBuff[8] = 0Xa7;
UartRecBuff[9] = 0Xa8;
UartDataSend(UartRecBuff,10);
}break;
default:break;
}
}
void main(void)
{
Sysinit();
while(1)
{
KeyProcess();
if(bUartRecSuccFlag)
{
bUartRecSuccFlag = 0;
if(GetID()==UartRecBuff[0]) //判断ID是否相同
{
UartDataSend(UartRecBuff,UartRecLen); //收到485总线发来的数据,把数据返回
}
}
if(SystemTime==0) //系统指示灯
{
LED1 = !LED1;
SystemTime = 50; //闪烁周期为1s
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -