实例1
总线的楼宇温度检测系统
前言
基于单片机实现传统温度检测技术的特点,提出了基于CAN总线的楼宇温度检测系统方案。该系统方案的硬件平台主要包括温度检测模块和主控平台,并详细介绍了其硬件实现、软件设计思想及流程。实验表明:该系统可实现对楼宇温度的实时检测,并由数码管显示检测结果,对异常情况进行处理,从而实现对楼宇房间温度的有效检测。
在传统的检测技术中,温度检测基本采用单片机系统为主,且大多数都针对工业需要,日常生活中的应用并不多;而通信多基于落后的485总线,不能进行远距离的实时数据传输,更不能与因特网相连,可靠性也不高。因此,本文提出一种基于CAN总线的温度测控技术,该技术适合远距离控制与传输,具有非常高的可靠性。
控制器局域网(Controller Area Network,CAN)是国际上应用最广泛的现场总线之一。CAN总线最早出现在20世纪80年代末的汽车工业中,由德国BOSCH公司最先提出,其主要特性为低成本,且总线利用率高。CAN采用串行通信方式工作,所提供的最高数据传输速率为1Mbit/s,最大通信距离为
正是基于CAN总线的上述优点,目前CAN总线在众多领域被广泛应用,其应用范围不再局限于原先的汽车行业,而向过程工业、机械工业、纺织工业、数控机床、医疗器械及传感器等领域发展,CAN总线已经形成国际标准,并已被公认为是几种最有前途的现场总线之一。
考虑到CAN总线的高可靠性和远距离传输优点,结合目前温度检测技术的技术瓶颈,即距离短和实时性差的特点,本系统CAN总线应用于传统的温度检测中,也是一种新的尝试。
1 基于CAN总线楼宇温度检测系统的实现
【7】发送缓冲区:如表3.10所示。
表3.10 验收屏蔽寄存器
区 | CAN地址 | 名称 | 位 | |||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |||
描述符 | 10 | 标识符字节1 | ID.10 | ID.9 | ID.8 | ID.7 | ID.6 | ID.5 | ID.4 | ID.3 |
11 | 标识符字节2 | ID.2 | ID.1 | ID.0 | RTR | DLC.3 | DLC.2 | DLC.1 | DLC.0 | |
数据 | 12 | TX数据1 | 发送数据字节1 | |||||||
13 | TX数据2 | 发送数据字节2 | ||||||||
14 | TX数据3 | 发送数据字节3 | ||||||||
15 | TX数据4 | 发送数据字节4 | ||||||||
16 | TX数据5 | 发送数据字节5 | ||||||||
17 | TX数据6 | 发送数据字节6 | ||||||||
18 | TX数据7 | 发送数据字节7 | ||||||||
19 | TX数据8 | 发送数据字节8 |
标识符(ID):11位,就像报文的名字,值越低,优先级越高。
远程发送请求(RTR):当RTR=1,总线以远程帧发送数据。如果RTR没有被置位,数据将以数据长度码规定的长度来传送数据帧。
数据长度码(DLC):数据字节数=8×DLC.3+4×DLC.2+2×DLC.1+DLC.0
报文数据区的字节数根据数据长度码编制。在远程帧传送中,因为RTR被置位,数据长度码是不被考虑的。这就迫使发送/接收数据字节数为0。然而,数据长度码必须正确设置,以避免两个CAN控制器用同样的识别机制启动远程帧传送而发生总线错误。数据字节数是0-8。
数据区:传送的数据字节数由数据长度码决定。发送的第一位是地址12单元的数据字节1的最高位。
③BasicCAN 和PeliCAN公用寄存器
【1】总线时序寄存器0(BTR0):如表3.11所示。
表3.11 总线时序寄存器0
BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
SJW.1 | SJW.0 | BRP.5 | BRP.4 | BRP.3 | BRP.2 | BRP.1 | BRP.0 |
波特率预置器位域
位域BRP使得CAN系统的时钟的周期时tSCL是可编程的:
同步跳转宽度位域
为了补偿在不同总线控制器的时钟振荡器之间的相位漂移,任何总线控制器必须在当前传送的任一相关信号边沿重新同步。同步跳转宽度
【2】总线时序寄存器1(BTR1):如表3.12、13所示。
总线时序寄存器1定义了一个位周期的长度、采样点的位置和在每个采样点的采样数目。在复位模式中,这个寄存器可以被读/写访问。在PeliCAN模式的操作模式中,该寄存器是只读的,在BasicCAN模式的操作模式中总是“FFH”
表3.12 总线时序寄存器1
BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
SAM | TSEG2.2 | TSEG2.1 | TSEG2.0 | TSEG1.3 | TSEG1.2 | TSEG1.1 | TSEG1.0 |
采样位(SAM)
表3.13 采样位
位 | 值 | 功能 |
SAM | 1 | 3次:总线采样3次,建议在低/中速总线上使用,这对过滤总线上的毛刺是有效的 |
0 | 单次:总线采样1次,建议使用在高速总线上 |
时间段1和时间段2位域
【3】输出控制寄存器(OCR):如表3.14-16所示。
允许软件控制建立不同输出驱动的配置。在复位模式中,这个寄存器可以被读/写访问。在PeliCAN模式的操作模式中,该寄存器是只读的,在BasicCAN模式的操作模式中总是“FFH”。
表3.14 输出控制寄存器
BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
OCTP1 | OCTN1 | OCPOL1 | OCTP0 | OCTN0 | OCPOL0 | OCMODE1 | OCMODE0 |
在SJA1000在睡眠模式中,TX0、TX1根据输出控制寄存器的内容输出隐性的电平。在复位
状态(复位请求=1)或外部复位引脚/RST被拉低时,TX0、TX1悬空。
表3.15 输出控制寄存器
OCMODE1 | OCMODE0 | 说明 |
0 | 0 | 双相输出模式:与正常输出模式相反 |
0 | 1 | 测试输出模式:在下一次系统时钟的上升沿RX上的电平反映到TXX上,系统时钟(fosc/2)与输出控制寄存器中的编程定义的极性相对应。 |
1 | 0 | 正常输出模式:通过TX0、TX1送出,取决于OCTPX、OCTNX、OCPOLX编程。 |
1 | 1 | 时钟输出模式:TX0同正常输出模式,TX1由发送时钟TXCLK取代 |
表3.16 输出引脚配置
驱动 | TXD | OCTPX | OCTNX | OCPOLX | TPX | TNX | TXX |
悬空 | × | 0 | 0 | × | 关 | 关 | 悬空 |
上拉 | 0 | 0 | 1 | 0 | 关 | 开 | 低 |
1 | 0 | 1 | 0 | 关 | 关 | 悬空 | |
0 | 0 | 1 | 1 | 关 | 关 | 悬空 | |
1 | 0 | 1 | 1 | 关 | 开 | 低 | |
下拉 | 0 | 1 | 0 | 0 | 关 | 关 | 悬空 |
1 | 1 | 0 | 0 | 开 | 关 | 高 | |
0 | 1 | 0 | 1 | 开 | 关 | 高 | |
1 | 1 | 0 | 1 | 关 | 关 | 悬空 | |
下拉推挽 | 0 | 1 | 1 | 0 | 关 | 开 | 低 |
1 | 1 | 1 | 0 | 开 | 关 | 高 | |
0 | 1 | 1 | 1 | 开 | 关 | 高 | |
1 | 1 | 1 | 1 | 关 | 开 | 低 |
【4】时钟分频寄存器:如表3.17-18所示。
表3.17 时钟分频寄存器
BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
CAN模式 | CBP | RXINTEN | 0保留 | CLOCK OFF | CD.2 | CD.1 | CD.0 |
=0,工作BasicCAN =1, 工作PeliCAN | =1,只有RX0起作用,RX1应接到确定电平。例如Vss | 允许TX1输出用来做专用接收中断输出 | 时钟关闭位1有效 |
表3.18 CLKOUT频率选择
CD.2 | CD.1 | CD.0 | 时钟频率 |
0 | 0 | 0 | fosc/2 |
0 | 0 | 1 | fosc/4 |
0 | 1 | 0 | fosc/6 |
0 | 1 | 1 | fosc/8 |
1 | 0 | 0 | fosc/10 |
1 | 0 | 1 | fosc/12 |
1 | 1 | 0 | fosc/14 |
1 | 1 | 1 | fosc |
3)BASICCAN程序设计:CAN应用节点的程序主要包括初始化、发送、接收子程序。
①CAN初始化子程序
NODE EQU 30H;节点号缓冲区
NBTR0 EQU 31H;总线定时寄存器0缓冲区
NBTR1 EQU 32H;总线定时寄存器1缓冲区
TXBF EQU 40H;RAM内发送缓冲区
RXBF EQU 50H; RAM内接收缓冲区
CR EQU 0BF00H;控制寄存器
CMR EQU 0BF01H;命令寄存器
SR EQU 0BF02H;状态寄存器
IR EQU 0BF03H;中断寄存器
ACR EQU 0BF04H;接收码寄存器
AMR EQU 0BF05H;接收码屏蔽寄存器
BTR0 EQU 0BF06H;总线定时寄存器0
BTR1 EQU 0BF07H;总线定时寄存器1
OCR EQU 0BF08H;输出控制寄存器
CDR EQU 0BF1FH;时钟分频寄存器
RXB EQU 0BF14H;接收缓冲器
TXB EQU 0BF0AH;发送缓冲器
入口:节点号在NODE,波特率在NBTR0、NBTR1
出口:无
CANINI:MOV DPTR,#CR;写控制寄存器
MOV A,#01H;置复位请求为高
MOVX @DPTR,A
CANI1:MOVX A,@DPTR;判断复位请求有效
JNB ACC.0,CANI1
MOV DPTR,#ACR;写验收码寄存器
MOV A,NODE;设置节点号
MOVX @DPTR,A
MOV DPTR,#AMR;写接收码屏蔽寄存器
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#BTR0;写总线定时寄存器0
MOV A,NBTR0;设置波特率
MOVX @DPTR,A
MOV DPTR,#BTR1;写总线定时寄存器1
MOV A,NBTR1
MOVX @DPTR,A
MOV DPTR,#OCR;写输出控制寄存器
MOV A,#0FAH
MOVX @DPTR,A
MOV DPTR,#CDR;写时钟分频寄存器
MOV A,#00H;将CAN工作模式设为BASICCAN模式时钟2分频
MOVX @DPTR,A
MOV DPTR,#CR;写控制寄存器
MOV A,#0EH;开放中断源
MOVX @DPTR,A
RET
②CAN接收子程序:入口:无出口:接收的描述符、数据长度及数据放在RXBF开始的缓冲区中。
RXSB:MOV DPTR,#SR;读状态寄存器判接收缓冲区满
MOVX A,@DPTR
JNB ACC.0,RXSB
RXSB1:MOV DPTR,#RXB:将接收的数据放在cpu的RAM区
MOV R0,#RXBF
MOVX A,@DPTR
MOV @R0,A
INC R0
INC DPTR
MOVX A,@DPTR
MOV @R0,A
MOV B,A
RXSB2:INC DPTR
INC R0
MOVX A,@DPTR
MOV @R0,A
DJNZ B,RXSB2
MOV DPTR,#CMR;接收完毕释放接收缓冲区
MOV A,#04H
MOVX @DPTR,A
MOV DPTR,#SR;读此状态寄存器
MOVX A,@DPTR
JB ACC.1,DATAOVER;判断数据溢出
JB ACC.7,BUSWRONG;判断总线状态
JB ACC.6,CNTWRONG;判断错误计数器状态
SJMP RECEEND
DATAOVER:做相应的数据溢出错误处理
SJMP RECEEND
BUSWRONG: 做总线错误处理
SJMP RECEEND
CNTWRONG:做计数错误处理
RECEEND:RET
③CAN发送子程序:
入口:将要发送的描述符放在TXBF, 将要发送的数据长度放在TXBF+1, 将要发送的数据放在TXBF+2开始的单元。
出口:无
TXSB:MOV DPTR,#SR;读状态寄存器
MOVX A,@DPTR;判发送缓冲区状态
JNB ACC.2,TXSB
MOV R1,#TXBF
MOV DPTR,#TXB
TX1:MOV A,@R1;向发送缓冲区10填入标识符
MOVX @DPTR,A
INC R1
INC DPTR
MOV A,@R1;向发送缓冲区11填入标识符
MOVX @DPTR, A
MOV B,A
TX2:INC DPTR
INC R1
MOV A, @R1;向发送缓冲区12-19送数据
MOVX @DPTR ,A
DJNZ B,TX2
MOV DPTR,#CMR;置CMR.0为1请求发送
MOV A,#01H
MOVX @DPTR,A
RET