单片机

1基本原则

质量是关键。没有人会对很差的工作感到满足。当完成高质量的工作时,你会为此而感到骄傲。不管你是否知道,你都会因为你的高质量工作而得到信誉。因此,要想为自己所做的事感到骄傲,就需要建立个人标准,并为达到这一标准而努力奋斗。在达到这些标准时,再提高标准并继续努力。挑战自己去完成更优良的工作,你将会为自己的成就而感到惊讶。

1.1 了解单片机的能力

【规则1】设计满足要求的最精简的系统。

正确估计单片机的能力,知道单片机能做什么,最大程度的挖掘单片机的潜力对一个单片机系统设计者来说是至关重要的。我们应该有这样一个认识,即单片机的处理能力是非常强大的。早期的PC 机,其CPU(8086)处理能力和8051 相当,却能处理相当复杂的任务。单片机的能力的关键就在软件设计者编写的软件上。只有充分地了解到单片机的能力,才不会做出“冗余”的系统设计。而采用许多的外围芯片来实现单片机能实现的功能。这样做即增加了系统成本,也可能会降低了系统的可靠性。

1.2 系统可靠性至关重要

【规则2】使用看门狗。

看门狗电路通常是一块在有规律的时间间隔中进行更新的硬件。更新一般由单片机来完成,如果在一定间隔内没能更新看门狗,那看门狗将产生复位信号,重新复位单片机。更新看门狗的具体形式多是给看门狗芯片相关引脚提供一个电平上升沿或读写它的某个寄存器。使用看门狗电路将在单片机发生故障进行死机状态时,重新复位单片机。当前有多种看门狗的芯片。而且,有好多种单片机中本身就集成有看门狗。一个外部的看门狗是最好的,因为它不依赖于单片机。如果可能的话,看门狗更新程序不应该放在中断或是子程序中,原则上应该放在主程序中。我曾经见过一个工程师,他所调试的程序在运行时偶而会引起看门狗的复位动作,于是他干脆在每10ms 就中断一次的时钟中断程序中清看门狗。我相信他也知道使看门狗失去作用,可他却没有不是去查明引起这个现象的真正原因。因此,我想提醒大家:不论什么理由,绝对不要忽略系统故障的真正原因。高质量的产品来自于高素质的工程师,高质量的产品造就高素质的工程师。

【规则3】确定系统的复位信号可靠。

这是一个很容易忽略的问题。当你在设计单片机系统时,你脑中有这个概念吗?什么样的复位信号才是可靠的吗?你用示波器查看过你设计的产品的复位信号吗?不稳定的复位信号可能会产生什么样的后果?你有没有发现过你所设计的单片机系统,每次重新上电启动后,数据变得乱七八糟,并且每一次现象并不相同,找不出规律,或者有时候干脆不运行,或者有时候进入一种死机状态,有时候又一点事都没有正常运行?在这种情况下,你应该查一下你的系统的复位信号。一般在单片机的数据手册(Datasheet)中都会提到该单片机需要的复位信号的要求。一般复位信号的宽度应为。复位电平的宽度和幅度都应满足芯片的要求,并且要求保持稳定。还有特别重要的一点就是复位电平应与电源上电在同一时刻发生,即芯片一上电,复位信号就已产生。不然,由于没有经过复位,单片机中的寄存器的值为随机值,上电时就会按PC 寄存器中的随机内容开始运行程序,这样很容易进行误操作或进入死机状态。

【规则4】确定系统的初始化有效。

系统程序开始应延时一段时间。这是很多单片机程序设计中的常用方法,为什么呢?因为系统中的芯片以及器件从上电开始到正常工作的状态往往有一段时间,程序开始时延时一段时间,是让系统中所有器件到达正常工作状态。究竟延时多少才算合适?这取决于系统的各芯片中到达正常工作状态的时间,通常以最慢的为准。一般来说,延时20-100 毫秒已经足够。对于系统中使用嵌入式MODEM 等“慢热”型的器件来说,则应更长。当然,这都需要在系统实际运行中进行调整。

【规则5】上电时对系统进行检测。

上电时对系统中进行检测是单片机程序中的一个良好设计。在硬件设计时也应该细细考虑将各个使用到的芯片、接口设计成容易使用软件进行测试的模式。很多有经验的单片机设计者都会在系统上电时(特别是第一次上电时)进行全面的检测,或者更进一步,将系统的运行状态中分为测试模式和正常运行模式,通过加入测试模式对系统进行详细的检测,使得系统的批量检测更为方便容易。另外要注意的是,一个简单明了的故障显示界面也是颇要费得心思的。比如:系统的外部RAM(数据存储器)是单片机系统中常用的器件。外部RAM 如果存在问题,程序通常都会成为一匹脱缰的野马。因此,程序在启动时(至少在第一次上电启动时)一定要对外部RAM 进行检测。检测内容包括:1)检测RAM 中的单元。这主要通过写入和读出的数据保持一致。

2)检测单片机与RAM 之间的地址数据总线。总线即没有互相短路,也没有连接到“地”上。另外,很多芯片,都提供了测试的方法。如串行通信芯片UART,都带环路测试的功能。

【规则6】按EMC 测试要求设计硬件。

EMC 测试要求已经成为产品的必需。有很多的文章关于这方面的。

1.3 软件编程和调试

【规则7】尽可能使用Small 模式编译

对比起Large 模式和Compact 模式,Small 模式能生成更为紧凑的代码。在Small模式下,C51 编译器将没有使用关键词,如idata、pdata、xdata 特殊声明的变量通通放在data 单元中。在编程中,对于在的数据区,可以指定放在外部存储器中。

【规则8】在仿真前做好充分的准备

单片机硬件仿真器给单片机开发者带来了极大的方便,同时也很容易造成人的依赖性。很多时候,没有仿真器却能促使工程师写出更高质量的程序。也许在硬件仿真调试之前,下面准备工作将会对你有用:

1)程序编完后,对代码仔细逐行检查。检查代码的错误,建立自己的代码检查表,对经常易错的地方进行检查。检查代码是否符合编程规范。

2)对各个子程序进行测试。测试的方法:用程序测试程序,编制一个调用该子程序的代码,建立要测试子程序的入口条件,再看看它是否按预期输出结果。

3)如果代码有修改,再次对代码进行检查。

4)有可能的话,进行软件仿真——Keil C 的软件仿真功能十分强大。软件仿真可以防止因硬件的错误,如器件损坏、线路断路或短路,而引起调试的错误。

5)开始硬件仿真。

【规则9】使用库函数

重用代码,尤其是是标准库的代码,而不是手工编写你自己的代码。这样更快、更容易也更安全。KeilC 中提供了多个库函数,这些库函数的用法在KeilC 的帮助文件中有详细的描述。

【规则10】使用const。

这一点在很多经典的关于C 和C++的书籍中是必谈的要点。在《Exceptional C++》一书中,对这点有很精彩的描述,现摘录如下:“没有正确的安全意识的枪手在世界上是不可能活的很长的。const 观念不正确的程序员也是一样和没有时间戴紧帽子的正确,没有时间检查带电电线的电工一样不会活的很长。”在C 语言中,const 修饰符表示告诉编译器此函数将不会改变被修饰的变量的指向的任何值(除了强制类型转换)。当把指针作为参数传递时,总是合适地使用const,不仅可以防止你无意中错误的赋值,而且还可以防止在作为参数将指针传递给函数时可能会修改了本不想改变的指针所指向的对象的值。如:

const int num= 7;

num = 9; //有/可能得到编译器的警告。

const char *ptr,则表示该指针所指向的内容不会被改变,如果在程序中被发生对其赋值的操作,编译时将出错误提示。如:

const char *ptr = “hello”;

*ptr = `H`;//错误,所指内容不可改变也可将const 放在星号后面来声明指针本身不可改变。如:

char* const ptr;

ptr++; //错误,指针本身不可改变

也可同时禁止改变指针和它所引用的内容,其形式如下: const char* const ptr;

【规则11】使用static

static 是一个能够减少命名冲突的有用工具。将只在一个模块文件中的变量和函数使用static 修饰,将不会和其他模块可能具有相同名称的函数和变量在模块连接时不会产生名称冲突。一般来说,只要不是提供给其它模块使用的函数,和非全局变量,均应使用static 修饰。将子程序中的变量使用static 修饰时,表示这个变量在程序开始时分配内存,在程序结束时释放,它们在程序执行期间保持它们的值。如:

void func1(void)

{

static int time = 0;

time++

}

void func2(void)

{

static int time = 0;

time++;

}

两个子程序中的time 变量使用static 修饰,所以它们是静态变量,每调用一次time将进行加1,并保持这个值。它们的功能与下面程序相似:

int time1 = 0;

int time2 = 0;

void func1(void)

{

time1++

}

void func2(void)

{

time2++;

}

我们可以看出,使用static 修饰后,模块中的全局变量减少,使得程序的更为简单。

【规则12】不要忽视编译器的警告。

编译器的给出的警告都是有的放矢,在没有查清引起警告的真正原因之前,不要忽视它。

【规则13】注意溢出问题,写安全的代码。

1.4 KeilC 编程

【规则14】深入了解你所用的工具。

仔细查看KeilC 附带的帮助文件,你能找到你期待已久的东西。KeilC 是当前最好用的单片机开发软件。要充分利用该软件的功能,就必须对它深入的进行了解。

【规则15】不要使用语言的冷僻特性,并且记住,耍小聪明会贻害无穷。最重要的是编写你理解的代码,理解你编写的代码,你就可能会做得很好。

2 推荐书目

要成为一个优秀的单片机系统产品设计工程师,兴趣、热情、责任心至关重要。

2.1 单片机技术学习

《微机原理及应用(从16 位到32 位) 》戴梅萼等著清华大学出版社。学校教材,也是当年我学习单片机的启蒙书。

2.2 C51 编程学习

《单片机高级语言C51 Windows 环境编程与应用》作者:徐爱钧彭秀华电子工业出版社。这本书几乎覆盖了C51 编程的方方面面,最新版本对当前使用最广的keilC 也有很详细的讲述。对于刚学C51 编程的同志,本书是上上之选,强力推荐。比起现今书市上的所谓什么“C51 编程圣经”之类的书强得多。

2.3 C 语言编程必读

《C 陷阱与缺陷》Andrew Koenig 著

《C 专家编程》Peter Van Der Linden 著

C 语言开发技术经典之作,C 程序员必读之书,数十年来经久不衰。如果你想对C语言全面的掌握,真正了解C 语言的精髓,这两本书是必读之作。由人民邮电出版社出版的中文译本也还不错。

2.4 程序设计技术方面

《数据结构》 严蔚敏 清华大学出版社。清华大学出版社的教材质量稳定,中规中矩,价格相对来说也便宜一点。

《程序设计实践》Brian W. Kernighan Rob Pike 著;《代码大全》(网上有下载)。这两本是能让你看后,感觉有大突破的那种书籍,千万别吝惜银子

作者:nwq0902
文章来源:nwq0902

围观 395

到现在为止,相信大家对单片机已经有了一个基本概念,但是我们为什么要学习单片机呢?我们需要找到爱上单片机的一万个理由。

单片机在实际中的应用

单片机在生活中应用非常广泛。各种家电,如洗衣机,电冰箱,电饭煲,电子称,等等,往往会称自己的产品是高科技、全自动、微电脑控制的智能产品……对于没有接触过单片机之类器件的人来说,会感觉真的是很难想象的高科技。而当你学会单片机之后,你的想法就完全不一样了。你可能只是淡淡一笑,然后暗暗的想,人家用的什么单片机?怎么写的程序?要不改天也来自制一个类似的玩玩?当然我并不否认单片机是高科技,我这里也不是有意要冒犯家电厂商,请大家理解o(╯□╰)o。

很多数码产品,像手机,单反,摄像机,一些MP3播放器,包括电脑中的硬盘等零部件往往都用到了单片机。极大丰富了我们的业余生活。


路边各种广告牌,尤其到了晚上的时候,总会发出耀眼的光芒,而那些广告牌,很多都是用单片机来控制的。

单片机在医用设备领域的用途也相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。这些单片机不分昼夜的辛苦工作着,帮助医生们创造一次又一次救死扶伤的奇迹。

汽车甚至飞机的很多部件,也使用了很多单片机来执行各种不同的艰巨任务。单片机为我们的出行保驾护航。


单片机在工业上的应用也相当广泛。流水线上装配各种产品,都离不开单片机的控制,各种数据采集、智能化控制、警报系统等,很多都是以单片机为核心的。

单片机在我们身边的应用

知道了很多单片机的应用,但是似乎和我们的生活并没有什么直接联系。但是事实并非如此。下面我就给大家举些例子。

我小的时候,和很多人一样,特别喜欢玩具车。看到商场上有卖遥控车的,特别想要,但是当时家里条件不好,所以最终还是没买成。我后来也想过自己做个遥控车,但是无奈感觉太难了,始终没有做出来。后来上大学,我接触到了单片机,发现单片机实在太强大了。也是因为兴趣,在几个星期的时间内,我就很轻松做成了一个遥控车。

宿舍常常有人不记得带钥匙,或者出去有事带钥匙不方便,比如说去打篮球。然后几个人一起回来,大眼瞪小眼,都没拿钥匙,门都开不了,只好求助楼管。于是我在宿舍门上装了一个电子密码锁,门外是按键和指示灯,门里面是单片机和电机,电机通过细线可以把门打开。你可能会担心安全问题,实际上完全不用担心。我们的密码锁,只有在单片机工作正常、且输入密码正确的情况下,才会启动电机开门。密码可以任意修改,只要你愿意,可以输入几百位的密码。当然也完全没这必要。连续三次输入密码错误,还会亮起红灯锁定,禁止再次尝试输入密码,要等几分钟才能解锁。所以想把密码试出来也是不太现实的。如果不幸单片机没电了,或者密码锁坏了,也不用担心。它的工作原理决定了,那种情况下,只是不能输入密码开门了,门完全不可能自己被电机打开。所以安全性是毋庸置疑的。


我制作的遥控密码门锁


早上如果起得比较早,常常会起不来,参考网上的方案,我设计了一种闹钟,能模拟早晨太阳升起,室内逐渐变亮的过程,在闹铃之前半小时,会慢慢的点亮照明灯。然后由于光线的原因,人就会慢慢醒来。如果到了定时时间,人还没起来按开关确认已经起床,闹铃就开始响。并且可以把开关设置在离床比较远的地方,只有起来才能关闹铃,以免错过起床时间又睡过去了。

类似的小制作还有很多。比如有人制作的“表白神器”心型点阵,是送心仪女生的必备佳品。还有各种非常漂亮的时钟,数码相框,电子蜡烛,光立方等。也有国外牛人,用单片机制作出了各种有趣的小玩意,甚至有用单片机制作的简易电子书阅读器。爱好航模、机器人的读者也可以用单片机去制作这些东西,后期也会对单片机的机电控制进行一些初步讲解。在最后还会介绍几个项目实例,有兴趣的读者也可以试着做一做。

单片机就如同“小强”一样无处不在,给我们的生活带来了巨大的影响……

文章来源:Hainter

围观 338

调试,在企业程序设计里(我把企业商务类型的软件开发叫企业程序设计,把单片机与驱动程序这样接触底层汇编与硬件相关的程序设计叫底层程序设计),调试一般都用来跟踪变量的赋值过程,以及查看内存堆栈的内容,查看这些内容的目的在于观察变量的赋值过程与赋值情况从而达到调试的目的。由于企业程序的宿主就是开发它的计算机本身,因此企业程序设计比起底层程序设计,特别是单片机的程序设计调试来的更直观,调试也更方便。

单片机的程序设计调试分为两种,一种是使用软件模拟调试,意思就是用开发单片机程序的计算机去模拟单片机的指令执行,并虚拟单片机片内资源,从而实现调试的目的,但是软件调试存在一些问题,如计算机本身是多任务系统,划分执行时间片是由操作系统本身完成的,无法得到控制,这样就无法时时的模拟单片机的执行时序,也就是说 ,不可能像真正的单片机运行环境那样执行的指令在同样一个时间能完成(往往要完成的比单片机慢)。为了解决软件调试的问题,第二种是硬件调试,硬件调试其实也需要计算机软件的配合,大致过程是这样的:计算机软件把编译好的程序通过串行口、并行口或者USB口传输到硬件调试设备中(这个设备叫仿真器),仿真器仿真全部的单片机资源(所有的单片机接口,并且有真实的引脚输出),仿真器可以接入实际的电路中,然后与单片机一样执行。同时,仿真器也会返回单片机内部内存与时序等情况给计算机的辅助软件,这样 就可以在软件里看到真实的执行情况。不仅如此,还可以通过计算机断的软件实现单步、全速、运行到光标的常规调试手段。

点击下载

围观 331

一、内部RAM

共256个单元,用户使用前128个单元,用于存放可读写数据,后128个单元被专用寄存器占用。

前128单元具体分为:

1、工作寄存器区:共4个组,每组为8个存储单元,即00H-07H,08H-0FH,10H-17H,18H-1FH,具体选择哪一个由程序状态字(PSW)中的RS1和RS0的组合决定(在此我就不展开了,呵呵……)

2、位寻址区:20H-2FH,共16个单元,每一位可以进行位寻址(16*8=128个位地址),就是每一个触发位,就是bit可以寻址

3、便笺区:从30H-7FH,共80个单元,用于存放用户数据或作堆栈区使用。

4、从80H-FFH为专用寄存器占用,其中还离散的分布SFR(21个特殊功能寄存器)

二、256B

其中00H~7FH

可分为3个区域:

00H~1FH 是通用寄存器区

20H~2FH 是位寻址区

30H~7FH 是用户RAM区

80H~FFH是特殊功能寄存器区

三、AT89S51单片机的ram,只有128字节,地址范围:00H~7FH。

SFR不是RAM,是特殊功能寄存器,地址范围:80H~FFH,SFR在其中离散分布着。

AT89S52单片机的ram,就有256字节,地址范围:00H~FFH。

SFR,特殊功能寄存器,仍然在地址范围:80H~FFH。

两者的地址重叠了,区别方法如下:

对80H~FFH直接寻址,就是读写SFR,特殊功能寄存器;

对80H~FFH间接寻址,就是读写RAM。

先说说这几个词是什么意思:

1,DATA,51的内部RAM,只有128B(字节)大小,不管是最新的什么增强型单片机;

2,XDATA,外部RAM,只能使用MOVX寻址

3,CODE,代码区,即是你的代码的大小,AT89C51为4K,C52为8K等,增强型的有更多的选择。

然后说明一下,几种RAM的区别:

1,DATA,也是上面1提到的DATA RAM,占51的128B;

2,IDATA,大小也为128B,与DATA构成256字节的内存(如AT89C52)

3,PDATA,外部RAM的前256B(就是一个页的大小),是XDATA的一部分;

4,XDATA,外部RAM

所以你的那个单片机的1280B,其实组成为:

DATA :128B

IDATA:128B

XDATA:1024B

所以你的问题,“使用片内RAM”打勾只是软件仿真用的;你的XDATA用了758B,说明你特意用XDATA关键字定了这么大的内存,比如大数组或者内存模式时,使用了lager模式,那么编译器会自动把超出的部分放到XDATA里,我猜你应该是这里选择了lager模式,不过你的内容这么大,也只能选择lager模式。

来源:互联网

围观 396

学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好。Keil软件是目前最流行开发80C51系列单片机的软件,Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(?Vision)将这些部份组合在一起。

学习之前请先安装KEILC51软件,在学会使用汇编语言后,学习C语言编程是一件比较容易的事,我们将通过一系列的实例介绍C语言编程的方法。图1-1所示电路图使用89c51单片机作为主芯片,这种单片机性属于80C51系列,其内部有8K的FLASH ROM,可以反复擦写,非常适于做实验。89c51的P1引脚上接8个发光二极管,P3.2~P3.4引脚上接4个按钮开关,我们的任务是让接在P1引脚上的发光二极管按要求发光。

简单的C程序介绍

例1-1: 让接在P1.0引脚上的LED发光。

/************************************************

单灯闪烁程序

*************************************************/

#include "reg51.h"//这一句是将51的常用端口,内部寄存器等的定义文件包含进这段程序

sbit P1_0=P1^0;

void main()

{  P1_1=0;

}

这个程序的作用是让接在P1.0引脚上的LED点亮。下面来分析一下这个C语言程序包含了哪些信息。

1)"文件包含"处理。

程序的第一行是一个"文件包含"处理。

所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序虽然只有4行,但C编译器在处理的时候却要处理几十或几百行。这里程序中包含REG51.h文件的目的是为了要使用P1这个符号,即通知C编译器,程序中所写的P1是指80C51单片机的P1端口而不是其它变量。这是如何做到的呢?

打开reg51.h可以看到这样的一些内容:

/*--------------------------------------------------------------------REG51.H

Header file for generic 80C51 and 80C31 microcontroller.

Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.

All rights reserved.

--------------------------------------------------------------------------*/

/* BYTE Register */

sfr P0 = 0x80;

sfr P1 = 0x90;

sfr P2 = 0xA0;

sfr P3 = 0xB0;

sfr PSW = 0xD0;

sfr ACC = 0xE0;

sfr B = 0xF0;

sfr SP = 0x81;

sfr DPL = 0x82;

sfr DPH = 0x83;

sfr PCON = 0x87;

sfr TCON = 0x88;

sfr TMOD = 0x89;

sfr TL0 = 0x8A;

sfr TL1 = 0x8B;

sfr TH0 = 0x8C;

sfr TH1 = 0x8D;

sfr IE = 0xA8;

sfr IP = 0xB8;

sfr SCON = 0x98;

sfr SBUF = 0x99;

/* BIT Register */

/* PSW */

sbit CY = 0xD7;

sbit AC = 0xD6;

sbit F0 = 0xD5;

sbit RS1 = 0xD4;

sbit RS0 = 0xD3;

sbit OV = 0xD2;

sbit P = 0xD0;

/* TCON */

sbit TF1 = 0x8F;

sbit TR1 = 0x8E;

sbit TF0 = 0x8D;

sbit TR0 = 0x8C;

sbit IE1 = 0x8B;

sbit IT1 = 0x8A;

sbit IE0 = 0x89;

sbit IT0 = 0x88;

/* IE */

sbit EA = 0xAF;

sbit ES = 0xAC;

sbit ET1 = 0xAB;

sbit EX1 = 0xAA;

sbit ET0 = 0xA9;

sbit EX0 = 0xA8;

/* IP */

sbit PS = 0xBC;

sbit PT1 = 0xBB;

sbit PX1 = 0xBA;

sbit PT0 = 0xB9;

sbit PX0 = 0xB8;

/* P3 */

sbit RD = 0xB7;

sbit WR = 0xB6;

sbit T1 = 0xB5;

sbit T0 = 0xB4;

sbit INT1 = 0xB3;

sbit INT0 = 0xB2;

sbit TXD = 0xB1;

sbit RXD = 0xB0;

/* SCON */

sbit SM0 = 0x9F;

sbit SM1 = 0x9E;

sbit SM2 = 0x9D;

sbit REN = 0x9C;

sbit TB8 = 0x9B;

sbit RB8 = 0x9A;

sbit TI = 0x99;

sbit RI = 0x98;

熟悉80C51内部结构的读者不难看出,这里都是一些符号的定义,即规定符号名与地址的对应关系。注意其中有

sfr P1 = 0x90;

这样的一行(上文中用黑体表示),即定义P1与地址0x90对应,P1口的地址就是0x90(0x90是C语言中十六进制数的写法,相当于汇编语言中写90H)。

从这里还可以看到一个频繁出现的词:sfr

sfr并标准C语言的关键字,而是Keil为能直接访问80C51中的SFR而提供了一个新的关键词,其用法是:

sfrt 变量名=地址值。

2)符号P1_0来表示P1.0引脚。

在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0是不是就是P1.0呢?你这么认为,C编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C的关键字sbit来定义,sbit的用法有三种:

第一种方法:sbit 位变量名=地址值

第二种方法:sbit 位变量名=SFR名称^变量位地址值

第三种方法:sbit 位变量名=SFR地址值^变量位地址值

如定义PSW中的OV可以用以下三种方法:

sbit OV=0xd2 (1)说明:0xd2是OV的位地址值

sbit OV=PSW^2 (2)说明:其中PSW必须先用sfr定义好

sbit OV=0xD0^2 (3)说明:0xD0就是PSW的地址值

因此这里用sfr P1_0=P1^0;就是定义用符号P1_0来表示P1.0引脚,如果你愿意也可以起P10一类的名字,只要下面程序中也随之更改就行了。

3)main称为"主函数"。

每一个C语言程序有且只有一个主函数,切必须有一个主函数,其放置的位置不要求,可以放在程序最后(推荐),函数后面一定有一对大括号"{}",在大括号里面书写其它程序。

从上面的分析我们了解了部分C语言的特性,下面再看一个稍复杂一点的例子。

例1-2 让接在P1.0引脚上的LED闪烁发光

/*************************************************

单灯闪烁程序

*************************************************/

#include "reg51.h"

#define uchar unsigned char

#define uint unsigned int

sbit P10=P1^0;

/*延时程序

由Delay参数确定延迟时间

*/

void mDelay(unsigned int Delay)

{ unsigned int i;

for(;Delay>0;Delay--)

{ for(i=0;i<124;i++)

{;}

}

}

void main()

{ for(;;)

{ P10=!P10; //取反P1.0引脚

mDelay(1000);

}

}

程序分析:主程序main中的第一行暂且不看,第二行是"P1_0=!P1_0;",在P1_0前有一个符号"!",符号"!"是C语言的一个运算符,就像数学中的"+"、"-"一样,是一种运算任号,意义是"取反",即将该符号后面的那个变量的值取反。

注意:取反运算只是对变量的值而言的,并不会自动改变变量本身。可以认为C编译器在处理"!P1_0"时,将P1_0的值给了一个临时变量,然后对这个临时变量取反,而不是直接对P1_0取反,因此取反完毕后还要使用赋值符号("=")将取反后的值再赋给P1_0,这样,如果原来P1.0是低电平(LED亮),那么取反后,P1.0就是高电平(LED灭),反之,如果P1.0是高电平,取反后,P1.0就是低电平,这条指令被反复地执行,接在P1.0上灯就会不断"亮"、"灭"。

该条指令会被反复执行的关键就在于main中的第一行程序:for(;;),这里不对此作详细的介绍,读者暂时只要知道,这行程序连同其后的一对大括号"{}"构成了一个无限循环语句,该大括号内的语句会被反复执行。

第三行程序是:"mDelay(1000);",这行程序的用途是延时1s时间,由于单片机执行指令的速度很快,如果不进行延时,灯亮之后马上就灭,灭了之后马上就亮,速度太快,人眼根本无法分辨。

这里mDelay(1000)并不是由Keil C提供的库函数,即你不能在任何情况下写这样一行程序以实现延时。如果在编写其它程序时写上这么一行,会发现编译通不过。那么这里为什么又是正确的呢?注意观察,可以发现这个程序中有void mDelay(…)这样一行,可见,mDelay这个词是我们自己起的名字,并且为此编写了一些程序行,如果你的程序中没有这么一段程序行,那就不能使用mDelay(1000)了。有人脑子快,可能马上想到,我可不可以把这段程序也复制到我其它程序中,然后就可以用mDelay(1000)了呢?回答是,那当然就可以了。还有一点需要说明,mDelay这个名称是由编程者自己命名的,可自行更改,但一旦更改了名称,main()函数中的名字也要作相应的更改。

mDelay后面有一个小括号,小括号里有数据(1000),这个1000被称之"参数",用它可以在一定范围内调整延时时间的长短,这里用1000来要求延时时间为1000毫秒,要做到这一点,必须由我们自己编写的mDelay那段程序决定的,详细情况在后面循环程序中再作分析,这里就不介绍了。

围观 514

从本文开始进入单片机入门篇的学习。入门篇主要介绍各种单片机基础知识概念。

入门篇阅读建议:根据个人已经掌握的知识,有重点的去读。如果介绍到你已经学过的知识,你只需要简单阅读一下,或者直接跳过。如果看后面的文章感觉有些知识掌握的还不好,可以在回来看入门篇相关的介绍。

数字的发明

很久以前,人类发明了数字。自此,人类社会发生了巨大的变化。有了数字,人们解决了很多问题。在数字的帮助下,人们学会了度量和计算,人们发明了温度计,发明了钟表,发明了直尺,发明了算盘……生活中原本模糊的概念,变的不再模糊,而是十分精确。


电的广泛应用和各种电子器件的发明

1870年以后,科学技术的发展突飞猛进,各种新技术、新发明层出不穷,并被迅速应用于工业生产,大大促进了经济的发展。第二次工业革命爆发了。在这次工业革命中,电力得到了广泛的应用。

之后人们发明了各种电子元器件,特别是电子管、晶体管以及后来集成电路的发明对人类社会产生了巨大的影响。图中给大家展示了一些常见的集成电路芯片。


计算机的发明

有句话说,懒人推动社会进步。这句话是有一定道理的。在科技不断发展的过程中,一方面,人们希望制造出一种机器,能帮助我们完成处理现实世界中的各种问题,让我们从重复而繁重的脑力劳动中解放出来;另一方面,往往是在军事上,由于种种原因需要在较短的时间内,完成一些像炮弹轨道计算,密码破译之类的任务,而人类的数字运算能力往往远达不到要求。

最初人们发明了算盘之类的计算工具,又有人发明了一些机械式计算机,通过齿轮传动等原理进行运算。而后,在电子技术飞速发展的情况下,人们发明了电子计算机。早期电子计算机采用大量电子管,十分庞大,需要消耗很多电量,操作也非常复杂。如1946年发明的“埃尼阿克”电子计算机,占地面积170平方米,重达30吨,耗电量高达150千瓦,而运算能力却远不及今天智能手机的CPU,尽管如此,它已经比当时的继电器计算机快一千倍。而随着晶体管、集成电路的出现,计算机技术以惊人的速度发展着,到今天各种计算机设备随处可见,甚至我们很多人每天的生活和工作都已经离不开计算机。


帕斯卡和他的齿轮式加法器

数字计算机发明之前,电子计算机都是模拟计算机。模拟计算机通过内部电子器件的电压、电流大小等来表示一个数字或物理量,进行处理。这种计算机处理问题的精度差,而且结构复杂,也很容易受外界干扰。于是后来人们发明了数字计算机。数字计算机把外界的各种信息转换成数字,然后对数字进行运算,最终得到一个确定的结果。我们人类使用的数字一般为十进制,这是因为我们有十个手指。但是由于很多电子器件都只有两种确定的状态,比如开关的开和关,灯的亮和灭,于是数字计算机使用的是二进制的数字,通过控制器件的开和关来表示数字“1”和“0”,实现各种功能。由于它没有模拟计算机的那些缺陷,发展十分迅速,成为今天计算机的主流。

单片机的发明

在计算机发展的同时,另一种大家相对陌生的东西也在悄悄发展着。在1971年,全球第一个计算机微处理器4004由美国Intel公司推出的同时,一种称之为单片机的技术也逐渐发展并得到广泛应用。单片机全称单片微型计算机,又称为微型控制器,英文名MCU(Micro Control Unit),可以理解为精简版的计算机。单片机相当于将计算机中的各个主要部件,CPU、存储器、IO口、中断系统等封装在一个集成电路芯片中。初学者或许对这些名词很陌生,但是不需要担心,关于他们分别是什么,后面会给大家介绍。下面是一些现在常见的单片机。


从左往右,1、2为51单片机,3、4为AVR单片机,5、6、7为MSP430单片机

为什么要发明单片机呢?这个很好理解。俗话说,杀鸡焉用牛刀。生活中有很多事情不很复杂,并不需要计算机那么庞大的机器来处理,于是我们只需要用精简版的计算机——即单片机来完成任务就好了。

单片机的特点

比起大家熟悉的计算机,单片机的配置可就差多了,简直是低的难以想象。我们常用的笔记本电脑CPU处理速度可以达到2GHz以上,还是双核四核甚至更高级,但是拿一款常见的单片机(STC89C52RC,我们即将以这款单片机开始来进行学习)来对比,它的最高处理速度只有几十MHz(其中1GHz = 1000MHz);笔记本电脑硬盘动辄几百GB乃至几TB,而单片机中相当于硬盘的ROM只有几到几十KB(1TB = 1024GB,1GB = 1024MB,1MB = 1024KB,1KB = 1024B);主流笔记本的内存普遍都有几个GB,单片机中相当于内存的RAM只有可怜的几十字节(即单位B)。但是大家千万不要小瞧这么“低端”的单片机,只要给它写进程序,足以控制一台我们经常看到的所谓“智能洗衣机”之类的电器。而且学习了单片机,也会让你对计算机有更深入的了解。

文章来源: Hainter

围观 376

笔者利用51单片机制作了一个LED旋转屏,并利用该旋转屏上制作出炫耀独特的数字钟,在把制作过程分享之前,先贴一张效果图。


效果图——左上角是静止图


看完图片之后大家惊奇的发现,上面显示的字居然是浮在空中的!这到底是怎么回事?其实道理很简单:LED旋转屏只采用一排LED,令其高速旋转,利用视觉残留效应,形成高分辨率的点阵屏,可以显示字符、汉字,甚至图案,而且图案看起来还有悬浮于空中的透明效果,非常炫目。下面跟着笔者一起来制作把!

下面给出一张元器件清单供参考。


开始硬件制作

1、制作电路

由于电路板高速旋转,除了要做好平衡,还要尽快地缩小电路板的体积和重量,这样装置比较小,也容易进行高速旋转。

制作电路时,除了少数插件外,全部采用贴片工艺进行制作,为了减小电路板体积,笔者使用双面PCB进行布线,

下面两张是笔者绘制的PCB图,供参考。


TOP层PCB


BOTTOM层PCB


PCB正面放置AT89S52、12个LED等,背面主要放置晶振、升压电路,整个电路板尺寸为64 mm ×30mm,读者可以根据这个布局自行画PCB,建议画PCB前先确定整机的装配结构,可以参考图9。手工制作双面PCB需要一定的经验,将Top Layer镜像打印,然后和Bottom Layer对齐,把裁好尺寸、打磨好的双面覆铜板放在两层纸中间,确保对齐后进行热转印。

2、装配结构

笔者确定圆柱型旋转屏的整机结构大致如下图所示。


装配结构图


找一个合适的电脑主机散热器的风扇,一般是12V、0.75A,也有0.15A的,这里最好选0.75A的大功率散热风扇,因为电机负荷比较大,小功率风扇可能带不动,然后把风扇的扇叶剪掉(舍不得剪也可以保留,耗电稍大而已),剩下转子和支架,然后按照图9的结构进行“叠罗汉”。找一块大小合适的硬木板,长度等于旋转屏直径,宽度等于电路板的宽度,按照图9把电路板固定在木板上面,至少用2根1cm长的自攻螺丝进行固定,否则高速旋转时电路板可能甩飞,安装时注意光电门的位置。

然后把木板用强力胶粘在电机上面,这个环节很重要,粘合强度一定要足够高,笔者用热熔胶大面积粘合,效果还可以,用AB胶也不错。

然后把电池座、平衡片固定在木板上面,安装电池座时,一定要连同电池放在里面,这样才能调节平衡,平衡片可以用覆铜板,这个环节最重要的是平衡,不断调节电池座的位置和平衡片,一定要调到最佳平衡状态,这需要耐心和运气。

挡光片的安装比较容易,不过位置要调好,恰好能把光电门的光“切断”,又不能碰到光电门。红外接收头本来是焊接在电路板上面的,笔者后来调试发现,接收头高速旋转会使接收到的信号误码率较高,于是把接收头移到旋转中心,问题有所改善。装配好的整机如图下图所示:



装配好的整机图


注入灵魂——编写软件

整机装配好后,上电调试,并写一个流水灯的程序并烧写到单片机,如果12个LED确实能“流水”,那恭喜你,硬件制作大体成功了!如果出现问题,检查升压电路是否输出3.3V和5.0V,检查单片机的复位引脚是不是低电平等。程序采用C51进行编写,不建议采用汇编,因为这个系统比较庞大,用C语言更容易开发。

软件编写的基本思想如流程图如下:


软件中要注意几个比较重要的函数的编写。一个是实现字符显示的函数,也是最重要的函数,编程上与点阵接近,不过相对容易一些。首先必须获得字库,如无字模软件,推荐一款LCD汉字取模软件,笔者使用感觉良好,下载地址:
http://dgdz.cic.tsinghua.edu.cn/dgdz/detail.jsp?seq=576&boardid=2601

另一个是红外遥控解码函数,红外遥控的解码,关键在于了解红外遥控信号的规律,笔者采用KD-29遥控器。

还有,笔者在旋转屏上实现了字符显示后,利用单片机内部定时器编写了一个数字钟,这样一来单片机任务有点多,即使使用了22.1184MHz的晶振,仍然感觉单片机速度不够,表现在显示字符时有抖动现象,这是因为中断函数内部指令稍多,导致延时函数延时不准引起的。

后来笔者用定时器来产生精密延时,效果好了一些,不过仍然有微微抖动,如果用AVR单片机,由于AVR单片机的速度比51单片机快10倍,这个问题就能得到很好地解决了,这也是笔者推荐使用Atmega8进行制作的原因。

这样的一个旋转屏也可以用来显示图案,但因为垂直分辨率不够多,显示普通小图标就可以了,笔者用它来显示静音符号,还有开闹钟的符号。显示图标时有一个小窍门,就是用文字来索引图标,在字库生成软件中,都可以自定义字模,我们把图案用某个用不到汉字来表示,显示的时候,只要显示这个汉字,它对应的图案就显示出来了,十分方便。软件问题智者见智,仁者见仁,读者也可以自行设计软件系统,笔者把源代码全部公开,可以到本刊网站www.radio.com.cn上下载,供读者参考。

结语

这个LED旋转屏的DIY就交流到这里,硬件的制作需要不断提高动手能力才能做得更精致,软件的编写要经历无数调试过程才能达到最终要求,DIY过程是艰辛的,但是收获了成果时的那份喜悦只有经历过才知道,这里再贴几张效果图。


显示时分秒、周四,中英均能显示


闹钟时间08:30,喇叭图标表示闹钟“开”


能显示任何汉字,提取字库放入flash即可

文章来源:无线电杂志

围观 660

常规上ROM是用来存储固化程序的,RAM是用来存放数据的。由于FLASH ROM比普通的ROM读写速度快,擦写方便,一般用来存储用户程序和需要永久保存的数据。譬如说,现在家用的电子式电度表,它的内核是一款单片机,该单片机的程序就是存放在ROM里的。电度表在工作过程中,是要运算数据的,要采集电压和电流,并根据电压和电流计算出电度来。电压和电流时一个适时的数据,用户不关心,它只是用来计算电度用,计算完后该次采集的数据就用完了,然后再采集下一次,因此这些值就没必要永久存储,就把它放在RAM里边。然而计算完的电度,是需要永久保存的,单片机会定时或者在停电的瞬间将电度数存入到FLASH里。

--ROM存放指令代码和一些固定数值,程序运行后不可改动;RAM用于程序运行中数据的随机存取,掉电后数据消失..

code就是指将数据定义在ROM区域,具只读属性,例如一些LED显示的表头数据就可以定义成code存储在ROM。

ROM:(Read Only Memory)程序存储器

在单片机中用来存储程序数据及常量数据或变量数据,凡是c文件及h文件中所有代码、全局变量、局部变量、’const’限定符定义的常量数据、startup.asm文件中的代码(类似ARM中的bootloader或者X86中的BIOS,一些低端的单片机是没有这个的)通通都存储在ROM中。

RAM:(Random Access Memory)随机访问存储器

用来存储程序中用到的变量。凡是整个程序中,所用到的需要被改写的量,都存储在RAM中,“被改变的量”包括全局变量、局部变量、堆栈段。

程序经过编译、汇编、链接后,生成hex文件。用专用的烧录软件,通过烧录器将hex文件烧录到ROM中(究竟是怎样将hex文件传输到MCU内部的ROM中的呢?),因此,这个时候的ROM中,包含所有的程序内容:无论是一行一行的程序代码,函数中用到的局部变量,头文件中所声明的全局变量,const声明的只读常量,都被生成了二进制数据,包含在hex文件中,全部烧录到了ROM里面,此时的ROM,包含了程序的所有信息,正是由于这些信息,“指导”了CPU的所有动作。

可能有人会有疑问,既然所有的数据在ROM中,那RAM中的数据从哪里来?什么时候CPU将数据加载到RAM中?会不会是在烧录的时候,已经将需要放在RAM中数据烧录到了RAM中?

要回答这个问题,首先必须明确一条:ROM是只读存储器,CPU只能从里面读数据,而不能往里面写数据,掉电后数据依然保存在存储器中;RAM是随机存储器,CPU既可以从里面读出数据,又可以往里面写入数据,掉电后数据不保存,这是条永恒的真理,始终记挂在心。

清楚了上面的问题,那么就很容易想到,RAM中的数据不是在烧录的时候写入的,因为烧录完毕后,拔掉电源,当再给MCU上电后,CPU能正常执行动作,RAM中照样有数据,这就说明:RAM中的数据不是在烧录的时候写入的,同时也说明,在CPU运行时,RAM中已经写入了数据。关键就在这里:这个数据不是人为写入的,CPU写入的,那CPU又是什么时候写入的呢?听我娓娓道来。

上回说到,ROM中包含所有的程序内容,在MCU上电时,CPU开始从第1行代码处执行指令。这里所做的工作是为整个程序的顺利运行做好准备,或者说是对RAM的初始化(注:ROM是只读不写的),工作任务有几项:

1、为全局变量分配地址空间---à如果全局变量已赋初值,则将初始值从ROM中拷贝到RAM中,如果没有赋初值,则这个全局变量所对应的地址下的初值为0或者是不确定的。当然,如果已经指定了变量的地址空间,则直接定位到对应的地址就行,那么这里分配地址及定位地址的任务由“连接器”完成。

2、 设置堆栈段的长度及地址---à用C语言开发的单片机程序里面,普遍都没有涉及到堆栈段长度的设置,但这不意味着不用设置。堆栈段主要是用来在中断处理时起“保存现场”及“现场还原”的作用,其重要性不言而喻。而这么重要的内容,也包含在了编译器预设的内容里面,确实省事,可并不一定省心。平时怎么就没发现呢?奇怪。

3、 分配数据段data,常量段const,代码段code的起始地址。代码段与常量段的地址可以不管,它们都是固定在ROM里面的,无论它们怎么排列,都不会对程序产生影响。但是数据段的地址就必须得关心。数据段的数据时要从ROM拷贝到RAM中去的,而在RAM中,既有数据段data,也有堆栈段stack,还有通用的工作寄存器组。通常,工作寄存器组的地址是固定的,这就要求在绝对定址数据段时,不能使数据段覆盖所有的工作寄存器组的地址。必须引起严重关注。

这里所说的“第一行代码处”,并不一定是你自己写的程序代码,绝大部分都是编译器代劳的,或者是编译器自带的demo程序文件。因为,你自己写的程序(C语言程序)里面,并不包含这些内容。高级一点的单片机,这些内容,都是在startup的文件里面。仔细阅读,有好处的。

通常的做法是:普通的flashMCU是在上电时或复位时,PC指针里面的存放的是“0000”,表示CPU从ROM的0000地址开始执行指令,在该地址处放一条跳转指令,使程序跳转到_main函数中,然后根据不同的指令,一条一条的执行,当中断发生时(中断数量也很有限,2~5个中断),按照系统分配的中断向量表地址,在中断向量里面,放置一条跳转到中断服务程序的指令,如此如此,整个程序就跑起来了。决定CPU这样做,是这种ROM结构所造成的。

其实,这里面,C语言编译器作了很多的工作,只是,你不知道而已。如果你仔细阅读编译器自带的help文件就会知道很多的事情,这是对编译器了解最好的途径。

I/O口寄存器:

也是可以被改变的量,它被安排在一个特别的RAM地址,为系统所访问,而不能将其他变量定义在这些位置。

中断向量表:

中断向量表是被固定在MCU内部的ROM地址中,不同的地址对应不同的中断。每次中断产生时,直接调用对应的中断服务子程序,将程序的入口地址放在中断向量表中。

ROM的大小问题:

对于flash类型的MCU,ROM空间的大小通常都是整字节的,即为ak*8bits。这很好理解,一眼就知道,ROM的空间为aK。但是,对于某些OTP类型的单片机,比如holtek或者sonix公司的单片机,经常看到数据手册上写的是“OTP progarming ROM 2k*15bit。。。。。”,可能会产生疑惑,这个“15bit”认为是1个字节有余,2个字节又不足,那这个ROM空间究竟是2k,多于2k,还是4k但是少了一点点呢?

这里要明确两个概念:一个是指令的位宽,另一个是指令的长度。指令的位宽是指一条指令所占的数据位的宽度;有些是8位位宽,有些是15位位宽。指令长度是指每条指令所占的存储空间,有1个字节,有2个字节的,也有3个字节甚至4个字节的指令。这个可以打个形象的比方:我们做广播体操时,有很多动作要做,但是每个复杂的动作都可以分解为几个简单的动作。例如,当做伸展运动时,我们只听到广播里面喊“2、2、3、4、5、6、7、8”,而这里每一个数字都代表一个指令,听到“3”这个指令后,我们的头、手、腰、腿、脚分别作出不同的动作:两眼目视前方,左手叉腰,右手往上抬起,五指伸直自然并拢打开,右腿伸直,左腿成弓步······等等一系列的分解动作,而要做完这些动作的指令只有一个“3”,要执行的动作却又很多,于是将多个分解动作合并成一个指令,而每个分解动作的“位宽”为15bits。实事上也确实如此,当在反汇编或者汇编时,可以看到,复合指令的确是有简单的指令组合起来的。

到此,回答前面那个问题,这个OTP的ROM空间应该是2K,指令位宽为15位。一般的,当指令位宽不是8的倍数时,则说明该MCU的大部分指令长度是一个字节(注:该字节宽度为15位,不是8位),极少数为2个或多个字节,虽然其总的空间少,但是其能容下的空间数据并不少。

文章来源:玩转单片机

围观 352

1、按理说,一个东西的负载电流,应该是它供给外部的电流,这时候也就是流出时,应该为正。

2、外接电阻一般是上拉,通常情况这种接法输出高电平时,内部输出开关管是截止状态,如果该引脚上有负载的话,负载电流经上拉电阻提供,引脚内部基本上不存在电流出入,(所以低功耗)

3、这么讲下去,当该脚输出低电平时(内部开关管导通,电压接近地),电流经电阻流入内部,这时候应该在单片机的相关技术文档中会详细说明单片机的工作电流,但总的来说,每个端口电流不要超过20毫安,否则容易使得器件损坏。描述为负

。IO口的灌电流最大30ma左右,拉电流更小了

一般来说上拉或下拉电阻的作用是增大电流,加强电路的驱动能力

比如说51的

还有,p0口必须接上拉电阻才可以作为io口使用

上拉和下拉的区别是一个为拉电流,一个为灌电流

一般来说灌电流比拉电流要大

也就是灌电流驱动能力强一些

拉电流与灌电流

51系列单片机的拉电流和灌电流是不同的。根据我的使用经验,标准I/O口的拉电流不大于1mA,灌电流最大约为10mA左右,P0口的驱动能力更差一些。

拉电流和灌电流是衡量电路输出驱动能力的参数,这种说法一般用在数字电路中。由于数字电路的输出只有高、低(0,1)两种电平值,高电平输出时,一般是对负载提供电流,其提供电流的数值叫“拉电流”;低电平输出时,一般是要吸收负载的电流,其吸收电流的数值叫“灌电流”。

文章来源:玩转单片机

围观 452

1、什么是AD转换

A是模拟信号的意思,D是数字信号的意思,AD转换就是模数转换,顾名思义,就是把模拟信号转换成数字信号,例如把电压值转化为数字信号。

2、为什么要AD转换

单片机(以及其他处理器)只能处理数字信号,当单片机想要获取电路上某一点的电压值时,就得用到AD转换了,如果你直接把单片机的引脚接到电路这个点上,单片机只知道这个点的电压是低电平还是高电平,又怎么能得到他的电压值呢?例如数字式的万用表,它测量电压时,先有一个AD转换电路,把电压值转换成一个数值,然后把这个值送个单片机(当然万用表里的用的处理芯片不是单片机),单片机经过计算处理后,再把这电压值显示到显示到屏幕上。
不过现在有一些比较强的单片机,其内部已经集成了AD转换器,不需要你再外接AD转换芯片。

3、8位16位的ad转换芯片是什么意思

8位,16位就代表了AD转换芯片的转换分辨率,数字越大,分辨率越高,同时也反映了它的精度,数字越大,精度相对也越高。8位算是最低了,有些单片机里集成的AD转换器一般是10位的。12位和16位的芯片价格就比较贵了。

4、分辨率

举个简单的例子,8位芯片只能转换最小到0.01V的电压,而12位的芯片却能转换最小到0.001V的电压,如果一个电压为3.359V,8位芯片转出来后的数值是3.35V,12位芯片转换出来后是3.359V,精度比8位就高一个档次了。(注:这里数值不是正确的数值,举例用,切勿实际使用)

5、采样

采样是AD转换的速度性能指标,通俗的说就是每秒里能采样多少次,采样次数越高芯片性能越好。如果对采样不理解,也可以用另一种方式理解,就是一个AD转换芯把电压值转换成数字值这个过程所需要的时间,时间越短越好。

6、精度

精度是AD芯片的一个重要参数,表示采集到的数据和真实值之间的相差的程度。

文章来源:玩转单片机

围观 405

页面

订阅 RSS - 单片机