如何在PIC单片机上实现发送数据

该程序运行在pic单片机p18f458上实现发送缓冲器0向接收缓冲器0发送数据的自测试模式,其中接收采用中断方式。
//发送采用查询方式
#include “p18f458.h”
intcan_flag; //定义标志寄存器
//**************初始化子程序***************
void initcan()
{
trisb=(trisb|0x08)&0xfb; //设置canrx/rb3为输入,cantx/rb2为输出
//设置can的波特率为125k,在fosc=4m时,tbit=8us,假设brp=01h
//则tq=[2*(1+brp)]/fosc=2*(1+1)/4=1us。
//nominal bit rate=8tq,sjw=1,sync_seg=1tq,prog _seg=1tq,phase_seg1=3tq,phase_seg2=3tq
cancon=0x80; //请求进入can配置模式reqop=100
while(canstat&0x80==0){;} //等待进入can配置模式opmode=100
brgcon1=0x01; //设置sjw和brp,sjw=1tq,brp=01h
brgcon2=0x90; //设置phase_seg1=3tq和prog _seg=1tq
brgcon3=0x42; //设置phase_seg2=3tq
//设置发送邮箱0标识符号和发送的数据
txb0con=0x03; //发送优先级为最高优先级,txpri=11
txb0sidh=0xff; //设置发送缓冲器0的标准标识符,本程序采用标准识符
txb0sidl=0xe0;
txb0dlc=0x08; //设置数据长度为8个字节
txb0d0=0x00; //写发送缓冲器数据区的数据
txb0d1=0x01;
txb0d2=0x02;
txb0d3=0x03;
txb0d4=0x04;
txb0d5=0x05;
txb0d6=0x06;
txb0d7=0x07;
//设置接收邮箱0的标识符和初始化数据
rxb0sidh=0xff; //设置接收缓冲器0的标识符
rxb0sidl=0xe0;
rxb0con=0x20; //仅仅接收标准标识符的有效信息,filhit0=0表示rxb0采用filter0
rxb0dlc=0x08; //设置接收缓冲器0的数据区长度
rxb0d0=0x00; //初始化接收缓冲器0的数据区数据
rxb0d1=0x00;
rxb0d2=0x00;
rxb0d3=0x00;
rxb0d4=0x00;
rxb0d5=0x00;
rxb0d6=0x00;
rxb0d7=0x00;
//初始化接收滤波器0和接收屏蔽,
rxf0sidh=0xff;
rxf0sidl=0xe0;
rxm0sidh=0x00;
rxm0sidl=0x00;
//初始化can模块的i/o控制寄存器
//ciocon=0x00;
//使can进入某种工作模式模式
cancon=0x00; //=0x40,进入自测试模式;=0x00,正常操作模式
while(canstat&0xe0!=0){;}
//while(canstat&0x40==0){;}
//初始化can的中断
pir3=0x00; //清所有中断标志
pie3=0x01; //使能接收缓冲器0的接收中断
ipr3=0x01; //接收缓冲器0的接收中断为最高优先级
}
//*********接收缓冲器0接收中断服务程序***********
#pragma interrupt can_isr
#pragma code low_isr=0x18
void low_isr()
{
_asm
goto can_isr
_endasm
}
#pragma code
void can_isr()
{
if(pir3bits.rxb0if==1) can_flag=1;
pir3bits.rxb0if=0; //清接收中断标志
rxb0conbits.rxful=0; //打开接收缓冲器来接收新信息
}
//****************主程序**can总线收发编程****************
main()
{
intcon=0x00; //禁止所有中断
initcan();
wdtcon=0; //=1,看门狗使能;=0,禁止看门狗
intcon=0xc0; //使能中断
while(1)
{
txb0conbits.txreq=1; //请求发送,txreq=1
while(pir3bits.txb0if!=1){;} //等待发送完成
while(can_flag==0){;} //等待接收数据
can_flag=0; //清接收到标志
txb0conbits.txreq=0; //禁止发送
txb0d0=rxb0d0+1; //用接收数据加1来更新发送数据
txb0d1=rxb0d1+1;
txb0d2=rxb0d2+1;
txb0d3=rxb0d3+1;
txb0d4=rxb0d4+1;
txb0d5=rxb0d5+1;
txb0d6=rxb0d6+1;
txb0d7=rxb0d7+1;
}
}
来源;21ic

使用碳化硅MOSFET实现快速直流充电器
新型中空长航时无人机彩虹4C:已进行多项改进,能保证在极端或恶劣环境中的作战能力
推出ESP8266升级版
智能家居产品有哪些(功能)_智能家居产品大全_智能家居产品介绍
CMOS集成电路设计中如何在物理层上实现电阻的设计
如何在PIC单片机上实现发送数据
8月铅蓄电池消费表现一般,9月仍将维持震荡趋势
谷歌为电力储能投资,电池取代提供备用电的柴油发电机
无人机的组成及功能介绍
e络盟推出树莓派创意设计大赛, 期待有创意、敢实现的工程师和创客们踊跃参赛
Spartan EFEM系统可每小时加工450张晶圆
加速度传感器QMA6100P的使用
采用AI语音识别引擎支持各种任务的类机器人
HMD宣布5月16日诺基亚X入网工信部
英飞凌科技推出首款Qi2磁功率曲线(MPP)充电发射器解决方案
特斯拉国产Model 3续航里程不及进口版,460km降为445km
卡尔蔡司发布VR One GX 兼容苹果手机
苹果iMac Pro拆解评测:显卡和GPU直接焊在主板 可维修性得分为3分
曝华为P40系列将采用石墨烯电池 容量提升体积缩小
闪电接口和USB-C接口有什么区别?