1
单片机发展简史
单片机涌现的历史并不长,但发展十分迅猛。
它的产生与发展和微处理器(CPU)的产生与发展大体同步,自1971年美国英特尔公司首先推出4位微处理器以来,它的发展到目前为止大致可分为5个阶段。
下面以英特尔公司的单片机发展为代表加以先容。

1971年~1976年单片机发展的低级阶段。
1971年11月英特尔公司首先设计出集成度为2000只晶体管/片的4位微处理器英特尔4004,并配有RAM、 ROM和移位寄存器, 构成了第一台MCS—4微处理器, 而后又推出了8位微处理器英特尔8008, 以及其它各公司相继推出的8位微处理器。
1976年~1980年低性能单片机阶段。
以1976年英特尔公司推出的MCS—48系列为代表, 采取将8位CPU、 8位并行I/O接口、8位定时/计数器、RAM和ROM等集成于一块半导体芯片上的单片构造, 虽然其寻址范围有限(不大于4 KB), 也没有串行I/O, RAM、 ROM容量小, 中断系统也较大略, 但功能可知足一样平常工业掌握和智能化仪器、仪表等的须要。
1980年~1983年高性能单片机阶段。
这一阶段推出的高性能8位单片机普遍带有串行口,有多级中断处理系统, 多个16位定时器/计数器。
片内RAM、 ROM的容量加大,且寻址范围可达64 KB,个别片内还带有A/D转换接口。
1983年~80年代末16位单片机阶段。
1983年英特尔公司又推出了高性能的16位单片机MCS-96系列,由于其采取了最新的制造工艺, 使芯片集成度高达12万只晶体管/片。
1990年代单片机在集成度、功能、速率、可靠性、运用领域等全方位向更高水平发展。
2
单片机的分类及运用
MCU按其存储器类型可分为无片内ROM型和带片内ROM型两种。
对付无片内ROM型的芯片,必须外接EPROM才能运用(范例为8031);带片内ROM型的芯片又分为片内EPROM型(范例芯片为87C51)、MASK片内掩模ROM型(范例芯片为8051)、片内Flash型(范例芯片为89C51)等类型。
按用场可分为通用型和专用型;根据数据总线的宽度和一次可处理的数据字节长度可分为8、16、32位MCU。
目前,海内MCU运用市场最广泛的是消费电子领域,其次是工业领域、和汽车电子市场。
消费电子包括家用电器、电视、游戏机和音视频系统等。
工业领域包括智能家居、自动化、医疗运用及新能源天生与分配等。
汽车领域包括汽车动力总成和安全掌握系统等。
3
单片机的基本功能
对付绝大多数MCU,下列功能是最普遍也是最基本的,针对不同的MCU,其描述的办法可能会有差异,但实质上是基本相同的:
1、TImer(定时器):TImer的种类虽然比较多,但可归纳为两大类:一类是固定时间间隔的TImer,即其定时的韶光是由系统设定的,用户程序不可掌握,系统只供应几种固定的韶光间隔给用户程序进行选择,如32Hz,16Hz,8Hz等,此类TImer在4位MCU中比较常见,因此可以用来实现时钟、计时等干系的功能。
另一类则是Programmable Timer(可编程定时器),顾名思义,该类Timer的定时韶光是可以由用户的程序来掌握的,掌握的办法包括:时钟源的选择、分频数(Prescale)选择及预制数的设定等,有的MCU三者都同时具备,而有的则可能是个中的一种或两种。
此类Timer运用非常灵巧,实际的利用也千变万化,个中最常见的一种运用便是用实在现PWM输出。
由于时钟源可以自由选择,因此,此类Timer一样平常均与Event Counter(事宜计数器)合在一起。
2、IO口:任何MCU都具有一定数量的IO口,没有IO口,MCU就失落去了与外部沟通的渠道。
根据IO口的可配置情形,可以分为如下几种类型:
纯输入或纯输出口:此类IO口由MCU硬件设计决定,只能是输入或输出,不可用软件来进行实时的设定。
直接读写IO口:如MCS-51的IO口就属于此类IO口。
当实行读IO口指令时,便是输入口;当实行写IO口指令则自动为输出口。
程序编程设定输入输出方向的:此类IO口的输入或输出由程序根据实际的须要来进行设定,运用比较灵巧,可以实现一些总线级的运用,如I2C总线,各种LCD、LED Driver的掌握总线等。
对付IO口的利用,主要的一点必须牢记的是:对付输入口,必须有明确的电平旗子暗记,确保不能浮空(可以通过增加上拉或下拉电阻来实现);而对付输出口,其输出的状态电平必须考虑其外部的连接情形,应担保在Standby或静态状态下不存在拉电流或灌电流。
3、外部中断:外部中断也是绝大多数MCU所具有的基本功能,一样平常用于旗子暗记的实时触发,数据采样和状态的检测,中断的办法由上升沿、低落沿触发和电平触发几种。
外部中断一样平常通过输入口来实现,若为IO口,则只有设为输入时个中止功能才会开启;若为输出口,则外部中断功能将自动关闭(ATMEL的ATiny系列存在一些例外,输出口时也能触发中断功能)。
外部中断的运用如下:
外部触发旗子暗记的检测:一种是基于实时性的哀求,比如可控硅的掌握,突发性旗子暗记的检测等,而另一种情形则是省电的须要。
旗子暗记频率的丈量:为了担保旗子暗记不被遗漏,外部中断是最空想的选择。
数据的解码:在遥控运用领域,为了降落设计的本钱,常常须要采取软件的办法来对各种编码数据进行解码,如Manchester和PWM编码的解码。
按键的检测和系统的唤醒:对付进入Sleep状态的MCU,一样平常须要通过外部中断来进行唤醒,最基本的形式则是按键,通过按键的动作来产生电平的变革。
4、通讯接口:MCU所供应的通讯接口一样平常包括SPI接口,UART,I2C接口等,其分别描述如下:
SPI接口:此类接口是绝大多数MCU都供应的一种最基本通讯办法,其数据传输采取同步时钟来掌握,旗子暗记包括:SDI(串行数据输入)、SDO(串行数据输出)、SCLK(串行时钟)及Ready旗子暗记;有些情形下则可能没有Ready旗子暗记;此类接口可以事情在Master办法或Slave办法下,普通说法便是看谁供应时钟旗子暗记,供应时钟的一方为Master,相反的一方则为Slaver。
UART(Universal Asynchronous Receive Transmit):属于最基本的一种异步传输接口,其旗子暗记线只有Rx和Tx两条,基本的数据格式为:Start Bit + Data Bit(7-bits/8-bits) + Parity Bit(Even, Odd or None) + Stop Bit(1~2Bit)。
一位数据所占的韶光称为Baud Rate(波特率)。
对付大多数的MCU来讲,数据位的长度、数据校验办法(奇校验、偶校验或无校验)、停滞位(Stop Bit)的长度及Baud Rate是可以通过程序编程进行灵巧设定。
此类接口最常用的办法便是与PC机的串口进行数据通讯。
I2C接口:I2C是由Philips开拓的一种数据传输协议,同样采取2根旗子暗记来实现:SDAT(串行数据输入输出)和SCLK(串行时钟)。
其最大的好处是可以在此总线上挂接多个设备,通过地址来进行识别和访问;I2C总线的一个最大的好处就是非常方便用软件通过IO口来实现,其传输的数据速率完备由SCLK来掌握,可快可慢,不像UART接口,有严格的速率哀求。
5、Watchdog(看门狗定时器):Watchdog也是绝大多数MCU的一种基本配置(一些4位MCU可能没有此功能),大多数的MCU的Watchdog只能许可程序对其进行复位而不能对其关闭(有的是在程序烧入时来设定的,如Microchip PIC系列MCU),而有的MCU则是通过特定的办法来决定其是否打开,如Samsung的KS57系列,只要程序访问了Watchdog寄存器,就自动开启且不能再被关闭。
一样平常而言watchdog的复位韶光是可以程序来设定的。
Watchdog的最基本的运用是为MCU由于意外的故障而导致去世机供应了一种自我规复的能力。
4
环球主流单片机制造商
下面整理了主流厂商的单片机(可能有些遗漏),排名不分先后,
欧美地区
1、Freescale+NXP(飞思卡尔+恩智浦):荷兰,紧张供应16位、32位MCU。
运用范围:汽车电子、LED和普通照明、医疗保健、多媒体领悟、家电和电动工具、楼宇自动化技能电机掌握、电源和功率转换器、能源和智能电网、自动化、打算机与通信根本举动步伐。
2、Microchip+Atmel(微芯科技+爱特梅尔):美国,紧张供应16位、32位MCU。
运用范围:汽车电子、工业用、电机掌握、汽车、楼宇自动化、家用电器、家庭娱乐、工业自动化、照明、物联网、智能能源、移动电子设备、打算机外设。
3、Cypress+Spansion(赛普拉斯+飞索半导体):美国,紧张供应8位、16位、32位MCU。
运用范围:汽车电子、家用电器、医疗、消费类电子、通信与电信、工业、无线。
4、ADI(亚德诺半导体):美国,紧张供应8位、16位、32位MCU。
运用范围:航空航天与国防、汽车运用 、楼宇技能 、通信 、消费电子 、能源 、医疗保健 、仪器仪表和丈量 、电机、工业自动化 、安防。
5、Infineon(英飞凌):德国,紧张供应16位、32位MCU。
运用范围:汽车电子、消费电子、工程、商用和农用车辆、数据处理、电动交通、工业运用、医疗设备、移动设备、电机掌握与驱动、电源、面向摩托车电动自行车与小型电动车、智能电网、照明、太阳能系统办理方案、风能系统办理方案。
6、ST Microelectronics(意法半导体):意大利/法国,紧张供应32位MCU。
运用范围:LED和普通照明、交通运输、医疗保健、多媒体领悟、家电和电动工具、楼宇自动化技能电机掌握、电源和功率转换器、能源和智能电网、自动化、打算机与通信根本举动步伐。
7、Qualcomm(高通):美国,紧张供应16位,32位MCU。
运用范围:智好手机、平板电脑、无线调制解调器。
8、Texas Instruments(德州仪器):美国,紧张供应16位、32位MCU。
运用范围:汽车电子、消费电子、医疗设备、移动设备、通信。
9、Maxim(美信):美国,紧张供应32位MCU。
运用范围:汽车电子、消费电子、工业运用、安防。
日韩地区
1、Renesas(瑞萨):日本,紧张供应16位、32位MCU。
运用范围:电脑及外设、消费类电子、康健医疗电子、汽车电子、工业、通信。
2、Toshiba(东芝):日本,紧张供应16位、32位MCU。
运用范围:汽车电子、工业用、电机掌握、无线通信、移动电话、电脑与周边设备、影像及音视频、消费类(家电)、LED照明、安全、电源管理、娱乐设备。
3、Fujitsu(富士通):日本,紧张供应32位MCU。
运用范围:汽车、医疗、机器,家电。
4、Samsung Electronics(三星电子):韩国,紧张供应16位、32位MCU。
运用范围:汽车电子、工业用、电机掌握、汽车、楼宇自动化、家用电器、家庭娱乐、工业自动化、照明、物联网、智能能源、移动电子设备、打算机外设。
中国地区
▍中国大陆地区
▍中国台湾地区
5
单片机的学习窍门
任何一款MCU,其基本事理和功能都是大同小异,所不同的只是其外围功能模块的配置及数量、指令系统等。
对付指令系统,虽然形式上看似千差万别,但实际上只是符号的不同,其所代表的含义、所要完成的功能和寻址办法基本上是类似的。
要理解一款MCU,首先须要知道便是其ROM空间、RAM空间、IO口数量、定时器数量和定时办法、所供应的外围功能模块(Peripheral Circuit)、中断源、事情电压及功耗等等。
理解这些MCU Features后,接下来第一步便是将所选MCU的功能与实际项目开拓的哀求的功能进行比拟,明确哪些资源是目前所须要的,哪些是本项目所用不到的。
对付项目中须要用到的而所选MCU不供应的功能,则须要负责理解MCU的干系资料,以求用间接的方法来实现,例如,所开拓的项目须要与PC机COM口进行通讯,而所选的MCU不供应UART口,则可以考虑用外部中断的办法来实现。
对付项目开拓须要用到的资源,则须要对其Manua进行负责的理解和阅读,而对付不须要的功能模块则可以忽略或浏览即可。
对付MCU学习来讲,运用才是关键,也是最紧张的目的。
明确了MCU的干系功能后,接下来就可以开始编程了。
对付初学者或初次利用此款MCU的设计者来说,可能会碰着很多对MCU的功能描述不明确的地方,对付此类问题,可以通过两种方法来办理,一种是编写特殊的验证程序来理解资料所述的功能;另一种则可以暂时忽略,单片机程序设计中则按照自己目前的理解来编写,留到调试时去修正和完善。
前一种方法适用于韶光较宽松的项目和初学者,而后一种方法则适宜于具有一定单片机开拓履历的人或项目进度较紧迫的情形。
指令系统千万不要特殊花韶光去理解。
指令系统只是一种逻辑描述的符号,只有在编程时根据自己的逻辑和程序的逻辑哀求来查看干系的指令即可,而且随着编程的进行,对指令系统也会越来越闇练,乃至可以不自觉地影象下来。
6
单片机的程序编写
MCU的程序的编写与PC下的程序的编写存在很大的差异,虽然现在基于C的MCU开拓工具越来越盛行,但对付一个高效的程序代码和喜好利用汇编的设计者来讲,汇编措辞仍旧是最简洁、最有效的编程措辞。
对付MCU的程序编写,其基本的框架可以说是大体同等的,一样平常分为初始化部分(这是MCU程序设计与PC最大的不同),主程序循环体和中断处理程序三大部分,其分别解释如下:
1、初始化:对付所有的MCU程序的设计来讲,初始化是最基本也是最主要的一步,一样平常包括如下内容:
屏蔽所有中断并初始化堆栈指针:初始化部分一样平常不肯望有任何中断发生。
打消系统的RAM区域和显示Memory:虽然有时可能没有完备的必要,但从可靠性及同等性的角度出发,特殊是对付防止意外的缺点,还是建议养成良好的编程习气。
IO口的初始化:根据项目的运用的哀求,设定干系IO口的输入输出办法,对付输入口,须要设定其上拉或下拉电阻;对付输出口,则必须设定其初始的电平输出,以防涌现不必要的缺点。
中断的设置:对付所有项目须要用到的中断源,该当给予开启并设定中断的触发条件,而对付不该用的多余的中断,则必须给予关闭。
其他功能模块的初始化:对付所有须要用到的MCU的外围功能模块,必须按项目的运用的哀求进行相应的设置,如UART的通讯,须要设定Baud Rate,数据长度,校验办法和Stop Bit的长度等,而对付Programmer Timer,则必须设置其时钟源,分频数及Reload Data等。
参数的初始化:完成了MCU的硬件和资源的初始化后,接下来便是对程序中利用到的一些变量和数据的初始化设置,这一部分的初始化须要根据详细的项目及程序的总体安排来设计。
对付一些用EEPROM来保存项目预制数的运用来讲,建议在初始化时将干系的数据拷贝到MCU的RAM,以提高程序对数据的访问速率,同时降落系统的功耗(原则上,访问外部EEPROM都会增加电源的功耗)。
2、主程序循环体:大多数MCU是属于永劫光不间断运行的,因此其主程序体基本上都因此循环的办法来设计,对付存在多种事情模式的运用来讲,则可能存在多个循环体,相互之间通过状态标志来进行转换。
对付主程序体,一样平常情形下紧张安排如下的模块:
打算程序:打算程序一样平常比较耗时,因此武断反对放在任何中断中处理,特殊是乘除法运算。
实时性哀求不高或没有实时性哀求的处理程序;
显示传输程序:紧张针对存在外部LED、LCD Driver的运用。
3、中断处理程序:中断程序紧张用于处理实时性哀求较高的任务和事宜,如,外部突发性旗子暗记的检测,按键的检测和处理,定时计数,LED显示扫描等。
一样平常情形下,中断程序应尽可能担保代码的简洁和短小,对付不须要实时去处理的功能,可以在中断中设置触发的标志,然后由主程序来实行详细的事务――这一点非常主要,特殊是对付低功耗、低速的MCU来讲,必须担保所有中断的及时相应。
4、对付不同任务体的安排,不同的MCU其处理的方法也有所不同:
例如,对付低速、低功耗的MCU(Fosc=32768Hz)运用,考虑到此类项目均为手持式设备和采取普通的LCD显示,对按键的反应和显示的反应哀求实时性较高,因此一样平常采取定时中断的办法来处理按键的动作和数据的显示;而对付高速的MCU,如Fosc》1MHz的运用,由于此时MCU有足够的韶光来实行主程序循环体,因此可以只在相应的中断中设置各种触发标志,并将所有的任务放在主程序体中来实行。
5、在MCU的程序设计中,还须要特殊把稳的一点便是:
要防止在中断和主程序体中同时访问或设置同一个变量或数据的情形。
有效的预防方法是,将此类数据的处理安排在一个模块中,通过判断触发标志来决定是否实行该数据的干系操作;而在其他的程序体中(紧张是中断),对须要进行该数据的处理的地方只设置触发的标志。
――这可以担保数据的实行是可预知和唯一的。
7
工程师对单片机编程的总结
1、要养成总结的好习气,总结不仅是对自己学习的一个总结,还是对学习过程的一个回顾与加深,还可避免第二次犯错。
2、编写程序之前先要有一个对该项目熟习的理解,做到心中有数,列一个大致框架。
仔细考虑该怎么布局,若何布局最合理,该步骤很主要。
要剖析先做哪个模块,详细到该模块的详细步骤,各个函数怎么命名,与其他模块的衔接等。
最好拿张纸记下主要过程。
3、对付c措辞的模块化编程,要先分好各个模块,一个模块一个模块的编程,确定一个顺序,按顺序来,该模块成功之后再编写下一个。
对付头文件,当该模块编写好之后再编写该模块的头文件。
4、涌现警告不要忽略,解释该程序一定有不合理之处,要弄清其来源,找到办理办法。
找来源时要有针对性,可上网搜一下该方面的资料,或向别人请教。
例如,居然把另一个工程内的main函数加入了这个工程。
还有居然函数命名重复。
还有根据实验征象剖析缘故原由,层层递进。
还有端口定义时居然选错了接口。
有时,实在办理不了就安歇一下,在想也挺好的。
再大略的地方也要把稳一下,都有可能出错。
在单片机运用开拓中,代码的利用效率问题、单片机抗滋扰性和可靠性等问题仍困扰着。
现归纳出单片机开拓中应节制的几个基本技巧。
8
单片机开拓技巧
1.如何减少程序中的bug
对付如何减少程序的bug,该当先考虑系统运行中应考虑的超范围管理参数如下。
物理参数:这些参数紧张是系统的输入参数,它包括勉励参数、采集处理中的运行参数和处理结束的结果参数。
资源参数:这些参数紧张是系统中的电路、器件、功能单元的资源,如影象体容量、存储单元长度、堆叠深度。
运用参数:这些运用参数常表现为一些单片机、功能单元的运用条件。
过程参数:指系统运行中的有序变革的参数。
2.如何提高C措辞编程代码的效率
用C措辞进行单片机程序设计是单片机开拓与运用的一定趋势。
如果利用C编程时,要达到最高的效率,最好熟习所利用的C编译器。
先试验一下每条C措辞编译往后对应的汇编措辞的语句行数,这样就可以很明确的知道效率。
在今后编程的时候,利用编译效率最高的语句。
各家的C编译器都会有一定的差异,故编译效率也会有所不同,精良的嵌入式系统C编译器代码长度和实行韶光仅比以汇编措辞编写的同样功能程度长5-20%。
对付繁芜而开拓韶光紧的项目时,可以采取C措辞,但条件是哀求你对该MCU系统的C措辞和C编译器非常熟习,特殊要把稳该C编译系统所能支持的数据类型和算法。
虽然C措辞是最普遍的一种高等措辞,但由于不同的MCU厂家其C措辞编译系统是有所差别的,特殊是在一些分外功能模块的操作上。
以是如果对这些特性不理解,那么调试起来问题就会很多,反而导致实行效率低于汇编措辞。
3.如何办理单片机的抗滋扰性问题防止滋扰最有效的方法是去除滋扰源、隔断滋扰路径,但每每很难做到,以是只能看单片机抗滋扰能力够不足强了。
在提高硬件系统抗滋扰能力的同时,软件抗滋扰以其设计灵巧、节省硬件资源、可靠性好越来越受到重视。
单片机滋扰最常见的征象便是复位,至于程序跑飞,实在也可以用软件陷阱和看门狗将程序拉回到复位状态,以是单片机软件抗滋扰最主要的是处理好复位状态。
一样平常单片机都会有一些标志寄存器,可以用来判断复位缘故原由;其余你也可以自己在RAM中埋一些标志。
在每次程序复位时,通过判断这些标志,可以判断出不同的复位缘故原由;还可以根据不同的标志直接跳到相应的程序。
这样可以使程序运行有连续性,用户在利用时也不会察觉到程序被重新复位过。
4.如何测试单片机系统的可靠性当一个单片机系统设计完成,对付不同的单片机系统产品会有不同的测试项目和方法,但是有一些是必须测试的:
测试单片机软件功能的完善性上电、掉电测试老化测试ESD和EFT等测试有时候,我们还可以仿照人为利用中,可能发生的毁坏情形。
例如用人体或者衣服织物故意摩擦单片机系统的打仗端口,由此测试抗静电的能力。
用大功率电钻靠近单片机系统事情,由此测试抗电磁滋扰能力等。
综上所述,单片机已成为打算机发展和运用的一个主要方面,单片机运用的主要意义还在于,它从根本上改变了传统的掌握系统设计思想和设计方法。
从前必须由仿照电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的掌握技能也称为微掌握技能,是传统掌握技能的一次革命。
此外在开拓和运用过程中我们更要节制技巧,提高效率,以便于发挥它更加广阔的用场。
9
芯片操作总结
对芯片的操作紧张是对芯片内寄存器的操作,芯片内寄存器在存储器上映射的都有自己的唯一地址,这也便是对相应的地址的操作。
看芯片,首先看时序图,再理解相应的寄存器,理解是如何操作的,定义须要的端口(程序可以识别),编写写操作程序和读操作程序。
如何往芯片内写入数据,如何读出数据,通过哪个端口输入或读出(最紧张的地方)。
通过总线连接芯片时,首先要理解该总线的协议。
I2c总线连接的芯片,紧张通过该总线去掌握该芯片。
1、点阵中一个74hc595用于列的选择,令外两个用于颜色的选择,点阵相称于二极管的凑集,
一端给高电平,另一端给低电平,二极管才能亮。
只是一端选择不同时,亮不同的颜色。
定时器事情模式的选择:高四位是设置定时器T1,低四位设置T0。
然后各模式的后两位设置事情模式。
当设置两个定时器时,把稳利用或(|)。
当用中断时,把稳进入中断后,该清零的要清零。
2、串口收发:波特率的设置一样平常用模式2(自动重装初值),由于不同的装置,处理数据的能力不同,设置波特率紧张为了照顾低速装置及为了彼此间的通讯。
中断标志位要软件清零。
设置串口中断时,收发无论哪一个产生都能进入中断函数,因此要把稳设置中断函数。
(自我觉得一样平常设置一种功能,当做上位机或下位机)。
发送用中断的话,要办理第一次该怎么进入中断,因此首先要发送一次,此后就可以进入中断了。
一次只能发一字节,而且只有在TI置一之后才能发送下一位。
3、Pcf8591ad转换,有四个通道的输入,读pcf8591时,选通哪一个通道,读的便是那个通道输入的电压,转换后的数据存储在该芯片内,再读出。
读时先写芯片的地址,在写器件的子地址(0x40|通道号),然后便是读出的数据。
4、Da转换是先向芯片内写入器件地址,在写子地址(0x40),在写要转换的数字量。
器件地址芯片资料有先容。
5、对付液晶显示,写入数据显示后,他会一贯显示,不用持续刷新,要想改变,只有重新输入。
6、对付ds1302时钟芯片,读数据时是在写入数据时的第八个时钟低落沿就读出第一位数据的的,然后再为下次输出做准备,把稳程序的写法,还要把稳返回值放的位置。
7、Ds1302中先指明寄存器,再向个中写入数据。
芯片资料上的寄存器标出的是地址。
(写保护处程序还不大明白,不是一贯都有写入吗?为什么还打开写保护?)
(根据前面的大侠,可以在初始化韶光后设一标志,有此标志则不用再初始化韶光。
但是如果断电后,MCU的RAM是无法保存这个标志的,因此可以用DS1302的RAM保存该标志,待上电后读取该标志。
我也是初学者,最近也打算用DS1302。
不知说法对不,我也还没详细履行,多互换)
8、初始化最好还要写一下,以防往后忘却。
有时把稳读出或写入时,首先操作的是最低位还是最高位,可根据时序图判断出。
9、对付红外收发,吸收时,他是根据两个低落沿之间的韶光是非来确定是高电平还是低电平,写程序时,先用定时器确定韶光是非,保存,然后再转化成二进制(该程序写法多看看,很好)。
10、步进电机:紧张做开关用,步进电机的力矩随转速的升高而降落。
紧张用在机床上零部件加工的自动进给。
对有较高精度的掌握场所都可也利用。
步进电机是将电脉冲旗子暗记转变为角位移或线位移的开环掌握元步进电机件。
在非超载的情形下,电机的转速、停滞的位置只取决于脉冲旗子暗记的频率和脉冲数,而不受负载变革的影响,当步进驱动器吸收到一个脉冲旗子暗记,它就驱动步进电机按设定的方向迁徙改变一个固定的角度,称为“步距角”,它的旋转因此固定的角度一步一步运行的。
可以通过掌握脉冲个数来掌握角位移量,从而达到准确定位的目的;同时可以通过掌握脉冲频率来掌握电机迁徙改变的速率和加速度,从而达到调速的目的。
11、伺服电机:(servo motor )是指在伺服系统中掌握机器元件运转的发动机,是一种补助马达间接变速装置。
伺服电机可使掌握速率,位置精度非常准确,可以将电压旗子暗记转化为转矩和转速以驱动掌握工具。
伺服电机转子转速受输入旗子暗记掌握,并能快速反应,在自动掌握系统中,用作实行元件,且具有机电韶光常数小、线性度高、始动电压等特性,可把所收到的电旗子暗记转换成电动机轴上的角位移或角速率输出。
分为直流和互换伺服电动机两大类,其紧张特点是,当旗子暗记电压为零时无自转征象,转速随着转矩的增加而匀速低落。
直流电机:范围较大,小车上都是。
12、汉字概览:
为了将汉字在显示器或打印机上输出,把汉字按图形符号设计成点阵图,就得到了相应的点阵代码(字形码)。
为在打算机内表示汉字而统一的编码办法形成汉字编码叫内码(如国标码),内码是惟一的(相称于该字的身份证号)。
为方便汉字输入而形成的汉字编码为输入码,属于汉字的外码,输入码因编码办法不同而不同,是多种多样的。
为显示和打印输出汉字而形成的汉字编码为字形码,打算机通过汉字内码在字模库中找出汉字的字形码,实现其转换。
机内码
根据国标码的规定,每一个汉字都有了确定的二进制代码,但是这个代码在打算机内部处理时会与ASCII码发生冲突,为办理这个问题,把国标码的每一个字节的首位上加1。
由于ASCII码只用7位,以是,这个首位上的“1”就可以作为识别汉字代码的标志,打算机在处理到首位是“1”的代码时把它理解为是汉字的信息,在处理到首位是“0”的代码时把它理解为是ASCII码。
经由这样处理后的国标码(内码)便是机内码。
如果我们把这个“口”字图形的“.”处用“0”代替,就可以很形象地得到“口”的字形码:0000H 0004H 3FFAH 2004H 2004H 2004H 2004H 2004H 2004H 2004H 2004H2004H 3FFAH 2004H 0000H 0000H。
打算机要输出“口”时,先找到显示字库的首址,根据“口”的机内码经由打算,再去找到“口”的字形码,然后根据字形码(要用二进制)通过字符发生器的掌握在屏幕上进行依次扫描,个中二进制代码中是“0”的地方空扫,是“1”的地方扫出亮点,于是就可以得到“口”的字符图形。
汉字字模按国标码的顺序排列,以二进制文件形式存放在存储器中,构成汉字字模字库,亦称为汉字字形库,称汉字库
两种编码方法,见头文件
GB1616.h//------------------ 汉字字模的数据构造定义 ------------------------//
struct typFNT_GB16 //汉字字模数据构造
{
unsignedchar Index[3]; //汉字内码索引
unsignedchar Msk[32]; //点阵码数据
};
/////////////////////////////////////////////////////////////////////////
// 汉字字模表 //
// 汉字库: 宋体16.dot,横向取模左高位,数据排列:从左到右从上到下 //
/////////////////////////////////////////////////////////////////////////
conststruct typFNT_GB16 codeGB_16[]= //数据表
{
/------------------------------------------------------------------------------
; 源文件 /笔墨 :徐
; 宽×高(像素):16×16
------------------------------------------------------------------------------/
"徐",0x10,0x80,0x10,0x80,0x21,0x40,0x42,0x20,0x94,0x10,0x1B,0xEC,0x20,0x80,0x60,0x80,
0xAF,0xF8,0x20,0x80,0x22,0xA0,0x24,0x90,0x2A,0x88,0x21,0x00,0x00,0x00,0x00,0x00,
这个构造,很大略的:一个是内码,一个点阵序列,以前的点阵库是按内码顺序放的,不须要内码索引的,如果只放部分汉字,就须要内码索引了。
(前面的汉字“徐”是为了要输出“徐”的时候找到该字的点阵序列,这个点阵序列是自己写的,当用1602显示时,由于该芯片内存在英文的点阵序列,以是就不用写了)一样平常内码两个字节就行了,多用1个字节是加了个尾0而已,这样,汉字内码处直接放汉字字符串就可;
codeGB_16[k].Index[0]
codeGB_16[k]解释有一个构造体typFNT_GB16的数组叫做codeGB_16
codeGB_16[k]是数组中第k+1个成员
index是构造体typFNT_GB16的成员,以是可以用codeGB_16[k].Index来进行引用
同时index又是个数组,以是可以index[0]
if((codeGB_16[k].Index[0]==c[0])&&(codeGB_16[k].Index[1]==c[1]))
&&是 逻辑与运算符
意思是 &&符号的两边的值都为真 &&的值才为真,也便是 true && true =true
这句的意思是
codeGB_16[k].Index[0]==c[0] 和 codeGB_16[k].Index[1]==c[1] 同时成立
if下面的语句才实行
codeGB_16[]是个构造体数组,codeGB_16[k].Index[0]是说构造体数组的第K个构造体的index成员的第0个元素值。
13、12864液晶:
每个显示点对应一位二进制数,1 表示亮,0 表示灭。
存储这些点阵信息的RAM称为显示数据存储器。
要显示某个图形或汉字便是将相应的点阵信息写入到相应的存储单元中。
绘图RAM的地址计数器(AC)只会对水平地址(X 轴)自动加一, 当水平地址=0FH 时会重新设为00H 但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定
14、绘图RAM(GDRAM)
绘图显示RAM供应128×8 个字节的影象空间,在变动绘图RAM时,先连续写入水平与垂直的坐标值,再写入两个字节的数据到绘图RAM,而地址计数器(AC)会对水平地址(X 地址)自动加一,当水平地址为0XFH 时会重新设为00H ;不会对垂直地址做进位自动加 1. 。
在写入绘图 RAM的期间,绘图显示必须关闭,
[cpp] view plain copy
// 显示汉字
voiddispString (uchar X, Y,uchar msg) //X为哪一行,Y 为哪一列。
msg
为汉字
{
if(X==0) X = 0x80; // 第一行,汉字显示坐标
else if(X==1) X = 0x90; // 第二行
else if(X==2) X = 0x88; // 第三行
else X = 0x98; //第四行
Y = X + Y; //Y 为1 往右移一位
write_com(Y); // 写入坐标
while (msg)
{
write_data(msg++); //显示汉字
}
}
//////////////////////////////// //////////////// ///////////////
// 显示图象
voiddisppicture(uchar code adder)
{
uint i,j;
//显示上半屏内容设置
for(i=0;i<32;i++) // 上半屏32个列地址
{
write_com(0x80 + i); //SET 垂直地址 VERTICALADD
write_com(0x80); //SET 水平地址 HORIZONTAL ADD
for(j=0;j<16;j++)
{
write_data(adder);
adder++;
}
}
//显示下半屏内容设置
for(i=0;i<32;i++) //
{
write_com(0x80 + i); //SET 垂直地址 VERTICALADD
write_com(0x88); //SET 水平地址 HORIZONTAL ADD
for(j=0;j<16;j++)
{
write_data(adder);
adder++;
}
}
}
对付C措辞,定义的变量,自动为其分配空间,其地址为该变量的名称。
通过该名称,可以在内存中招到该数据,经由运算得到新数据,而汇编中须要编程者自己定义存储空间及把数据送到累加器等进走运算,每一步都须要编程者操作。
而C措辞这些过程由编译器去完成。
15、一些有用的答疑解惑
①、单片机C措辞,其变量的内存开辟是如何进行的?难道是编译器,在编译过程中智能地加入分配与回收的代码?关键之处在于我所做的程序,如何担保其没有内存溢出错误?如果我进行的是递归运算,这样的话,内存需求是很难自己打算的。
②、单片机C措辞在变量定义上是否会受到约束?比如浮点型数据的乘除运算,通过汇编还写,代码相称繁芜,如果直接C措辞来写,岂不过份大略?
③、单片机C措辞天生的hex文件中,指令及数据的ROM的地址分布是否编译器自动分配?可否用户进行分配?
回答1:c措辞写的单片机程序,先由1个程序(彷佛是c51.exe)编译,编译完成后,变量的存储空间大小已经安排好,只是还没分配详细地址(地址浮动),接下来有另一个程序(彷佛是a51.exe)进行连接,连接往后,详细地址确定。
如果变量过多,编译会提示数据段too large,要担保其没有内存溢出错误,紧张考虑堆栈是否溢出,要靠履历
单片机c措辞一样平常禁止递归,一样平常都避免用递归运算,单片机毕竟不是PC,会影响速率的,要递归的话,用DSP芯片更得当,总之,要会挑得当的芯片
回答2:变量的大小(位数)一样平常和芯片累加器的位数一样,比如51常用8位的,由于它是8位单片机
单片机可以定义位变量,但是不可以定义位数组。
用c措辞写只是看着大略,实际天生的代码量是最多的,用于掌握的单片机险些不用浮点数运算,不仅慢还麻烦还占地方,如果是DSP芯片,本身有适宜的硬件构造,会好很多。
回答3:一样平常是自动分配的,可以c措辞和汇编措辞稠浊编程,也可以用Keil C在线汇编,芯片与外部的数据交流都是通过端口进行的。