单片机

什么是嵌入式?什么是单片机?嵌入式和单片机有什么区别和联系呢?

本文针对这些问题整理了一篇文章,希望对大家理解单片机和嵌入式的基本概念,以及之间的区别有所帮助。

1、系统组成结构上的区别

(1)单片机基本结构

单片机由运算器、控制器、存储器、输入输出设备构成。

(2)嵌入式系统成部分
嵌入式系统一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统、特定的应用程序组成。

嵌入式系统设计的第一步是结合具体的应用,综合考虑系统对成本、性能、可扩展性、开发周期等各个方面的要求,确定系统的主控器件,并以之为核心搭建系统硬件平台。

2、硬件组成上的区别

单片机是在一块集成电路芯片中包含了微控制器电路,以及一些通用的输入输出接口器件。从构成嵌入式系统的方式看,根据现代电子技术发展水平,嵌入式系统可以用单片机实现,也可以用其它可编程的电子器件实现。其余硬件器件根据目标应用系统的需求而定。

3、软件组成上的区别

制造商出厂的通用单片机内没有应用程序,所以不能直接运行。增加应用程序后,单片机就可以独立运行。嵌入式系统一定要有控制软件,实现控制逻辑的方式可以完全用硬件电路,也可以用软件程序。

4、主次关系方面的区别

单片机现在已经被认为是通用的电子器件了,单片机自身为主体。嵌入式系统在物理结构关系上是从属的,嵌入式系统被嵌入安装在目标应用系统内。嵌入式系统在控制关系上却是主导的,是控制目标应用系统运行的逻辑处理系统。

尽管可以用不同方式构成嵌入式系统,但是一旦构成之后,嵌入式系统就是一个专用系统。专用系统中,可编程器件的软件可以在系统构建过程中植入,也可以在器件制造过程中直接生成,以降低制造成本。

控制逻辑复杂的单片机会需要操作系统软件支持;控制逻辑简单的嵌入式系统也可以不用操作系统软件支持。

5、系统的联系

根据IEEE的定义,嵌入式系统是用来控制或监视机器、装置或工厂等大规模系统的设备。从定义我们可以看出,实际上以前的控制装置、单片机系统应该也属于嵌入式系统的范畴。
  
我们可以这样理解,嵌入式系统是一个大类,单片机是其中一个重要的子类。嵌入式系统顾名思义就是一个嵌入在其他系统中的系统。例如汽车系统中嵌入姿态控制系统,就可以使汽车驾驶更安全,更有效;电源系统内引入自动控制系统,能够让电源工作的更稳定。这里的姿态控制系统和电源的自动控制系统就属于嵌入式系统。
  
单片机形成的系统一般是用于自动化,工业控制功能的,这些功能一般不会独立运用,是需要和其他系统配合的,因此从广义上讲,单片机应用一般属于嵌入式系统的一个分支。

目前由于嵌入式系统应用广泛,因此还有不是单片机的嵌入式系统,例如手机,是在手机的基本功能上(通话、短信)加入了应用处理器,使其功能更加强大,但是由于制造工艺的问题,高端手机还不能做到全部一片集成(一片集成的那个是山寨机),但是也属于嵌入式系统的一个分支。

内容整理自网络,版权归原作者所有,如涉及作品版权问题,请联系删除!

围观 18

新型加密单片机、定制固件和配置服务支持平台在运行之前检测和终止恶意程序

随着包括新型蜂窝基础架构在内的5G技术飞速发展,越来越多的网络和数据中心支持云计算功能的扩展,开发人员开始寻找能保障操作系统安全的新方法。Microchip Technology Inc.(美国微芯科技公司)今日发布新型加密单片机CEC1712。这款由加密技术支持的单片机配备Soteria-G2定制固件,可终止通过外部串行外设接口(SPI)闪存启动的系统中的Rootkit和Bootkit等恶意程序。

Microchip的Soteria-G2定制固件基于功能全面的CEC1712 Arm® Cortex®-M4处理器,以预启动模式,凭借硬件信任根保护为通过外部SPI闪存启动的操作系统提供安全启动功能。此外,在系统的使用期限内,这款单片机还提供密钥撤销和代码回卷保护功能,可实施现场安全更新。这款单片机符合NIST800-193指南的规定,可防范、检测、修复损害,保障系统平台固件的整体可靠性。安全启动功能和硬件信任根对系统防范威胁,防止威胁因素载入系统过程中至关重要,它们只允许系统使用制造商信任的软件进行启动。

