联系方式

    深圳市英瑞尔芯科技有限公司

    电话:

    186 6591 0262

    E-mail:

    sally@szinter.com.cn

    地址:

    深圳市福田区振华路现代之窗A座7B

单片机(MCU)最强科普(万字总结,值得收藏)

发布时间:2021-12-08 05:48:00

来源:http://www.szinter.com.cn/news733105.html

MCU是Microcontroller Unit 的通称,汉语叫微处理器,别名单片机设计,是把CPU的次数与规格型号做适度减缩,并将运行内存、计数、USB、A/D变换、UART、PLC、DMA等附近插口,乃至LCD光耦电路都融合在单一集成ic上,产生射频收发器的电子计算机,为不一样的运用场所做不一样组成操纵,例如手机上、PC外部、智能遥控器,至汽车电子器件、工业生产上的步进电机、机械手臂的操纵等,都可以看到MCU的影子。

硬件开发网络课程 - 内嵌式-表针 - 创客学院直播间

一、单片机设计发展趋势发展史

单片机设计发生的历史时间并不久,但发展趋势十分迅速。它的发生与发展趋势和微控制器(CPU)的发生与发展趋势大致同歩,自1971最先发布4位微控制器至今,它的发展趋势到迄今为止大概可以分成5个环节。的单片机设计发展趋势为意味着进行详细介绍。

1971年~1976年

单片机设计进行的市场经济体制。1971年11最先设计出处理速度为2000只晶体三极管/片的4位微控制器intel4004,并装有RAM、 ROM和移位寄存器, 组成了第一台MCS—4微控制器, 之后又发布了8位微控制器intel8008, 及其其他各企业陆续发布的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的容积增加,且寻址方式范畴可达 ** KB,某些片内还含有A/D变换插口。

1983年~80时期末

16位单片机设计环节。1983又发布了性能高的16位单片机设计MCS-96系列产品,因为其选用了近期的生产制造加工工艺, 使集成ic处理速度达到12万个晶体三极管/片。

1990年代

单片机设计在处理速度、作用、速率、稳定性、主要用途等多方位向更高质量发展趋势。

二、单片机设计的归类及运用

MCU按其储存器种类可分成无片内ROM型和带片内ROM型二种。针对无片内ROM型的集成ic,务必外接EPROM才可以运用(典型性为8031);带片内ROM型的集成ic又分成片内EPROM型(典型性集成ic为87C51)、MASK片内掩膜ROM型(典型性集成ic为8051)、片内Flash型(典型性集成ic为89C51)等种类。

按主要用途可分成通用性和专用;依据系统总线的间距和一次可解决的数据信息字节数长短可分成8、16、32位MCU。

现阶段,中国MCU应用商店最普遍的是消费电子产品行业,次之是制造业行业、和汽车电子城。消费电子产品包含电器产品、电视机、电子游戏机和音频视频系统等。工业生产行业包含智能家居系统、自动化技术、诊疗运用及新能源技术转化成与分派等。汽车行业包含汽车汽车动力系统和安全性自动控制系统等。

三、单片机设计的基本要素

针对绝大部分MCU,以下作用是最广泛也是最主要的,对于不一样的MCU,其叙述的方法很有可能会出现差别,但实质上是基本一致的:

1、TImer(计时器):TImer的类型尽管比较多,但可概括为两类:一类是固定不动间隔时间的TImer,即其按时的时间是由系统软件设置的,可执行程序不能操纵,系统软件只提供几类固定不动的间隔时间给可执行程序开展挑选,如32Hz,16Hz,8Hz等,该类TImer在4位MCU中非常普遍,因而可以用于完成时钟、记时等相应的作用。

另一类则是Program ** ble Timer(可编计时器),说白了,此类Timer的按时时间是可以由客户的流程来调节的,操纵的方法包含:时钟源的挑选、分频数(Prescale)挑选及预制构件数的设置等,有的MCU三者都与此同时具有,而有的则可能是这其中的一种或二种。该类Timer运用非常灵活,具体的运用也千姿百态,在其中最多见的一种运用就用其完成PWM导出。

因为时钟源可以随意选择,因而,该类Timer一般均与Event Counter(事情计数)合在一起。

2、IO口:一切MCU都有着一定数目的IO口,沒有IO口,MCU就失去与外界联系的方式。依据IO口的可配备状况,可以分成以下几类种类:

纯键入或纯导出口:该类IO口由MCU硬件开发决策,只有是键入或导出,不能用APP来开展实时监控的设置。

立即读写能力IO口:如MCS-51的IO口就归属于该类IO口。当实行读IO口命令时,便是键入口;当实行写IO口命令则全自动为导出口。

程序编写设置I/O方位的:该类IO口的键入或导出由程序流程依据具体的必须来开展设置,运用较为灵便,可以建立一些系统总线级的运用,如I2C系统总线,各种各样LCD、LED Driver的操纵系统总线等。

针对IO口的应用,关键的一点务必记住的是:针对键入口,务必有清晰的脉冲信号数据信号,保证不可以悬空(可以根据提升下拉或下拉电阻来完成);而针对导出口,其导出的情况脉冲信号务必考虑到其外面的联接状况,应确保在Standby或静态数据情况下未找到拉电流量或灌电流量。

3、外部中断:外部中断也是绝大部分MCU所具备的基本要素,一般用以数据信号的即时开启,数据信息取样和情况的检验,终断的方法由上升沿、降低沿开启和脉冲信号开启几类。外部中断一般通过键入口来完成,若为IO口,则仅有设为键入时在其中断作用才会打开;若为导出口,则外部中断作用将全自动关掉(ATMEL的ATiny系列产品存有一些除外,导出口时也可以开启终断作用)。外部中断的运用如下所示:

外界开启数据信号的检验:一种是根据实用性的规定,例如晶闸管的操纵,突发数据信号的检验等,而另一种状况则是节电的必须。

数据信号工作频率的精确测量:为了更好地确保数据信号不被忽略,外部中断是最理想化的挑选。

数据信息的编解码:在遥控器主要用途,为了更好地减少开发的成本费,常常必须使用APP的方法来对各种各样编码数据开展编解码,如Manchester和PWM编号的编解码。

功能键的检验和体系的唤起:针对进到Sleep情况的MCU,一般要根据外部中断来开展唤起,最主要的方式则是功能键,根据功能键的姿势来造成脉冲信号的转变。

4、通信插口:MCU所提供的通信插口一般包含SPI接口,UART,I2C插口等,其各自叙述如下所示:

SPI接口:该类插口是绝大部分MCU都提供的一种最基本上通讯方式,其传输数据选用同歩时钟来操纵,数据信号包含:SDI(串行通信数据信息键入)、SDO(串行通信数据源导出)、SCLK(串行通信时钟)及Ready数据信号;有一些状况下则概率沒有Ready数据信号;该类插口可以运行在Master方式或Slave方法下,简单观点便是看谁提供时钟数据信号,提供时钟的一方为Master,反过来的一方则为Slaver。

UART(Universal Asynchronous Receive Tran ** it):归属于最主要的一种异步传输插口,其电源线仅有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(串行通信数据信息I/O)和SCLK(串行通信时钟)。其较大的益处是可以在这里系统总线上建空好几个机器设备,根据详细地址来开展鉴别和浏览;I2C系统总线的一个最高的优势便是十分便捷用APP根据IO口来完成,其传送的数据速率彻底由SCLK来操纵,可快可慢,并不像UART插口,有严格要求的速度规定。

5、Watchdog(看门狗1计时器):Watchdog也是绝大部分MCU的一种基本上配备(一些4位MCU很有可能沒有此作用),大部分的MCU的Watchdog只有容许程序流程对其开展校准而不可以对其关掉(有些是在程序流程烧时尚来设置的,如Microchip PIC系列产品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、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。运用范畴:汽车电子器件、工业级、电机控制系统、汽车、楼宇智能化、电器产品、家居智能化、工控自动化、照明灯具、物联网技术、智能化电力能源、挪动电子产品、电子计算机外接设备。

中国大陆

▍中国内地地域

1、希格玛电子光学:关键提供32位MCU,运用范畴:电信网、生产制造、电力能源、交通出行、电力工程等。

2、珠海市欧比特:关键提供32位MCU,运用范畴:航天航空:星箭站船、四轴飞行器;高档工业自动化:内嵌式电子计算机;船舰操纵、工业控制系统、电气设备、环境监控系统。

3、兆易创新:关键提供32位MCU,运用范畴:工控自动化、工业触摸屏、电机控制系统、安防监控系统、智能家居系统、物联网技术。

4、晟矽电子光学:关键提供8位、32位MCU,运用范畴:小电器、消费性电子器件、智能遥控器、电脑鼠标、锂电、电子产品、汽车电子器件、医疗设备及计量检定、小玩具、工业控制系统、智能家居系统及智能安防等行业。

5、芯海科技:关键提供16、32位MCU,应用范围:仪器仪表、物联网、消费电子、家电、汽车电子。

6、联华集成电路:主要提供8位、16位MCU,应用范围:消费电子、白色家电、工业控制、通信设备、汽车电子、计算机。

7、珠海建荣:主要提供8位MCU,应用范围:家用电器 、移动电源。

8、炬芯科技:主要提供8位至32位MCU,应用范围:平板电脑、智能家居、多媒体、蓝牙、wifi音频。

9、爱思科微电子:主要提供8位、16位MCU,应用范围:消费类芯片、通讯类芯片、信息类芯片、家电。

10、华芯微电子:主要提供8位、4位MCU,应用范围:卫星接收器、手机充电器、万年历、多合一遥控器。

11、上海贝岭(华大半导体控股):主要提供8位、16位、32位MCU,应用范围:计算机周边、HDTV、电源管理、小家电、数字家电。

12、海尔集成电路:主要提供14位、15位、16位MCU,应用范围:消费电子、汽车电子、工业、智能仪表。

13、北京君正:主要提供32位MCU,应用范围:可穿戴式设备、物联网、智能家电、汽车、消费类电子、平板电脑。

14、中微半导体:主要提供8位MCU,应用范围:智能家电、汽车电子、安防监控、LED照明及景观、智能玩具、智能家居、消费类电子。

15、神州龙芯集成电路:主要提供32位MCU,应用范围:电力监控、智能电网、工业数字控制、物联网、智能家居、数据监控。

16、紫光微电子:主要提供8位、16位MCU,应用范围:智能家电。

17、时代民芯:主要提供32位MCU,应用范围:汽车导航、交通监控、渔船监管、电力电信网络。

18、华润矽科微电子():主要提供8位、16位MCU,应用范围:消费电子、工业控制、家电。

19、国芯科技:主要提供32位MCU,应用范围:信息安全领域 、办公自动化领域、通讯网络领域、 信息安全领域。

20、中天微:主要提供32位MCU,应用范围:智能手机、数字电视、机顶盒、汽车电子、GPS、电子阅读器、打印机。

21、华润微电子:主要提供8位、16位MCU,应用范围:家电,消费类电子、工业自动化控制的通用控制电路。

22、中颖电子:主要提供4位、8位、16位、32位MCU,应用范围:家电、电机。

23、灵动微电子:主要提供32位,应用范围:电机控制、蓝牙控制、高清显示、无线充、无人机、微型打印机、智能标签、电子烟、LED点阵屏等。

24、新唐科技:主要提供8位MCU,应用范围:照明、物联网等。

25、东软载波:主要提供8位、32位MCU,应用范围:家电、智能家居、仪器仪表、液晶面板控制器、工业控制等。

26、贝特莱:主要提供32位MCU,应用范围:智能家居、工业控制以及消费类产品领域。

27、笙泉科技:主要提供8位MCU,应用范围:车用、教育、工控、医疗等中小型显示面板。

28、航顺芯片:主要提供8位、32位MCU,应用范围:汽车、物联网等。

29、复旦微电子:主要提供16位、32位MCU,应用范围:智能电表、智能门锁等。

30、华大半导体:主要提供8位、16位、32位MCU,应用范围:工业控制、智能制造、智慧生活及物联网等。

▍中国台湾地区

1、宏晶科技:主要提供32位MCU。应用范围:通信、工业控制、信息家电、语音。

2、盛群半导体:主要提供8位、32位MCU。应用范围:消费电子、LED照明等。

3、凌阳科技:主要提供8位、16位MCU。应用范围:家庭影音。

4、中颖电子:主要提供4位、8位MCU。应用范围:充电器、移动电源、家电、工业控制。

5、松翰科技:主要提供8位、32位MCU。应用范围:摇控器、智能型充电器、大小系统、电子秤、耳温枪、血压计、胎压计、各类量测及健康器材。

6、华邦电子:主要提供8位、16位MCU。应用范围:车用电子、工业电子、网络、计算机、消费电子、物联网。

7、十速科技:主要提供4位、8位、51位MCU。应用范围:遥控器、小家电。

8、佑华微电子:主要提供4位、8位MCU。应用范围:录音集成电路产品、消费电子、家用产品。

9、应广科技单片机:主要提供4位、8位MCU。应用范围:机械、自动化、家电、机器人。

10、义隆电子:主要提供8位、16位MCU。应用范围:消费电子、电脑、智能手机。

五、单片机的学习窍门

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

对于指令系统,虽然形式上看似千差万别,但实际上只是符号的不同,其所代表的含义、所要完成的功能和寻址方式基本上是类似的。

要了解一款MCU,首先需要知道就是其ROM空间、RAM空间、IO口数量、定时器数量和定时方式、所提供的外围功能模块(Peripheral Circuit)、中断源、工作电压及功耗等等。

了解这些MCU Features后,接下来第一步就是将所选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的通讯,需要设定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的程序设计中,还需要特别注意的一点就是:

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

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

1、要养成总结的好习惯,总结不仅是对自己学习的一个总结,还是对学习过程的一个回顾与加深,还可避免第二次犯错。

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

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

4、出现警告不要忽视,说明该程序一定有不合理之处,要弄清其来源,找到解决办法。找来源时要有针对性,可上网搜一下该方面的资料,或向别人请教。例如,居然把另一个工程内的 ** in函数加入了这个工程。还有居然函数命名重复。还有根据实验现象分析原因,层层递进。还有端口定义时居然选错了接口。有时,实在解决不了就休息一下,在想也挺好的。再简单的地方也要注意一下,都有可能出错。

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

八、单片机开发技巧

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等测试

有时候,我们还可以模拟人为使用中,可能发生的破坏情况。例如用人体或者衣服织物故意摩擦单片机系统的接触端口,由此测试抗静电的能力。用大功率电钻靠近单片机系统工作,由此测试抗电磁干扰能力等。

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

从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。

此外在开发和应用过程中我们更要掌握技巧,提高效率,以便于发挥它更加广阔的用途。

九、芯片操作总结

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

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

通过总线连接芯片时,首先要了解该总线的协议。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、128 ** 液晶:

每个显示点对应一位二进制数,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(X0) X = 0x80; // 第一行,汉字显示坐标

else if(X1) 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在线汇编,芯片与外部的数据交换都是通过端口进行的。

https://jq.qq.com/?_wv=1027&k=7oT9MHUs (二维码自动识别)

相关标签: