教你学单片机 2:用机器的视角思考

发布者:婉如Chanel最新更新时间:2015-11-10 关键字:单片机  机器  视角  思考 手机看文章 扫描二维码
随时随地手机看文章
你准备写第一个单片机程序了,在此之前我假设你已经会使用编译器,也会下载程序了。
P.S. 因为这些工作确实很简单,在网上找份教程看看就会了。
 
一般刚开始学一种单片机的时候,写的第一个程序都是“点亮第一个LED”。这个程序很经典,它代表你已经成功学会操控单片机的IO端口,学51单片机亦是如此。代码如下(我使用ATMEL 公司的AT89S52):
 
#include
sbit LED = P1^0 ;
void Delay(unsigned int t)
{
    unsigned int i,j ;
    for(i=t;i>0;i--)
        for(j=100;j>0;j--);
}
 
void main(void)
{
    LED = 1 ;
    while(1)
    {
        Delay(500);
        LED=~LED;
    }
}
 
单片机会从main函数开始执行,所以我们把思绪拉到main函数。
 
一开始用了“ LED = 1 ;”,初始化IO端口,让它设定在某个状态。接下来使用一个while大循环语句,调用Delay函数,时间一到就把LED取反,再回到循环,周而复始。在高级语言里面看起来这个过程貌似很简单,小学生都会理解了。但是你知道把它翻译成机器码之后是什么样的吗?在这里我不想把产生的汇编代码贴出来,免得你难以接受。不过我可以把执行过程详细地讲给你听。
 
首先,所有的CPU,它们在执行指令的时候都是从程序段的0地址(也就是程序最开始的地方)开始的,而且CPU永远只做两件事情,一是从程序区里取出指令,二是执行这条指令,然后再回去取指令。。
 
这样说很简单嘛,把main函数的代码从程序区的0地址开始一条条存放不就行了吗。其实不是这样的,一般0地址里存放的都不会是main函数的真实代码,它会放一条跳转指令(就是一条指令后面跟一个地址,告诉CPU要跳到那个地方去工作),这条指令跟着的是main函数的入口地址,把单片机指到main函数真正的地址去执行。为什么要这样做?看下面的图:
教你学单片机 <wbr>2:用机器的视角思考,单片机是怎么执行程序的?

程序存储区的固定前面几个地址是要用来存放中断服务程序的地址的(中断?后面会讲,先不管),称之为“中断向量”。程序在执行过程中遇到中断的时候,它就会根据中断信号的类型跳回到这些固定的地址,再由这些地址里面存储的指令指引,跳转到中断服务程序真正开始的地方去执行。所以,最开始的一系列地址是不能存放另的东西的,不然程序会乱掉。如果你把main函数定义在这里,没遇到中断之前当然可以正常运行,但如果你在程序中使用了中断,后果就不堪设想了。总而言之,main不是放在最开始的地方的!
 
那它放在哪里?理论上只要避开了中断向量地址的冲突,你可以放在任何地方,你用C语言编写的时候编译器会自动处理这个问题,不用你操心,如果以后你要用汇编写了,你就必须自己定义main函数的地址了。
 
好了,那我们就进入main函数里面看看吧。
 
根据这段代码,你觉得第一句应该执行的语句应该是“ LED = 1 ;”,然后是while循环。。BLA..BLA..
 
错了,进入main函数之后首先要做的事情是初始化相关寄存器。因为芯片刚开始工作的时候,寄存器都处于一种未知的状态,你必须首先赋给它一个初值才行,在这个main函数中没有使用变量,所以可以不用初始化内存区,但至少CPU必须初始化一个很重要的寄存器:SP堆栈指针。关于这家伙以后再讲,总之就是先初始化。
 
初始化完毕之后才开始执行你的真正的代码,先让LED设置为1,然后进入一个循环结构,调用延时函数Delay,等待它执行完毕之后再回来把LED取反,然后返回继续周而复始地执行。
 
等等,有一个很重要的问题:单片机是怎么延时的?在延时的时间里它都在干什么?
 
我们知道,单片机的一个主要性能就是执行速度,也就是一秒钟能执行多少条指令,一般速度越快代表性能越好,比如51单片机如果你在外面给它接上一个12M Hz的晶振,它的CPU就会以一百万条/秒的速度工作,即是说它执行一条指令要花费一百万分之一秒的时候即一微秒(是不是觉得很快?其实以现在的标准来说已经算很慢了,慢得像乌龟)。按照这个道理,如果我们想要让单片机延时,比如延时1ms,我们可以让CPU空转1000次,因为CPU空转一次也需要一条指令的时间。让它转上1000次之后结束,那么就相当于它延迟了1ms,延时函数就是这样写出来的,工作原理如果下图:
教你学单片机 <wbr>2:用机器的视角思考,单片机是怎么执行程序的?
 
这就是Delay函数的作用,但是这样的延时不能做到很精确,因为在这段时间里CPU要执行判断、赋值等等一系列指令,在C语言写的代码里面你不能准确预测到编译器会把你这段代码转换为怎么样的汇编指令,所以你也就无法计算出精确的变量值,只能在一个大概的范围里面选取。虽然C语言写起程序来很方便,但同时它的缺点也显现在这里:无法控制编译器写出精确的延迟函数,在有些对时间要求很高的场合里C语言无法胜任,只能用汇编来写;同时用C语言写出的程序产生的机器码一般都比用汇编写的要多,即不够精简,效率不高,在有些单片机里面程序存储容量不高的话就比较麻烦,不过现在的单片机程序存储容量普遍都比较高了。这样说来用C语言来写一些对时间性要求不高的程序是很有优势的,开发周期比汇编要高得多。
关键字:单片机  机器  视角  思考 引用地址:教你学单片机 2:用机器的视角思考

上一篇:教你学单片机 1 :简介,关于单片机的OOXX
下一篇:单片机逆向分析浅谈

推荐阅读最新更新时间:2024-03-16 14:38

