爱收集资源网

英特尔8008:单片机发展的里程碑

网络整理 2023-09-30 04:02

MCU是MicrocontrollerUnit的简称,英文叫微控制器,亦称单片机,是把CPU的频度与尺寸做适当削减,并将显存、计数器、USB、A/D转换、UART、PLC、DMA等周边插口,甚至LCD驱动电路都整合在单一芯片上,产生芯片级的计算机,为不同的应用场合做不同组合控制,例如手机、PC外围、遥控器,至车辆电子、工业上的步进电机、机器手指的控制等,都可看到MCU的身影。

单片机发展导论

单片机出现的历史并不长,但发展非常迅猛。它的形成与发展和微处理器(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等集成于一块半导体芯片上的单片结构,尽管其轮询范围有限(不小于4KB),也没有串行I/O,RAM、ROM容量小,中断系统也较简单,但功能可满足通常工业控制和智能化仪器、仪表等的须要。

1980年~1983年高性能单片机阶段。这一阶段推出的高性能8位单片机普遍带有串行口,有多级中断处理系统,多个16位定时器/计数器。片内RAM、ROM的容量加强,且轮询范围可达64KB,某些片内还带有A/D转换插口。

1983年~80年代末16位单片机阶段。1983年英特尔公司又推出了高性能的16位单片机MCS-96系列,因为其采用了最新的制造工艺,使芯片集成度高达12万只晶体管/片。

1990年代单片机在集成度、功能、速度、可靠性、应用领域等全方位向更高水平发展。

单片机的分类及应用

MCU按其储存器类型可分为无片内ROM型和带片内ROM型两种。对于无片内ROM型的芯片,必须外接EPROM能够应用(典型为8031);带片内ROM型的芯片又分为片内EPROM型(典型芯片为87C51)、MASK片内掩模ROM型(典型芯片为8051)、片内Flash型(典型芯片为89C51)等类型。

按用途可分为通用型和专用型;按照数据总线的长度和一次可处理的数据字节宽度可分为8、16、32位MCU。

目前,国外MCU应用市场最广泛的是消费电子领域,其次是工业领域、和车辆电子市场。消费电子包括家用家电、电视、游戏机和音视频系统等。工业领域包括智能家装、自动化、医疗应用及新能源生成与分配等。车辆领域包括车辆动力总成和安全控制系统等。

单片机的基本功能

对于绝大多数MCU,下述功能是最普遍也是最基本的,针对不同的MCU,其描述的方法可能会有区别,但本质上是基本相同的:

1、TImer(定时器):TImer的种类似乎比较多,但可归纳为两大类:一类是固定时间间隔的TImer,即其定时的时间是由系统设定的,用户程序不可控制,系统只提供几种固定的时间间隔给用户程序进行选择,如32Hz,16Hz,8Hz等,这种TImer在4位MCU中比较常见,因而可以拿来实现时钟、计时等相关的功能。

另一类则是ProgrammableTimer(可编程定时器),顾名思义,该类Timer的定时时间是可以由用户的程序来控制的,控制的方法包括:时钟源的选择、分频数(Prescale)选择及预制数的设定等,有的MCU两者都同时具备,而有的则可能是其中的一种或两种。这种Timer应用十分灵活,实际的使用也千变万化,其中最常见的一种应用就是用其实现PWM输出。

因为时钟源可以自由选择,因而,这种Timer通常均与EventCounter(风波计数器)合在一起。

2、IO口:任何MCU都具有一定数目的IO口,没有IO口,MCU就丧失了与外部沟通的渠道。按照IO口的可配置情况,可以分为如下几种类型:

纯输入或纯输出口:这种IO口由MCU硬件设计决定,只能是输入或输出,不可用软件来进行实时的设定。

直接读写IO口:如MCS-51的IO口就属于这种IO口。当执行读IO口指令时,就是输入口;当执行写IO口指令则手动为输出口。

程序编程设定输入输出方向的:这种IO口的输入或输出由程序按照实际的须要来进行设定,应用比较灵活,可以实现一些总线级的应用,如I2C总线,各类LCD、LEDDriver的控制总线等。

对于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(UniversalAsynchronousReceiveTransmit):属于最基本的一种异步传输插口,其讯号线只有Rx和Tx两条,基本的数据格式为:StartBit+DataBit(7-bits/8-bits)+ParityBit(Even,OddorNone)+StopBit(1~2Bit)。一位数据所占的时间称为BaudRate(码率)。

对于大多数的MCU来讲,数据位的宽度、数据校准方法(奇校准、偶校准或无校准)、停止位(StopBit)的宽度及BaudRate是可以通过程序编程进行灵活设定。这种插口最常用的方法就是与PC机的并口进行数据通信。

I2C插口:I2C是由Philips开发的一种数据传输合同,同样采用2根讯号来实现:SDAT(串行数据输入输出)和SCLK(串行时钟)。其最大的用处是可以在此总线上挂接多个设备,通过地址来进行辨识和访问;I2C总线的一个最大的用处就是十分便捷用软件通过IO口来实现,其传输的数据速度完全由SCLK来控制,可快可慢,不像UART插口,有严格的速度要求。

5、Watchdog(看门狗定时器):Watchdog也是绝大多数MCU的一种基本配置(一些4位MCU可能没有此功能),大多数的MCU的Watchdog只能容许程序对其进行复位而不能对其关掉(有的是在程序烧入时来设定的,如MicrochipPIC系列MCU),而有的MCU则是通过特定的方法来决定其是否打开,如Samsung的KS57系列,只要程序访问了Watchdog寄存器,就手动开启且不能再被关掉。通常而言watchdog的复位时间是可以程序来设定的。Watchdog的最基本的应用是为MCU由于意外的故障而造成关机提供了一种自我恢复的能力。

全球主流单片机制造商

下边整理了主流厂商的单片机(可能有些遗漏),排行不分先后,

欧美地区

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、STMicroelectronics(意法半导体):英国/美国,主要提供32位MCU。应用范围:LED和普通照明、交通运输、医疗保健、多媒体融合、家电和电动工具、楼宇手动化技术马达控制、电源和功率转换器、能源和智能电网、自动化、计算机与通讯基础设施。

7、Qualcomm(联发科):日本,主要提供16位,32位MCU。应用范围:智能手机、平板笔记本、无线调制混频器。

8、TexasInstruments(泰安仪器):日本,主要提供16位、32位MCU。应用范围:车辆电子、消费电子、医疗设备、移动设备、通信。

9、Maxim(美信):日本,主要提供32位MCU。应用范围:车辆电子、消费电子、工业应用、安防。

韩国地区

1、Renesas(瑞萨):英国,主要提供16位、32位MCU。应用范围:笔记本及外设、消费类电子、健康医疗电子、汽车电子、工业、通信。

2、Toshiba(富士通):英国,主要提供16位、32位MCU。应用范围:车辆电子、工业用、电机控制、无线通讯、移动电话、电脑与周边设备、影像及音视频、消费类(电器)、LED照明、安全、电源管理、娱乐设备。

3、Fujitsu(东芝):英国,主要提供32位MCU。应用范围:车辆、医疗、机械,电器。

4、SamsungElectronics(三星电子):日本,主要提供16位、32位MCU。应用范围:车辆电子、工业用、电机控制、汽车、楼宇手动化、家用家电、家庭娱乐、工业手动化、照明、物联网、智能能源、移动电子设备、计算机外设。

中国地区

▍中国内地地区

#d:9:3:8:0:7:1:d:a:0:5:f:c:5:7:f:8:d:9:7:6:8:4:a:7:a:6:9:6:8:6:2#

▍中国大陆地区

#1:2:b:1:5:4:b:1:2:f:0:6:f:4:e:3:7:d:2:5:d:b:f:b:a:2:6:7:9:7:5:a#

单片机的学习技巧

任何一款MCU,其基本原理和功能都是邯郸小异,所不同的只是其外围功能模块的配置及数目、指令系统等。

对于指令系统,尽管方式上看似千差万别,但实际上只是符号的不同,其所代表的含意、所要完成的功能和主存方法基本上是类似的。

要了解一款MCU,首先须要晓得就是其ROM空间、RAM空间、IO口数目、定时器数目和定时形式、所提供的外围功能模块(PeripheralCircuit)、中断源、工作电流及帧率等等。

了解这种MCUFeatures后,接出来第一步就是将所选MCU的功能与实际项目开发的要求的功能进行对比,明晰什么资源是目前所须要的,什么是本项目所用不到的。

对于项目中须要用到的而所选MCU不提供的功能,则须要认真理解MCU的相关资料,以求用间接的方式来实现,比如,所开发的项目须要与PC机COM口进行通信,而所选的MCU不提供UART口,则可以考虑用外部中断的方法来实现。

对于项目开发须要用到的资源,则须要对其Manua*进行认真的理解和阅读,而对于不须要的功能模块则可以忽视或浏览即可。对于MCU学习来讲,应用才是关键,也是最主要的目的。

明晰了MCU的相关功能后,接出来就可以开始编程了。

对于初学者或初次使用此款MCU的设计者来说,可能会碰到好多对MCU的功能描述不明晰的地方,对于这种问题,可以通过两种方式来解决,一种是编撰非常的验证程序来理解资料所述的功能;另一种则可以暂时忽视,单片机程序设计中则根据自己目前的理解来编撰,留到调试时去更改和建立。前一种方式适用于时间较修身的项目和初学者,而后一种方式则适宜于具有一定单片机开发经验的人或项目进度较急迫的情况。

指令系统千万不要非常花时间去理解。指令系统只是一种逻辑描述的符号,只有在编程时按照自己的逻辑和程序的逻辑要求来查看相关的指令即可,但是随着编程的进行,对指令系统也会越来越熟练,甚至可以不自觉地记忆出来。

单片机的程序编撰

MCU的程序的编撰与PC下的程序的编撰存在很大的区别,即使现今基于C的MCU开发工具越来越流行,但对于一个高效的程序代码和喜欢使用汇编的设计者来讲,汇编语言依然是最简约、最有效的编程语言。

对于MCU的程序编撰,其基本的框架可以说是大体一致的,通常分为初始化部份(这是MCU程序设计与PC最大的不同),主程序循环体和中断处理程序三大部份,其分别说明如下:

1、初始化:对于所有的MCU程序的设计来讲,初始化是最基本也是最重要的一步,通常包括如下内容:

屏蔽所有中断并初始化堆栈表针:初始化部份通常不希望有任何中断发生。

清理系统的RAM区域和显示Memory:尽管有时可能没有完全的必要,但从可靠性及一致性的角度出发,非常是对于避免意外的错误,还是建议养成良好的编程习惯。

IO口的初始化:按照项目的应用的要求,设定相关IO口的输入输出方法,对于输入口,须要设定其上拉或下拉内阻;对于输出口,则必须设定其初始的电平输出,以防出现何必要的错误。

中断的设置:对于所有项目须要用到的中断源,应当给与开启并设定中断的触发条件,而对于不使用的多余的中断,则必须给与关掉。

其他功能模块的初始化:对于所有须要用到的MCU的外围功能模块,必须按项目的应用的要求进行相应的设置,如UART的通信,须要设定BaudRate,数据宽度,校准方法和StopBit的厚度等,而对于ProgrammerTimer,则必须设置其时钟源,分频数及ReloadData等。

参数的初始化:完成了MCU的硬件和资源的初始化后,接出来就是对程序中使用到的一些变量和数据的初始化设置,这一部份的初始化须要依据具体的项目及程序的总体安排来设计。对于一些用EEPROM来保存项目预制数的应拿来讲,建议在初始化时将相关的数据拷贝到MCU的RAM,以增强程序对数据的访问速率,同时增加系统的帧率(原则上,访问外部EEPROM就会降低电源的帧率)。

2、主程序循环体:大多数MCU是属于长时间不间断运行的,因而其主程序体基本上都是以循环的形式来设计,对于存在多种工作模式的应拿来讲,则可能存在多个循环体,互相之间通过状态标志来进行转换。对于主程序体,通常情况下主要安排如下的模块:

估算程序:估算程序通常比较历时,因而坚决反对置于任何中断中处理,非常是乘除法运算。

实时性要求不高或没有实时性要求的处理程序;

显示传输程序:主要针对存在外部LED、LCDDriver的应用。

3、中断处理程序:中断程序主要用于处理实时性要求较高的任务和风波,如,外部突发性讯号的检查,键盘的测量和处理,定时计数,LED显示扫描等。

通常情况下,中断程序应尽可能保证代码的简约和短小,对于不须要实时去处理的功能,可以在中断中设置触发的标志,之后由主程序来执行具体的事务――这一点十分重要,非常是对于低帧率、低速的MCU来讲,必须保证所有中断的及时响应。

4、对于不同任务体的安排,不同的MCU其处理的方式也有所不同:

比如,对于低速、低帧率的MCU(Fosc=32768Hz)应用,考虑到这种项目均为手持式设备和采用普通的LCD显示,对键盘的反应和显示的反应要求实时性较高,因而通常采用定时中断的形式来处理键盘的动作和数据的显示;而对于高速的MCU,如Fosc》1MHz的应用,因为此时MCU有足够的时间来执行主程序循环体,因而可以只在相应的中断中设置各类触发标志,并将所有的任务放到主程序体中来执行。

5、在MCU的程序设计中,还须要非常注意的一点就是:

要避免在中断和主程序体中同时访问或设置同一个变量或数据的情况。有效的防治方式是,将这种数据的处理安排在一个模块中,通过判定触发标志来决定是否执行该数据的相关操作;而在其他的程序体中(主要是中断),对须要进行该数据的处理的地方只设置触发的标志。――这可以保证数据的执行是可预知和惟一的。

工程师对单片机编程的总结

1、要养成总结的好习惯,总结除了是对自己学习的一个总结,还是对学习过程的一个回顾与加深,还可防止第二次错事。

2、编写程序之前先要有一个对该项目熟悉的了解,做到心里有数,列一个大致框架。仔细推敲该如何布局,如何布局最合理,该步骤很重要。要剖析先做那个模块,具体到该模块的具体步骤,各个函数如何命名,与其他模块的衔接等。最好拿张纸记下重要过程。

3、对于c语言的模块化编程,要先分好各个模块,一个模块一个模块的编程,确定一个次序,按次序来,该模块成功以后再编撰下一个。对于头文件,当该模块编撰好以后再编撰该模块的头文件。

4、出现警告不要忽略,说明该程序一定有不合理之处,要弄清其来源,找到解决办法。找来源时要有针对性,可上网搜一下该方面的资料,或向他人讨教。诸如,竟然把另一个工程内的main函数加入了这个工程。还有竟然函数命名重复。还有依据实验现象剖析缘由,层层递进。还有端口定义时竟然选错了插口。有时,实在解决不了就休息一下,在想也很好的。再简单的地方也要注意一下,都有可能出错。

在单片机应用开发中,代码的使用效率问题、单片机抗干扰性和可靠性等问题仍困惑着。现归纳出单片机开发中应把握的几个基本方法。

单片机开发方法

1.怎么减小程序中的bug

对于怎样降低程序的bug,应当先考虑系统运行中应考虑的超范围管理参数如下。

2.怎么提升C语言编程代码的效率

用C语言进行单片机程序设计是单片机开发与应用的必然趋势。假如使用C编程时,要达到最高的效率,最好熟悉所使用的C编译器。先试验一下每条C语言编译之后对应的汇编语言的句子行数,这样就可以很明晰的晓得效率。在今后编程的时侯,使用编译效率最高的词句。各家的C编译器就会有一定的差别,故编译效率也会有所不同,优秀的嵌入式系统C编译器代码宽度和执行时间仅比以汇编语言编撰的同样功能程度长5-20%。

对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求你对该MCU系统的C语言和C编译器十分熟悉,非常要注意该C编译系统所能支持的数据类型和算法。其实C语言是最普遍的一种中级语言,但因为不同的MCU厂家其C语言编译系统是有所差异的,非常是在一些特殊功能模块的操作上。所以假如对这种特点不了解,这么调试上去问题才会好多,反倒引起执行效率高于汇编语言。

3.怎么解决单片机的抗干扰性问题避免干扰最有效的方式是消除干扰源、隔断干扰路径,但常常很难做到,所以只能看单片机抗干扰能力够不够强了。在提升硬件系统抗干扰能力的同时,软件抗干扰以其设计灵活、节省硬件资源、可靠性好越来越遭到注重。

单片机干扰最常见的现象就是复位,至于程序跑飞,虽然也可以用软件圈套和看门狗将程序拉回到复位状态,所以单片机软件抗干扰最重要的是处理好复位状态。

通常单片机就会有一些标志寄存器,可以拿来判定复位缘由;另外你也可以自己在RAM中埋一些标志。在每次程序复位时,通过判定这种标志,可以判别出不同的复位诱因;还可以按照不同的标志直接跳到相应的程序。这样可以使程序运行有连续性,用户在使用时也不会察觉到程序被重新复位过。

4.怎么测试单片机系统的可靠性当一个单片机系统设计完成,对于不同的单片机系统产品会有不同的测试项目和技巧,并且有一些是必须测试的:

有时侯,我们还可以模拟人为使用中,可能发生的破坏情况。比如用人体或则外套织物故意磨擦单片机系统的接触端口,由此测试抗静电的能力。用大功率电锤紧靠单片机系统工作,由此测试抗电磁干扰能力等。

综上所述,单片机已成为计算机发展和应用的一个重要方面,单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方式。

从前必须由模拟电路或数字电路实现的大部份功能,如今已能用单片机通过软件方式来实现了。这些软件取代硬件的控制技术称作为微控制技术,是传统控制技术的一次革命。

据悉在开发和应用过程中我们更要把握方法,提升效率,以易于发挥它愈发宽广的用途。

芯片操作总结

对芯片的操作主要是对芯片内寄存器的操作,芯片内寄存器在储存器上映射的都有自己的惟一地址,这也就是对相应的地址的操作。看芯片,首先看时序图,再了解相应的寄存器,了解是怎样操作的,定义须要的端口(程序可以辨识),编撰写操作程序和读操作程序。

怎样往芯片内写入数据,怎样读出数据,通过那个端口输入或读出(最主要的地方)。

通过总线联接芯片时,首先要了解该总线的合同。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、伺服马达:(servomotor)是指在伺服系统中控制机械器件运转的底盘,是一种补贴电机间接变速装置。伺服马达可使控制速率,位置精度十分确切,可以将电流讯号转化为力矩和怠速以驱动控制对象。伺服马达定子怠速受输入讯号控制,并能快速反应,在手动控制系统中,用作执行器件,且具有机电时间常数小、线性度高、始动电流等特点,可把所收到的联通号转换成电动机轴上的角位移或角速率输出。分为直流和交流伺服电动机两大类,其主要特征是,当讯号电流为零时无自转现象,怠速随着力矩的降低而匀速下滑。直流马达:范围较大,货车上都是。

12、汉字概览:

为了将汉字在显示器或复印机上输出,把汉字按图形符号设计成点阵图,就得到了相应的点阵代码(字形码)。

为在计算机内表示汉字而统一的编码方法产生汉字编码叫内码(如国标码),内码是唯一的(相当于该字的身分证号)。为便捷汉字输入而产生的汉字编码为输入码,属于汉字的外码,输入码因编码方法不同而不同,是多种多样的。为显示和复印输出汉字而产生的汉字编码为字形码,估算机通过汉字内码在字模库中找出汉字的字形码,实现其转换。

机内码

按照国标码的规定,每一个汉字都有了确定的二补码代码,而且这个代码在计算机内部处理时会与ASCII码发生冲突,为解决这个问题,把国标码的每一个字节的首位上加1。因为ASCII码只用7位,所以,这个首位上的“1”就可以作为辨识汉字代码的标志,计算机在处理到首位是“1”的代码时把它理解为是汉字的信息,在处理到首位是“0”的代码时把它理解为是ASCII码。经过这样处理后的国标码(内码)就是机内码。

假如我们把这个“口”字图形的“.”处用“0”代替,就可以很形象地得到“口”的字形码:0000H0004H3FFAH2004H2004H2004H2004H2004H2004H2004H2004H2004H3FFAH2004H0000H0000H。计算机要输出“口”时,先找到显示字库的首址,按照“口”的机内码经过估算,再去找到“口”的字形码,之后按照字形码(要用二补码)通过字符发生器的控制在屏幕上进行依次扫描,其中二补码代码中是“0”的地方空扫,是“1”的地方扫出亮点,于是就可以得到“口”的字符图形。

汉字字模按国标码的次序排列,以二补码文件方式储存在储存器中,构成汉字字模字库,也称为汉字字形库,称汉字库

两种编码方式,见头文件

GB1616.h//------------------汉字字模的数据结构定义------------------------//

structtypFNT_GB16//汉字字模数据结构

unsignedcharIndex[3];//汉字内码索引

unsignedcharMsk[32];//点阵码数据

};

