单片机基础与编程技巧
1970/01/01 19:07 点击:2747 / 回复:0
交流内容
一、什么是单片机?单片机的定义和种类。
二、单片机的基本结构和原理。
三、从事单片机所需要的基本知识。
四、单片机怎么入门,先学什么,是先学汇编还是先学C?
五、单片机应用系统的研发步骤。
六、良好编程习惯的重要性。
七、单片机编程的规范,编程修养,个人风格和习惯。
八、项目文件、资料、文档的创建和管理。
九、单片机编程技巧略谈。
十、单片机调试技巧。
一、什么是单片机?单片机的定义和种类:
不同封装形式的单片机:
单片机的定义:
单片机就是单片微型计算机,它是在一片单块的集成电路芯片上,包含了计算机的基本功能部件:中央处理器CPU、存储器(RAM,ROM)、定时器/计数器,中断控制器,串行口,和I/O输入输出接口电路等,构成一个完整的计算机,由于多用于控制领域,所以又叫微控制器(MCU)。单片机只需要适当的外部电路和软件相结合,便可以构成一个简单的单片机控制系统如图:
最简单的控制系统:
LED EQU P1.1
LOOP:
CLR LED
CALL DELAY
SETB LED
CALL DELAY
JMP LOOP
此段程序能使发光二极管每隔0.5秒轮流点亮和熄灭。
单片机的引脚定义图:
单片机的种类:
•按厂家型号分有:INTEL,ATMEL,PIC,PHILIPS,MOTOROLA,TI,SYSCMOS等。
•按位数分:4位,8位,16位,32位单片机。目前应用最广的是8位单片机,价格低廉。目前正兴起的32位ARM单片机是高性能单片机。
•按引脚数量分:有8脚,16脚,20脚,28脚,40脚,48脚,64脚,100脚以上甚至更多。引脚越多,功能越强大。
•按封装分:DIP,PLCC,SSOP等。
•按擦写方式有:OTP(一次性),可多次擦写。
单片机的应用领域:
•单片机应用无处不在,日常生活中随处可见,广泛应用于以下领域:
•测控系统:用于各种工业控制、数据采集。
•智能仪表:如温度、压力、流量、速度等。
•机电一体化产品:数控机床、医疗器械等。
•智能民用产品:家用电器、冰箱、洗衣机、空调、电视机、数码照相机、游戏机、玩具、音响、公共广播。
•高档产品:汽车、手机、PDA、机顶盒、GPS等。
二、单片机的基本结构
单片机内部方框图(以AT89S52为例):
三、从事单片机所需的基本知识
•有浓厚的兴趣、热爱,专注执著,视为事业。
•要有一定的电子技术基础:单片机产品开发是软件和硬件紧密结合的工作,对硬件懂的越多越好,可以加快开发速度。
•基本数字电路知识。
•计算机基本知识,数制及其转换,补码原码反码。
•至少掌握一门编程语言,汇编语言、C语言。
•一定的数学知识,数据结构,算法等,特别对DSP,ARM等高档单片机犹为重要。
•一定的英语基础,能基本读懂英文资料。
四、学单片机怎么快速入门?先学什么?
•硬件方面:学习基本的电子技术,如模拟电路,数字电路,能看懂电路图。
•软件方面:学习汇编语言、C语言。
•有人问:现在流行C,还用学汇编吗?各自的优缺点。汇编语言是低级语言,直接面向机器,代码紧凑、效率高,但难阅读难理解、难维护、可移植性差。C语言是高级语言,表达能力强,表达方式灵活,表达方式简洁直观,可读性强,容易理解,使用简单的方法就可以构造出相当复杂的数据类型和程序结构;可进行结构化设计,适用于大型的复杂项目,可大大缩短开发周期,可移植性好,非常利于维护。所以两种语言都要学好。
•学习单片机的原理和结构、接口电路,推荐《单片机原理及其接口技术》清华大学出版社,胡汉才编著。推荐学习C语言的入门书:《C程序设计》谭浩强编著,清华大学出版社。
•做个简单的实验板或买块开发板,做几个简单的控制实验,掌握单片机开发的基本流程:创建项目,编写代码,调试和仿真,烧写单片。理论联系实际,实践非常重要。
推荐基本入门书:
单片机原理及接口技术
C程序设计
C程序设计(第二板)
MCS-51系列单片机117条汇编指令表:
单片机学习板:
本学习板专为单片机爱好者学习MCS-51系列单片机而设计.可直接的实验有:
1.点亮LED,各种跑马灯
2.数码管显示数字和字母,.数码管动态刷新显示
3.查询方式按键,中断方式按键
4.蜂鸣器发声,单片机奏乐
5.外部事件计数
6.串行通讯
7.IIC总线存储器读写
8.IIC总线时钟芯片操作
单片机仿真器:
用于在线适时仿真,方便调试、修改软件中的逻辑错误等
用于在线适时仿真,方便调试、修改软件中的逻辑错误等
单片机编程器:
用于往单片里烧写已调试好的程序,加密单片程序。
用于往单片里烧写已调试好的程序,加密单片程序。
目前单片流行的C语言编译环境:KEIL C
KEIL C与标准C有什么不同?
nKeil C 的主要特点和它与ANSI C 的不同之处
nKeil C 除了具有标准C的所有功能外,还增加了一些针对单片机硬件特点的特殊功能,如增加了对单片机内部硬件资源、特殊功能寄存器,I/O口的控制,如:
nsfr SCON=0X98; //定义 SCON串行控制寄存器
nsbit SM0=0X9F; //定义 SCON 的各位
nsbit SDA=P1︿1; //定义单片I/0口。
n增加了数据存储类型:data, idata, bdata, pdata, xdata, code.
n增加中断服务函数:void timer0(void) interrupt 1 {}
n等等,还有其他。。。。。。。
单片机应用系统的研发步骤:
n拟制设计任务书:市场调研,方案论证,功能设计,指标要求。
n建立数学模型:如温度、电压电流,功率,要用数学公式具体化。把模糊的概念数字化。
n硬件电路设计、模拟电路数字电路、可靠性设计、器件选型、画原理图、PCB图、制版、插件、焊接、调试。
n结构设计:机箱、面板、后板,线材。
n软件设计:首先确定程序结构、程序功能、确定算法、流程图设计、绘制流程图是单片机程序编写前最重要的工作,首先画出简单的功能流程图(粗框图),再对功能流程图进行扩充和具体化。
n编写程序代码,程序的检查和修改,编译。
n系统的软硬件测试、调试、运行和维护。
七、单片机编程技巧略谈:
n先确定程序结构的重要性:尽可能把问题想全面一点,做到胸有成竹。
n使用无符号类型unsigned char, 原因是8051 不支持符号运算。
n避免使用浮点指针你可以这样做但会浪费大量的代码时间。
n尽量采用短变量:能用char型就不要用int型,节省内存空间。
n使用位变量,对于某些标志位应使用位变量而不是unsigned char 这将节省你的内存。
n用局部变量代替全局变量,把变量定义成局部变量比全局变量更有效率,且节省内存,对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。
n为变量分配内部存储区。
局部变量和全局变量可被定义在你想要的存储区中,当你把经常使用的变量放在内部RAM 中时,可使你的程序的速度得到提高,除此之外,你还缩短了你的代码,因为外部存储区寻址的指令相对要麻烦一些,考虑到存储速度,按下面的顺序使用存储器DATA IDATA PDATA XDATA 当然你要记得留出足够的堆栈空间。
n使用宏替代函数,巧用宏定义,条件编译,方便修改、维护程序。
nSwitch case 语句要有default语句,防止找不到匹配的。函数参数范围检查
nBINGO平台里的技巧。
n多阅读别人的程序,了解别人的编程思路,吸收先进的编程技巧和方法。
软件抗干扰技术:防止程序跑飞
n运用看门狗(WATCHDOG):看门狗有硬件看门狗和软件看门狗,硬件看门狗是带有复位电路的器件,如带看门狗的存储器CAT1611。软件看门狗大多都是单片内部自带的看门狗定时器,定时器溢出时能使单片复位。
n看门狗喂狗正确方法:不要在定时器中断程序中喂狗,否则失去看门狗功能。最好只在主程序中喂狗,且喂狗指令不要太频繁。
n变量的边界问题:对函数的参数要进行范围判断,及出错的处理。程序开始时要对变量进行初始化赋值,防止程序初值不对而出现明显的错误。
n防止程序跑飞的措施,后面介绍。
单片机软件抗干扰技术:
n数字量输入方法:如数据采集,状态检测,可多次重复采集取平均值,或去掉明显偏离范围的值;状态检测采用延时检测,多次确认检测,排除干扰。
n数字量输出控制:可采用循环重复输出同一个数据,定期刷新,重复周期应尽量短,即使受到干扰出错,也能立即恢复正常。
n防止程序跑飞(死机)的处理:最简单的方法是复位单片或重新开机,但需要人为干预,有时是不允许的。
1、指令冗余:程序跑飞后往往将一些操作数误当作指令码来执行,从而引起整个程序的混乱,如果在一些关键的语句前人为的插入一些单字节的空操作指令NOP,当程序跑飞到这条单字节的空指令上,就不会发生将后面的操作数当成指令码来执行了。从而是程序重新走入正轨。但也不能乱插,否则降低程序效率。
2、设置软件陷阱:软件陷阱是一条引导指令,强行将捕获的程序引向一个指定的正确的地址,或引向一个处理程序出错的地址。如:
(1) :在未使用的大片EPROM程序空间区域设置软件陷阱:
ORG 0FFBH ORG 1FFBH
NOP NOP
NOP NOP
LJMP MAIN LJMP MAIN ;强行跳到程序开始的地方
(或LJMP PROCERR) 或LJMP PROCERR)
; 或强行跳到出错处理程序
n(2):在未使用的中断向量入口区
ORG 0000H
LJMP MAIN
ORG 0003H ;外部中断0入口
LJMP FUNCINT0 ;外部中断处理程序
NOP ;冗余指令
NOP ;冗余指令
LJMP PROCERR ;软件陷阱
ORG 000BH
LJMP PROCTIMER0
NOP ;冗余指令
NOP ;冗余指令
LJMP PROCERR ;软件陷阱
ORG 0013H
LJMP PROCERR ;INT1未使用的中断入口,设陷阱
………………………………
ORG 002BH
LJMP PROCERR ;T2未使用的中断入口,设陷阱
NOP ;冗余指令
NOP ;冗余指令
ORG 0030H
MAIN: ……….. ;主程序
3)在程序区适当位置安排陷阱:主要是在一些程序跳转指令后,正常运行不会执行到的地方加入,这样不会影响程序的效率,有可能捕捉到”跑飞”的程序,如。
JNZ NOTZERO
。。。
AJMP PROCTASK1
NOP
NOP
LJMP PROCERR ;陷阱,正常情况下不会到此。
ABC: MOV R7,A
RET
NOP
NOP
LJMP PROCERR ;陷阱,正常情况下不会到此。
软件抗干扰技术:系统的恢复
n单片CPU硬件复位后,相当于机器冷启动,所有变量被初始化,程序从头执行,有时会破坏当前的工作,在某些特殊场合是不允许的。
n热启动:用软件识别的方法,使程序跑飞复位后,对系统的当前状态进行修复和有选择的进行部分初始化,不会破坏当前的工作,也让人不会明显的感觉到机器复位了,这种软件操作有称为“热启动”,
n热启动的判断:在内存中某两个或更多个连续的单元设置“上电标志”数据,如0AA55H、或0AA5533H等,供软件识别。
n热启动处理过程:首先关所有中断,并重新设置堆栈,将所有I/O口设置成安全状态,根据系统中残留的信息进行恢复工作,纠正因受干扰而引起的关键的错误数据。使系统进入正常工作状态。
n系统信息的恢复:对某些重要的关键的数据,为防止受干扰而出错,可采取存储冗余技术:既将这些重要的数据重复存放在三个互不相关的地址单元中,建立双重数码备份,恢复时采取三中取二表决流程。
五、良好编程习惯的重要性:
n许多程序,没有注释,没有缩进,胡乱命名的变量名,结构混乱等等,等等,我把这种程序统称为没有修养的程序,这种程序员,他是在做创造性的工作吗?不,完全就是在搞破坏,他们与其说是在编程,还不如说是在对源程序进行“加密”,因为他编的程序所创造的价值,远远小于需要在上面进行维护的价值。
n有修养的程序员的作品必然是一图精美的图画,一首美妙的歌曲,一本赏心悦目的小说,让人看了禁不住赞叹。差的程序让人半天看不懂,猜不着他的心思。
n每个人都有自己的个人风格和编程习惯:但应养成良好的风格和习惯,就是修养。
n在这里不讨论过深的技术,我只想在一些容易让人忽略的东西上说一说,虽然这些东西可能很细微,但如果你不注意这些细微之处的话,那么他将会极大的影响你的整个软件质量,以及整个软件程的实施,所谓“千里之堤,毁于蚁穴”。
n1714 变量名为m_bitliu,一个函数上千行,if语句嵌套十几层,函数里循环变量用全局变量,程序转手好几代接班人,一直问题不断,维护代价极其昂贵!
n两个好的程序与差的程序的对比。
六、单片机编程规范
国际上对编程规范有明确的规定,就像ISO标准一样,有几种规范:有UNIX标准,微软标准。
每个公司根据自己公司的特点,再结合国际标准,也有每个公司的标准,如华为公司、用友软件、金山软件等。
编程规范和范例 :
附件:软件部编程规范文档:
八、项目文件的管理,资料的管
理
n自己的设计的项目要放在同一个目录下,每个目录名应以项目名称命名。
n同一个项目文件、源程序和资料要尽量只放在一个分区的一个目录下面,不要放在多个地方,不要在其他的分区和目录下再复制相同的项目文件和程序,否则弄不清哪个版本是最新的。
n资料文件专门放在资料目录下面,并分类存放。
n项目文件里应包含一个写注释的文本文件,记录一些关键的说明和变动,如:
九、单片机调试技巧略谈
n调试分硬件调试和软件调试,
n首先检查硬件电路,先排除硬件故障,节约时间。如首先排除目标板的短路、短路,引脚错位,电源和地是否正确等问题,
n保证单片正常工作的基本条件:电源、接地是否正确、晶振是否起振、复位电路是否正常等。
n软件调试分模块逐个逐个调试,可以检验硬件和软件是否都正常,保证基本模块功能无误,为整体调试铺平道路。
n充分运用编译软件带的调试功能,如断点调试、单步调试、运行到指定行、各种观察窗口如局部变量窗口,全局变量窗口、I/O窗口,串行窗口,CPU窗口、时间记录窗口,观察程序运行的状态和结果,发现问题和解决问题。
n考虑外围接口器件的速度,如果是低速器件,要有足够的延时时间。
n考虑外围接口器件I/O端口的结构,如果是开漏结构,则必须加上拉电阻,否则驱动不够,影响正常工作。原则上作输出用的I/O口加上拉电阻可以增加驱动能力,和增强抗干扰能力。在电源和地间加滤波电容。
n仿真器运行正常,但写入单片后单片运行却不正常,应检查单片的复位电路、电源、晶振电路是否正常,如不正常,单片是无法开始工作的。还有就是检查单片的EA/Vpp脚是否接到VCC,因为现在的单片机多是用内部的程序存储器。
n测试单片的每个I/O是否都正常,有时单片的某几个非关键I/O口损坏,但单片还是能正确烧写进去,但实际却不能正常工作。
n经验的积累非常重要,功多艺熟,熟能生巧。
文章:youk [1970/01/01 19:07]
评论