首页 > 文章中心 > 单片机c语言

单片机c语言

前言:想要写出一篇令人眼前一亮的文章吗?我们特意为您整理了5篇单片机c语言范文,相信会为您的写作带来帮助,发现更多的写作思路和灵感。

单片机c语言

单片机c语言范文第1篇

【关键词】单片机;C语言;指针

C是一种编译型语言.有高级语言的特点,并具备汇编语言的功能,移植性能好,便于自顶向下结构化程序设计,C语言在单片机中的应用,给开发者带来了很大的方便.软件开发者不需要对单片机硬件的结构有很深人的了解,编译器可以自动完成变量存储单元的分配.使得单片机的程序设计更加简单可靠。指针、地址、数组及其相互关系是C语言中最有特色的部分。在编写单片机的应用程序时,常常需要对端口及存储单元进行寻址.因此,掌握指针在这些寻址过程的工作原理是很有必要的,这有利于编写灵活高效的程序。

一、指针结构声明

C语言中,对于指针的声明采用如下形式:类型标识符*指针变量名;由于单片机存储区的关系,所以单片机C语言的指针声明格式有别于普通C语言指针的声明格式,其格式为:

类型标识符[存储区类型]

指针变量名[指针变量存储区类型]

单片机C语言的指针的定义比普通C语言指针的定义多两个部分:存储区类型是指指针变量所指向的数据的存储区,可以是所有的数据存储类型;指针变量存储区类型是指指针变量的存放区域的数据,可以是data、ldata、xdata或pdata如下声明:

unsigned char xdata *data yc;

上声明语句是指在RAM(data)内声明一指针变量yc,该指针变量指向一无符号字符型数据,该无符号型字符存在xdata区内。 该指针变量的应用格式如下:

unsigned char xdata indata[6];

unsigned char xdata *data yc;

yc=indata;

其编译后的的汇编为:MOV 08H,#00H;0x08和0x09是在片内RAM存储区分配的yc指针变量的地址空间。

二、指针寻址的实现

单片机C语言的数组的寻址和普通C语言的寻址基本上是一样的,只是当数组存储在片内时,由于片内RAM资源十分有限,所以很难有比较复杂的数据结构,而且在编程过程中也尽量避免在片内RAM中使用较大的数组。

1.指向data区的指针寻址的实现

这是最基本的寻址方法,比如一个检测系统中,通过A/D转换把外部数据输入单片机中,单片机对这6次采样数据求和,具体程序如下:

unsigned char data inputdata[6];

unsigned int data sum,i;

unsigned char data * data yc;

void main()

