5.1 CAN节点应用程序设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

流程图:
开始
表4.1 自定义应用层协议说明
初始化
字段
描述
N
接收到CAN
报文?
Y
处理CAN报文
按键状态
N
发生改变?
Y
发送CAN报文
ID.10~ID.7
发送CAN报文节点的地址 (SrcAddr)
ID.6~ID.3
接收CAN报文节点的地址 (DstAddr)
ID.2~ID.0
功能码(FunCode),指明 一帧数据的作用
FunDataLen
功能参数长度变量
FunData
功能参数数组,最多包含8 字节
应用程序-实现功能
地址设为0
按键按下 蜂鸣
按键释放 蜂鸣
节点0
将两个CAN节点的 地址设为互补
功能码
节点1
发送CAN帧
接收CAN帧
接收CAN帧
功能参数
发送CAN帧
发送CAN帧
接收CAN帧
接收CAN帧
发送CAN帧
地址设为1
LED驱动
目的:点亮或熄灭LED。 方法:直接控制与LED相连的MCU引脚。
P1.0 = 1,D1点亮 P1.0 = 0,D1熄灭
LED驱动程序
程#de序fin实e 现D1: P1_0
void ledInit(void) {
D1 = 0; }
void ledSet(unsigned char val) {
// 蜂鸣器响的次数减1
} else {
buzzerQuiet();
// 关闭定时器,在蜂鸣器震荡次数为0时
}
}
蜂鸣器驱动程序
四个函数来实现:
发声频率
发声时间
void buzzerSound(unsigned int uiFreq,unsigned int uiTime) // 发出指定频率的声音
第5章 CAN节点应用程序设计
本章导读
本章以前面开发的CAN应用层协议驱动程序为基础,通过一个CAN节点应用程 序设计的实例,来展示应用层协议在CAN节点上的具体应用。
第4章 第3章 第2章
CAN节点结构 应用程序(eg.MCU = P89V51)
CAN应用层 协议驱动
CAN硬件驱动
CAN控制器 eg.SJA1000 CAN收发器 eg.CTM8251
// //
控制蜂鸣器不发声 Buzzer初始化
{ ……
}
BuzzCnt = 0; v{ oTidRI1S=R_0T; imer1(void) interrupt TF//1_关V闭EC定T时OR器1 // Timer中断服务函数
…TF…1 = 0;
}
TMOD &= ~T0_MASK;
// 清除定时器1中断标志 // 清除旧设置(#define T0_MASK 0x0F)
} ……
}
蜂鸣器驱动程序
四个函数来实现:
void buzzerQuiet(void)
{
TR1 = 0; TF1 = 0; BUZZ = 1; }
// 控制蜂鸣器不发声
// 关闭定时器1 // 清除定时器中断标志 // 置高蜂鸣器的控制引脚电平
蜂鸣器驱动程序
四个函数来实现:
void ISR_Timer1(void) interrupt TF1_VECTOR // Timer中断服务函数
{
if (uiFreq < 20) {
由bu发zz声er频Qu率iet(); retu决rn定;
T
//发限声定时频间率范围在20~20000Hz之间
}
if (uiFreq > 20000) uiFreq = 20000;
TL1_Load TH1_Load
= =
LOW_B定YT时E(65536U定L时-时C间PU到C,LK / HIGH_时BY间TE(65536U电L 平- C取P反UCLK
{ ……
}
// Timer中断服务函数
void buzzerSound(unsigned int uiFreq,unsigned int uiTime) {
…… }
// 发出指定频率的声音
蜂鸣器驱动程序
四个函数来实现:
v{vooiidd bbuuzzzzeerrQInuiti(evto(vido)id)
/(u(发uiFiF声rereq次q**数22)));)=;
发//声计时算间T×im发er声0装频载率值
BuzzCnt = uiFreq;
BBuuzzzzCCnntt次/*==声5u0iT0i;me;
TL1 = 0xF0; TH1 = 0xFF; TR1 = 1; }
20Hz
// 根据发声时间设置取反次数
程#de序fine实K现EY:1 P3_2
static char oldKey; void keyInit(void) {
oldKey = KEY1; }
char keyGet(char *key) {
if(KEY1 != oldKey) { oldKey = KEY1; if(KEY1) { *key = 0; } else { *key = 1; } return 1;
功能电路 驱动
功能电路 Eg.LED/KEY
本章
功能电路驱动
蜂鸣器驱动
按键驱动
LED驱动
蜂鸣器 驱动电路
按键 输入电路
LED灯 显示电路
蜂鸣器驱动
目的:驱动蜂鸣器发出声音。 方法:使无源蜂鸣器不断振荡
发出声音。
程序实现:通过MCU的定
时器中断来控制振荡频率。
程序实现
发声时间
由发声频率
决定 无源蜂鸣T器:如何发声?
} return 0; }
// 定义按键和mcu的连接关系
// 按键初始化
按// 键设置按按下键,的P初3始.2检=测0电,平 *key设置为 1 按键释放,P3.2 = 1 ,*key设置为 0
// 获取按键状态
// 按键状态发生改变 // 设置oldKey的值 // 按键释放 // 按键按下 // 按键有动作返回1 // 按键没有动作
if(val) { D1 = 1;
} else { D1 = 0;
} }
// LED初始化 // 熄灭D1
// LED灯控制函数,val是LED的控制参数 // 点亮D1 // 熄灭D1
应用程序-设计思想
目的:展示CAN应用层协议在CAN节点上的具体应用。 方法:通过调用各个驱动程序来对不同外设进行控制完成各种需要的功能。
{
if(BuzzCnt) {
// 允许蜂鸣器发声
TR1 = 0;
// 关闭定时器1
TL1 = TL1_Load;
// 设置定时器的计数值低8位
TH1 = TH1_Load;
// 设置定时器的计数值高8位
TR1 = 1;
// 启动定时器
BUZZ = !BUZZ;
// 蜂鸣器控制电平取反
BuzzCnt--;
定时 时间
定时时间到,
电平取反 取反次数 = 发声时间×发声频率
蜂鸣器驱动程序
ቤተ መጻሕፍቲ ባይዱ四个函数来实现:
void buzzerInit(void)
{ ……
}
// Buzzer初始化
void buzzerQuiet(void)
{ ……
}
// 控制蜂鸣器不发声
void ISR_Timer1(void) interrupt TF1_VECTOR
人耳能识别的范围
超声
// 启动T取im反er次数 = 发声次数×2 = 发声时20K间H×z 发声频率 ×2 = uiTime(ms) ×10-3 × uiFreq ×2
按键驱动
目的:获取按键的状态。 方法:读取与按键相连的MCU引脚的值。
按键按下,P3.2 = 0;按键释放,P3.2 = 1
按键驱动程序
v{ oTidMbOuDzz|e=r0Inxi0t(1v;oid)
// Buzze//r初设始置化新模式:16位定时模式
…BU…ZZ = 1;
}
ET1 = 1;
// 置高蜂鸣器控制引脚为高电平 // 使能定时器中断1
v{ oiEdAbu=z1ze; rSound(unsigned int uiFreq/,/un设si置gn中ed断in允t u许iTime) // 发出指定频率的声音
点亮LED
熄灭LED
同样,节点2按键状态发生改变时,现象相同。
相关文档
最新文档