1、 提供电子技术 最新 最实用设计方案3 单片机 C51 编程规范 1 单片机 C51 编程规范 前言 为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范。 2 单片机 C51 编程规范范围 本标准规定了程序设计人员进行程序设计时必须遵循的规范。本规范主要针对 C51编程语言和 keil编译器而言,包括排版、注释、命名、变量使用、代码可测性、程序效率、质量保证等内容。 3 单片机 C51 编程规范总则 格式清晰 注释简明扼要 命名规范易懂 函数模块化 程序易读易维护 功能准确实现 代码空间效率和时间效率高 适度的可扩展性 4 单片机 C51 编程规范数据类型定义 编程时统一
2、采用下述新类型名的方式定义数据类型。 建立一个 datatype.h 文件,在该文件中进行如下定义: typedef bit BOOL; / 位变量 / typedef unsigned char INT8U; / 无符号 8 位整型变量 / typedef signed char INT8S; / 有符号 8 位整型变量 / typedef unsigned int INT16U; / 无符号 16 位整型变量 / typedef signed int INT16S; / 有符号 16 位整型变量 / typedef unsigned long INT32U; / 无符号 32 位整型变量
3、/ typedef signed long INT32S; / 有符号 32 位整型变量 / typedef float FP32; / 单精度浮点数(32 位长度) / typedef double FP64; / 双精度浮点数(64 位长度) / 5 单片机 C51 编程规范标识符命名 5.1 命名基本原则 命名要清晰明了,有明确含义,使用完整单词或约定俗成的缩写。通常,较短的单词可通过去掉元音字母形成缩写;较长的单词可取单词的头几个字母形成缩写。即“见名知意”。 命名风格要自始至终保持一致。 命名中若使用特殊约定或缩写,要有注释说明。 除了编译开关/头文件等特殊应用,应避免使用以下划线开
4、始和或结尾的定义。 同一软件产品内模块之间接口部分的标识符名称之前加上模块标识。 5.2 宏和常量命名 宏和常量用全部大写字母来命名,词与词之间用下划线分隔。对程序中用到的数字均应用有意义的枚举或宏来代替。 5.3 变量命名 提供电子技术 最新 最实用设计方案4 变量名用小写字母命名,每个词的第一个字母大写。类型前缀(u8s8 etc.)全局变量另加前缀 g_。 局部变量应简明扼要。局部循环体控制变量优先使用 i、j、k等;局部长度变量优先使用 len、num 等;临时中间变量优先使用temp、tmp 等。 5.4 函数命名 函数名用小写字母命名,每个词的第一个字母大写,并将模块标识加在最前面
5、。 5.5 文件命名 一个文件包含一类功能或一个模块的所有函数,文件名称应清楚表明其功能或性质。 每个.c 文件应该有一个同名的.h 文件作为头文件。 6 单片机 C51 编程规范注释 6.1 注释基本原则 有助于对程序的阅读理解,说明程序在“做什么”,解释代码的目的、功能和采用的方法。 一般情况源程序有效注释量在 30左右。 注释语言必须准确、易懂、简洁。 边写代码边注释,修改代码同时修改相应的注释,不再有用的注释要删除。 6.2 文件注释 文件注释必须说明文件名、函数功能、创建人、创建日期、版本信息等相关信息。 修改文件代码时,应在文件注释中记录修改日期、修改人员,并简要说明此次修改的目的
6、。所有修改记录必须保持完整。 文件注释放在文件顶端,用“/* */”格式包含。 注释文本每行缩进 4 个空格;每个注释文本分项名称应对齐。 /* 文件名称: 作 者: 版 本: 说 明: 修改记录: */ 6.3 函数注释 6.3.1 函数头部注释 函数头部注释应包括函数名称、函数功能、入口参数、出口参数等内容。如有必要还可增加作者、创建日期、修改记录(备注)等相关项目。 函数头部注释放在每个函数的顶端,用“/*/”的格式包含。其中函数名称应简写为 FunctionName(),不加入、出口参数等信息。 /* 函数名称: 提供电子技术 最新 最实用设计方案5 函数功能: 入口参数: 出口参数:
7、 备 注: */ 6.3.2 代码注释 代码注释应与被注释的代码紧邻,放在其上方或右方,不可放在下面。如放于上方则需与其上面的代码用空行隔开。一般少量注释应该添加在被注释语句的行尾,一个函数内的多个注释左对齐;较多注释则应加在上方且注释行与被注释的语句左对齐。 函数代码注释用“/”的格式。 通常,分支语句(条件分支、循环语句等)必须编写注释。其程序块结束行“”的右方应加表明该程序块结束的标记“end of ”, 尤其在多重嵌套时。 6.4 变量、常量、宏的注释 同一类型的标识符应集中定义,并在定义之前一行对其共性加以统一注释。对单个标识符的注释加在定义语句的行尾。 全局变量一定要有详细的注释,
8、包括其功能、取值范围、哪些函数或过程存取它以及存取时的注意事项等。 注释用“/”的格式。 7 单片机 C51 编程规范函数 7.1 设计原则 函数的基本要求: *正确性:程序要实现设计要求的功能。 *稳定性和安全性:程序运行稳定、可靠、安全。 *可测试性:程序便于测试和评价。 *规范可读性:程序书写风格、命名规则等符合规范。 *扩展性:代码为下一次升级扩展留有空间和接口。 *全局效率:软件系统的整体效率高。 *局部效率:某个模块子模块/函数的本身效率高。 编制函数的基本原则: *单个函数的规模尽量限制在 200 行以内(不包括注释和空行)。一个函数只完成一个功能。 *函数局部变量的数目一般不超
9、过 510 个。 *函数内部局部变量定义区和功能实现区(包含变量初始化)之间空一行。 *函数名应准确描述函数的功能。通常使用动宾词组为执行某操作的函数命名。 *函数的返回值要清楚明了,尤其是出错返回值的意义要准确无误。 *不要把与函数返回值类型不同的变量,以编译系统默认的转换方式或强制的转换方式作为返回值返回。 *减少函数本身或函数间的递归调用。 *尽量不要将函数的参数作为工作变量。 提供电子技术 最新 最实用设计方案6 7.2 函数定义 *函数若没有入口参数或者出口参数,应用 void 明确申明。 *函数名称与出口参数类型定义间应该空一格且只空一格。 *函数名称与括号()之间无空格。 *函数
10、形参必须给出明确的类型定义。 *多个形参的函数,后一个形参与前一个形参的逗号分割符之间添加一个空格 uCOS-II 在 51 单片机上的移植 引言: 随着各种应用电子系统的复杂化和系统实时性需求的提高,并伴随应用软件朝着系统化方向发展的加速,在 16 位 /32 位单片机中广泛使用了嵌入式实时操作系统。然而实际使用中却存在着大量 8 位单片机,从经济性考虑,对某些应用场合,在 8 位 MCU 上使用操作系统是可行的。从学习操作系统角度,uC/OS- II for 51 即简单又全面,学习成本低廉,值得推广。 结语: C/OS -II 具有免费、简单、可靠性高、实时性好等优点,但也有缺乏便利开发
11、环境等缺点,尤其不像商用嵌入式系统那样得到广泛使用和持续的研究更新。但开放性又使得开发人员可以自行裁减和添加所需的功能,在许多应用领域发挥着独特的作用。当然,是否在单片机系统中嵌入C/OS- II 应视所开发的项目而定,对于一些简单的、低成本的项目来说,就没必要使用嵌入式操作系统了。 uC/OS-II 原理: uCOSII 包括任务调度、时间管理、内存管理、资源管理(信号量、邮箱、消息队列)四大部分,没有文件系统、网络接口、输入输出界面。它的移植只与 4 个文件相关:汇编文件( OS_CPU_A.ASM)、处理器相关 C 文 件( OS_CPU.H、 OS_CPU_C.C)和配置文件( OS_
12、CFG.H)。有 64 个优先级,系统占用 8 个,用户可创建 56 个任务,不支持时间片轮转。它的基本思路就是 “近似地每时每刻总是让优先级最高的就绪任务处于运行状态” 。为了保证这一点,它在调用系统 API 函数、中断结束、定时中断结束时总是执行调度算法。原作者通过事先计算好数据,简化了运算量,通过精心设计就绪表结构,使得延时可预知。任务的切换是通过模拟一次中断实现的。 uCOSII 工作核心原理是:近似地让最高优先级的就绪任务处于运行状态。 操作系统将在下面情况中进行任务调度:调用 API函数(用户主动调用),中断(系统占用的时间片中断 OsTimeTick(),用户使用的中断)。 调度
13、算法书上讲得很清楚,我主要讲一下整体思路。 ( 1) 在调用 API 函数时,有可能引起阻塞,如果系统 API 函数察觉到运行条件不满足,需要切换就调用 OSSched()调度函数,这个过程是系统自动完成的,用户没有参与。 OSSched()判断是否切换,如果需要切换,则此函数调用 OS_TASK_SW()。这个函数模拟一次中断(在 51 里没有软中断,我用子程序调用模拟,效果相同),好象程序被中断打断了,其实是 OS 故意制造的假象,目的是为了任务切换。既然是中断,那么返回地址(即紧邻 OS_TASK_SW()的下一条汇编指令的 PC 地址)就被自动压入堆栈,接着在中断程序里保存 CPU 寄
14、存器( PUSHALL) 。堆栈结构不是任意的,而是严格按照 uCOSII 规范处理。 OS 每次切换都会保存和恢复全部现场信息(POPALL ),然后用 RETI 回到任务断点继续执行。这个断点就是 OSSched()函数里的紧邻 OS_TASK_SW()的下一条汇编指令的 PC 地址。切换的整个过程就是,用户任务程序调用系统 API 函数, API 调用 OSSched(), OSSched()调用软中断 OS_TASK_SW()即 OSCtxSw,返回地址(PC 值)压栈,进入 OSCtxSw 中断处理子程序内部。反之,切换程序调用 RETI 返回紧邻 OS_TASK_SW()的下一条汇
15、编指令的 PC 地址,进而返回 OSSched()下一句,再返回 API 下一句,即用户程序断点。因此,如果任务从运行到就绪再到运行,它是从调度前的断点处运行。 提供电子技术 最新 最实用设计方案7 (2 )中断会引发条件变化,在退出前必须进行任务调度。 uCOSII 要求中断的堆栈结构符合规范,以便正确协调中断退出和任务切换。前面已经说到任务切换实际是模拟一次中断事件,而在真正的中断里省去了模拟 (本身就是中断嘛)。只要规定中断堆栈结构和 uCOSII 模拟的堆栈结构一样,就能保证在中断里进行正确的切换。任务切换发生在中断退出前,此时还没有返回中断断点。仔细观察中断程序和切换程序最后两句,它
16、们是一模一样的,POPALL+RETI。即要么直接从中断程序退出,返回断点;要么先保存现场到 TCB, 等到恢复现场时再从切换函数返回原来的中断断点(由于中断和切换函数遵循共同的堆栈结构,所以退出操作相同,效果也相同)。用户编写的中断子程序必须按照 uCOSII 规范书写。任务调度发生在中断退出前,是非常及时的,不会等到下一时间片才处理。OSIntCtxSw ()函数对堆栈指针做了简单调整,以保证所有挂起任务的栈结构看起来是一样的。 (3 )在 uCOSII 里,任务必须写成两种形式之一(uCOSII 中文版 p99页)。在有些 RTOS 开发环境里没有要求显式调用 OSTaskDel(),这
17、是因为开发环境自动做了处理,实际原理都是一样的。 uCOSII 的开发依赖于编译器,目前没有专用开发环境,所以出现这些不便之处是可以理解的。 移植过程: (1 )拷贝书后附赠光盘 sourcecode 目录下的内容到 C: YY 下,删除不必要的文件和 EX1L.C,只剩下 p187( uCOSII)上列出的文件。 ( 2)改写最简单的 OS_CPU.H 数据类型的设定见 C51.PDF 第 176 页。注意 BOOLEAN 要定义成 unsigned char 类型,因为 bit 类型为 C51 特有,不能用在结构体里。 EA=0 关中断; EA=1 开中断。这样定义即减少了程序行数,又避免
18、了退出临界区后关中断造成的死机。 MCS-51 堆栈从下往上增长(1= 向下, 0=向上), OS_STK_GROWTH 定义为 0 #define OS_TASK_SW() OSCtxSw() 因为 MCS-51 没有软中断指令,所以用程序调用代替。两者的堆栈格式相同, RETI 指令复位中断系统, RET则没有。实践表明,对于 MCS-51,用子程序调用入栈,用中断返回指令 RETI 出栈是没有问题的,反之中断入栈 RET 出栈则不行。总之,对于入栈,子程序调用与中断调用效果是一样的,可以混用。在没有中断发生的情况下复位中断系统也不会影响系统正常运行。详见uC/OS- II第八章 193
19、页第12 行 ( 3)改写 OS_CPU_C.C 我设计的堆栈结构如下图所示: TCB 结构体中 OSTCBStkPtr 总是指向用户堆栈最低地址,该地址空间内存放用户堆栈长度,其上空间存放系统堆栈映像,即:用户堆栈空间大小 =系统堆栈空间大小 +1。 SP 总是先加 1 再存数据,因此, SP 初始时指向系统堆栈起始地址( OSStack)减 1 处( OSStkStart)。很明显系统堆栈存储空间大小 =SP-OSStkStart。 任务切换时,先保存当前任务堆栈内容。方法是:用 SP-OSStkStart 得出保存字节数,将其写入用户堆栈最低地址内,以用户堆栈最低地址为起址,以 OSSt
20、kStart 为系统堆栈起址,由系统栈向用户栈拷贝数据,循环SP-OSStkStart 次,每次拷贝前先将各自栈指针增 1。 其次,恢复最高优先级任务系统堆栈。方法是:获得最高优先级任务用户堆栈最低地址,从中取出 “长度 ”,以最高优先级任务用户堆栈最低地址为起址,以 OSStkStart 为系统堆栈起址,由用户栈向系统栈拷贝数据,循环“长度” 数值指示的次数,每次拷贝前先将各自栈指针增 1。 用户堆栈初始化时从下向上依次保存:用户堆栈长度(15 ),PCL , PCH,PSW, ACC, B, DPL, DPH, R0, R1, R2, R3, R4, R5, R6, R7。不保存 SP,任
21、务切换时根据用户堆栈长度计算得出。 OSTaskStkInit 函数总是返回用户栈最低地址。 提供电子技术 最新 最实用设计方案8 操作系统 tick 时钟我使用了 51 单片机的 T0 定时器,它的初始化代码用C 写在了本文件中。 最后还有几点必须注意的事项。本来原则上我们不用修改与处理器无关的代码,但是由于 KEIL 编译器的特殊性,这些代码仍要多处改动。因为 KEIL 缺省情况下编译的代码不可重入,而多任务系统要求并发操作导致重入,所以要在每个 C 函数及其声明后标注 reentrant 关键字。另外,“pdata” 、 “data”在 uCOS 中用做一些函数的形参,但它同时又是 KE
22、IL 的关键字,会导致编译错误,我通过把“pdata” 改成 “ppdata”, “data”改成 “ddata”解决了此问题。 OSTCBCur、OSTCBHighRdy、OSRunning 、 OSPrioCur、 OSPrioHighRdy 这几个变量在汇编程序中用到了,为了使用 Ri 访问而不用DPTR,应该用 KEIL 扩展关键字 IDATA 将它们定义在内部 RAM 中。 ( 4)重写 OS_CPU_A.ASM A51 宏汇编的大致结构如下: NAME 模块名 ; 与文件名无关 ;定义重定位段 必须按照 C51 格式定义,汇编遵守 C51 规范。段名格式为:? PR?函数名?模块名
23、 ;声明引用全局变量和外部子程序 注意关键字为“EXTRN” 没有E 全局变量名直接引用 无参数 /无寄存器参数函数 FUNC 带寄存器参数函数 _FUNC 重入函数 _?FUNC 分配堆栈空间 只关心大小,堆栈起点由 keil 决定,通过标号可以获得 keil 分配的 SP起点。切莫自己分配堆栈起点,只要用 DS 通知 KEIL 预留堆栈空间即可。 STACK 段名与 STARTUP.A51 中的段名相同,这意味着 KEIL 在 LINK 时将把两个同名段拼在一起,我预留了 40H 个字节, STARTUP.A51 预留了 1 个字节, LINK完成后堆栈段总长为 41H。查 看 yy.m5
24、1知 KEIL将堆栈起点定在 21H,长度 41H,处于内部 RAM 中 基于单片机的大棚温湿度控制系统设计 0 引言 植物的生长都是 在一定的环境中进行的,在生长过程中受到环境中各种因素的影响,其中影响最大的是温度和湿度。若昼夜的温度和湿度变化很大,其对植物生长极为不利。因此必须对温度和湿度进行监测和控制,使其适合植物的生长,以提高其产量和质量。 本系统就是针对大棚内温度、湿度,研究单片机控制的温室大棚自动控制,综合考虑系统的精度、效率以及经济性要求多方面因素之后,设计一种基于 计算机 自动控制的大棚温湿度控制系统。 本系统实现的蔬菜大棚温湿度控制系统的目标功能如下: ( 1)系统能对大棚环
25、境温湿度进行采集和 显示 (现场观温、湿度,软件记录)。 提供电子技术 最新 最实用设计方案9 ( 2)能通过上位机端远程设定蔬菜的生长期适宜温湿度。由主控机统一设置系统时间和温度湿度修正值。 ( 3)当大棚的环境温湿度参数超过设定的上下限值时控制相应的系统启动。 ( 4)可实时显示当前温度、时间、报警阈值等信息,并可查询各时间段的温湿度情况,并加以控制。 1 系统各组成模块 本系统通过 温度传感器 DS18B20 采集温度,HM1500LF 采集湿度,经过含有单片机的检测系统的进一步分析处理,通过 通信 线路将信息上行到 PC 机,在 PC 机上可对温湿度信号进行任何分析、处理。用户可以通过
26、下位机中的键 盘输入温湿度的上下限值和预置值,也可以通过上位机进行输入,从而实现上位机对大棚内作物生长的远程控制。如果环境的实时参数超越上下限值,系统自动启动执行机构调节大棚内温度和湿度状态,直到温湿度状态处于上下限值内为止。如果有预置初值,且与当前状态不相等时,系统也会启动执行机构实时动态调节温湿度状态,直到所处的平衡状态与预置值相等为止。 上位机即 PC 机使用 DELPHI 软件编写的一个数据库管理系统,可直接设置温度的上下限值和读取下位机的数据,并对下位机内的控制设备进行操作,调节大棚内温湿度状态。形成作物生长的走势图,从而通过生长走势图得出适合各种作物生长的最佳环境参数条件,为今后的
27、温室种植提供参考。 上下位机之间通过符合串行 总线 RS 232 标准的通信通道以事先约定的协议进行通信。系统原理图如图 1 所示。 2 总体电路及工作过程说明 使用智能温度传感器 DS18B20 进行组网来 测量 各个采集点的温度,HM1500LF 来采集湿度,单片机 AT89S52 作为该系统的处理核心,单片机根据温湿度 传感器 检测到的数据,把各个测量点的温湿度存储并显示在 LCD 液晶显示器上,同时显示在 PC 机上。 3 数据采集模 块 本模块主要采用 DS18B20 采集温度, HM1500LF 采集湿度,由单片机AT89S52 作总的控制并显示与传输。具体原理图如图 2 所示。
28、提供电子技术 最新 最实用设计方案10 3 1 温度传感器 DS18B20 DS18B20 是 Dallas 公司生产的一线式数字温度传感器,采用的是单总线数据传输方式,数据的输入、输出都通过同一条线,因此对时序有很高的要求,为了保证时序,需要做精确的延时,较短的延时可以通过用 _nop_()来实现,根据 DS18B20 的读写时序,用到的延时有 15s, 45s , 90s , 270s ,540s 等,因这些延时为 15s 的整数倍,因此可编写一个 Delay15( n)函数,用该函数进行大约 15sn 的延时,非常方便。程序如下: 有了比较精确的延时保证,就可以对 DS18B20 进行初
29、始化、数据写、数据读。根据时序图,不难写出相应的函数。 3 2 湿度传感器 HM1500LF 湿度传感器 HM1500LF 是法国 Humirel 公司生产的一种低价位的线性电压输出湿度传感器,HM1500LF 的测湿 元件 选用湿敏电容,利用电容量与相对湿度的函数关系即可测量湿度。 DS2450 是美国 Dallas 公司最新推出的一种符合单总线协议的可组网集成 AD 芯片,四个湿度传感器分别接到一片 DS2450的四个模拟电压输入通道 A, B, C, D 上,电路采用 +5 V 电源 供电,必须在上电完毕后向地址 1CH 写入 40H,使模拟电路永久地保持在工作状态。利用该电 路湿度检测
30、信号在测量现场就被直接转换为 数字信号 ,因此 HM1500LF 和DS2450 组合在一起,就构成一个单总线数字湿度 传感器模块 。 4 单片机软件 整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的相应子程序模块就大体定下来了。单片机程序组成如图 3 所示。 4 1 系统的主程序设计 主程序是系统的监控程序,在程序运行的过程中必须先经过初始化,流程图如图 4 所示。系统在初始化完成后就进入温度测量程序,实时地测量当前的温度并通过显示电路在 LCD 上显示。程序中以中断的方式来重新设定温度的上下限。根据硬件设计完成对温度的控制。系统软件设计的总体流程图如图 4 所示 提供电
31、子技术 最新 最实用设计方案11 基于 L297/L298 芯片步进电机的单片机控制 1 引言 步进电动机是一种将电脉冲信号转换成角位移或线位移的精密执行元件,由于步进电机具有控制方便、体积小等特点,所以在数控系统、自动生产线、自动化仪表、绘图机和计算机外围设备中得到广泛应用。微电子学的迅速发展和微型计算机的普及与应用,为步进电动机的应用开辟了广阔前景,使得以往用硬件电路构成的庞大复杂的控制器得以用软件实现,既降低了硬件成本又提高了控制的灵活性,可靠性及多功能性。市场上有很多现成的步进电机控制机构,但价格都偏高。应用 SGS 公司推出的 L297 和 L298 两芯片可方便的组成步进电机驱动器
32、,并结合 AT89C52 单片机进行控制,即可以实现用相对便宜的价格组成一个性能不错的步进电机驱动电路。 2 工作原理 由于步进电机是一种将电脉冲信号转换成直线或角位移的执行元件,它不能直接接到交直流电源上,而必须使用专用设备 -步进电机控制驱动器 典型步进电机控制系统如图 1 所示:控制器可以发出脉冲频率从几赫兹到几十千赫兹可以连续变化的脉冲信号,它为环形分配器提供脉冲序列。环形分配器的主要功能是把来自控制环节的脉冲序列按一定的规律分配后,经过功率放大器的放大加到步进电机驱动电源的各项输人端,以驱动步进电机的转动。环形分配器主要有两大类:一类是用计算机软件设计的方法实现环分器要求的功能,通常
33、称软环形分配器。另一类是用硬件构成的环形分配器,通常称 为硬环形分配器。功率放大器主要对环形分配器的较小输出信号进行放大。以达到驱动步进电机目的。 图 1 典型步进电机控制框图 3 硬件组成 文中所控制的步进电机是四相单极式 35BY48HJ120 减速步进电动机。本文所设计的步进电机控制驱动器的框图如图 2 所示。它由 AT89C52 单片机、光电耦和器、集成芯片 L297 和 L298 组成。 AT89C52 是美国 ATMEL 的低电压、高性能 8 位 CMOS 单片机。片内置 8K 字节可重复擦写的 Flash 闪速存储器。256 字节 RAM。 3 个 16 位定时器。可编程串行 U
34、ART通道。对完成步进电机的简单控制已足以胜任。 图 2 本文提出的步进电机控制驱动器框图 L297 是步进电动机控制器(包括环形分配器)。 L298 是双 H 桥式驱动器。它们所组成的微处理器至双桥式步进电动机的接口如图 3 所示。这种方式结合的优点是,需要的元件很少。从而使得装配成本低,可靠性高和占空 间少。 并且通过软件开发。可以简化和减轻微型计算机的负担。另外, L297 和L298 都是独立的芯片。所以应用是十分灵活的。 提供电子技术 最新 最实用设计方案12 L297 芯片是一种硬件环分集成芯片。它可产生四相驱动信号,用于计算机控制的两相双极或四相单极步进电机 它的心脏部分是一组译
35、码器它能产生各种所需的相序。这一部分是由两种输入模式控制,方向控制(CW/CCW ) 和HALF/FULL 以及步进式时钟 CLOCK.它将译码器从一阶梯推进至另一阶梯。译码器有四个输出点连接到输出逻辑部分,提供抑制和斩波功能所需的相序。因此 L297 能产生三种相序信号,对应于三种不同的工作方式:即半步方式(HALF STEP);基本步距( FULL STEP,整步)一相激励方式;基本步距两相激励方式。脉冲分配器内部是一个 3bit 可逆计数器,加上一些组合逻辑。产生每周期 8 步格雷码时序信号,这也就是半步工作方式的时序信号。此时HALF/FULL 信号为高电。若 HALF/FULL 取低
36、电平,得到基本步距工作方式。即双四拍全阶梯工作方式。 L297 另一个重要组成是由两个 PWM 斩波器来控制相绕组电流,实现恒流斩波控制以获得良好的矩频特性。每个斩波器由一个比较器、一个 RS 触发器和外接采样电阻组成,并设有一个公用振荡器,向两个斩波器提供触发脉冲信号。图 3 中,频率 f 是由外接 16 脚的 RC 网络决定的, 当 R 10k 时,f=1/0.69RC。当时钟振荡器脉冲使触发器置 1,电机绕组相电流上升,采样电阻的 R 上电压上升到基准电压 Uref 时,比 较器翻转,使触发器复位,功率晶体管关断,电流下降,等待下一个振荡脉冲的到来。这样,触发器输出的是恒频 PWM 信号
37、,调制 L297 的输出信号,绕组相电流峰值由 Uref 确定。 L297 的 CONTROL 端的输入决定斩波器对相位线A、 B、 C、 D 或抑制线 INH1 和 INH2 起作用。 CONTROL 为高电平时,对 A、 B、 C、 D 有控制作用;而为低电平时,则对 INH1 和 INH2 起控制作用,从而可对电动机转向和转矩进行控制。 L298 芯片是一种高压、大电流双全桥式驱动器,其设计是为接受标准 TTL逻辑电平信号和驱动电感负载的,例如继电器、圆筒形线圈、直流电动机和步进电动机 具有两抑制输入来使器件不受输入信号影响。每桥的三级管的射极是连接在一起的,相应外接线端可用来连接外设传
38、感电阻。可安置另一输入电源,使逻辑能在低电压下工作。 L298 芯片是具有 15 个引出脚的多瓦数直插式封装的集成芯片。 图 3 中.AT89C52 通过串口经 MAX232 电平转换之后与微机相连。接受上位机指令。向 L297 发出时钟信号、正反转信号、复位信号及使能控制等信号。电路中,电阻 R13, R15 用来调节斩波器电路的参考电压,该电压将与通过管脚 13, 14 所反馈的电位的大小比较,来确定是否进行斩波控制,以达到控制电机绕组电流峰值、保护步进电机的目的 由于 L297 内部带有斩波恒流电路,绕组相电流峰值由 Uref 确定。当采用两片 L297 通过 L298 分别驱动步进电机
39、的两绕组,且通过两个 D/A 转换器改变每相绕组的 Uref 时,即组成了步进电机细分驱动电路。另外,为了有效地抑制电磁干扰,提高系统的可靠性,在单片机与步进电动机驱动回路中利用两个 16 引脚光电耦合器件 TLP521-4 组成如图 3 所示的隔离电路。其作用是切断了单片机与步进电动机驱动回路之间电的直接联系,实现了单片机与驱动回路系统地线的分别联接。防止处于大电流感性负载下工作的驱动电路产生的干扰信号以及电网负载突变产生的干扰信号通过线路串入单片机,影响单片机的正常工作 提供电子技术 最新 最实用设计方案13 基于单片机的智能太阳能路灯控制系统设计方案 摘 要: 随着世界能源危机日益严重,
40、利用太阳能成为解决能源问题的一大途径,在此背景下开发智能太阳能路灯意义重大。本文介绍了智能太阳能路灯系统的组成及工作原理,采用 LPC935 单片机作为主控制器,结合密封铅酸蓄电池充电专用芯片 UC3906,实现了对密封铅酸蓄电池最佳充电所需的全部控制和检测功能,延长了系统的使用寿命。通过热释电红外、微波双鉴传感器技术及以无线通讯技术,实现了红外微波探测、相邻路灯间的无线通讯以及主副灯的智能化切换,达到了节能减排的效果。 随着科学技术的迅速发展,世界能源危机日益严重,利用常规能源已不能适应世界经济快速增长的需要,开发和利用新能源越来越引起各国的重视。太阳能源本身的安全可靠、无噪声、无污染和可再
41、生性的特点,加之现今光伏技术的逐渐成熟,利用光伏发电成为解决能源问题的一大途经。 智能太阳能路灯是利用太阳能组件的光生伏特效应,将光能转换为电能,并储存在蓄电池中供负载使用,它是集太阳能光伏技术、蓄电池技术、照明光源技术于一体的新兴技术。太阳能路灯控制器是应用于太阳能光伏系统中,协调太阳能电池板、蓄电池、负载的工作,使整个太阳能光伏系统高效,安全的运作。 1 智能太阳能路 灯系统总体方案 智能太阳能路灯系统的由太阳能电池板、蓄电池、 LED 灯( 主灯、副灯) 和控制器组成( 如图 1 所示) 。白天太阳能电池板接受太阳辐射能并转化为电能输出,经过充电控制电路储存在蓄电池中; 晚间当光线照度降
42、低时,控制器使副灯点亮,进行指示性照明。当控制器监测到有人经过时控制器同时点亮主灯和副灯,同时和相邻前后的灯通讯,控制邻灯主灯和副灯同时点亮,保证行人在该路段的照明。控制器检测到蓄电池充电或放电超出一定范 围时,控制器切断充放电回路,保证电池不被损坏。遇到连续阴雨天季节可切换成市电照明,避免蓄电池长期亏电。 2 控制系统硬件电路图设计 系统硬件是基于 P89PLC935 单片机作为主控制器的基础,设计出符合功能要求的各个子模块,原理见图 2。 ( 1) 控制器 控制器选用 P89LPC935 单片机,它是一款单片封装的微控制器,适合于本系统要求的高集成度、底成本的场合,可以满足多方面的性能要求
43、, LPC935 采用了高性能的处理器结构,指令执行时间只需 2 4 个时钟周期, 6 倍于标准 80C51,同时, LPC935 集成了许多系统级的功能,这样可大大减少元件的数目,它的 8KBROM 能满足本系统程序存储器的要求,不需用扩展 EPROM。 该单片机内置的 2 个 4 路输入的 8 位 A/D 转换器,不需再单独选用 A/D 转换器,简化了外围硬件电路, P89LPC935 内部的看门狗电路及低电压掉电 提供电子技术 最新 最实用设计方案14 图 1 智能太阳能路灯系统总体方案 检测可在电源故障和受到强电磁干扰时使系统可靠复位,提高了系统的安全可靠性。 ( 2) 环境照度的检测
44、 本系统采用光敏开关检测环境照度。环境照度检测是整个路灯的总开关,只有在夜晚,环境照度较低的情况下,主副灯、人体感应单元及相应的控制电路开始工作,白天均不工作。白天时光敏电阻阻值小,比较器 LM358 负端电压高于正端电压,比较器输出低电平,单片机接收到低电平,屏蔽各种通讯和感应信号,夜晚光敏电阻阻值大,比较器负端电压小于正端,输出高电平,单片机控制接收感应信号和通讯信号。 ( 3) 人体感应单元 本系统采用被动式热释电红外、微波双鉴传感器作为人体感应单元。由于人体都有恒定的体温,一般在 36. 5 ,所以会发出特定波长,一般是 10m 左右的红外线。人体发射的 10um 左右的红外线通过菲涅
45、尔滤光片增强后聚集到热释电元件上,热释电元件接受到人体红外辐射温度发生变化时失去电荷平衡,向外释放电荷,经后续电路检测处理并产生报警信号2 ,但是,热气流,暖风也会造成被动式热释电红外探头发出错误信号,造成和相邻灯之间的误通讯。为了避免误通讯 基于 MCS-51 单片机的智能机器人迷宫车设计 机器人应当具有几个特征:移动功能,执行功能、感觉和智能。目前全世界各国举办的涉及硬件,软件仿真的机器人大赛不下 20 余类。各种各样的机器人比赛都有一个共同的宗旨:培养科学创新精神,激发思维的想象力,鼓励理论与实践的结合。不仅如此,现在已经有越来越多的自动控制产品已经介入生产,在农业、工业上都有广泛的应用
46、。新的工作方式将大大的缩短了人工作业的时间,并且减轻了人的体力劳动的支出。走迷宫的微型机器鼠主要是基于自动引导小车( Auto Guided Vehicle, AGV)的原理,实现机器鼠识别路线,判断并自动躲避障碍,选择正确的行进路线走出迷宫。在此选择制作一个简易的行进装置,使其能顺利的走避障或是迷宫。为了实现小车识别路线,判断并自动躲避障碍,选择正确的行进路线,障碍判断采用单光束反射取样红外传感器,驱动电机采用直流电机,控制核心采用 MCS-51 单片机。控制上采用分时复用技术,仅用一块单片机实现了信号采集、线路判断、电机控制等功能。迷宫由 1616 个区组成。起点设在拐角处,终点设在中央,
47、占 4 个区。每个区为 180 mm180 mm 大小,间壁高为 50 mm,厚度为 12 mm,侧面涂白色,底面涂黑色,如图 1 所示。 1 迷宫车控制系统的总体设计方案 迷宫车由墙壁传感器、单片机控制板、动力及转向系组成的,控制框图如图 2 所示。 提供电子技术 最新 最实用设计方案15 迷宫车采用轮式移动方式。优点是:结构和控制简单而且技术成熟。从选定电动机转速和轮胎直径,可以简单地计算出小车的速度。但是,有关路面的阻力或上坡的驱动转矩等成为重要的因素。考虑这点,在轮胎上使用无线遥控车的塑胶轮胎。如图 3 所示,前轮 1 为万向脚轮或球形轮,后轮 2 和后轮 3 为独立驱动轮,利用它们的
48、转速差实现转向。这种组合的特点是机枢组合容易,而且当 2 个驱动轮以相同速度、相反方向转动时车体能绕 2 个驱动轮连线的中点自转,值得注意的是自转中心与车体中心不一致。 迷宫车车身材料的选择。迷宫车使用的材料大部分用于结构,一般应采用金属材料。迷宫车承载和运动不应产生严重的变形和断裂,从力学角度讲即具有足够的强度。迷宫车负载小,自重轻,对寿命的要求不高。因此,选用铁皮。 1 1 迷宫车控制电路的设计 控制电路主要由电机驱动电路,单片机接口电路,电源电路和传感器电路组成。控制框图如图 4 所示。 ( 1)红外线光感电路传感器通过发光二极管发出红外线,若有障碍物在前方,红外线会被反射回来,被感光三极管接收,单片机程序对信号进行比较处理,按设定的动作要求向后轮的两个电机发出控制命令,控制小车行进。 ( 2)电机驱动电路采用 89S51 单片机,通过 L293D 芯片来控制两个驱动电机动作。 89S51 根据红外传感器对外界进行探测后反馈回来的信号,依据迷宫车探路算法,判定迷宫车行进方向,分别向左右两个驱动电机发出控制指令,该信号经 L293D 芯片驱动后,直接控制相应电机动作,使迷宫车按既定动作进行前进、后退、转向。 1 2 迷宫车控制程序设计 控制算法: