你准备写第一个单片机程序了,在此之前我假设你已经会使用编译器,也会下载程序了。
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函数真正的地址去执行。为什么要这样做?看下面的图:
程序存储区的固定前面几个地址是要用来存放中断服务程序的地址的(中断?后面会讲,先不管),称之为“中断向量”。程序在执行过程中遇到中断的时候,它就会根据中断信号的类型跳回到这些固定的地址,再由这些地址里面存储的指令指引,跳转到中断服务程序真正开始的地方去执行。所以,最开始的一系列地址是不能存放另的东西的,不然程序会乱掉。如果你把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,延时函数就是这样写出来的,工作原理如果下图:
这就是Delay函数的作用,但是这样的延时不能做到很精确,因为在这段时间里CPU要执行判断、赋值等等一系列指令,在C语言写的代码里面你不能准确预测到编译器会把你这段代码转换为怎么样的汇编指令,所以你也就无法计算出精确的变量值,只能在一个大概的范围里面选取。虽然C语言写起程序来很方便,但同时它的缺点也显现在这里:无法控制编译器写出精确的延迟函数,在有些对时间要求很高的场合里C语言无法胜任,只能用汇编来写;同时用C语言写出的程序产生的机器码一般都比用汇编写的要多,即不够精简,效率不高,在有些单片机里面程序存储容量不高的话就比较麻烦,不过现在的单片机程序存储容量普遍都比较高了。这样说来用C语言来写一些对时间性要求不高的程序是很有优势的,开发周期比汇编要高得多。
关键字:单片机 执行程序
引用地址:
用机器的视角思考,单片机是怎么执行程序的
推荐阅读最新更新时间:2024-03-16 14:41
基于单片机的温度记录系统
目前检测温度一般采用热电偶或热敏电阻作为传感器。这种传感器至仪表之间通常都要用专用的温度补偿导线,而温度补偿导线的价格很高,并且线路太长,会影响测量精度,这是直接以模拟量形式进行采集的不可避免的问题。在实际应用中,往往需要对较远处的温度信号进行监视。为此,设计了一种用单片机与数字温度传感器集成的方案,它可以以更低的成本和更高的精确度实现温度检测。 l 系统综述 系统硬件设计以Atmel公司的AT89S52单片机为核心,主要由电源电路、复位电路、晶振电路、串口通讯电路、温度传感器电路、12864液晶显示电路、I2C存储器电路以及按键输入电路构成。温度采集电路采用单总线数字温度传感器实现温度采集,可设计为一路或多路;温度存储电路采
[单片机]
基于MSP430单片机和串口芯片PL2303的BSL编程工具设计
为了对烧断熔丝的MSP430系列单片机进行程序更新,采用USB转串口芯片PL2303和VB6.0编程语言设计出了一款高性价比的BSL编程工具,给出了该编程工具的硬件和软件设计的具体方案,并论述了设计中的要点。该BSL编程工具使用方便、操作简单、成本低廉,投入使用以后获得了较好的效果。 美国德州仪器公司的MSP430系列单片机在智能仪器仪表、医疗电子、消费电子等领域有着非常广泛的应用。大部分MSP430系列单片机都具有非易失性Flash存储器,用户调试或更新Flash中程序的方式一般有两种方法:JTAG和Bootstrap Loader(引导装载程序,简称BSL)。 MSP430系列单片机内部集成了JTAG仿真调试模块,并口
[单片机]
52单片机IO口输出-蜂鸣器(硬核)
什么是蜂鸣器 蜂鸣器是一种一体化结构的电子讯响器,广泛应用于电子产品中作发声器件,起到警报提醒的作用。 有源蜂鸣器与无源蜂鸣器 这里的“源”不是指电源,而是指震荡源。 有源蜂鸣器内部带震荡源,所以只要异同点就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。需要用2K~5K的方波去驱动它,有源蜂鸣器往往比无源的贵,就是因为里面多个振荡电路。 无源蜂鸣器的优点是: 1.便宜 2.声音频率可控,可以做出音乐里基本七音符的效果 有源蜂鸣器的优点是: 程序控制方便,接通电源就可以工作,程序简单。 三极管的工作原理 什么是三极管: 三极管全称半导体三极管,也称晶体三极管,是一种控制电流的半导体器件其作用是把
[单片机]
单片机复位电路
为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。一般微机电路正常工作需要供电电源为5V±5%,即4.75~5.25V。由于微机电路是时序数字电路,它需要稳定的时钟信号,因此在电源上电时,只有当VCC超过4.75V低于5.25V以及晶体振荡器稳定工作时,复位信号才被撤除,微机电路开始正常工作。 复位电路的分类: 单片机复位电路主要有四种类型:(1)微分型复位电路;(2)积分型复位电路;(3)比较器型复位电路;(4)看门狗型复位电路。 ISA总线的复位信号到南桥之间会有一个非门,跟随器或电子开关,常态时为低电平,复位时为高电平。IDE的复位和ISA总线正好相反,通常两者之间会有一个非门
[单片机]
51单片机学习历程《二》——数码管的显示
数码管的使用非常广泛,有段锁存和位锁存,段锁存来显示你想显示的数字,位锁存用来定位某个数码管,这样就能被你控制显示花样的东西了,非常有趣! 实例一: 八个数码管从左到右分别显示0,1,2,3.。。。,7。 示例二:电话号码滚动显示
[单片机]
PC机与单片机串行通信中实现命令批处理
在PC机与MCS-51单片机之间进行串行通信时,基本是一对一的,即用PC机向单片机每发1条命令,就等待单片机的1条返回信息。这样可能把大量时间浪费在PC机与单片机的通信过程中了。为此笔者经过实践,设计出可以批处理执行PC机发给单片机的命令,就像DOS操作系统中的批处理命令一样,可连续批处理信息,结果当然提高了系统速度。文中提供了部分平台式C51软件源代码,以供大家参考。 1 通信协议 (1)通信数据格式 PC机→MCS-51单片机数据格式如表1所列。 MCS-51单片机→PC机数据格式如表2所列。 (2)初始通信参数 PC机与单片机间(9600,n,8,1)即波特率为9600 baud,1起始位,8数据位,1停止位,无奇偶校
[单片机]
STC12C60S2单片机双485通讯开发双485通讯控制程序
电路原理图如下: 程序说明 接线:MAX485-1 D+ 链接 MAX485-2 D+ ;MAX485-1 D- 链接 MAX485-2 D- 功能:串口一 自动发送一个tab数据,串口二接收,接收后数据显示在P0口的led灯上 串口二 自动发送一个tab数据,串口一接收,接收后数据显示在p0口的led灯上 按key1,P0口显示0xAA 按key2,P0口显示0x55 按key3,P0口显示0xf0 按key4,P0口显示0x0f *******************************************************
[单片机]
基于C167CS微控制器的数字化电梯系统
摘要 : 基于C167CS 微控制器设计了数字化电梯系统, 该系统中利用多规则加权的模糊控制算法进行群控控制,以CAN总线多主方式实现各控制器间的串行通信。该系统提高了电梯的运行效率,并增强了电梯运行的实时性控制,系统的灵活性与可靠性得到了提高。 1 引言 国民经济的飞速发展, 现代化程度日益提高,高层建筑愈来愈多, 电梯也随之增多, 电梯产品在人们物质文化生活中的地位得到了提高,成为重要的运输设备之一。国内传统的电梯控制一是由继电器、接触器构成。它不仅存在着可靠性差、成本高、故障率高等缺点,而且在层数增加时,配线变化给制造及安装带来诸多不变。若用微机来控制电梯具有许多优点,进而数字化电梯控制系统是发展的必然
[单片机]