简介:
1.主节点
主节点资源:4个按键,采用9600波特率的UART,在发送同步间隔场时用4800!收发芯片:MCP201
2.从节点
从节点资源:UART,CCP捕捉 首先用接收引脚状态判断是否同步间隔场,用定时器1进行计时判断同步间隔场是否合格,判断合格后,用CCP模块捕捉同步头55H,同时计算波特率,之后打开UART进行数据接收!
程序如下:
1.MASTER
// LIN 总线设计
//---------------------------------------------
// 文件名: MASTER.c
// 版本: V1.0
// 日期: 25/12/06
// 功能: LIN总线主节点
// 编译环境: HiTech PIC C compiler v.8.05
// 使用MCU: PIC16F877
// 通信速率: 9600
//---------------协议说明---------------------
//数据发送按照USART方式发送
//Lin协议说明:
//1.电平定义:
// 显性电平:逻辑0
// 隐性电平:逻辑1
//2.数据组成
// 同步间隔场:至少13位的显性电平,以及1个位的界定符(隐性电平)
// 同步场:0x55主机发送,从机通过定时器捕捉方式来计时计算波特率
// 数据场:
// a.标识符场:定义了报文的内容和长度,最高两位是奇偶校验位
// 位5和6是数据长度标识,低四位是地址标识符
// b.命令场:由2.4.8个数据字节组成,外加一个数据校验场
// 保留标识符:(广播标识符)
// "0x3c"主机请求,用于主机广播命令,所有从机都接收
// "0x3d"从机响应,触发所有从机节点顺序向主机传送数据
// 第一个数据场的00-7F保留,其余自由分配(程序里没有遵循,实验嘛呵呵)
//---------------------------------------------
#include //---------------------------------------------
//--------------常量定义----------------------
#define Key1 RA0
#define Key2 RA1
#define Key3 RA2
#define Key4 RA3
#define CS RB1
#define STATUSIT(avr,s) ((unsigned)(&avr)*8+(s)) //绝对寻址定义
static bit C @ STATUSIT(STATUS,0); //对进位位进行定义
//----------------内存定义--------------------
unsigned char send[10]; //定义数据数组
unsigned char Counter; //发送个数计数
//--------------函数定义----------------------
void Picint(void); //初始化
void KeyScan(void); //键盘扫描
void Work1(void); //事件处理1
void Work2(void); //事件处理2
void Work3(void); //事件处理3
void Work4(void); //事件处理4
void interrupt SDI(void); //中断函数
void Delay(unsigned int m); //延时函数
void Send(void); //数据发送
void SendSync(void); //同步间隔场和同步头发送
void SendData(unsigned char asd); //发送数据场
unsigned char CheckSum(unsigned char as); //校验和计算
void qushu();
//*********************************************
//主函数
//*********************************************
void main()
{
Picint();
while(1)
{
KeyScan(); //键盘扫描等待处理
}
}
//*********************************************
//初始化函数
//*********************************************
void Picint()
{
INTCON=0; //中断定义
ADCON1=0x07; //定义A口为数字ioput模式
TRISA0=1; //键盘接口定义
TRISA1=1;
TRISA2=1;
TRISA3=1;
TRISB0=1; //中断定义端口
TRISB1=0; //片选引脚
TXSTA=0x04; //USART模块设置,使用高速波特率设置
RCSTA=0x80; //使能串口,并没有开启接收和发送
TRISC7=1; //数据输入
TRISC6=0; //数据发送
CS=1; //片选
RC6=1;
}
//*********************************************
//数据发送 USART
//*********************************************
void Send()
{
//TXEN=1; //发送使能
SendSync(); //发送同步间隔场和同步头
SendData(Counter); //发送的字节的数量
TXEN=0; //发送禁止
}
//*********************************************
//同步间