单片机汇编编程300例,单片机汇编语言实例
单片机编程,汇编语言
如下即可:
SORT: ;排序子程序
MOV R6, #10 ;11个数字,比较10次
S1:
MOV R0, #30H ;起始地址
MOV A, R6
MOV R7, A
CLR PSW.5 ;交换标志清零
S2:
MOV B, @R0 ;取出前一个数
INC R0
MOV A, @R0 ;取出后一个数
CJNE A, B, S3 ;后-前
S3:
JNC N_JH ;够减就不用交换
MOV @R0, B ;交换存放
DEC R0
MOV @R0, A
INC R0
SETB PSW.5 ;设立交换标志位
N_JH:
DJNZ R7, S2
JNB PSW.5, S_END ;没有交换过,就结束
DJNZ R6, S1
S_END:
RET
基于51单片机通过74HC595控制四相步进电机的C程序
我有一个74hc595串入并出控制led程序,你自己改一改就行了。
前提是你还需要一个电机驱动芯片(如l293d,uln2003等)。
/************************************************************************************
* 标题: 试验74HC595驱动8位LED灯(C语言) *
* *
* 连接方法:JP12用条线冒短接 JP1(LED灯接口)和JP2(595接口) 用8PIN排线连接 * *
******************************************************************************** *
*通过本例程了解 74HC595(串入并出)基本原理和使用 *
*3个I/O扩展8个输出,通过片选可以串接更多74HC595芯片,得到更多的输出数 *
* 请学员认真消化本例程,懂74C595在C语言中的操作 *
*此汇编程序留给大家做为课后作业自己完成。关于HC595汇编驱动参考“静态显示(74HC595驱动)”。
*************************************************************************************/
#include reg51.h
#include intrins.h
#define NOP() _nop_() /* 定义空指令 */
//SPI IO
sbit MOSIO =P3^4;
sbit R_CLK =P3^5;
sbit S_CLK =P3^6;
void delay(unsigned int i); //函数声名
void HC595SendData(unsigned char SendVal);
main()
{ unsigned char Led=0xfe; //1111 1110
HC595SendData(0xff); //初始化595使他为高电平 让LED处于熄灭状态
while(1)
{
HC595SendData(Led); //调用595驱动程序 把LED的数据送到595
Led=1;
Led = Led| 0x01; //移位后,后面的位为高电平;
if (Led == 0xff ) Led=0xfe; //1111 1110
delay(200);
}
}
/*****************************************************************************
* 延时子程序 *
* *
******************************************************************************/
void delay(unsigned int i)
{
unsigned int j;
for(i; i 0; i--)
for(j = 300; j 0; j--);
}
/*********************************************************************************************************
** 函数名称: HC595SendData
** 功能描述: 向SPI总线发送数据
*********************************************************************************************************/
void HC595SendData(unsigned char SendVal)
{
unsigned char i;
for(i=0;i8;i++)
{
if((SendVali)0x80) MOSIO=1; //set dataline high 0X80 最高位与SendVal左移的最高位 进行逻辑运算
else MOSIO=0; // 如果为真 MOSIO = 1
S_CLK=0;
NOP(); //产生方形波
NOP();
S_CLK=1;
}
R_CLK=0; //set dataline low
NOP(); //产生方形波
NOP();
R_CLK=1; //片选
}
单片机解释
单片机是典型的嵌入式微控制器(Microcontroller Unit),由运算器,控制器,存储器,输入输出设备等构成,相当于一个微型的计算机。与应用在个人电脑中的通用型微处理器相比,它更强调自供应(不用外接硬件)和节约成本。它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出接口简单,功能较低。由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微控制器;已经从上世纪80年代的4位、8位单片机,发展到现在的32位甚至64位的高速单片机。[1]
中文名
单片机
外文名
Microcontroller Unit
性质
嵌入式微控制器
优点
体积小、质量轻、价格便宜
组成
运算器、控制器、存储器、输入输出设备
种类
3种
类别
电路芯片
相关概述
单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit), 常用英文字母的缩写MCU表示单片机。单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。单片机由运算器,控制器,存储器,输入输出设备构成,相当于一个微型的计算机(最小系统),和计算机相比,单片机缺少了外围设备等。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。它最早是被用在工业控制领域。
?
单片机
由于单片机在工业控制领域的广泛应用,单片机由仅有CPU的专用处理器芯片发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。
INTEL的8080是最早按照这种思想设计出的处理器,当时的单片机都是8位或4位的。其中最成功的是INTEL的8051,此后在8051上发展出了MCS51系列单片机系统。因为简单可靠而性能不错获得了很大的好评。尽管2000年以后ARM已经发展出了32位的主频超过300M的高端单片机,直到现在基于8051的单片机还在广泛的使用。在很多方面单片机比专用处理器更适合应用于嵌入式系统,因此它得到了广泛的应用。事实上单片机是世界上数量最多处理器,随着单片机家族的发展壮大,单片机和专用处理器的发展便分道扬镳。
现代人类生活中所用的几乎每件有电子器件的产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电子产品中都含有单片机。 汽车上一般配备40多片单片机,复杂的工业控制系统上甚至可能有数百片单片机在同时工作。
应用分类
单片机作为计算机发展的一个重要分支领域,根据发展情况,从不同角度单片机大致可以分为通用型/专用型、总线型/非总线型及工控型/家电型。
通用/专用型
这是按单片机适用范围来区分的。例如,80C51是通用型单片机,它不是为某种专用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路。
总线型/非总线型
这是按单片机是否提供并行总线来区分的。总线型单片机普遍设置有并行地址总线、数据总线、控制总线,这些引脚用以扩展并行外围器件都可通过串行口与单片机连接,另外,许多单片机已把所需要的外围器件及外设接口集成一片内,因此在许多情况下可以不要并行扩展总线,大大减省封装成本和芯片体积,这类单片机称为非总线型单片机。
工控型/家用型
这是按照单片机大致应用的领域进行区分的。一般而言,工控型寻址范围大,运算能力强;用于家电的单片机多为专用型,通常是小封装、低价格,外围器件和外设接口集成度高。 显然,上述分类并不是惟一的和严格的。例如,80C51类单片机既是通用型又是总线型,还可以作工控用。
相关历史
单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。
起初模型
?
单片机
SCM即单片微型计算机(Single Chip Microcomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,Intel公司功不可没。
MCU即微控制器(Micro Controller Unit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家。从这一角度来看,Intel逐渐淡出MCU的发展也有其客观因素。在发展MCU方面,最著名的厂家当数Philips公司。
Philips公司以其在嵌入式应用方面的巨大优势,将MCS-51从单片微型计算机迅速发展到微控制器。因此,当我们回顾嵌入式系统发展道路时,不要忘记Intel和Philips的历史功绩。
SoC即嵌入式系统(System on Chip)寻求应用系统在芯片上的最大化解决使得专用单片机的发展自然形成了SoC化趋势。随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有越来越大的发展。因此,对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统。
单片机发展史
1971年intel公司研制出世界上第一个4位的微处理器;Intel公司的霍夫研制成功世界上第一块4位微处理器芯片Intel 4004,标志着第一代微处理器问世,微处理器和微机时代从此开始。因发明微处理器,霍夫被英国《经济学家》杂志列为“二战以来最有影响力的7位科学家”之一 。
1971年11月,Intel推出MCS-4微型计算机系统(包括4001 ROM芯片、4002 RAM芯片、4003移位寄存器芯片和4004微处理器 )其中4004包含2300个晶体管,尺寸规格为3mm×4mm,计算性能远远超过当年的ENIAC,最初售价为200美元。
1972年4月,霍夫等人开发出第一个8位微处理器Intel 8008。由于8008采用的是P沟道MOS微处理器,因此仍属第一代微处理器。
1973年intel公司研制出8位的微处理器8080;1973年8月,霍夫等人研制出8位微处理器Intel 8080,以N沟道MOS电路取代了P沟道,第二代微处理器就此诞生。
主频2MHz的8080芯片运算速度比8008快10倍,可存取64KB存储器,使用了基于6微米技术的6000个晶体管,处理速度为0.64MIPS(Million Instructions Per Second )。
1975年4月,MITS发布第一个通用型Altair 8800,售价375美元,带有1KB存储器。这是世界上第一台微型计算机。
1976年intel公司研制出MCS-48系列8位的单片机,这也是单片机的问世。Zilog公司于1976年开发的Z80微处理器,广泛用于微型计算机和工业自动控制设备。当时,Zilog、Motorola和Intel在微处理器领域三足鼎立。
20世纪80年代初,Intel公司在MCS-48系列单片机的基础上,推出了MCS-51系列8位高档单片机。MCS-51系列单片机无论是片内RAM容量,I/O口功能,系统扩展方面都有了很大的提高。
单片机定时器的汇编语言程序编程
1、
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: MOV R2,#00H
MOV TMOD,#20H
MOV TH1,#231
MOV TL1,#231
SETB P1.2
SETB TR1
HERE: JNB TF1,HERE
PT_1: CJNE R2,#07H,PT11
SETB P1.2
MOV R2,#00H
CLR TF1
AJMP HERE
PT11: CLR P1.2
INC R2
CLR TF1
AJMP HERE
END
2、
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP IT_0
ORG 001BH
AJMP IT_1
ORG 0100H
MAIN: MOV TMOD,#51H
MOV TH1,#0FCH
MOV TL1,#18H
MOV IE,#10001010B
SETB TR1
SJMP $
IT_1: CLR TR1
MOV TH0,#0FCH
MOV TL0,#18H
SETB TR0
RETI
IT_0: CLR TR0
MOV TH1,#0FCH
MOV TL1,#18H
SETB TR1
RETI
END
单片机编程
在单片机汇编语言的保留字符中,符号$用于表示当前指令行所在地址。在本题目所给出的汇编子程序中,指令行DJNZ R4,$表示这是一条有条件的转移指令,即R4寄存器中数值减1,如果寄存器值不等于0,转到指定的地址执行程序。而此行指令所指定地址$,就是本行指令所在的地址,所以会重复执行本条指令,直到R4寄存器中内容减至0后,转而执行下条指令。
此处之所以出现这样的写法,完全是为了凑延时吋间。从子程序给出的注释信息可以看出,这是一段500ms的延时程序。在经典的51系列单片机中,执行一条DJNZ操作指令需要2个机器周期,一个机器周期又是12个系统时钟周期。对于系统时钟频率11..0592MHz的单片机,执行一次DJNZ指令占用的时间为2×12x1/11.0592,大约等于2us。因R4寄存器赋初值250,该重复操作所产生延时为2×250=500us。这500us延时又被嵌套在LOOP1和LOOP2两重循环中,LOOP1循环200次,LOOP2循环5次,由此可以计算出子程序总的延时为500×200x5=500(ms)。
51单片机编写lcd1602显示程序,第一行显示自己的姓名,第二行显示学号
1、首先我们打开Keil μVision编译器,新建一个工程,然后保存在硬盘上的位置,然后选择Atmel-AT89C51单片机为模型,并启动器添加STARTUP.A51文件,然后在当前目录下新建一个C文件,并将其添加入工作路径。
2、导入51单片机的头文件以及LCD1602的头文件。
3、创建一个延时函数,可以传入想要具体延时的时长,其内部实现是由一个二重循环,两个循环的次数相乘积。
4、然后创建写命令的函数,指定RS和E同时为0时,才可以写入命令,设定完成后,将com写入输出端口,规定写命令时,E为正脉冲,然后空操作一个机器周期等待机器反应。
5、然后创建写数据的函数,规定写数据时,E为正脉冲,规定当RS=1和RW=0时才可以写入数据,然后将数据从输出端口输出,最后让E产生正跳变。
6、然后创建初始化LCD1602的函数,指定显示模式位两行显示,5*7,8位数据、整体显示,无光标,无闪烁、写入一个字符后地址指针加1,最后进行清屏操作。
7、最后在主函数中首先执行LCD1602的初始化函数,首先创建一个无限循环,然后添加两个字符串,这里以两行显示百度经验的网址为例,再进行延时以及使用清屏函数进行刷新。