‘壹’ 求大神们分享yq518单片机开发板资料
一、题库资料
1、 张齐,单片机原理与应用系统设计——基于C51的PROTUES仿真实验与解题指导,电子工业出版社。(纸质版)
2、 张毅刚,单片机原理及应用,高等教育出版社(电子版)
二、分析设计基础资料
‘贰’ 学习MCS-51(具体以89C51为例)系列单片机的体会
http://www.38xian.com/index.aspx?menuid=4&type=articleinfo&lanmuid=19&infoid=685&language=cn
http://www.38xian.com/index.aspx?menuid=4&type=articleinfo&lanmuid=19&infoid=686&language=cn
又来看了一下,修改一下吧,加点文字
C语言学习总结
搞嵌入式的,大都用C语言写代码,本人从事单片机开发,也写了不少的代码,一直习惯用 if 、switch打天下,在定义数据结构的时候也只用到 字符型、整型、数组,位;很少用结构体,共用体,枚举,因为咱C语言学得不好,和它们不熟,总感觉它们不那么好招呼,重要的是自已觉得没必要用上它们。随着越来越多的积累,咱写代码的风格也在不断的发生变化,从以前的喜欢将所有的函数及数据的定义写在一个文件里到逐渐的将函数按功能模块化、从以前的习惯直接在程序里写常数到慢慢的开始用上宏来代替,咱编程的风格也逐渐开始正规化,编程水平也逐步提升,当然这些成绩都源于咱不断的学习,学习匠人的编程规范、学习herald的感悟设计、还有网上写得非常出色的代码以及STM32的固件函数库,在咱的不断领悟和思考下,总结了几点关于C语言的用法,与大家共同分享。
一、 学习匠人的头文件包含巧妙用法
当一个头文件被多个C文件包含,且该头文件中定义了这些C文件的公共变量,则在编译的时候会出现重复定义,导致编译通不过,通常我们会采用如下两种做法来解决上述问题。
(为了让问题表述得更清楚,我们假设两个C文件C1,C2,C3,一个头文件H1,C1,C2,C3有两个公共变量V1和V2)
1、 在C1文件中定义变量V1和V2,在C2和C3文件中对V1,V2用extern声明;
2、 在C1文件中定义变量V1和V2,在H1中对V1,V2用extern声明,然后在C2和C3文件中包含H1;
很显然,以上两种方法都要对V1和V2书写至少两次,一次定义,一次外部声明,且不是在同一文件下,这样不利于管理和修改,有没有一种方法可以让这些公用的变量放在一个文件里,且只要书写一次呢?
偶在二姨那里无意中看到匠人的发帖,就是关于该问题的讨论,现在我转发一下,与大家同共分享。首先我们将要用到的公共变量全部书写到com.h文件中,每一个变量在定义前加一个符号EXT_,当该头文件被main.c函数包含时,定义EXT_为空,表示com.h中的变量在main.c中被定义,当被其它文件包含时,定义EXT_为extern,表示外部声明,如:
Com.h文件:
//避免重复定义
#ifdef root
#define EXT_
#else
#define EXT_ extern
#endif
//全局变量
EXT_ u8 variable1; //该变量在三个C文件中都要用到
Main.c
#define root //在包含com.h前定义root
#include "com.h"
二、 用结构体的方式来定义总线或外设地址
当一个整体包含不同类型的多个成员时,通常用结构体来定义结构体变量,这样内存会将这些变量按照递增的方式分配到相邻的地址(不对齐的地方会有填充),按“结构体名.成员名”的方式访问结构体内的成员,这是访问结构体变量的方式;但是还有一种指向结构体变量的指针,它可以将某个地址转换成该结构体类型的指针,比如寄存器的定义:
(以下是摘自STM32固件函数库,关于GPIO的定义)
typedef struct
{
vu32 CRL; //0
vu32 CRH; //偏移量4
vu32 IDR; //偏移量8
vu32 ODR;
vu32 BSRR;
vu32 BRR;
vu32 LCKR;
} GPIO_TypeDef;
#define GPIOA_BASE ((u32)0x40010800) //GPIOA的基地址为0x40010800
#define GPIOA (GPIO_TypeDef *) GPIOA_BASE; //强制类型转换为GPIO_TypeDef类型的指针
这样在操作GPIOA的寄存器时只要这样写就可以了
读: X="GPIOA-">CRL; 写:GPIOA->CRL=X;
或 读: X=(*GPIOA).CRL; 写:(*GPIOA).CRL =X;
当然,要达到上述目的也可以采用如下方式
#define GPIOA_ CRL 0x40010800
#define GPIOA_ CRH 0x40010804
#define GPIOA_ IDR 0x40010808
#define GPIOA_ ODR 0x4001080C
#define GPIOA_ BSSR 0x40010810
#define GPIOA_ LCKR 0x40010814
很明显,第一种书写方式更加正规化,且当定义多个GPIO时,只要将其它GPIO的基地址强制转换为该结构类型的指针即可。
再来看看一个定义外部总线的例子
typedef struct
{
vu8 CH375_DATA;
vu8 CH375_CMD; //偏移量1
} CH375_TypeDef;
#define CH375 ((CH375_TypeDef *) 0x6c000000)
CH375-> CH375_DATA=data; //往0x6c000000地址处写数据
CH375-> CH375_CMD=cmd; //往0x6c000001地址处写命令
怎么样,是不是方便多了。重要的是代码的观赏和可读性提高了。
三、 用枚举数据类型来定义特定的状态
在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个函数在操作过程中会返回几个特定的状态:操作成功,操作失败,忙,等等。如果我们直接在函数里用0,1和2来表示这三种状态,有时偶尔会出现数值与实际状态对不上号的情况,造成置状态和判断状态错误,那么我们可以在程序里用宏或者枚举来事先定义好这些状态。
如:用宏定义:
#define Sucess 0
#define Failure 1
#define Busy 2
用枚举
typedef enum { Sucess = 0, Failure , Busy } FlagStatus;
四、 用共用体类型定义共享内存空间
共用体类型定义的数据是将多个成员共享同一内存空间,该空间的大小为最大成员的大小,其用法与结构体完全相同,但值得注意的是不能同时引用多个成员,在某一时刻只能使用其中之一成员。
在程序中如果全局变量比较多,包含几个结构和数组,如果这些全部定义的话势必会占大量的内存,有可能还会导致单片机内存不够,如果能让几个不同时用到的数组和结构变量共享一段内存,则能省出很多的内存空间。
比如以下输入输出若不同时进行,则可以共享同一段内存空间
union {
struct {
unsigned char Flag;
unsigned char Type;
unsigned char State;
unsigned long DataLen;
unsigned char Buffer[64];
}DataOut;
struct {
unsigned char Flag;
unsigned char Type;
unsigned char State;
unsigned long DataLen;
unsigned char Buffer[64];
} DataIn;
} BOC;
C语言博大精深,丰富多彩,用得好能很好的发挥它的作用,同时学习好的编程方法养成良好的编程习惯对于一名设计人员来说也是极其的重要,以上四点都是本人自身积累和学习的一些总结,希望能够与大家一起共同交流,共同学习和提高。
个人珍藏的好文章,贴出来分享
‘叁’ 求新手学习51单片机的书以及单片机C语言编程的书籍,最好网上能买到。
张齐的《单片机应用系统设计技术》-基于C语言编程,《21天学通C语言》作者是个叫BRADLY L.JONES的美国人写的非常实用,除此之外我建议你使用《51单片机常用模块设计》但此书最好是在你有一定基础之后看…
‘肆’ 谁知道单片机和plc的区别
单片机是一种芯片,在一定场合,配合外围电路,可以用来设计所需要的各种功能,大都用汇编语言、C语言等来开发嵌入式软件,可应用于各种领域。
PLC是一种可编程的控制器,相当于一种控制设备,主要用于工业自动化等领域,大都采用梯形图编程,也可以用组态软件。其特点是非常可靠。
在ARM出现以前,很多小型PLC是以单片机为CPU的,我曾经看过日本和德国产的PLC就是这样的。
应该说这两者有很大的区别,由于目前它们的应用需求都不少,前景都是不错的。不过单片机的使用偏于研发,PLC的使用偏于应用。
‘伍’ STC单片机PWM输出最大可以达到多少频率
STC
1T单片机理论上是最高百工作频率35MHZ,其最高时钟频率应该没那么度高,不过20多MH应该没问题的,定时器问最高频率应该就是20/256MHZ左右了,不需要定答时器直接在主循环里面切换状态可以更快--(不过此时单片机就回只能干一件事情,就是切答换状态了)
‘陆’ 现在用什么单片机最多,是C51的,还是microchip,还是其它的
这个没有定论,与特定行业、特定需求、特定公司有关。
其实你学到一定水平之后就会发现都差不多,也就是架构、资源稍有变化。
入门建议51,毕竟这个被啃的时间长、人数多,资料好找、师傅也好找。
之后就可以接触接触PIC、MSP430、HCS08这几个有特点的系列,也可以去玩玩M0/3/4。
‘柒’ PLC与单片机哪个应用更广泛
1.PLC是建立在单片机之上的产品,单片机是一种集成电路,两者不具有可比性。
2.单片机可以构成各种各样的应用系统,从微型、小型到中型、大型都可,PLC是单片机应用系统的一个特例。
3.不同厂家的PLC有相同的工作原理,类似的功能和指标,有一定的互换性,质量有保证,编程软件正朝标准化方向迈进。这正是PLC获得广泛应用的基础。而单片机应用系统则是八仙过海,各显神通,功能千差万别,质量参差不齐,学习、使用和维护都很困难。
PLC在工控领域已经霸占了主要的地位,其稳定性、免维护等非单片机可以代替;现在的PLC功能越来越强大,在工控方面不可取代。单片机的开发无局限性,前期虽然不高,但其稳定性与PLC无可比拟。
国内很多厂家开发的嵌入式系统在工控方面也得到好评,但在维修界就不敢恭维了,因其通用性及可代换方面严重欠缺,维修相当不方便。但单片机在家电方面的出色表现也为其赢得另一片控制天地
‘捌’ 请各位高手讲解一下单片机中ADC模块中的数据左对齐和右对齐是啥意思把大概的工作原理讲下啦.谢谢啦!
一般高于八位的ADC才会出现这种情况
比如说AD转换后数字量保存在ADCH,ADCL两个寄存器中
左对齐就是AD值的最高位就是ADCH的最高位了,ADCL的低位就会有的用不到,读出来就为0
右对齐就是AD值的最低位是ADCL的最低位,而ADCH的高位就会有的用不到,读出来也为0
左对齐:11111111 11110000
MSB LSB
右对齐:00001111 11111111
MSB LSB
‘玖’ 求基于AT89C52超声波测距简易设计的源程序,要求用3个LED管显示其测距,精确到小数点后2位如,X.XX米。
目前国内超声波测距器的设计大多采用汇编语言设计。由于单片机应用系统的日趋复杂,要求所写
的代码规范化,模块化,并便于多人以软件工程的形式进行协同开发,汇编语言作为传统的单片机应用系
统的编程语言,已经不能满足这样的实际需要了,而C语言以其结构化和能产生高效代码满足了这样的需
求,成为电子工程师进行单片机系统编程时的首先编程语言。在本设计中,由于C语言程序有利于实现较
复杂的算法,汇编语言程序具有较高的效率并且容易精确计算程序运行的时间,而超声波测距器的程序既
有较复杂的距离计算又要求精确计算超声波测距时程序运行的时间,所以本设计采用C语言和汇编语言
混合编程来实现。本文论述的是一种基于AT89C52单片机的超声波测距器,可用于汽车倒车等场合⋯。
1设计要求
设计一个超声波测距器,可以应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用
于如液位、井深、管道长度的测量等场合。要求测量范围在0.10—5.00 m,测量精度lem,测量时与被测物
体无直接接触,能够清晰稳定地显示测量结果。
2设计思路
2.1超声波及其测距原理
超声波是指频率高于20KHz的机械波。为了以超声波作为检测手段,必须产生超声波和接收超声波。
完成这种功能的装置就是超声波传感器,习惯上称为超声波换能器或超声波探头。超声波传感器有发送
器和接收器,但一个超声波传感器也可具有发送和接收声波的双重作用。超声波传感器是利用压电效应
的原理将电能和超声波相互转化,即在发射超声波的时候,将电能转换为超声波,发射超声波;而在收到回
波的时候,则将超声振动转换成电信号。
超声波测距的原理一般采用渡越时间法TOt(time of fliight)。首先测出超声波从发射到遇到障碍物返
回所经历的时间,再乘以超声波的速度就得到二倍的声源与障碍物之间的距离。测量距离的方法有很多
种,短距离的可以用尺,远距离的有激光测距等,超声波测距适用于高精度的中长距离测量。因为超声波
收稿日期:2008-04-08
作者简介:周功明(1963一),男,副教授,主要研究方向:电子信息科学技术。
·50· 绵阳师范学院学报(自然科学版) 第27卷
在标准空气中的传播速度为331.45粑秒,由单片机负责计时,单片机使用12.0M晶振,所以此系统的测
量精度理论上可以达到毫米级。由于超声波指向性强,能量消耗缓慢,在介质中传播距离远,因而超声波
可以用于距离的测量。利用超声波检测距离,设计比较方便,计算处理也较简单,并且在测量精度方面也
能达到要求。
超声波发生器可以分为两类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。本课题
属于近距离测量,可以采用常用的压电式超声波换能器来实现【7】。
2.2超声波测距器的系统框图
根据设计要求并综合各方面因素,可以采用AT89C52单片机作为主控制器,用动态扫描法实现LED
数字显示,超声波驱动信号用单片机的定时器完成,超声波测距器的系统框图如下图l所示¨2|:
3系统组成
3.1硬件部分
主要由单片机系统及显示电路、超声波发射电路
和超声波检测接收电路三部分组成。采用AT89C52来
实现对CX20106A红外接收芯片和TCT40—10系列超
声波转换模块的控制。单片机通过P1.0引脚经反相
\
超声波接收E :, LED显示单片机r
/\
Z ∑
超声波发送高控制器
:> 扫描驱动
图1 超声波测距器系统设计框图
Fig.1 Ultrasonic eLangi.g system design diagram
器来控制超声波的发送,然后单片机不停的检测INT0引脚,当INTO引脚的电平由高电平变为低电平时就
认为超声波已经返回。计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器与障碍
物之间的距离¨≈J。
3.2软件部分
主要由主程序、超声波发生子程序、超声波接收中断程序及显示子程序等部分。
4系统硬件电路设计
4.1单片机系统及显示电路
单片机采用AT89C52或其兼容系列。采用12MHz高精度的晶振,以获得较稳定的时钟频率,减小测
量误差。单片机用P1.0端口输出超声波转化器所需的40KHz方波信号,利用外中断0口检测超声波接收
电路输出的返回信号。显示电路采用简单实用的4位共阳LED数码管,段码用74LS244驱动,位码用PNP
三极管驱动。单片机系统及显示电路如下图2所示‘1。31。
图2单片机及显示电路原理图
Fig.2 MCU and display circuit schematics
第8期周功明等:基于AT89C52单片机的超声波测距器设计·51.
4.2超声波发射电路原理图
压电超声波转换器的功能:利用压电晶体谐振工作。内部结构如图3‘3Ⅲ1所示,它有两个压电晶片和
一个共振板。当它的两极外加脉冲信号,其频
率等于压电晶片的固有振荡频率时,压电晶片PI.O
将会发生共振,并带动共振板振动产生超声波,
这时它就是一超声波发生器;如没加电压,当共
振板接收到超声波时,将压迫压电振荡器作振
动,将机械能转换为电信号,这时它就成为超声
波接收转换器。超声波发射转换器与接收转换
器其结构稍有不同。
4.3超声波检测接收电路图3发射电路原理图
参考红外转化接收电路,本设计采用集成
F‘g·3 U1‘ms。nie劬啪mi‘妇c‘咖1‘∞hem蚯c
电路CX20106A,这是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。考虑到红外遥控
常用的载波频率38KHz与测距超声波频率
40KHz较为接近,可以利用它作为超声波检测
电路。如图4【3 J[71超声波检测接收电路原理图
所示,适当改变C4的大小,可改变接收电路的
灵敏度和抗干扰能力。⋯. J。j-二
5系统程序设计
超声波测距软件设计主要由主程序,超声
波发射子程序,超声波接收中断程序及显示子
程序组成。下面对超声波测距器的算法,主程
序,超声波发射子程序和超声波接收中断程序
逐一介绍。
5.1超声波测距器的算法设计
GND
图4超声波检测接收电路原理图
Fig.4 Ultrasonic receiver and detection circuit schematic
图5【_列示意了超声波测距的原理,即超声
波发生器T在某一时刻发出的一个超声波信号,当超声波遇到被测物
体后反射回来,就被超声波接收器R所接受。这样只要计算出发生信
号到接收返回信号所用的时问,就可算出超声波发生器与反射物体的
距离。
距离计算公式:d=s/2=(c木t)/2,其中d为被测物与测距器的距
离,s为声波的来回路程,c为声速,t为声波来回所用的时间。
图5超声波测距原理图
Fig.5 Ultrasonic Ranging schematic
声速c与温度有关(见表1),如温度变化不大,则可认为声速是基
本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。声速确定后,只要测得超声波往
返时间,即可求得距离。在系统加入温度传感器来监测环境温度,可进行温度补偿。这里可以用DSl8820
测量环境温度,根据不同的环境温度确定一声速提高测距的稳定性。为了增强系统的可靠性,可在软硬件
上采用抗干扰措施。
表1不同温度下的超声波速表
Table I Under different temperatures ultrasonic velocity Table
·52· 绵阳师范学院学报(自然科学版) 第27卷
5.2主程序
主程序首先对系统环境初始化,设置定时器1D工作模式为16位的定时计数器模式,置位总中断允许
位EA并给显示端Po和P2清0。然后调用超声波发生子程序送出一个超声波脉冲,为避免超声波从发射
器直接传送到接收器引起的直接波触发,需延迟0.1ms(这也就是测距器会有一个最小可测距离的原因)
后,才打开外中断0接收返回的超声波信号。由于采用12MHz的晶振,机器周期为lus,当主程序检测到接
收成功的标志位后,将计数器哟中的数(即超声波来回所用的时
间)按下式计算即可测得被测物体与测距仪之间的距离,设计时取
20℃时的声速为344 m/s则有:d=(C木TO)/2=172T0/10000cm
(其中,ID为计数器,ID的计数值)。
测出距离后结果将以十进制BCD码方式LED,然后再发超声
波脉冲重复测量过程。主程序框图如图6所示。
5.3超声波发生子程序和超声波接收中断程序
超声波发生子程序的作用是通过PI.0端口发送2个左右的
超声波信号频率约40KHz的方波,脉冲宽度为12 US左右,同时把
计数器,ID打开进行计时。超声波测距器主程序利用外中断0检
测返回超声波信号,一旦接收到返回超声波信号(INT0引脚出现
低电平),立即进入中断程序。进入该中断后就立即关闭计时器
,ID停止计时,并将测距成功标志字赋值l。如果当计时器溢出时
还未检测到超声波返回信号,则定时器rID溢出中断将外中断0关
闭,并将测距成功标志字赋值2以表示此次测距不成功H旬J。
5.4超声波测距器的部分程序清单
/宰超声波测距器弹片机c程序使用Keil C51 ver 7.09
。
木/
#include<re951.h>
#define uchar unsigned int
#define uint unsigned int
#define ulong unsigned long
Extem void ca_t(void);
Extem void delay(uint);
Extem void display(unchar);
Data unehar testtok;
/木超声波测距器主程序术/
Void main(void)
{data unchar dispram[5];
data uint i;
data ulong time;
p0=0xff;
pl=0xff;
TMOD=0X11:
IE=0x80;
While(1)
{.“}
开始
系统初始化
发送超声波脉冲
等待发射超声波
计算距离
显示结果0.5s
图6主程序框图
diagram of the main program
第8期周功明等:基于AT89C52单片机的超声波测距器设计·53·
6软硬件调试
超声波测距仪的制作和调试,其中超声波发射和接收采用中15的超声波换能器TCT40一IOFl(T发
射)和TCT40—10S1(R接收),中心频率为40kHz,安装时应保持两换能器中心轴线平行并相距4—8 cm,
其余元件无特殊要求。若能将超声波接收电路用金属壳屏蔽起来,则可提高抗干扰能力。根据测量范围
要求不同,可适当调整与接收换能器并接的滤波电容C4的大小,以获得合适的接收灵敏度和抗干扰能力。
硬件电路制作完成并调试好后,便可将程序编译好下载到单片机试运行。根据实际情况可以修改超
声波发生子程序每次发送的脉冲宽度和两次测量的间隔时间,以适应不同距离的测量需要∞】【71。
7 结束语
本文设计的是基于AT89C52单片机的超声波测距器,可应用于汽车倒车等场合,提醒驾驶员倒车时有
效的避开可能对倒车造成危害的障碍物和行人,从而有效避免由于倒车造成的汽车碰撞或擦伤经济损失
和人身安全问题。具有较强的实用性。
参考文献:
[1] 周功明.基于AT89C2051弹片机的防盗自动报警电子密码锁系统设计[J].绵阳师范学院学报,2007,26(5):112—
116.
[14]
张齐.单片机应用系统设计技术一基于c语言编程[M].北京:电子工业出版社,2006.
李光飞.单片机c程序设计实例指导[M].北京:航空航天大学业出版社,2005.
楼燃苗,李光飞.51系列单片机设计实例[M].北京:航空航天大学业出版社,2003.
Zhongbo Li.Electronic Technique[M].Beijing:Mechannic Instrical Prees,2003.
赖麒文.8051单片机c语言彻底应用[M].北京:科学业出版社,2002.
何希才.传感器及其应用电路[M].北京:电子工业出版社,2001.
丁元杰.单片微机原理及应用[M].北京:机械工业出版社,2001.
孙串友,孙晓斌.感测技术基础[M].北京:电子工业出版社,2001.
马忠梅.单片机的c语言应用程序设计[M].北京:航空航天大学业出版社,1999.
刘喜昂,周志宇.基予多超声传感器的机器人安全避障技术[J].测控技术,2003,23(2):71—73.
翟国富,刘茂恺.一种实时高精度的机器人用超声波测距处理方法[J].应用声学,1990,15(1):17—24.
Cray C,Swinhoe C F,Myinl.Target controlled infusion of ketamine曲analgessia for TIV A with propof01.Can.J Anesth,1999,
40:957.
R J Higgens.Electronics and Analog Integrated Circuits[M].N.J:Prentice—Hall Inc,2001.