Soteria-G2固件与CEC1712 单片机结合使用,可简化代码开发工作,减少风险,帮助设计人员更快速地采用和实现安全启动功能。Soteria-G2固件将只读内存(ROM)中实现的CEC1712不可变安全自举程序作为系统信任根。

Microchip计算产品部副总裁Ian Harris表示:“Rootkit是一种非常隐蔽的恶意程序,它在操作系统启动之前加载,可以躲开常规的反恶意程序软件,而且很难检测。防范Rootkit的一种方法是使用安全启动功能。CEC1712单片机和Soteria-G2固件旨在防范威胁,防止威胁因素载入系统。”

CEC1712安全自举程序可加载、解密和验证通过外部SPI闪存在CEC1712单片机上运行的固件。之后,经验证的CEC1712代码对首个应用处理器的SPI闪存中存储的固件进行验证。CEC1712单片机最多支持两个应用处理器,每个应用处理器配备两个闪存组件。Microchip或Arrow Electronics提供客户专用数据预配置选项。该选项是一种安全的制造解决方案,有助于防范过度创建和伪造行为。除了可将开发时间缩短几个月之外,该选项还能大幅简化配置逻辑,让客户可以方便地保障设备安全并管理设备,且不会产生第三方配置服务费用、认证费用等间接费用。

Arrow Electronics物联网副总裁Aiden Mitchell表示:“为Microchip某些旗舰产品提供安全配置服务是我们产品的重要组成部分。Soteria-G2固件和CEC1712单片机用于保护系统。随着我们进入5G时代并接触越来越多的联网解决方案和自动机器,客户对此类产品的需求将越来越大。”

除了在5G和数据中心操作系统预启动期间防范恶意程序之外,CEC1712单片机和Soteria-G2固件还能帮助互联自动驾驶汽车的操作系统、车用高级驾驶辅助系统(ADAS)及其他通过外部SPI闪存启动的系统提升安全性。

开发工具

CEC1712单片机和Soteria-G2套件提供多种软硬件支持选项。软件支持包括Microchip的 MPLAB® X IDE、MPLAB Xpress和MPLAB XC32编译器。硬件支持功能包含在编程器和调试器中(包括MPLAB ICD 4 和PICkit™ 4编程器/调试器)。

供货与定价

CEC1712H-S2-I/SX单片机(含Soteria-G2固件)已实现量产,10,000枚起售,单价为4.02美元。如需了解更多信息,请联系Microchip销售代表、全球授权分销商或访问Microchip网站。如需了解配置服务的定价,请通过secure.provisioning@arrow.com联系Arrow Electronics。如需购买文中提到的产品,访问Microchip直销网站

资源

可通过Flickr或联系编辑获取高分辨率图片(可免费发布):
应用图:www.flickr.com/photos/microchiptechnology/49548114798/

Microchip Technology Inc. 简介

Microchip Technology Inc.是致力于智能、互联和安全的嵌入式控制解决方案的领先供应商。 其易于使用的开发工具和丰富的产品组合让客户能够创建最佳设计,从而在降低风险的同时减少系统总成本,缩短上市时间。Microchip的解决方案为工业、汽车、消费、航天和国防、通信以及计算市场中12万多家客户提供服务。Microchip总部位于美国亚利桑那州Chandler市,提供出色的技术支持、可靠的产品交付和卓越的质量。详情请访问公司网站 www.microchip.com

围观 32

单片机的一个主要作用就是数据信息的处理,而在处理数据的过程中,需要一些“容器”来存放这些数据。这就好比烧饭要用到锅碗瓢盆一样。在这里,我们称这些“容器”为“存储器”。

存储器的物理实质是一组(或多组)具备数据输入/输出和数据存储功能的集成电路,用于充当设备缓存或保存同定的程序及数据。存储器按存储信息功能的不同,可分为只读存储器ROM和随机存储器RAM

ROM即只读存储器。ROM中的信息一次写入后只能被读出,而不能被操作者修改或删除。一般用于存放固定的程序或数据表格等。

不能被操作者修改或删除。一般用于存放固定的程序或数据表格等。

当然,“只读”这个“传统”的概念有时是可以被一些新特性的器件颠的。下面介绍的这两种类型的ROM就可以使用适当的方法进行擦除或改写。

1.EPROM

EPROM 与一般的ROM的不同点在于,它可以用特殊的装置擦除或重写其中的内容。

2.闪存FLASH

闪速存储器,又称PEROM, 它是完全非易失的,可以在线写入,并且可以按页连续字节写入,读出速度快。

RAM即随机存储器。这就是我们平常所说的内存,主要用来存放各种现场的输入/输出数据、中间计算结果,以及与外部存储器交换信息,或是作堆桟用。它的存储单元根据具体需要可以读出或改写。

RAM只能用于暂时存放程序和数据。一旦电源关闭或发生断电,RAM中的数据就会丢失。而ROM中的数据在电源关闭或断电后仍然会保留下来。这也许就是二者最大的区别吧。

本文转自:畅学电子,转载此文目的在于传递更多信息,版权归原作者所有。

围观 58

单片机应用系统中,常有用单片机的I/O口来实现自关机(彻底关机)的功能。一般用单片机的一个I/O口控制一个电子开关来实现,因单片机关电后,失去电源,所以在关机时,实现关机的IO口的电平必须用低电平。

但在这里有一个矛盾,就是在电子开关关闭电源时,因有电源滤波电容的存在,单片机系统的电压不是立即变为0,而是慢慢变低,当电压低到一定电压时,单片机 将进入复位状态、或程序跑飞状态、或不确定状态,此时单片机控制关电的I/O口也可能变回高电平,将使电子开关重新开通。

解决方法:

一般单片机最低工作电压要比正常工作的电压低一些,我们就用这个差别来设计关机电路,就是让电子开关的开通电压必须大于单片机的最低工作压,这样在单片机正常工作时,此控制电压较高,能维持电子开关的正常导通,而当单片机在关电过程中因低压而产生的I/O口的高电平,因电压较低,不足以维持电子开关的导通, 从而实现彻底的关电。


在关机状态时:

S1按下,Q2导通,单片机工作后,POWER输出高电平,Q1导通,维持Q2的导通实现开机。

在开机状态时:

1、软件关机:MCU的POWER引脚输出低电平,Q1截止,Q2关断,关机。(一般用于延时关机,象数字万用表即是)

2、S1按下,低电平通过D3使MCU的输入脚ON-OFF电平为低,MCU检测到后,通过软件关机(如1所述)

D3用于隔离,不然关机状态时MCU的ON-OFF脚为低电平,Q2将导通。

POWER 是单片机输出开关电源的,低电平是0,高电平等于单片机的供电电压(近似)

ON-OFF是单片机的输入脚,用于单片机检测S1的状态,如果不用S1关机ON-OFF脚可以不用。

来源:电子发烧友网,转载此文目的在于传递更多信息,版权归原作者所有。

围观 44

一些单片机内置硬件SPI功能,如STC15F2K60S2和昇泉MPC82G516,本文以后者为例,记述了用单片机SPI硬件功能向4位数码显示模块发送串行显示数据的应用过程。重点介绍了硬件SPI的结构功能、发送时序和应用要点,并专门介绍了SPI主机的时钟极性和相位极性,及如何根据从机硬件特点来确定主机参数。

一、 SPI协议简介

SPI是英语Serial Peripheral interface的缩写,中文是串行外围设备接口。主要应用在MPU与 EEPROM、FLASH、实时时钟、AD转换器等外设之间传输串行数据。

SPI总线占用四根线,分别是时钟线SPICLK、数据线MISO和MOSI、以及从机选择线/SS,如下图。主机是发起传输的设备,也即产生时钟脉冲的设备,从机在脉冲的作用下被动的接收或发送数据。SPI是双向传输协议,主机和从机在脉冲同步下是互为收发数据的。如果数据仅从主机向从机单向传送,则可省略MISO线。


总线上至少配置一主一从,也可以挂接多个主机或从机。主机多由MPU担任。总线可配置为:
1. 一主一从:可直接将从机SS端接低电平,可节省MPU一个IO口。
2. 二个主机: 2个MPU都配置成主机时,两机SS端直连。发起传输的主机拉低SS线,能把对方强制改为从机。
3. 一主多从:主机用不同I/O口接各从机SS端来实现片选。

二、 硬件介绍

1. 本应用采用一主一从配置。主机是单片机,从机是4位数码管显示模块。该模块不具备完整SPI功能,但能接收SPI串行数据。另外,模块需要占用单片机一个I/O来锁存输出信号。

2. 单片机MPU采用昇泉MPC82G516,内置硬件SPI功能,各引脚功能是:P1.7为脉冲SPICLK,P1.5为数据MOSI。P1.4为片选SS,P1.6为数据MISO。芯片属于51系列,与STC15系列大同小异。但其独特之处在于内置OCD接口(即片上调试功能,On-Chip Debug),可以实现不占用片上资源的在系统调试,能真正实现单步仿真。

3. 4位数码显示模块,采用2片595驱动,分别用于输出数码管的段码和位码。模块有5根针脚,除了电源VCC和GND,3根数据线分别是时钟线CLK、数据线DIO和锁存RCK。如果需要,用2个模块级联可实现8位显示。


三、 发送流程

1. SPI功能由单片机内置硬件实现,每次可发送一个字节。发送指令很简单,只要向SPI数据寄存器SPIDAT写入一个字节即可。单片机执行到该指令后,硬件会自动按照初始化配置,输出脉冲和数据。

2. SPI收发由硬件自动控制进行,发送一个字节的时间,根据SPI时钟频率的设置,约占15-450个机器周期。SPI硬件发完一个字节会置位SPIF标志,并申请中断(如果中断允许)。因此不能连续写SPI,当前一字节未发完时写入数据时,就会造成冲突。发生冲突后,SPI硬件置位冲突标志位WCOL,丢弃新写入的数据,继续完成原字节的发放。

3. SPIF与WCOL是SPI状态寄存器SPISTAT的2个标志位,编程时要注意其特点是“置1清0”。

SPSTAT (地址=84H, SPI状态寄存器, 复位值=00xx,xxxxB)

7.SPIF( 传输完成标志)

6.WCOL (写冲突标志)

4. SPI硬件单次只发送一个字节。连续发送多个字节,需要用户编程实现,方法一是写指令后,将SPIF置1清0,再循环判断SPIF,等SPIF为1后再发下一字节;方法二是使用SPI中断,在中断服务程序清SPIF,再发下一字节。

四、 SPI参数配置

参数配置通过控制寄存器SPICTL来实现,各控制位的定义如下表及说明。

SPCTL (地址=85H, SPI控制寄存器, 复位值=0000,0100B)


1. 单片机作主机,因此SSIG=1,MSTR=1。

2. 脉冲和相位极性CPOL和CPHA根据从机接收特性来确定。595芯片在“时钟CLK上升沿时采样移入数据”,假设使用正脉冲,则上升沿是其前沿,因此参数取00。如果采用负脉冲,则上升沿为后沿,参数取11。

3. 其他参数比较容易确定:SPEN=1启用SPI功能。DORD根据从机电路确定。SPR1、SPR0取00、01、10、11时,SPI时钟频率为3M、750K、187.5K和93.75K,而595芯片时钟频率可达25M。

五、 数据寄存器的读写

数据寄存器SPIDAT,地址=86H, 复位值=0000,0000B。因其内部SPI硬件实际有3个寄存器,如下图,两个缓冲器共享同一地址,但读写时操作的是不同的寄存器。

发送方向是单缓冲,只有一个发送缓冲器,因此写指令SPIDAT=X执行时,X写入的是该缓冲器,同时启动发送,数据逐位移出到MOSI线上。

接收方向是双缓冲,数据先移入接收移位寄存器,然后传输到并行读数缓冲器中。计时执行读指令X=SPIDAT,读到的X就是该缓冲器的值。该缓冲器在下一字节接收到后被刷新,因此必须及时读取。双缓冲的设计让用户不用担心读到正在移位的中间值。


六、 实际传输时序图解

模块采用了动态扫描驱动方式,每隔1ms刷新显示1位数码管,下图就是用逻辑分析仪采集的一次刷新时序,可见主机发送了2个字节,前一字节是段码,后一字节是位码。图中标示了一个字节发送的各个步骤。