{ sum=0;

collectdata( );/*采集数据函数,输入到数组inputdata中*/

yc=inputdata;

for(i=0;i

sum+=*yc;

}

2.指向程序存储区的指针寻址实现

指针指向数据存储区其其实质就是C语言中指向函数的指针这一概念,可以利用这种指针来实现函数指针调用函数。指向函数的指针变量定义格式为:类型标识符(*指针变量名)([参数1],[参数2]……);定义好后用(*指针变量名)([参数],[参数]……)即可调用这个函数。例如,主程序中要引用一个键盘扫描函数scan,程序如下所示:

Void scan()

Void main()

{ void (*yc)();

Yc=scan;

For(;;)

{(*yc)( );}

}

三、C51热启动代码的编制

对于工业控制计算机,往往设有看门狗电路,当看门狗动作使计算机复位,这就是热启动。热启动时,一般不允许从头开始,这将导致现有的已测量到或计算到的值复位,导致系统工作异常。因而在程序中必须判断是热启动还是冷启动,常用的方法是:确定某内存单位为标志位(如0x7f位和0x7e位),启动时首先读该内存单元的内容,如果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,否则就是冷启动,程序执行初始化部份,并将0xaa赋与这两个内存单元。

根据以上的设计思路,编程时,设置一个指针,让其指向特定的内存单元如0x7f,然后在程序中判断,程序如下:

void?main()

{?char?data?*HotPoint=(char?*)0x7f;

if((*HotPoint==0xaa)&&(*(--HotPoi-nt)==0xaa))

{?/*热启动的处理?*/??}

else

{?HotPoint=0x7e;/*冷启动的处理*/

*HotPoint=0xaa;

*(++HotPoint)=0xaa;

}

/*正常工作代码*/

}

然而实际调试中发现,无论是热启动还是冷启动,开机后所有内存单元的值都被复位为0,当然也实现不了热启动的要求。这是为什么呢?原来,用C语言编程时,开机时执行的代码并非是从main()函数的第一句语句开始的,在main()函数的第一句语句执行前要先执行一段“起始代码”。正是这段代码执行了清零的工作。C编译程序提供了这段起始代码的源程序,名为“startup.a51”,打开这个文件,可以看到如下代码:

IDATALEN?EQU?80H;the?length?of?IDATA?memory?in?bytes.

STARTUP1:

IF?IDATALEN??0

MOV?R0,#IDATALEN-1

CLR?A

IDATALOOP:MOV?@R0,A

DJNZ?R0,IDATALOOP

ENDIF

可见,在执行到判断是否热启动的代码之前,起始代码已将所有内存单元清零。如何解决这个问题呢?好在启动代码是可以更改的,方法是:修改startup.a51源文件,然后用编译程序所附带的a51.exe程序对startup.a51编译,得到startup.obj文件,然后用这段代码代替原来的起始代码。具体步骤是(设C源程序名为HOTSTART.C):

修改startup.a51源文件(这个文件在C51\LIB目录下)。

执行如下命令:

A51?startup.a51得到startup.obj文件。将此文件拷入HOTSTART.C所在目录。

将编好的C源程序用C51.EXE编译好,得到目标文件HOTSTART.OBJ。

用L51?HOTSTART,STARTUP.OBJ命令连接,得到绝对目标文件HOTSTART。

用OHS51?HOTSTART得到HOTSTART.HEX文件,即可。

对于startup.a51的修改,根据自已的需要进行,如将IDATALEN?EQU?80H中的80H改为70H,就可以使6F到7F的16字节内存不被清零。

四、结束语

单片机C语言的应用是十分灵活的,要充分发挥C语言的优势,对内外部数据和程序进行方便自如的操作,必须要掌握好指针的应用。

参考文献

[1]马忠棒.单片机的C语言应用程序设计[M].北京航空航天大学出版社,2001.

单片机c语言范文第2篇

一、c语言与单片机课程在中职学校电子及相关专业中的重要地位

c语言是一种被广泛使用的计算机程序设计语言,在中职学校引入c语言课程,不但能使学生掌握一种基础的编程语言,还为学生发展能力和进一步学习打下基础。

传统的电子装置,只能使用复杂的模拟电路或分立的集成电路来实现,这样的产品不仅体积大,且成本高,控制的精度也不高,适应性更差。有了单片机后,可实现很多复杂的功能。而学好单片机可让学生在电子行业内找到一个比较好的工作。所以,单片机课程,也常被称为“饭碗”课程。

二、中职学校“c语言”与“单片机”课程教学方式现状分析

目前,中职学校中“c语言”与“单片机”课程的教学是采用完全割离的方式进行的,一般在第二学期开设“c语言”,在第四学期开设“单片机”。

在讲授“c语言”时,通常以turboc 2.0为蓝本,除了介绍“c语言”的数据类型、控制语句、数组、指针外,还对函数、结构体甚至文件进行详细地介绍。整个教学过程中,过分注重语句、语法的细节和程序设计技巧的讲授,对如何分析和解决实际问题讲得不够。从而没有明确的学习目的,更缺少学习的兴趣。

而单片机的教材中,往往以汇编语言做为编程工具,为了能正确地运用汇编语言编写单片机的程序,就要对单片机内部结构、存储器结构等知识做详细介绍。从多年的教学实践来看,单片机课程讲到寻址方式时,就基本上讲不下去了,后面的课程,学生只能像听天书一样被动地接受。

所以,多年来,学生怕学c语言,更怕学单片机。学过c语言课程的学生,不知道c语言的具体用途,学完后很快就忘记了。学过单片机的学生,感觉单片机内部结构难懂,汇编语言更加难掌握,学到最后,连数码管、键盘这样的最基本的程序,也无法顺利完成。因此,这两门课程的教学改革,势在必行。

三、“c语言”与“单片机”课程整合的可行性分析

通过上述对“c语言”与“单片机”本文由收集整理教学现状的分析,我们发现,之所以这两门课难教难学,其根本原因在于两门课教学过程的割裂。

c语言是一门较特别的高级语言,它把高级语言的基本结构和语句与低级语言的实用性结合起来,允许直接访问物理地址,可直接对硬件进行操作,因此既具有高级语言的功能,又有低级语言的许多功能,能够像汇编语言一样对位、字节和地址进行操作。而单片机的指令系统和硬件结构,正是学生最头疼的内容。而有了c语言这个编程工具后,单片机的学习效率会大大提高。

同时,单片机用c语言编程,绕过了单片机中难学的内容,用c语言编程,驱动单片机装置,解决了c语言应用抽象的难题,所以,这两个课程,整合在一起教学,真可谓是“天生一对”!

四、“c语言”与“单片机”课程整合的方法

对c语言与单片机课程的教学过程进行整合,可提高两门课的学习效果,但整合过程中,要想达到最佳的效果,也要采用正确的方法。

首先,这种整合不是简单的“一加一”式的整合,不是将两门课在相对集中的时间内相继开设,就叫“整合”,而是要以单片机课程做为“主线”,在讲授单片机课程的同时,根据编程的需要,不断地“渗透”c语言的知识。再通过观察程序驱动硬件的现象,深入体会单片机的原理。

其次,这种整合,也不必追求课时的压缩,认为既然是“整合”了,效率提高了,就应该体现在课时的减少上,这种想法是错误的。所以,建议两门课程,仍然保持两个学期的课时量:第一个学期,主要介绍基本知识;第二个学期,可以项目实训的方式,让学生完成一些综合性的实验,以提高对两门课程知识的实际运用能力。

五、“c语言”与“单片机”课程整合的实践与效果

单片机c语言范文第3篇

论文摘要:“C程序设计”课程是电子类专业基础必修课,主要是为单片机编程服务,该课程的教学效果直接影响到后续单片机课程的学习。本文结合单片机系统开发的特点,探讨了C程序设计教学方法,为后续单片机课程的学习打下基础。

随着微电子技术的发展和广泛应用,基于单片机上的系统开发,C语言作为一种高级的编程语言,越来越受到人们的关注。现在,无论是嵌入式系统开发企业还是电子设计竞赛、毕业设计等,一般都以C语言为主要开发工具。结合单片机的系统资源,用C语言开发符合实际工程需要的单片机系统,对于编程者来说就有重要的意义。

1.C在单片机教学中的地位

C语言作为一种结构化的程序设计语言,它是程序开发工具中使用最广泛一门编程语言。C语言具有很强的功能性、结构性、可移植性。用C语言编写程序比汇编更符合人们的思考习惯,程序开发者可以摆脱与硬件不必要的接触,更专心地考虑程序的功能和算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。由于它具有良好的程序结构,适用于模块化程序设计,因此采用C语言设计单片机应用系统程序时,采用结构化的、自顶向下、逐步求精的程序设计方法,将功能模块化,由不同的模块完成不同的功能。这样可使整个应用系统程序结构清晰,易于调试和维护。

2.单片机教学现状

单片机技术是现代电子工程领域一门飞速发展的技术,是现代电子技术中的一项不可缺少的重要技术。随着技术的不断进步和日益普及,单片机技术已渗透到各个领域,影响着我们的日常生活和工作。因此电子技术及相关专业的学生学习单片机技术越来越成为社会发展的需求。当前,各大高校的电子、计算机类专业均开设单片机课程。

《单片机》是我院电子系一门实践性极强的专业主干课程,是我校电子系重点建设课程之一,是本专业学生的必修课程。为了提高我系单片机教学效果,我们对单片机教学进行了大胆改革,使用C语言开发单片机,且课程的设计打破了学科体系的框架,将单片机和C语言的相关知识和技能按“项目”进行整合,并将《C程序设计》课程列为电子类专业核心基础课程之一。因此,《C程序设计》课程教学效果的好坏,将直接影响学生后续专业课程的学习。

从近几年我系《C程序设计》课程的教学效果来看,学生普遍反映该课程的学习比较困难,课程的语法知识较多,理解和记忆都不太容易,即使记住了语法知识也不能灵活应用;不知道学习C语言究竟有何用处,学完C后不能很好地利用C进行单片机小型系统的开发,缺乏知识的灵活应用能力。因此,根据以往单片机教学所得经验,我觉得教师有必要在《C程序设计》课程的教学过程中在以下几个方面引起足够的重视,并在教学中加以改进,为后续单片机课程的学习打下坚实的基础。

3.《C程序设计》课程教学方法探索

3.1上好每堂课,激发学生的学习兴趣

语言程序设计教学被认为是一种需要师生双方改进的一门课程,因为大多数语言教材中通常先给出一般的语法格式,然后逐步讲解语法要点,再给出实例。这种顺序灌输会使学生失去学习的兴趣,所以我认为在课堂教学环节应采取以学生为主体、以教师为主导的教学模式,要求学生自己先看有关知识点,并识记。教师采取精讲实例,在这过程中引出相关知识点,然后再举一类似实例让学生自己分析,巩固知识点。教师应把主要精力放在算法的分析和各语句语法的具体应用上,同时培养学生自学能力,采取互动机制,迫使学生主动学习。

3.2注重演示,强化实验,提高实践操作能力

因为授课对象是一年级新生,所以教师多用通俗易懂的语言进行讲解,多举实例,使学生容易理解和消化。在教学过程中,尽量采用讲解、演示方法,如在讲解经典算法后,按照理论方法所述,用DEV C++软件进行编程演示,从而加深学生对教学内容的理解。

在教学过程中,教师应将理论知识与实验内容进行整合,根据教学内容并结合实际应用设置实验题目,让每个学生独立完成。遇到学生不能解决的问题,教师应利用多媒体进行演示解决问题的过程,从而加深学生对教学内容的理解并提高实践操作能力。  3.3培养良好的编程风格

3.3.1优化程序

由于在许多工业测控领域中的嵌入式系统都采用单片机开发,它们所需要的计算和控制工作日趋复杂,其中软件的设计是最复杂和困难的,工作量大,特别是对于控制系统,设计人员需要考虑单片机的软硬件资源分配,但是单片机系统是一种资源十分有限的系统。这主要表现在CPU和片内结构简单、程序存储器资源的不足。因此在用C语言进行单片机开发时,如何使用好这些有限的资源就显得十分重要。虽然C语言具有许多的优点,但是生成的代码相对要长,基本多占用存储空间20%—50%。因而,在“C程序设计”课程教学中,教师不仅要教会学生如何编写程序,而且应在教学过程中向学生灌输优化代码的思想,让学生从大一开始就有开发项目的一些经验。

3.3.2合理选用数据类型

C语言在程序开发中提供了的丰富的数据类型,尤其是关于用户界面开发和一些动画与图像技术的实现。但是在开发单片机系统时,我们要按照实际需要,合理地选用数据类型。C语言中有Char等少数的数据类型是机器语言直接支持的数据类型,用此类数据类型的语句所生成的代码较短,而其它的数据类型如整型、浮点型等数据要有一定的内部程序或内部函数的支持,相对来说较复杂的数据类型的语句生成的代码也复杂,不利于转化成单片机的代码。因此,在“C程序设计“教学过程中,要向学生适当说明选择合适数据类型的好处,并尽可能地减少程序中使用的数据类型的种类,为以后学生的单片机学习打好基础。

3.3.3灌输模块化程序设计思想

在普通微型计算机上进行C语言程序开发设计时,只需考虑程序功能实现,而不必考虑程序代码的长短。但是在单片机上进行C语言程序设计就必须考虑系统的硬件资源,要求设计的软件程序结构是合理、紧凑和高效的。同一任务,有时用主程序完成是合理的,但有时需子程序效率最高,占用资源最少;有时并不是程序的算法越简单、长度越短越好,由于有一些算法要调用一些内部的子程序和函数,生成的机器代码质量反而较低。不同的算法对程序代码效率影响很大。因此,在进行“C程序设计”教学时,教师应适当向学生灌输模块化程序设计的思想,在不影响程序功能实现的情况下可以采用一些优化算法,并且把程序分成若干个功能独立的模块,为学生今后的单片机项目开发做好铺垫。

4.结语

单片机系统采用C语言开发与设计,极大地促进了单片机在生产、生活各个领域的应用,提高了程序开发效率。因而,C语言学习效果的好坏,对今后单片机课程的学习具有深远的影响。除了讲解C语言的基本语法外,更重要的是改善教学方法,利用各种方法培养学生的学习兴趣,并向学生灌输良好的编程风格与编程方法,为今后的单片机课程的学习打下良好的基础。

参考文献

[1]向艳.“C程序设计”课程教学体系和模式探讨[J].计算机教育,2010,(3):112-114.

[2]董蕴宝,潘旭君.浅谈C语言在单片机中的程序设计[J].科技信息,2009,(13):59-67.

[3]张洪静.电类专业C语言教学探讨[J].电脑知识与技术,2010,(29):8280-8281.

[4]林益平,赵福建.单片机C语言课程教学的探索与实践[J].电气电子教学学报,2007,(2):104-106.

单片机c语言范文第4篇

关键词: STC12C5A60S2,PWM,PCM,单片机,语音

1 引言

目前,语音系统越来越广泛地应用于各个领域。目前常用的方案是采用专用语音集成电路加以单片机控制实现,而这类设计用到的语音芯片一般价格较高,电路的软硬件设计成本和难度都比较大。如果采用STC12C5A60S2单片机的大容量ROM存储语音数据,再利用内置的PWM功能,可以方便的将语音信号还原。本文就单片机设计语音功能原理和方法进行详细介绍。

2 STC12C5A60S2单片机介绍

STC12C5A60S2单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代51单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部拥有高达60K的用户应用程序空间(ROM),1280字节RAM,集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S)等功能。

STC12C5A60S2单片机集成了两路可编程计数器阵列(PCA)模块,可通过程序设定,使其工作于8位PWM模式,它是实现语音输出的重要部件。大容量的ROM空间适合存储较长的语音数据,1T高速的运算能力和1KB的RAM为语音解码输出提供了保障,所以应用该单片机可以很容易的设计出具备语音功能的系统。

3 单片机实现语音功能的原理

在STC12C5A60S2单片机上实现语音输出,首先要有供单片机读取的语音数据,可以借助PC机上的软件录制或从现有声音文件中提取,保存为PCM编码,8kHz采样,8位的WAV格式文件。采取这种格式的原因有两点:一是该采样速率下可获得清晰的语音效果,能满足语音系统的要求,二是和单片机位数以及PWM位数一致,有利于单片机的处理和运算。

PCM是波形编码技术的一种,特点是比较简单,语音质量高,缺点就是占用存储空间较多,如果要实现较长的语音,可采取适当的编码形式进行压缩,如ADPCM自适应差分脉冲编码算法等,在这里限于篇幅不再对语音编解码知识加以论述,有兴趣的读者可以自己查阅相关资料。

当获得了WAV文件中的PCM数据后,要把该数据以数组的形式存放,并和单片机程序一道经过C编译器编译生成代码。再通过USART将代码下载到单片机内部FLASH ROM存储器中。