/////////////////////////////////////////////////////////////////////////

//汉字字模表//

//汉字库:粗体16.dot,纵向取模左低位,数据排列:从左到右从上到下//

/////////////////////////////////////////////////////////////////////////

conststructtypFNT_GB16codeGB_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]viewplaincopy

//显示汉字

voiddispString(ucharX,Y,uchar*msg)//X为哪一行,Y为哪一列。msg

为汉字

if(X==0)X=0x80;//第一行,汉字显示座标

elseif(X==1)X=0x90;//第二行

elseif(X==2)X=0x88;//第三行

elseX=0x98;//第四行

Y=X+Y;//Y为1向右移一位

write_com(Y);//写入座标

while(*msg)

write_data(*msg++);//显示汉字

///////////////////////////////////////////////////////////////

//显示图像

voiddisppicture(ucharcode*adder)

uinti,j;

//*******显示上半屏内容设置

for(i=0;i

write_com(0x80+i);//SET垂直地址VERTICALADD

write_com(0x80);//SET水平地址HORIZONTALADD

for(j=0;j

write_data(*adder);

adder++;

//*******显示下半屏内容设置

for(i=0;i

write_com(0x80+i);//SET垂直地址VERTICALADD

write_com(0x88);//SET水平地址HORIZONTALADD

for(j=0;j

write_data(*adder);

adder++;

对于C语言,定义的变量,手动为其分配空间,其地址为该变量的名称。通过该名称,可以在显存中招到该数据,经过运算得到新数据,而汇编中须要编程者自己定义储存空间及把数据送到累加器等进行运算,每一步都须要编程者操作。而C语言这种过程由编译器去完成。

15、一些有用的答疑解惑

①、单片机C语言,其变量的显存开辟是怎样进行的?莫非是编译器,在编译过程中智能地加入分配与回收的代码?关键之处在于我所做的程序,怎么保证其没有显存溢出错误?假如我进行的是递归运算,这样的话,显存需求是很难自己估算的。

②、单片机C语言在变量定义上是否会遭到约束?例如浮点型数据的乘除运算,通过汇编还写,代码相当复杂,倘若直接C语言来写,岂不过分简单?

③、单片机C语言生成的hex文件中,指令及数据的ROM的地址分布是否编译器手动分配?能否用户进行分配?

回答1:c语言写的单片机程序,先由1个程序(似乎是c51.exe)编译,编译完成后,变量的储存空间大小早已安排好,只是还没分配具体地址(地址浮动),接出来有另一个程序(似乎是a51.exe)进行联接,联接之后,具体地址确定。

假如变量过多,编译会提示数据段toolarge,要保证其没有显存溢出错误,主要考虑堆栈是否溢出,要靠经验

单片机c语言通常严禁递归,通常都避开用递归运算,单片机虽然不是PC,会影响速率的,要递归的话,用DSP芯片更合适,其实,要会挑合适的芯片

回答2:变量的大小(位数)通常和芯片累加器的位数一样,例如51常用8位的,由于它是8位单片机

单片机可以定义位变量,并且不可以定义位字段。用c语言写只是看着简单,实际生成的代码量是最多的,用于控制的单片机几乎不用浮点数运算,除了慢还麻烦还占地方,倘若是DSP芯片,本身有适宜的硬件结构,会好好多。

回答3:通常是手动分配的,可以c语言和汇编语言混和编程,也可以用KeilC在线汇编,芯片与外部的数据交换都是通过端口进行的。

c+上位机与下位机通信代
上一篇:华为手机通话录音,助你高效工作 下一篇:没有了