第1行信号为SPI时钟,时钟极性设置为CPOL=0,表示待机时为低电平,脉冲为高电平。时钟相位设置为CPHA=0,表示脉冲前沿为上升沿(从机采样读取数据)、脉冲后沿为下降沿(主机放数据)。第2行信号为SPI数据,在逻辑分析仪软件中指定SPI协议后,软件能识别出数据内容并用蓝色条标示。第3、4两行与SPI协议无关,用于观察写指令及进出中断的时间。第5行是595芯片的锁存信号,上升沿时锁存并输出。
该传输采用了较慢的时钟频率,可以看出传输占时较长。如果MPU任务繁重,应采用中断方式来处理连续发送。

七、 SPI的脉冲、相位极性

SPI协议允许用户定义脉冲和相位极性,共有4种组合。使用哪种输出,取决于从机。下面列出了4种组合发送时序。根据595“上升沿采样”的特性,组合 00、11都符合要求,实测组合10也能正常驱动显示模块,但组合01无效。


脉冲1相位0组合:负脉冲(待机高电平),前沿(下降沿)采样。此时,主机是下降沿采样,但模块的595总是在上升沿时采样,之所以这种方式模块也能识别出正确数据,是因为主机的数据是在脉冲后沿(上升沿)后变更的,此时从机已完成采样。


八、 调试中问题记录及分析

1. 逻辑分析仪采集“锁存RCK信号”时出现干扰(出现少量随机低电平脉冲)

用逻辑分析仪测量,RCK路多出现干扰,但显示模块工作正常。说明SPI硬件发送及显示模块的595芯片接收、识别RCK信号都正常,只是逻辑分析仪采集时识别错误。于是从硬件、软件多处查找问题:

1) 开必板:更换不同晶振、更换开发板、改用MPU其他IO口
2) 分析仪:切换不同输入端、采集点从MPU引脚改到显示模块上、重启分析仪、设置不同采样频率
3) 线路:将RCK采集线远离时钟线等
4) 软件:设置不同的SPI时钟、加大RCK锁存脉冲宽度

但问题依旧。查逻辑分析仪资料,得知:逻辑分析仪有三个重要参数:阈值电压、采样率和采样深度。其中阈值电压是分析区分高低电平的重要参数。逻辑分析仪和单片机都是数字电路,它在读取外部信号的时候,多高电压识别成高电平,多高电压识别成低电平是有一定限制的。比如一款逻辑分析仪,阈值电压是:0.7~1.4V,那么当它采集外部的数字电路信号的时候,高于1.4V识别为高电平,低于0.7V识别为低电平。

RCK信号平时高电平,工作脉冲为低电平。干扰为随机低电平脉冲,说明输出高电平电压时可能偏低,有可能是供电不足所致。而开发板与仿真器都由调试仿真器的USB线供电,实际调试时也可见数码管显示暗淡。当给开发板单独供电后,逻辑分析仪采集信号正常!

2. 中断入口编号问题

写SPI中断服务程序时,从单片机数据手册查到中断号为9#。但调试程序时,始终无法进入中断,后来想到手机中断编号从#1到#14,而C语言可能是从#0到#13,将中断入口号修改为8,程序正常。

九、 代码(查询方式)

给出查询方式的代码,程序执行效果是4位数码管显示按秒加法计数值。

//本程序用SPI功能驱动4位数码管显示模块。使用SPI接口线:
// P1.7 SPICLK 脉冲 与模块上SCLK相连
// P1.5 MOSI 数据线 与模块上DIO相连
// 另外使用P1.3输出595的锁存信号,与模拟上的RCLK相连
// 595使用要点:脉冲SCK上升沿时采集移入数据,锁存RCK上升沿时锁存输出
// SPI主机传送模式,时钟和相位极性设置为00或11时均可

