单片机必会程序2
学习51单片机必写的几个程序
学习51单片机必写的几个程序
51 单片机偶完全自学的,因为想学的时候离学校开课还早得很。
学完了单片机,现在学校课也开完了,收获很大。
现将偶学习经验写出来,供大家交流。
1、因为有了C 语言和汇编语言的基础,加上模电学得不错。
微机原理也上了。
所以我只花了半天的时间把51 的引脚功能和内部结构搞清楚了。
偶认为学51 重要的就是搞清内部结构和地址空间。
2、仅用了几个小时简单看了一下51 的汇编指令和C 语法。
我个人认为学习程序语言的语法规则是很简单的,且各种语言之间都有共通的地方,有了汇编和某种高级语言的基础学其它语言应该能很快上手。
3、直接编程练习,软件硬件实现。
我的第一个程序是跑马灯程序。
这个会让你熟悉端口的用法,普通流程控制。
当然是C 语言写一个,汇编写一个,实现同样的功能。
我的第二个程序是电子钟。
这个程序会使你对中断有更深入的了解和学会中断的应用,包括外部中断(调整时间)的应用。
同样C 和汇编两种方法实现。
还会学会数码管的驱动,动态
扫描,查表编程等。
我的第三个程序DS1821 温度计
这个程序使我学习如何从一个不熟悉的器件的数据资料读取其时序图,用单片机来模拟其时序以实现对器件的操作。
同样用C 和汇编同时实现。
我的第四个程序128 乘以64 液晶显示程序。
这个程序会学会液晶显示原理,单片机数据口线的操作等。
同样两种语言实。
单片机学习第四章汇编语言程序设计
ORG START:CLR
MOV SUBB JC MOV XCH MOV NEXT: NOP SJMP END
1000H C A,60H A,61H NEXT A,60H A, 61H 60H,A
$
;0→CY
;做减法比较两数 ;若(60H)小,则转移
;交换两数
整理课件
【例4.6】将R2中的一位十六进制数转换为 ASCII码,结果仍存放于R2中。
MOV R0, #0 SJMP NEXT4 NEXT2:MOV R0,A DEC R0 NEXT4:MOV 31H,R0 SJMP $ END
;取X ;与5比较
;X<5,则转NEXT2 ; ;设10<X,Y=X十1
;与1l比较 ;x>10,则转NEXT4
;5≤X≤10,Y=0
;X<5,Y=X-1 ;存结果
MOV
@R0,A
;保存结果
SJMP $
;原地踏步
END
整理课件
【例4.2】假设两个双字节无符号数,分别存 放在R1R0和R3R2中,高字节在前,低字 节在后。编程使两数相加,用R2R1R0存放 和。 对多字节的加法,存在最高位的进位问题。 如果最高位有进位,则和的字节数要比加 数或被加数的字节数多一个。
经常用于定义一个地址表。Yi为双字节数据, 它可以为十进制或十六进制的数,也可以 为一个表达式。高位数在前,低位数在后。
整理课件
• 例如: ORG 1000H DATA:DW 3241H,1234H,78H 上述程序将对从1000H单元开始的6个单元 赋值,赋值情况如何呢? (1000H)=32H,(1001H)=41H, (1002H)=12H,(1003H)=34H, (1004H)=00H,(1005H)=78H。
stc单片机程序烧录方法
STC单片机程序烧录方法介绍STC单片机是一种常用的嵌入式系统开发工具,用于控制各种电子设备。
在使用STC单片机时,烧录程序是必不可少的一步。
本文将详细介绍STC单片机程序烧录的方法和步骤。
准备工作在进行STC单片机程序烧录之前,需要准备以下材料和工具: 1. STC单片机:根据具体需求选择合适的型号; 2. 烧录器:常用的烧录器有STC-ISP、STC-USBISP 等; 3. 程序文件:将要烧录到单片机中的程序文件,通常为HEX或BIN格式; 4. 连接线:用于连接单片机和烧录器的数据线; 5. 电源线:用于给单片机供电的电源线; 6. 电脑:用于烧录程序的电脑。
步骤下面将详细介绍STC单片机程序烧录的步骤:步骤一:连接硬件1.将烧录器插入电脑的USB接口,并确保烧录器驱动已正确安装;2.将单片机插入烧录器的插座中,确保插入方向正确;3.使用数据线将烧录器与单片机连接,确保连接牢固;4.使用电源线给单片机供电,确保电源稳定。
步骤二:打开烧录软件1.打开电脑上的烧录软件,常用的软件有STC-ISP、STC-PROG等;2.在软件中选择正确的单片机型号,以及烧录器的连接方式和端口号。
步骤三:导入程序文件1.在烧录软件中选择“打开”或“导入”按钮,导入要烧录的程序文件;2.确认程序文件的格式和路径是否正确。
步骤四:设置烧录参数1.在烧录软件中选择“设置”或“选项”按钮,设置烧录参数;2.根据具体需求设置芯片的时钟频率、烧录方式等参数。
步骤五:烧录程序1.在烧录软件中选择“烧录”或“开始”按钮,开始烧录程序;2.烧录过程中,烧录器会将程序文件中的数据逐个写入单片机的存储器中;3.等待烧录完成,并在软件中查看烧录结果。
步骤六:测试程序1.确认程序已成功烧录到单片机中后,断开烧录器与单片机的连接;2.将单片机与外部电路连接,并给单片机供电;3.测试程序的功能和性能,确保程序正常运行。
注意事项在进行STC单片机程序烧录时,需要注意以下事项: 1. 确保烧录器与单片机的连接正确,避免插反或接触不良; 2. 在烧录过程中,确保烧录器和单片机的供电稳定; 3. 在选择烧录软件和设置烧录参数时,确保与单片机型号和程序文件格式相匹配; 4. 在烧录过程中,不要断开烧录器与单片机的连接或供电; 5. 在测试程序时,注意观察和记录程序的运行情况,及时排除问题。
单片机汇编指令
单片机汇编指令单片机(Microcontroller)是一种集成了微处理器和其他外设的集成电路芯片,用于控制各种电子设备。
在单片机的开发过程中,编程是必不可少的一部分,而汇编语言是一种常用于单片机编程的低级语言。
汇编语言是一种和机器语言十分接近的编程语言,使用简单的助记符(Mnemonic)来代表机器指令,方便程序员进行编程。
在单片机开发中,汇编语言的指令集是非常重要的知识,掌握好单片机的汇编指令对于编写高效、性能优良的程序至关重要。
本文将介绍一些常见的单片机汇编指令,供大家参考和学习。
一、数据传输指令1. MOV 指令:将数据从一个存储器位置或寄存器传输到另一个存储器位置或寄存器。
例如:MOV A, B ;将B的值传送给A寄存器MOV R1, #20 ;将数值20传送给R1寄存器2. LDA 和 STA 指令:分别用于将数据从存储器加载到累加器和将累加器中的数据存储到存储器中。
例如:LDA 0x20 ;将地址为0x20的存储器单元的数据加载到累加器STA 0x30 ;将累加器中的数据存储到地址为0x30的存储器单元3. XCH 指令:用于交换两个存储器位置或寄存器的数据。
例如:XCH A, B ;交换A和B寄存器的值二、算术指令1. ADD 和 SUB 指令:分别用于将数据相加和相减。
例如:ADD A, B ;将A和B的值相加,并将结果存储到A寄存器SUB A, B ;将B的值从A中减去,并将结果存储到A寄存器2. INC 和 DEC 指令:分别用于将数据递增和递减。
例如:INC A ;将A的值递增1DEC A ;将A的值递减1三、逻辑指令1. AND、OR 和 XOR 指令:分别用于进行逻辑与、逻辑或和逻辑异或操作。
例如:AND A, B ;将A和B的值进行逻辑与操作,并将结果存储到A寄存器OR A, B ;将A和B的值进行逻辑或操作,并将结果存储到A寄存器XOR A, B ;将A和B的值进行逻辑异或操作,并将结果存储到A寄存器2. NOT 指令:用于对一个存储器位置或寄存器中的数据进行逻辑非操作。
单片机 80C51单片机的软件基础_2
单片机 80C51单片机的软件基础_2在现代电子技术领域,单片机扮演着至关重要的角色。
80C51 单片机作为其中的经典代表,其软件基础是我们深入理解和应用它的关键。
首先,让我们来了解一下 80C51 单片机的指令系统。
指令是单片机能够执行的基本操作命令,就如同我们日常做事的具体步骤。
80C51单片机的指令系统丰富多样,包括数据传送指令、算术运算指令、逻辑运算指令、控制转移指令等等。
数据传送指令用于在单片机内部的寄存器、存储器之间进行数据的移动。
比如说,将一个数值从一个寄存器传送到另一个寄存器,或者将存储单元中的数据读取到寄存器中。
算术运算指令则能实现加法、减法、乘法、除法等基本的数学运算。
这在处理各种数据计算的任务中是必不可少的。
逻辑运算指令用于对数据进行逻辑与、或、异或等操作,帮助我们实现对数据的逻辑判断和处理。
控制转移指令则决定了程序的执行流程。
它可以让程序根据特定的条件跳转到指定的地址继续执行,从而实现分支和循环等功能。
接下来,我们说一说 80C51 单片机的编程语言。
常见的编程语言有机器语言、汇编语言和高级语言。
机器语言是单片机能够直接识别和执行的二进制代码。
它由一连串的 0 和 1 组成,虽然执行效率高,但编写和阅读都非常困难。
汇编语言是一种符号化的机器语言,使用助记符来代替机器指令的操作码,用地址符号或标号来代替地址码。
相比机器语言,汇编语言更易于理解和编写,但仍然需要对单片机的硬件结构有较深入的了解。
高级语言,如 C 语言,具有更高的可读性和可维护性。
它能够让开发者更专注于解决问题的逻辑,而不必过多地关注单片机的底层硬件细节。
使用高级语言编写的程序,经过编译后可以在 80C51 单片机上运行。
在软件开发过程中,编程工具也是不可或缺的。
Keil 就是一款常用的 80C51 单片机编程软件。
它提供了方便的代码编辑、编译、调试环境,能够大大提高开发效率。
编写好程序后,我们需要将其下载到单片机中。
第3章51系列单片机程序设计(C语言部分)
idata
间接寻址片内数据存储区,可访问片内全部RAM地址空间(256字节)
pdata
分页寻址片外数据存储区(256字节)由MOV @Ri访问(i=0,1)
xdata
片外数据存储区(64 KB)由MOVX @DPTR访问
code
程序存储器64 KB空间,由MOVC @DPTR访问
第3章 51系列单片机程序设计(C部分)
/* Ary37定义为abry[3]的第7位 */
第3章 51系列单片机程序设计(C部分)
3.5 数 组
数组:数组是一组类型相同 有序数据的集合。用数组名 和下标来唯一确定数组中的 元素。
第3章 51系列单片机程序设计(C部分)
3.5.1 一维数组
一、一维数组的定义 形式:类型说明符 数组名 [常量表达式]
使用C51进行编程时,MCS-51片内的I/O口与片外扩展的I/O可以统一在一个头文 件中定义,也可以在程序中(一般在开始的位置)进行定义。
对于MCS-51片内I/O口按特殊功能寄存器方法定义。 例如:
sfr P0=0x80 ; /* 定义P0口,地址为80H */ sfr P1=0x90 ; /* 定义P1口,地址为90H */
第3章 51系列单片机程序设计(C部分)
3.4.3 C51数据的存储类型与MCS-51存储结构
表 3.4.2 C51存储类型与MCS-51存储空间的对应关系
存储类型 与存储空间的对应关系
data
直接寻址片内数据存储区,访问速度快(128字节)
bdata
可位寻址片内数据存储区,允许位与字节混合访问(16字节)
据 浮点型(float) 类
型 指针类型
详细见表3.4.1
8051单片机常用指令
8051单⽚机常⽤指令3.2.1数据传送与交换类指令共有28条指令,包括以A,Rn,DPTR,直接地址单元,间接地址单元为⽬的的操作数的指令;访问外部RAM的指令;读程序存储器的指9.堆栈操作3.2 分类指令在介绍各条分类指令之前,将指令中的操作数及注释中的符号说明如下。
Rn:当前指定的⼯作寄存器组中的Ro-R7(其中n=0,1,2,…,7)。
Ri:当前指定的⼯作寄存器组中的RO,R1(其中i=0,1)。
(Ri):Ri间址寻址指定的地址单元。
((Ri)):Ri间址寻址指定地址单元中的内容。
dir:8位直接字节地址(在⽚内RAM和SFR存储空间中)。
#data8:8位⽴即数。
#datal6:16位⽴即数。
addrl6:16位地址值。
addrll:11位地址值。
bit:位地址(在位地址空间中)。
rel:相对偏移量(⼀字节补码数)。
下⾯介绍各条分类指令的主要功能和操作,详细的指令操作说明及机器码形式可见附录。
3.2.1数据传送与交换类指令共有28条指令,包括以A,Rn,DPTR,直接地址单元,间接地址单元为⽬的的操作数的指令;访问外部RAM的指令;读程序存储器的指令;数据交换指令以及准栈操作指令。
9.堆栈操作PUSH dir ;SP⼗1-6P,(dir)⼀(SP)POP dir ;((SP))⼀dir,SP-1--P ,例1 SP=07H,(35H)=55H,指令PUSH 35H执⾏后,55H送⼊08H地址单元,SP=08H。
例2 SP=13H,(13H)= 1FH,指令POP 25H执⾏后,1FH压⼊25H地址单元,SP此时为12H。
综合例把⽚内RAM中50H地址单元中的内容与40H地址单元中的内容互换。
⽅法⼀(直接地址传送法):MOV A ,50H数据传送与交换类指令是各类指令中数量最多、使⽤最频繁的⼀类指令,编程时应能⼗分熟练地灵活运⽤3.2.2算术运算类指令共有24条指令,主要包括加、减、乘、除、增量、减量和⼗进制调整等指令。
单片机函数
单片机函数单片机函数是一种用于编程控制的函数,主要用于单片机的内部功能和外部设备之间的交互。
当我们在单片机中编程时,可以使用已经定义好的函数来实现一些常见的功能,而不必每次都重复编写代码。
本文将介绍一些常见的单片机函数及其用法。
1.延时函数延时函数是单片机编程中最基本的函数之一、它用于在程序中添加延时,以控制程序的时间间隔。
延时函数可以通过软件实现,也可以通过硬件计数器来实现。
例如,对于某些需要精确控制时间的操作,我们可以使用硬件计数器来实现延时,而对于一些简单的延时操作,我们可以使用软件延时函数来实现。
2.输入输出函数输入输出函数用于读取输入设备或控制输出设备。
在单片机中,输入输出通常通过引脚来实现。
通过调用输入输出函数,我们可以读取或控制某个引脚的电平状态。
例如,如果我们希望读取一个传感器的数据,我们可以使用输入函数来读取传感器引脚的电平;如果我们想控制一个LED灯的亮灭,我们可以使用输出函数来控制LED引脚的电平状态。
3.中断函数中断函数是一种特殊的函数,它用于响应硬件中断。
当某个硬件事件发生时,中断函数会被自动调用,以便进行相应的处理。
例如,当一个按钮按下时,可以配置一个中断函数,以便在按钮按下时自动执行特定的操作。
中断函数通常是基于优先级的,可以设置不同的中断优先级来处理不同的中断事件。
4.串口通信函数串口通信函数是用于在单片机和外部设备之间进行串行通信的函数。
串行通信用于将数据以位的形式发送或接收,可以实现单片机与计算机、传感器、显示器等设备的数据传输。
串口通信函数通常包括初始化函数、发送函数和接收函数,通过调用这些函数,可以实现单片机与外部设备的数据交换。
5.定时器函数定时器函数是用于配置和控制单片机内部定时器模块的函数。
定时器可以用来产生特定时间间隔的中断,用于周期性地执行某个任务,例如定时发送数据、定时采集传感器数据等。
定时器函数通常包括配置函数、启动函数和停止函数,通过调用这些函数,可以实现定时器的设置和控制。
MCS系列单片机指令系统2
Y
解:本题是十进制数累加,必 须对和要进行BCD码调整;同
N Cy=1?
Y
时加数的增长不能用INC指令, 千、百位加1
数据保存 结束
也必须进行BCD码调整,因此 只能用ADD A,#01指令, 再进行BCD码调整。
BCD码调整 加数1
【例】在内RAM 30H~3FH 存放符号数,试统计中间负数 的个数,将统计结果存放在 40H单元中,试编制程序。
4)DW伪指令 指令格式:
[标号:]DW 16位二进制数表 说明:DW伪指令是定义字的伪指令,即从指定的地址单元 开始,定义若干个16位二进制数据,每个字占用两个单元, 先存高8位,再存低8位。用法同DB伪指令。
5)DS伪指令
指令格式:
地址
[标号:]DS <表达式>
说明:DS伪指令是定义存储区, 2000H
LOOP2:INC R0 DJNZ R2,LOOP1 END
本章小结
主要掌握立即寻址、直接寻址、寄存器寻址、寄存器间接 寻址等寻址方式。 掌握各指令的格式及用法。 能阅读程序,写出结果。 能编写简单结构化程序。
【例】下列程序存放在ROM中的情
况。 源程序
机器语言
ORG 2000H
START:MOV A,#02H 74 02
MOVC A,@A+PC 83
RET
22
DB 41H,”4”,”A”41 34 41
END
地址 2000H 2001H 2002H 2003H 2004H 2005H 2006H
ROM 74 02 83 22 41 34 41
即从标号指定的单元开始保留表 2001H
达式所代表的存储单元数。
2002H
单片机重点
1、若不使用MCS-51片内存储器引脚EA必须接地。
2、微处理器由寄存器、控制器和运算器三部分组成。
3、单片机系统复位后,PSW=00H,因此片内RAM寄存区的当前寄存器是第 0 组,8个寄存器的单元地址为 00H ~ 07H 。
4、当80C51的RST引脚上保持 2 个机器周期以上的高电平时,80C51即发生复位。
5、当单片机的型号为8031时,其芯片引线EA一定要接低电平。
6、MCS-51单片机内RAM的寄存器区共有 32 单元,分为 4 组寄存器,每组 8 个单元,以 R0~R7 作为寄存器名称。
7、若单片机使用频率为6MHz的晶振,那么机器周期为 2US 。
8、复位后A= 00H ,PSW= 00H ,SP= 07H ,P0~P3= 0FFH 。
80C51复位后,CPU从 0000 H单元开始执行程序,SP的内容为 07 H,第一个压入堆栈的数据将位于内部 RAM的 08 H单元。
OPL A,#4执行指令后,PSW寄存器的内容P为 0 H。
9、8031单片机的引脚必须接低电平, P0 口作地址/数据总线,传送地址码的低8位, P2 口作地址总线,传送地址码的高 8位。
三态缓冲寄存器输出端的“三态”是指高电平态、低电平态和高阻态10、80C51中断有 2 个优先级。
11、MCS-51有5个中断源,有2个中断优先级,优先级由软件填写特殊功能寄存器 IP加以选择。
12、外部中断INT1入口地址为 0013H 。
13、MCS-51中,T0中断服务程序入口地址为__000BH__。
14、80C51中断嵌套最多__2__级。
15、外中断请求标志位是_IE0_和_IE1_。
16、中断系统(1)INT0和INT1的中断标志分别是IE0和IE1。
(2)T0和T1两引脚也可作外部中断输入引脚,这时TMOD寄存器中的C/T位应当为1。
17、MCS-51串行接口有4种工作方式,这可在初始化程序中用软件填写 SCON 特殊功能寄存器加以选择。
单片机编程全集(含源代码)
前言 (2)基础知识:单片机编程基础 (2)第一节:单数码管按键显示 (4)第二节:双数码管可调秒表 (6)第三节:十字路口交通灯 (7)第四节:数码管驱动 (9)第五节:键盘驱动 (10)第六节:低频频率计 (15)第七节:电子表 (18)第八节:串行口应用 (19)前言本文是本人上课的一个补充,完全自写,难免有错,请读者给予指正,可发邮件到ZYZ@,或郑郁正@中国;以便相互学习。
结合课堂的内容,课堂上的部分口述内容,没有写下来;有些具体内容与课堂不相同,但方法是相通的。
针对当前的学生情况,尽可能考虑到学生水平的两端,希望通过本文都学会单片机应用。
如果有不懂的内容,不管是不是本课的内容,都可以提出来,这些知识往往代表一大部分同学的情况,但本人通常认为大家对这些知识已精通,而在本文中没有给予描述,由此影响大家的学习。
对于这些提出问题的读者,本人在此深表谢意。
想深入详细学习单片机的同学,可以参考其它有关单片机的书籍和资料,尤其是外文资料。
如果有什么问题,我们可以相互探讨和研究,共同学习。
本文根据教学的情况,随时进行修改和完善,所以欢迎同学随时注意本文档在课件中的更新情况。
基础知识:单片机编程基础单片机的外部结构:1、DIP40双列直插;2、P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)3、电源VCC(PIN40)和地线GND(PIN20);4、高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)5、内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)6、程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)7、P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)1、四个8位通用I/O端口,对应引脚P0、P1、P2和P3;2、两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)3、一个串行通信接口;(SCON,SBUF)4、一个中断控制器;(IE,IP)针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。
(完整版)STC89C52单片机定时器2的使用
52单片机有3个定时器,T2是一个16位自动重载的,像T0和T1的方式2一样,只不过它是16位重载,如果作为计数器或定时用,中断用的是5,就是interrupt 5,T2的引脚是P1.0口。
P1.0作为I/O 口用了以后T2计数是不行了,不过定时或是作为串口时钟还是可以的。
T2CON(T2的控制寄存器),字节地址0C8H:0CFH 0CEH 0CDH 0CCH 0CBH 0CAH 0C9H 0C8HTF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RT2 各位的定义如下:TF2:定时/计数器2溢出标志,T2溢出时置位,并申请中断。
只能用软件清除,但T2作为波特率发生器使用的时候,(即RCLK=1或TCLK=1),T2溢出时不对TF2置位。
EXF2:当EXEN2=1时,且T2EX引脚(P1.0)出现负跳变而造成T2的捕获或重装的时候,EXF2置位并申请中断。
EXF2也是只能通过软件来清除的。
RCLK:串行接收时钟标志,只能通过软件的置位或清除;用来选择T1(RCLK=0)还是T2(RCLK=1)来作为串行接收的波特率产生器TCLK:串行发送时钟标志,只能通过软件的置位或清除;用来选择T1(TCLK=0)还是T2(TCLK=1)来作为串行发送的波特率产生器EXEN2:T2的外部允许标志,只能通过软件的置位或清除;EXEN2=0:禁止外部时钟触发T2;EXEN2=1:当T2未用作串行波特率发生器时,允许外部时钟触发T2,当T2EX引脚输入一个负跳变的时候,将引起T2的捕获或重装,并置位EXF2,申请中断。
TR2:T2的启动控制标志;TR2=0:停止T2;TR2=1:启动T2C/T2:T2的定时方式或计数方式选择位。
只能通过软件的置位或清除;C/T2=0:选择T2为定时器方式;C/T2=1:选择T2为计数器方式,下降沿触发。
CP/RT2:捕获/重装载标志,只能通过软件的置位或清除。
理工类专业课复习资料-单片机原理及应用期末考试必考知识点重点总结
单片机是微单片微型计算机的简称,微型计算机的一种。
它把中央处理器(CPU) ,随机存储器(RAM),只读存储器(ROM) ,定时器\计数器以及I\O 接口,串并通信等接口电路的功能集成与一块电路芯片的微型计算机。
:在计算机中有一组二进制编码表示一个信息,这组编码称为计算机的字,组成字的位数称为“字长”,字长标志着精度,MCS-51 是8 位的微型计算机。
89c51 是8 位 (字长) 单片机 (51 系列为8 位)单片机硬件系统仍然依照体系结构:包括CPU(进行运算、控制) 、RAM(数据存储器)、ROM(程序存储器)、输入设备和输出设备、内部总线等。
由于一块尺寸有限的电路芯片实现多种功能,所以制作上要求单片机的高性能,结构简单,工作可靠稳定。
单片机软件系统包括监控程序,中断、控制、初始化等用户程序。
一般编程语言有汇编语言和 C 语言,都是通过编译以后得到机器语言(二进制代码)。
1.1一种是HMOS 工艺,高密度短沟道MOS 工艺具有高速度、高密度的特点;另一种是CHMOS 工艺,互补金属氧化物的HMOS 工艺,它兼有HMOS 工艺的特点还具有CMOS 的低功耗的特点。
例如:8051 的功耗是630mW,80C51 的功耗只有110mW 左右。
1.251.设计单片机系统的电路2.利用软件开发工具(如:Keil c51) 编辑程序,通过编译得到.hex 的机器语言。
3.利用单片机仿真系统(例如:Protus) 对单片机最小系统以及设计的外围电路,进行模拟的硬软件联合调试。
4.借助单片机开发工具软件(如:STC_ISP 下载软件) 读写设备将仿真中调试好的.hex 程序拷到单片机的程序存储器里面。
5.根据设计实物搭建单片机系统。
2.1MCS-51()CPU(进行运算、控制) 、RAM(数据存储器) 、ROM(程序存储器)、I/O 口(串口、并口)、内部总线和中断系统等。
工作过程框图如下:组成:8 位算术逻辑运算单元ALU (Arithmetic Logic Unit)、8 位累加器A (Accumulator)、8 位寄存器B、程序状态字寄存器PSW (Program Status Word)、8 位暂存寄存器TMP1 和TMP2 等。
51单片机基础知识必备
51单片机基础知识必备一. 基础知识必备1 . 单片机复位引脚——RST当输入连续两个机器周期以上的高电平时为有效,用来完成单片机复位的初始化操作,复位后的程序计数器PC = 0000H,即复位后将从程序存储器的0000H单元读取第一条指令代码。
通俗的讲,就是单片机从头开始执行程序。
2.PSEN 全称是程序储存器允许输出控制端。
在读取外部程序储存器时,PSEN低电平有效,以实现外部程序储存器的读操作。
(内存足够了,没必要)3.电平重要知识点CMOS电路中不使输入端悬空,否则会造成逻辑混乱。
CMOS电平能驱动TTL电平,但是TTL电平不能驱动CMOS电平,需加上拉电阻4. 51系类扩展数据类型sfr——特殊功能寄存器的数据声明,声明一个8位寄存器。
sfr16 ——16位特殊功能寄存器的数据声明。
sbit ——特殊功能位声明,就是声明某一个特殊功能寄存器中的某一位。
bit ——位变量声明,当定义一个位变量时,可使用此符号。
5. 电阻的标志读数如果标称是103,就是10*10^3欧姆,150表示15*10^0欧姆,三位数表示5%精度,四位数表示1%精度6.要牢记,51MCU上电时,如果没有人为的控制IO状态,它所有的IO口都将是高电平,因此,我们没有必要写一句让锁存端置于高电平的语句7.和MCU有关的周期(1)时钟周期,也称震荡周期,定义为时钟频率的倒数。
MCU中最小的事件单位(2)状态周期,他是时钟周期的两倍(3)机器周期,MCU的基本操作周期,在一个操作周期内,MCU完成一个基本操作,如读取指令,储存器的读写。
它由12个时钟周期(6个状态周期组成)(4)指令周期,他是指MCU执行一条命令所需要的事件,一般一个指令周期含有1~4个机器周期8.“消影”——P0 = 0xff每次送完段选数据之后,在送入为选数据之前,需加上P0 = 0xff。
9 中断概念51内部有5个终端源,也就是说有5种情况发生,会使得单片机去处理终端程序。
单片机操作流程
单片机操作流程
第一步:点击PROJECT中的NEW PROJECT然后命名(要知道路径) ,保存,选择相对应的芯片型号,确定。
第二步:点击FILE,选NEW,输入程序,保存,需要知道路径名及其后缀。
第三步:在界面左侧窗口中的source group 1上点击右键,add file to group,找到刚保存的源文件,add,close 第四步:界面左侧窗口中的target 1上点击右键,options for target"target 1”第五步:在出现的界面中选择上方的output在“create hex file”前打对勾,确定。
第六步:在界面左侧窗口中的target 1上点击右键built target如提示信息中没有警告及错误即可。
第七步:关闭KEIL窗口,打开编程窗口(必须通讯正常) ,选择正确的芯片型号,点击擦除,然后点击加载,找到刚刚KEIL中编译生成的HEX文件,确定,编程即可。
(其间把芯片正确放入编程器的座上。
)。
单片机编程入门学习C语言和汇编语言
单片机编程入门学习C语言和汇编语言随着科技的发展,单片机已经成为嵌入式系统中不可或缺的部分。
单片机是一种集成电路芯片,具有控制和处理功能,广泛应用于各个领域。
要想进行单片机编程,学习C语言和汇编语言是必不可少的。
本文将介绍单片机编程入门所需的C语言和汇编语言知识,帮助读者快速掌握单片机编程技能。
一、C语言入门C语言是一种高级程序设计语言,特点是语法简洁、灵活、易学易用。
它广泛应用于软件开发和嵌入式系统中。
下面是C语言入门的一些基础知识点:1. 数据类型C语言提供了多种数据类型,包括整数类型、浮点数类型、字符类型等。
在编程时需要根据具体需求选择适当的数据类型。
2. 运算符C语言支持各种运算符,如算术运算符、关系运算符、逻辑运算符等。
掌握运算符的使用方法对于编程非常重要。
3. 控制语句C语言提供了多种控制语句,如条件语句、循环语句和跳转语句。
通过控制语句可以控制程序的执行流程。
4. 数组和指针数组和指针是C语言中非常重要的概念。
数组用于存储一系列相同类型的数据,指针用于存储变量的地址。
5. 函数函数是C语言中的重要组成部分,可以将一段逻辑代码封装成函数,实现代码的模块化和重用。
通过学习以上C语言基础知识,读者可以初步掌握C语言编程的能力,并开始进行单片机编程的学习。
二、汇编语言入门汇编语言是一种低级程序设计语言,与计算机硬件直接相关。
通过汇编语言,程序员可以直接控制计算机的底层操作。
下面是汇编语言入门的一些基础知识点:1. 寄存器在汇编语言中,寄存器是存储数据的重要部件。
不同的CPU架构提供了不同的寄存器,如AX、BX、CX等。
程序员需要了解不同寄存器的功能和使用方法。
2. 指令汇编语言以指令的形式进行操作。
每个指令对应一条机器指令,如MOV、ADD、SUB等。
程序员需要学会各个指令的使用方法。
3. 内存管理程序需要使用内存来存储数据和指令。
汇编语言提供了各种内存管理指令,如MOV、LEA、LDA等。
常见51单片机指令及详解
常见51单片机指令及详解数据传递类指令(1)以累加器为目的操作数的指令MOV A,RnMOV A,directMOV A,@RiMOV A,#data第一条指令中,Rn代表的是R0-R7。
第二条指令中,direct就是指的直接地址,而第三条指令中,就是我们刚才讲过的。
第四条指令是将立即数data送到A中。
下面我们通过一些例子加以说明:MOV A,R1 ;将工作寄存器R1中的值送入A,R1中的值保持不变。
MOV A,30H ;将内存30H单元中的值送入A,30H单元中的值保持不变。
MOV A,@R1 ;先看R1中是什么值,把这个值作为地址,并将这个地址单元中的值送入A中。
如执行命令前R1中的值为20H,则是将20H单元中的值送入A中。
MOV A,#34H ;将立即数34H送入A中,执行完本条指令后,A中的值是34H。
(2)以寄存器Rn为目的操作的指令MOV Rn,AMOV Rn,directMOV Rn,#data这组指令功能是把源地址单元中的内容送入工作寄存器,源操作数不变。
(3)以直接地址为目的操作数的指令MOV direct,A 例: MOV 20H,AMOV direct,Rn MOV 20H,R1MOV direct1,direct2 MOV 20H,30HMOV direct,@Ri MOV 20H,@R1MOV direct,#data MOV 20H,#34H(4)以间接地址为目的操作数的指令MOV @Ri,A 例:MOV @R0,AMOV @Ri,direct MOV @R1,20HMOV @Ri,#data MOV @R0,#34H(5)十六位数的传递指令MOV DPTR,#data168051是一种8位机,这是唯一的一条16位立即数传递指令,其功能是将一个16位的立即数送入DPTR中去。
其中高8位送入DPH,低8位送入DPL。
例:MOV DPTR,#1234H,则执行完了之后DPH中的值为12H,DPL中的值为34H。
单片机编程入门:单片机流水灯程序
单片机编程入门:单片机流水灯程序今日就来教教大家怎么玩玩51单片机,当然了,首先有一个必要的条件就是你必需要会c语言,目前高校里面有开的关于微机原理的课的,上课的时候,老师还说:“你们要多学学汇编语言,对你们以后学习单片机有用”,而事实上后来才发觉c语言才是最重要的。
要想玩单片机,就必需要知道最重要的是什么,对于一块51单片机的开发板来说,最重要的就是要认仔细真的看它的原理图,原理图才是最重要的。
今日先说说最基本的,就是怎么玩流水灯,老样子,先看看原理图:可以看到,总共是八个LED灯,都是由单片机的P1口掌握的,并且可以知道当端口为低电平常,灯就会亮,大家肯定要留意这一点,目前市场上51的开发板还是有特别多的,你必需要知道你的板子上LED灯是高电平使能还是低电平使能。
像我这块就是低电平使能,写程序的话,我们可以用十六进制的代码写,任意一个十六进制的数都可以拆分成八位的二进制数,而计算机只识别二进制,这样我们可以直接掌握LED灯。
比如我现在写一个代码P1 = 0xfe,那么把它变为二进制后就是1111 1110 这样的话,正好对应八个LED灯,最终一位是零,那么也就是最终一个LED灯亮了,其余的则是全灭状态。
现在我们可以玩玩流水灯,看一下这个程序:看主函数main 里面的代码,P1 = 0xff 说明最开头是全灭状态,定义一个for循环,以八位为一个循环,当然也可以看到,最重要的便是P1 = P1》1这个代码,相当于说是把1111 1111 这个代码整体向右移位,比如说移位一次,那么就会变成0111 1111,那么就会有一个灯亮,移位两次,就会变成0011 1111,就会有两个灯亮,以此类推下去,等就会渐渐亮起来。
也就是流水灯咯。
大家可以自己随便修改,看看各种亮灯方式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "delay.h"/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}#include"display.h"#include"delay.h"#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换//sbit LA TCH1=P2^0;//定义锁存使能端口段锁存//sbit LA TCH2=P2^3;// 位锁存unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2------------------------------------------------*/void Display(unsigned char FirstBit,unsigned char Num){static unsigned char i=0;DataPort=0; //清空数据,防止有交替重影LA TCH1=1; //段锁存LA TCH1=0;DataPort=dofly_WeiMa[i+FirstBit]; //取位码LA TCH2=1; //位锁存LA TCH2=0;DataPort=TempData[i]; //取显示数据,段码LA TCH1=1; //段锁存LA TCH1=0;i++;if(i==Num)i=0;}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值//TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*------------------------------------------------定时器中断子程序------------------------------------------------*/void Timer0_isr(void) interrupt 1{TH0=(65536-2000)/256; //重新赋值2msTL0=(65536-2000)%256;Display(0,8);}#include"display.h"#include"delay.h"#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换//sbit LA TCH1=P2^0;//定义锁存使能端口段锁存//sbit LA TCH2=P2^3;// 位锁存unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2------------------------------------------------*/void Display(unsigned char FirstBit,unsigned char Num){static unsigned char i=0;DataPort=0; //清空数据,防止有交替重影LA TCH1=1; //段锁存LA TCH1=0;DataPort=dofly_WeiMa[i+FirstBit]; //取位码LA TCH2=1; //位锁存LA TCH2=0;DataPort=TempData[i]; //取显示数据,段码LA TCH1=1; //段锁存LA TCH1=0;i++;if(i==Num)i=0;}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值//TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*------------------------------------------------定时器中断子程序------------------------------------------------*/void Timer0_isr(void) interrupt 1{TH0=(65536-2000)/256; //重新赋值2msTL0=(65536-2000)%256;Display(0,8);}/*-----------------------------------------------名称:IIC协议PCF8591 AD/DA转换论坛:编写:shifang修改:无内容:使用4路AD中的1路检测外部模拟量输入------------------------------------------------*/#include <reg52.h>#include "i2c.h"#include "delay.h"#include "display.h"#define AddWr 0x90 //写数据地址#define AddRd 0x91 //读数据地址extern bit ack;unsigned char ReadADC(unsigned char Chl);bit WriteDAC(unsigned char dat);/*------------------------------------------------主程序------------------------------------------------*/main(){unsigned char num=0;Init_Timer0();while (1) //主循环{num=ReadADC(0);TempData[0]=dofly_DuanMa[num/100];TempData[1]=dofly_DuanMa[(num%100)/10]; TempData[2]=dofly_DuanMa[(num%100)%10];//主循环中添加其他需要一直工作的程序DelayMs(100);}}/*------------------------------------------------读AD转值程序输入参数Chl 表示需要转换的通道,范围从0-3返回值范围0-255------------------------------------------------*/unsigned char ReadADC(unsigned char Chl){unsigned char V al;Start_I2c(); //启动总线SendByte(AddWr); //发送器件地址if(ack==0)return(0);SendByte(0x40|Chl); //发送器件子地址if(ack==0)return(0);Start_I2c();SendByte(AddWr+1);if(ack==0)return(0);V al=RcvByte();NoAck_I2c(); //发送非应位Stop_I2c(); //结束总线return(V al);}/*------------------------------------------------写入DA转换数值输入参数:dat 表示需要转换的DA数值,范围是0-255 ------------------------------------------------*//*bit WriteDAC(unsigned char dat){Start_I2c(); //启动总线SendByte(AddWr); //发送器件地址if(ack==0)return(0);SendByte(0x40); //发送器件子地址if(ack==0)return(0);SendByte(dat); //发送数据if(ack==0)return(0);Stop_I2c();}*/。