单片机对FLASH存储器中的语音编码数据进行解码,在采样时钟频率下,送到内部集成的脉冲宽度调制器PWM中,来控制PWM每个波形的占空比,再通过低通波器滤波,最后经功放单元推动扬声器发出声音。

4 系统硬件设计

4.1 系统框图

系统STC12C5A60S2单片机为核心,按键、显示和低通滤波器等器件共同组成,硬件电路设计简单,这也是本系统的优点之一,极大程序地节约了硬件成本。

图1 系统组成框图

4.2 系统电路图

图2 单片机主系统电路图

图3 RC低通滤波器

PWM 输出后须通过低通滤波器滤除高频噪声,才能还原成人耳能识别的声音。低通滤波器的类型和参数取决于声音的采样频率和价格预算。用的最多的要数RC滤波器,这种滤波器的设计简单成本低廉,即使使用参数不是非常明确的元件也能获得很好的声音输出。

5 系统软件设计

在主程序设计时,首先要建立一个PWM任务,PWM的输出频率要高于定时器中断频率,最好两倍以上,这样语音输出混杂的高频PWM波容易被低通滤波器滤除,使语音信号变得清晰,然后设置一个周期性的定时器中断程序,在中断函数里面将语音数据写入PWM寄存器,来改变PWM 的占空比,中断周期应和语音数据的采样周期一致,本系统采用的是8KHz采样速率的音频数据,因此定时器的中断周期应设定为125uS。下面是主程序及定时器中断程序的设计流程。

图4 系统主程序流程图

6 结束语

随着语音技术应用的越来越广泛,对语音系统设计要求也越来越高,很多的电子产品要求语音合成集成电路电路简单,成本低廉,利用STC12C5A60S2单片机内大容量ROM和自带的PWM可以很好地解决这个问题,而PWM方式进行D/A转换输出电压信号,可以直接输出语音信号。并且,数字脉冲宽度调制器避免了复杂的模拟电路的设计,降低了设计和生产的难度。所以,PWM方式作为语音合成的输出具有极大的应用前景。

参考文献

单片机c语言范文第5篇

关键词:C8051F040; CAN总线; 测试模式; CAN控制器

中图分类号:TN91934文献标识码:A文章编号:1004373X(2012)06004302

Research of CAN bus test mode based on C8051F040

ZHANG Hui

(Astronaut Center of China, BeiJing 100094, China)

Abstract: Fieldbus has become the hotspot in the data bus field. CAN bus is recognized to be one of the most prospective fieldbuses. The design and debugging of CAN bus node is the focal point in CAN bus communication system design. The CAN controller integrated in C8051F040 is introduced. A CAN communication node is designed base on C8051F040. The software design program of CAN node test mode is presented. It can be used to test CAN bus modules and save the testing time.

Keywords: C8051F040; CAN bus; test mode; CAN controller

收稿日期:20111015现场总线能同时满足过程控制和制造业自动化的需求,因而现场总线已成为数据总线领域中最为活跃的一个领域。现场总线的研究和应用已成为数据总线领域的热点。CAN总线(Controller Area Network)属于现场总线的范畴,它是一种支持分布式控制和实时控制的串行通信网络。CAN总线是德国博士公司在20世纪80年代为解决现代汽车中众多的控制和测试仪器之间的数据通信而开发的一种串行通信协议。由于其高性能、高可靠性、及独特的设计,CAN总线越来越受到人们的重视,其应用领域不再局限于汽车工业,而向过程工业、机械工业、纺织工业、农用机械、传感器以及航空航天等领域发展。被公认为最有前途的现场总线之一[1]。

1引言

Cygnal公司开发的51系列单片机C8051F040是完全集成的混合信号系统型微控制器,其上集成可实现全功能CAN的CAN总线控制器,完全符合CAN规范2.0A和2.0B。本文利用C8051F040单片机上集成的CAN控制器,外接一个CAN收发器(PCA82C250)设计了一个CAN通信节点的硬件电路,然后详细介绍了CAN控制器测试模式的实现,可以应用于CAN通信节点的调试测试。

2C8051F040单片机上集成的CAN控制器

CAN控制器包括CAN核,消息存储器,消息处理器,控制寄存器和模块接口等几部分。CAN核用于协议控制和消息的串并转换;消息存储器用于存储消息对象和标志符;消息处理器用于控制CAN核和消息存储器之间的数据传输;控制寄存器用于控制和配置CAN控制器;模块接口用于MCU与CAN控制器之间交换数据。C8051F040单片机上集成的CAN控制器的消息存储器上可以存储32个消息对象,均可以被配置为发送或接收对象。CAN总线协议处理由CAN控制器独立完成,不用MCU干预,因此CAN通信占用的CPU带宽很小,C8051F040集成CAN控制器原理如图1所示。

