pIC 单片机 p18f458上实现发送缓冲器0向接收缓冲器0发送数据的自测试模式
//该程序运行在pic 单片机 p18f458上实现发送缓冲器0向接收缓冲器0发送数据的自测试模式,其中接收采用中断方式
//发送采用查询方式
#include "p18f458.h"
int CAN_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;
}
}
关键字:p18f458 单片机 通讯程序
引用地址:
p18f458单片机通讯程序
推荐阅读最新更新时间:2024-03-16 15:48
C语言如何实现单片机流水灯程序
今天又开始重新学习单片机了,在安装了Keil软件之后, 然后安装 USB连接 开发板的 驱动。 学习单片机,应该有块开发板, 一边 看书,然后就接着动手编写 程序,这样才能慢慢理解 单片机。 今天写了好几个 关于二极管的程序, 下面是 实现 二极管轮流点亮的程序,也就是大家所说的流水灯。 #include reg52.h void Delay() { unsigned int i; unsigned char j; for(i=1000; i 0; i--) for(j=110; j 0; j--); } void main() { unsigned char i; while
[单片机]
时钟芯片SD2200ELP与AVR单片机TWI接口控制的设计
在提升机制动闸瓦间隙实时在线检测的设计中,需要保存故障时间和故障数据。 大部分仪器仪表中都要使用时钟芯片,但是很多的实时时钟芯片(如PCF8563)没有掉电保护,须外接晶振和电池,比较麻烦。而深圳兴威帆电子技术有限公司生产的SD2200ELP是内置32 KBE2PROM的串行实时时钟芯片,不需要外接器件支持,连线简单、可靠,提供的数据精确,断电后也能继续工作。微控制器采用Atmel公司的ATmegal6单片机,利用AT-megai6的硬件TWI接口可直接对SD2200ELP进行操作,无需软件模拟I2C方式,使用方便、可靠。 1 SD2200L简介 SD2200L系列(包括SD2200B/C/D/E/FLP)是一
[单片机]
基于MSP430F系列单片机的智能蓄电池监测系统
1 引言
在电力系统的蓄电池组维护中,除了常规的对蓄电池均浮充充电管理外,还需要对蓄电池组的端电压、单节电池电压进行巡检;定期对蓄电池组进行恒流放电试验,以检验蓄电池组的容量;同时为了检验电池组的瞬时大电流放电能力,还需要定期进行大电流动态放电试验,测试每节电池的内阻。
以前进行静态放电试验时采用的放电设备主要有可变电阻,碳棒,水槽等,为了维持放电电流恒定,需要人工或用继电器切换调节负载电阻,调节很不方便,而且稳流特性也不好;而且动态放电很难操作,有一定的危险性。本文提出的智能蓄电池组监测系统正是为了替代传统的放电方式而进行研制的。
2 智能检测系统的构成与设计
2.1系统的构成
放
[电源管理]
基于MC9S12XSl28单片机的智能循迹小车的硬件设计
O 引言 智能车辆作为智能交通系统的关键技术之一,是许多高新技术综合集成的载体。它体现了车辆工程、人工智能、自动控制及计算机技术于一体的综合技术,是未来汽车发展的趋势。本自动循迹小车系统采用数字摄像头0V6620来采集路面信息,核心控制器MC9S12XSl28则可分析和处理图像数据,识别道路中央黑色引导线。另外,控制器还可根据道路前方黑色引导线距车体中心线之间的偏差送出控制信号给转向舵机和电机驱动模块MC33886,进而控制小车,以实现快速稳定的循迹行驶。 1 系统硬件总体架构 整个系统可以构成一速度闭环控制系统,其总体框图如图1所示。 图中,RS232模块用于向PC机上传图像采集数据,车速检测采用欧姆龙公司的E6A
[单片机]
51单片机(十二)—— 单片机复位
一、复位介绍 复位为单片机提供了一条从已知初始条件启动处理的途径。复位期间,大部分控制和状态寄存器被迫使用初始值,单片机的外围模块被禁止,单片机用于复位的复位源有加电复位、外部RESET管脚复位、看门狗复位等。 我们实验对应的硬件复位电路,如下图所示。 这个图中集成了51单片机和AVR单片机的复位电路,对于51单片机,将J12上的跳线帽跳到左侧,则左侧的电路与单片机的复位引脚相连,正常情况由于R14的下拉作用,单片机的复位引脚为低电平,单片机正常工作,如果按下按键,VCC与单片机复位引脚相连,单片机产生复位。 二、例程测试 1、硬件复位 这个实验我们来测试硬件复位功能,测试代码的主要部分如下所示,完整代码可以从本文资源
[单片机]
Andes Core N801省电效率的MCU处理器【晶心】
(台湾 新竹)亚洲首家原创性32-bit CPU IP与系统芯片设计平台的晶心科技 (Andes),今天(4月28日)于北京首度正式发表最新入门款32位处理器–最佳省电效率的Andes Core™ N801,以因应8位MCU应用升级的庞大需求。 该产品不仅在省电效率(Power Efficiency)方面可达75 DMIPS/m Watt,高于一般8位 MCU 70倍以上的效率,而且只需14 K Gates。在适当的组态下,效能甚至可高达1.2 DMIPS/MHz,高于一般8位 MCU 10倍以上的效能。在硬件架构方面,除法器为基本配备,乘法器则可选择快速或小型的。除此之外,不需外加中断控制器就可支持多达16组向量中
[单片机]
单片机内部结构知多少
01 单片机内部结构分析 我们来思考一个问题,当我们在编程器中把一条指令写进单片机内部,然后取下单片机,单片机就可以执行这条指令,那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机掉电后依然可以保持这条指令不会丢失,这是个什么地方呢?这个地方就是单片机内部的只读存储器即 ROM(READ ONLY MEMORY)。为什么称它为只读存储器呢?刚才我们不是明明把两个数字写进去了吗?原来在 89C51 中的 ROM 是一种电可擦除的 ROM,称为 FLASH ROM,刚才我们是用的编程器,在特殊的条件下由外部设备对 ROM 进行写的操作,在单片机正常工作条件下,只能从那面读,不能把数据写进去,所以我们还是把它称为 ROM。
[单片机]
一种基于单片机和SG3525的程控开关电源设计与实现
引言 直流稳压电源是一种常见的电子仪器,其广泛应用于实验教学和科学研究等领域。目前使用的直流稳压电源大部分存在诸多缺点,如输出不可调、电压不稳定等等,因而导致实验结果不精确。以SG3525控制芯片和单片机为核心设计制造的智能稳压开关电源,电路简单,价格低廉,性能卓越。因其利用单片机设置周密的保护监测系统,确保了电源运行可靠,所以具有较高的使用价值。 1、调节原理及控制方案 图1 3525传统控制框图 采用SG3525控制的开关电源传统控制方案如图1所示。3525通过检测输出电压,与给定基准电压进行比较,从而自身调节输出的脉冲波形占空比,控制主电路开关管的关断以达到稳定输出的目的。3525传统的控制方式突出的缺点在于基准电压是恒
[单片机]