⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 CAN总线开发板源代码与原理图
💻 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 + -