3CAN控制器工作模式

C8051F040单片机上集成的CAN控制器主要有2种工作模式:正常工作模式和测试模式。可以通过将CAN控制器寄存器中的Test位置1,进入测试模式。在测试模式下,测试寄存器中的Tx1,Tx0,LBack,Silent以及Basic位均是可写的。将Test位置0后,测试寄存器的所有功能将被禁止。测试模式又可细分为沉默模式(又叫监测模式)、回送模式、基本模式以及回送和沉默模式结合等4种工作模式。通过将测试寄存器中的Silent位置1,可将CAN核设置为沉默模式。在沉默模式下,CAN核能够接收有效数据帧和有效远程帧,但是只能在总线上发送隐性位而不能进行传输。图2为在沉默模式下CAN_TX和CAN_RX信号同CAN核的联系。通过将测试寄存器的LBack位置1,可以将CAN核设置为回送模式。在回送模式下,CAN核将它发送的消息当作接收到的消息对待,并存储在接收缓存中。

图1C8051F040集成CAN控制器原理图图3为在回送模式下CAN_TX和CAN_RX信号同CAN核的联系。通过将LBack和Silent同时置1,可以将回送模式和沉默模式结合。这种模式可以应用于热自检,可以在不影响CAN系统运行的情况下,对CAN节点进行自检。在这种模式下,CAN_RX引脚与CAN核断开,CAN_TX引脚被保持为隐性位。图4为在这种模式下CAN_TX和CAN_RX信号同CAN核的联系。若将测试寄存器中的Basic置1,CAN核便工作于基本模式下。在这种模式下消息存储器不工作,即不用消息队列缓存交换数据,而把IF1寄存器用作传输缓存,把IF2寄存器用作接收缓存[23]。

图2在沉默模式下CAN_TX和CAN_RX

信号同CAN核的联系4CAN通信节点硬件设计

C8051F040上集成的CAN控制器是一个协议控制器,不能提供物理层驱动,需要外接CAN收发器才能挂接在CAN网络上与其他节点通信。本文采用PCA82C250收发器作为物理层驱动器。若在CAN控制器和PCA82C250之间加入光藕隔离器件可以提高系统的稳定性和可靠性,但这会增加系统的复杂性。本文的目的主要是调试CAN控制器的测试模式,所以没有使用光藕隔离器件。CAN通信节点原理图如图5所示。

图3在回送模式下CAN_TX和CAN_RX

信号同CAN核的联系图4在回送和沉默结合模式下CAN_TX

和CAN_RX信号同CAN核的联系图5CAN通信节点原理图5软件设计

基于C8051F040的CAN通信节点的软件设计主要包括3个部分:CAN节点初始化、报文发送和报文接收。熟悉这3部分程序的设计,就能写出普通的CAN通信程序。

5.1CAN初始化

初始化CAN控制器的一般步骤如下[47]:

(1) 将SFRPAGE寄存器设置为CAN0_PAGE。

(2) 将CAN0CN寄存器的INIT和CCE位设置为“1”。

(3) 设置时序参数。