#include
unsigned char code LedChar[] = { //数码管段码字符转换表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
unsigned char code segbit[]={ //8位数码管位码表,本例根据电路仅用4位
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char LedBuff[4]={0,0,0,0}; //数码管显示缓冲区

sbit RCK=P1^3; //锁存信号,上升沿有效
sbit LED=P1^0; //标记1,用于调试
sbit LED_P11=P1^1; //标记2,用于调试
sbit LED_P12=P1^2; //标记3,用于调试

unsigned char i = 0; //动态扫描的索引
unsigned int cnt = 0; //记录 T0 中断次数
unsigned long sec = 0; //记录经过的秒数

void LED_OUT(unsigned char X)
{
LED_P11=!LED_P11; //
SPIDAT = X; //写一个字节到SPI发送缓冲区
while(!(SPISTAT & 0x80)); //查询SPIF标志位,为0时循环等待,为1时退出往下
LED_P11=!LED_P11;
SPISTAT = 0x80; //对SPIF标志位 写1置0
}

void Timer0_isr(void) interrupt 1 using 1
{
TH0 = 0xFC; //T0初值,定时 1ms
TL0 = 0x18;
cnt++; //计数值自加 1
//以下代码动态扫描刷新1位数码管显示
i++; //i从0到3循环,每次刷新1位显示
if (i == 0)
{ LED_OUT(LedBuff[0]);LED_OUT(0x01); } //发送段码、位码
else if (i == 1)
{ LED_OUT(LedBuff[1]);LED_OUT(0x02); }
else if (i == 2)
{ LED_OUT(LedBuff[2]);LED_OUT(0x04); }
else if (i == 3)
{ LED_OUT(LedBuff[3]);LED_OUT(0x08);i=0xFF; } ; //修改循环变量i
RCK=0; //向595芯片发锁存脉冲信号
RCK=1;
}

void main()
{
TMOD = 0x01; //设置T0为模式1:16位定时器,脉冲默认12T模式
TH0 = 0xFC; //为 T0 赋初值 0xFC67,定时 1ms
TL0 = 0x18;
//设置SPI控制寄存器:
SPICTL=0xD0; //高4位1101:SSIG:内控模式,1:由MSTR决定主从模式。
// SPEN:SPI功能开关,1:打开
// DORD:SPI数据顺序,1:LSB,0:MSB
// MSTR:主从机模式,1:主机
//低4位0000:CPOL时钟极性,0待机低电平,前沿上升沿,后沿下降沿
// CPHA:时钟相位,当SSIG=1时,CPHA必须为0
// SPR1/SPR0:时钟速度分别为4/16/64/1 28分频
//AUXIE |= 0x01; //开启SPI中断,APUXIE.0位为ESPI
//AUXIP |= 0x01; //SPI中断优先级为1级
//AUXIPH |= 0x01; //SPI中断优先级提为3级
//IP &= 0xFD; //T0中断优先级为0级
//IPH &= 0xFD; //T0中断优先级为0级

EA=1; //开总中断
ET0=1; //开T0中断
TR0 = 1; //启动 T0
i=0; //初始化三个全局变量
cnt=0;
sec=0;
LedBuff[0] = 0xC0; //初始化4个显示缓存
LedBuff[1] = 0xC0;
LedBuff[2] = 0xC0;
LedBuff[3] = 0xC0;
while (1)
{
if (cnt >= 1000) //T0溢出1000次为1秒
{
cnt = 0; //计数值复位
sec++; //秒计数自加 1
LED=~LED; //指示灯反相(P1.0如果接有LED可观察到闪烁)
//秒值转换为4位十进数,再查表得到段码送缓存
LedBuff[0] = LedChar[sec];
LedBuff[1] = LedChar[sec/10];
LedBuff[2] = LedChar[sec/100];
LedBuff[3] = LedChar[sec/1000];
}
}
}

来源:http://blog.sina.com.cn/s/blog_57ad1bd20102x8zy.html
转载此文目的在于传递更多信息,版权归原作者所有。

围观 1226

许多小伙伴在学完C语言后想入门单片机,但学着学着发现明明都是C语言,为什么单片机C语言和我当初学的C语言有差异呢?今天小编就来梳理我们平时所学的C语言与单片机C语言的有什么样的不同。

单片机c语言比起普通C语言增加了一些基本的指令,变量的赋值是16进制,当然单片机c语言只牵涉到普通c语言的基础部分。

具体体现在:

1.单片机中C的语法一般都对 ANSI C有些扩展,及一些特殊写法 如C51扩展的 data xdata bit sbit 一类的,还有一些中断程序写法 void int() interrput 1 一类的。

2.C是一门语言,由对应平台的编译器编译成对应平台汇编的程序,各平台的汇编不一样,当然编译器也不一样 DOS上的TC2 TC3 WINDOWS上的VC 8051的C51都有自已的编译器 。具体区别是由编译器决的,只能参考对应的编译手册,即使同种平台不同的编译器对C的扩展也有不同。

3.单片机c语言编程是基于C语言的单片机编程。单片机的C语言采用C51编译器(简称C51)。由C51产生的目标代码短、运行速度高、存储空间小、符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言PL/M51语言目标代码混合使用。

C51本质就是C,是为在单片机上使用C而出来的,如果C不牢固,还是多掌握一点C再学C51,不过新增的知识也不少,而且基本上跟C无关。

4.C只是一种高级语言。它除具有一般高级语言的功能特性外,它可以很好的操作底层的硬件接口。在C语言的基础上,如果你把一些单片机的端口或特殊功能寄存器加于定义,使之方便于在 写语句的时候,直接直观的编写。这样就差不多是单片机C语言。

结语:C语言是我们入门编程所学习的一门语言,也是IOS开发、单片机开发等应用上具有重要应用的一门语言,虽然C语言与单片机C语言、C++、C#等有或小或大的差异,但他们的编译机理、表达形式都是一样的!

来源:https://segmentfault.com/a/1190000020185943

围观 88

单片机应用中,常常会遇到这种情况,在用单片机制作电子钟或要求根据时钟启控的控制系统时,会突然发现当初校准了的电子时钟的时间竟然变快或是变慢了。

于是,尝试用各种方法来调整它的走时精度,但是最终的效果还是不尽人意,只好每过一段时间手动调整一次。那么,是否可使时钟走时更精确些呢?现探讨如下:

一、误差原因分析

1.单片机电子时钟的计时脉冲基准,是由外部晶振的频率经过12分频后提供的,采用内部的定时,计数器来实现计时功能。所以,外接晶振频率的精确度直接影响电子钟计时的准确性。

2.单片机电子时钟利用内部定时,计数器溢出产生中断(12MHz晶振一般为50ms)再乘以相应的倍率,来实现秒、分、时的转换。大家都知道,从定时,计数器产生中断请求到响应中断,需要3_8个机器周期。定时中断子程序中的数据人栈和重装定时,计数器的初值还需要占用数个机器周期。此外。从中断人口转到中断子程序也要占用一定的机器周期。例如:


从上述程序可以看出,从中断人口到定时/计数器初值的低8位装入需要占用2+2+2=6个机器周期。所以,在编程时一般会把这6个机器周期加入定时/计数器的初值中。但是,从定时,计数器溢出中断请求到执行中断需要几个机器周期(3~8个机器周期)。就很难确定准确值,正是这一原因导致了电子时钟计时的不准。

二、解决方法

1、采用高精度晶振方案

虽然采用高精度的晶振可以稍微提高电子钟计时的精确度,但是晶振并不是导致电子钟计时不准的主要因素,而且高精度的晶振价格较高,所以不必采用此方案。

2、动态同步修正方案
从程序人手,采用动态同步修正方法给定时,计数器赋初值。动态同步修正方法如下:由于定时,计数器溢出后,又会从O开始自动加数,故在给定时/计数器再次赋值前,先将定时,计数器低位(TLO)中的值和初始值相加,然后送人定时,计数器中,此时定时,计数器中的值即为动态同步修正后的准确值。具体程序如下:


采用此种方法后,相信制作的电子时钟的精度已有提高了。

3、自动调整方案

采用同步修正方案后,电子时钟的精度虽然提高了很多,但是由于晶振频率的偏差和一些其他未知因素的影响(同一块电路板、同样的程序换了一片单片机后,走时误差不一样,不知是何原因),时间长了仍然会有积累误差。为此,可采用自动调整方案。实际上是一种容错技术。其自动调整原理为:实测出误差Is所需的时间,然后每隔这样一段时间后就对秒进行加“1”或减“1”调整。例如:电子钟每过50小时就慢1秒,其自动调整程序如下:


以下是一个完整实例:



结语

使用此方法调整较费时间,但效果非常好。经实验,一次调整可/以将月误差控制在Is左右,如按此方法再次测出误差Is所需的天数并进行二次调整,其精度会更高。

来源:网络

围观 41

页面

订阅 RSS - 单片机