基于Proteus仿真的AVR单片机串口程序
以前在Proteus上做过51的串口仿真没有成功,昨天再次尝试atmega16的串口仿真居然成功了;当然仿真是最简单的,实际做事的时候需要加上max232芯片,但仿真时就不需要了, 程序功能:由串口助手向单片机发送一组数据 I LOVE YOU-----SBILY1988 ,单片机收到数据后发送回串口助手, 数据传输方向:计算机 单片机; 单片机 计算机; 现送上仿真图和程序: #include iom16v.h #include avrdef.h void init(); void send(unsigned char); unsigned char receive(); voi
[单片机]
基于Proteus仿真的AVR<font color='red'>单片机</font>串口程序
机科做到二十年来稳拿亿元AGV机器人市场的秘诀是什么
根据新战略机器人产业研究所统计,目前国内AGV机器人产业链企业达300余家,而营收过亿元的,却是一双手都数的过来。其中,有这么一家企业,在AGV市场每年都拥有过亿营收,且从事AGV行业近二十年,在印钞造币、玻纤、制药等领域有着广泛的实践应用——它就是北京“机科”。 二十年来机科如何做到稳拿亿元AGV市场? 机科发展股份有限公司是一家提供智能高端制造装备及系统集成和环保设备及工程的央企,主要技术和产品服务于环保、汽车、智能制造、物流等国民经济核心领域,并在国家级的技术创新工作中扮演着重要的角色,承担过多项国家级技术开发项目。 早在1999年机科便开始智能输送装备相关情况调研, 2002年,由“机械科学研究院”相关研
[机器人]
8位MCU趋势解读:CISC将向RISC低头
对于不同的微控制器(MCU)产品应用,不仅需要考虑不同厂家MCU的性价比,而且还需要考虑不同指令系统下MCU应用特点。针对不断涌现出来的新的智能化电子产品,人们一直在开发适合于不同嵌入式系统应用的MCU新产品。不同厂家的MCU产品其指令集各不相同,特别是指令集系统架构的不同,如市场上广泛应用的MCS51系列和PIC系列微控制器则分别采用CISC指令系统和RISC指令系统。 微控制器按照指令系统可以分为CISC、RISC、类RISC(RISC-LIKE)等几种。传统的MCS51控制器属于CISC型,其代码密度高,但大多数指令需要多个时钟周期完成。RISC型一般指令密度较低,但指令效率很高。类RISC型则兼有CISC和RISC的优
[单片机]
单片机系列指令快速记忆法
简介: 大家都知道,汇编语言指令由操作码、操作数两部分组成。MCS-51使用汇编语言指令,它共有44个操作码助记符,33种功能,其操作数有#data、direct、Rn、@Ri等。这里先介绍指令助记符及其相关符号的记忆方法 一、助记符号的记忆方法 1.表格列举法 把44个指令助记符按功能分为五类,每类列表记忆。此处从略,请读者自己总结。 2.英文还原法单片机的操作码助记符是该指令功能的英文缩写,将缩写还原成英语原文,再对照汉语有助于理解其助记符含义,从而加强记忆。 例如: 增量 INC-Incremect 减量 DNC-Decrement 短转移 SJMP-Short jump 长转移 LJMP-Long ju
[单片机]
51单片机 步进电机旋转角度控制
#include reg52.h typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong; uchar code beatCode = { 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6 }; ulong beats = 0; uchar T0RH = 0, T0RL = 0; void turnMotor(ulong angle){ EA = 0; beats = angle * 4076 / 360;
[单片机]
Teledyne e2v联手Yumain助力AI机器视觉成像发展
Teledyne e2v,Teledyne Technologies 旗下的全球成像解决方案创新公司宣布与一家为各类工业应用提供服务的领先 AI 视觉解决方案提供商 Yumain(法国第戎)达成一项新型技术与产业合作。双方强强联合后,将制定出能支持工业应用创新的先进仿生视觉解决方案。 最近出现的工业 AI 迅速证实了其相对于基于传统规则方式所具备的诸多优势。实践证明,传统方式不适用于可变性较高的应用,例如复杂的不规则表面(拉丝铝材、木材等)的检测。尽管仍需充分利用其潜能并使 AI 广泛应用于全球,但用户在设置、培训和优化 AI 时必须能满足在几分钟内轻松完成(无需任何 AI 专业技术),提供可靠结果,并能在应用中保持灵活
[物联网]
Teledyne e2v联手Yumain助力AI<font color='red'>机器</font>视觉成像发展
单片机浴室报警器程序
1、氧气浓度采集:本设计采用ZE03-O2(工作电压3.7V-9V DC 温度0-50度 湿度20%-90%RH)氧气浓度传感器,适用于浴室氧气浓度检测,虽内置温度传感器进行温度补偿,但程序算法上需将采集数据和输出氧气浓度建立线性关系。 2、信息储存:采用AT24C02(掉电记忆,电可擦除)作为外置EEPROM存储用户设置信息(主要用于存储用户设置时间,报警温度和氧气浓度)。 3、报警部分:当任何一项指标超标时都需要声音报警,不同的指标超标光报警要给用户明确的某项指标超标。 4、浴室模型:本课题是基于浴室,采用CAD对模型进行设计与绘制,模型确定为底面面积为0.64平方米高1米的长方体,长方体内部布满泡沫以此来构建封闭、透气性差和
[单片机]
<font color='red'>单片机</font>浴室报警器程序
使用单片机对瓦斯气体浓度信息检测和报警设计
  由于瓦斯气体本身的危险性和对人民生产生活造成的巨大危害,因此对瓦斯气体的检测和报警是一项必要的工作。瓦斯报警是指利用气体传感器技术,将检测到的瓦斯气体浓度和标准值进行比较,当高过一定浓度值时候进行相应的声光报警,提醒正在作业的人员进行相应的处理,组织人员撤离或对矿井通风排气,避免不安全事故的发生,对现在采矿业的安全起着非常重要的作用。笔者所设计一种低成本的可燃性气体报警器设计,能够监控矿井的瓦斯气体的浓度,显示测量结果,并对当前的环境状态做出判断,发出报警信息。   当前,随着采矿技术的不断发展,井下作业的 安全 越来越有保障,但是仍然有许多采矿企业的机械化程度低,对现场采矿的工作人员的生命安全造成潜在的威胁,特别是针对瓦斯
[测试测量]
使用<font color='red'>单片机</font>对瓦斯气体浓度信息检测和报警设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved