/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
/************* 功能说明 **************
本例程基于STC32G为主控芯片的实验箱进行编写测试。
使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
USART类型Lin主机总线收发测试用例.
按一下P32口按键, 主机发送完整一帧数据.
按一下P33口按键, 主机发送帧头并获取从机应答数据(合并成一串完整的帧).
默认传输速率:9600波特率, 用户可自行修改.
下载时, 默认时钟 24MHz (用户可自行修改频率).
******************************************/
#include "..\comm\STC32G.h"
#include "stdio.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define MAIN_Fosc 24000000UL
#define Baudrate1 9600UL
#define Timer0_Reload (65536UL -(MAIN_Fosc / 1000)) //Timer 0 中断频率, 1000次/秒
#define TM (65536UL -(MAIN_Fosc/Baudrate1/4))
/*****************************************************************************/
sbit SLP_N = P4^1; //0: Sleep
/************* 本地常量声明 **************/
#define FRAME_LEN 8 //数据长度: 8 字节
#define UART1_BUF_LENGTH 64
/************* 本地变量声明 **************/
u8 Lin_ID;
u8 TX_BUF[8];
bit B_1ms; //1ms标志
bit B_TX1_Busy; //发送忙标志
u8 TX1_Cnt; //发送计数
u8 RX1_Cnt; //接收计数
u8 RX1_TimeOut;
u8 Key1_cnt;
u8 Key2_cnt;
bit Key1_Flag;
bit Key2_Flag;
u8 RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
/************* 本地函数声明 **************/
void LinInit();
void LinSendMsg(u8 lid, u8 *pdat);
void LinSendHeader(u8 lid);
/******************** 串口打印函数 ********************/
void UartInit(void)
{
P_SW2 |= 1; //UART2 switch to: 0: P1.0 P1.1, 1: P4.6 P4.7
S2CON = (S2CON & 0x3f) | 0x40;
T2L = TM;
T2H = TM>>8;
AUXR |= 0x14; //定时器2时钟1T模式,开始计时
}
void UartPutc(unsigned char dat)
{
S2BUF = dat;
while((S2CON & 2) == 0);
S2CON &= ~2; //Clear Tx flag
}
char putchar(char c)
{
UartPutc(c);
return c;
}
/********************* 主函数 *************************/
void main(void)
{
u8 i;
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
P_SW2 |= 0x80;
AUXR = 0x80; //Timer0 set as 1T, 16 bits timer auto-reload,
TH0 = (u8)(Timer0_Reload / 256);
TL0 = (u8)(Timer0_Reload % 256);
ET0 = 1; //Timer0 interrupt enable
TR0 = 1; //Tiner0 run
Lin_ID = 0x32;
UartInit();
LinInit();
EA = 1; //打开总中断
SLP_N = 1;
TX_BUF[0] = 0x81;
TX_BUF[1] = 0x22;
TX_BUF[2] = 0x33;
TX_BUF[3] = 0x44;
TX_BUF[4] = 0x55;
TX_BUF[5] = 0x66;
TX_BUF[6] = 0x77;
TX_BUF[7] = 0x88;
while(1)
{
if(B_1ms) //1ms到
{
B_1ms = 0;
if(!P32)
{
if(!Key1_Flag)
{
Key1_cnt++;
if(Key1_cnt > 50)
{
Key1_Flag = 1;
LinSendMsg(Lin_ID, TX_BUF); //发送一串完整数据
}
}
}
else
{
Key1_cnt = 0;
Key1_Flag = 0;
}
if(!P33)
{
if(!Key2_Flag)
{
Key2_cnt++;
if(Key2_cnt > 50)
{
Key2_Flag = 1;
LinSendHeader(0x13); //发送帧头,获取数据帧,组成一个完整的帧
}
}
}
else
{
Key2_cnt = 0;
Key2_Flag = 0;
}
if(RX1_TimeOut > 0) //超时计数
{
if(--RX1_TimeOut == 0)
{
for(i=0; i<RX1_Cnt; i++) printf("0x%bx ",RX1_Buffer[i]); //从串口输出收到的从机数据
RX1_Cnt = 0; //清除字节数
printf("\r\n");
}
}
}
}
}
/********************** Timer0 1ms中断函数 ************************/
void timer0 (void) interrupt 1
{
B_1ms = 1; //1ms标志
}
//========================================================================
// 函数: void LinSendByte(u8 dat)
// 描述: 发送一个字节函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2021-10-28
// 备注:
//========================================================================
void LinSendByte(u8 dat)
{
B_TX1_Busy = 1;
SBUF = dat;
while(B_TX1_Busy);
}
//========================================================================
// 函数: u16 LinSendData(u8 *pdat)
// 描述: Lin发送数据函数。
// 参数: *pdat: 设置数据缓冲区.
// 返回: Lin ID.
// 版本: VER1.0
// 日期: 2021-10-28
// 备注:
//========================================================================
void LinSendData(u8 *pdat)
{
u8 i;
for(i=0;i<FRAME_LEN;i++)
{
LinSendByte(pdat[i]);
}
}
//========================================================================
// 函数: void SendBreak(void)
// 描述: 主模式发送Lin总线Break函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2021-10-28
// 备注:
//========================================================================
void SendBreak(void)
{
USARTCR5 |= 0x04; //主模式 Send Break
LinSendByte(0x00);
}
//========================================================================
// 函数: void LinSendPID(u8 id)
// 描述: ID码加上校验符,转成PID码并发送。
// 参数: ID码.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-12-2
// 备注:
//========================================================================
void LinSendPID(u8 id)
{
u8 P0 ;
u8 P1 ;
P0 = (((id)^(id>>1)^(id>>2)^(id>>4))&0x01)<<6 ;
P1 = ((~((id>>1)^(id>>3)^(id>>4)^(id>>5)))&0x01)<<7 ;
LinSendByte(id|P0|P1);
}
//========================================================================
// 函数: void LINSendChecksum(u8 *dat)
// 描述: 计算校验码并发送。
// 参数: 数据场传输的数据.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-12-2
// 备注:
//========================================================================
void LINSendChecksum(u8 *dat)
{
u16 sum = 0;
u8 i;
for(i = 0; i < FRAME_LEN; i++)
{
sum += dat[i];
if(sum & 0xFF00)
{
sum = (sum & 0x00FF) + 1;
}
}
sum ^= 0x00FF;
LinSendByte((u8)sum);
}
//========================================================================
// 函数: void LinSendHeader(u8 lid)
// 描述: Lin主机发送帧头函数。
// 参数: ID码.
// 返回: none.
// 版本: VER1.0
// 日期: 2021-10-28
// 备注:
//========================================================================
void LinSendHeader(u8 lid)
{
SendBreak(); //Send Break
LinSendByte(0x55); //Send Sync Field
LinSendPID(lid); //设置总线ID
}
//========================================================================
// 函数: void LinSendMsg(u8 lid, u8 *pdat)
// 描述: Lin主机发送完整帧函数。
// 参数: lid: Lin ID; *pdat: 发送数据缓冲区.
// 返回: none.
// 版本: VER1.0
// 日期: 2021-10-28
// 备注:
//================================
没有合适的资源?快使用搜索试试~ 我知道了~
C语言56-LIN总线主机收发测试-USART(STC32G-DEMO-CODE-220311kw)
共4个文件
uvproj:1个
hex:1个
c:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 105 浏览量
2022-06-14
06:14:45
上传
评论
收藏 10KB RAR 举报
温馨提示
C语言56-LIN总线主机收发测试-USART(STC32G-DEMO-CODE-220311kw)C语言56-LIN总线主机收发测试-USART(STC32G-DEMO-CODE-220311kw)C语言56-LIN总线主机收发测试-USART(STC32G-DEMO-CODE-220311kw)C语言56-LIN总线主机收发测试-USART(STC32G-DEMO-CODE-220311kw)C语言56-LIN总线主机收发测试-USART(STC32G-DEMO-CODE-220311kw)C语言56-LIN总线主机收发测试-USART(STC32G-DEMO-CODE-220311kw)C语言56-LIN总线主机收发测试-USART(STC32G-DEMO-CODE-220311kw)C语言56-LIN总线主机收发测试-USART(STC32G-DEMO-CODE-220311kw)C语言56-LIN总线主机收发测试-USART(STC32G-DEMO-CODE-220311kw)C语言56-LIN总线主机收发测试-USART(STC32G-DEMO-CODE-220311kw)
资源推荐
资源详情
资源评论
收起资源包目录
C语言56-LIN总线主机收发测试-USART(STC32G-DEMO-CODE-220311kw).rar (4个子文件)
56-LIN总线主机收发测试-USART
main.c 10KB
sample.hex 5KB
sample.uvopt 5KB
sample.uvproj 12KB
共 4 条
- 1
资源评论
金枝玉叶9
- 粉丝: 125
- 资源: 7640
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 三菱PLC(Mitsubishi)通讯协议的C#实现,支持FX、Q系列的ASCII-3E、BIN-3E、FX串口格式
- 五一建模20242024
- rainy-day.jpg
- IMG_20240501_171218.jpg
- Swift-内购封装swift版本
- 经典CNN网络之ResNet 图像分类网络实战项目:7种小麦叶片病害分类(迁移学习)
- Java毕设之ssm010基于ssm的新能源汽车在线租赁管理系统+vue.rar
- Java毕设之ssm009毕业生就业信息统计系统+vue.rar
- Java毕设之ssm008医院门诊挂号系统+jsp.rar
- Java毕设之ssm007亚盛汽车配件销售业绩管理统+jsp.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功