关于c51资料
- 格式:doc
- 大小:2.73 MB
- 文档页数:43
c51芯片C51芯片是一种经典的8位单片机(Microcontroller),由英特尔(Intel)公司推出。
它是集成电路上的一种特殊的类型,拥有处理器核心、存储器、定时器和输入输出设备等。
下面将对C51芯片进行1000字的介绍。
一、C51芯片的特点1. 8位结构:C51芯片是一种8位单片机,意味着它的数据总线宽度为8个位,可以同时处理8位的数据。
这种结构使得C51芯片比16位或32位的处理器更加经济实惠,适合于嵌入式应用。
2. 简单易用:C51芯片采用指令简洁、结构清晰的汇编语言进行编程,容易上手。
此外,C语言也可以用来进行开发,便于程序员进行高级编程。
3. 低功耗:C51芯片采用低功耗设计,能够在低电压下运行,能够提供较高的能效比。
这使得C51芯片在实际应用中更加节能环保。
4. 多功能:C51芯片具有丰富的外设接口和功能模块,包括通用输入输出引脚(GPIO)、串口通信接口(UART)、模数转换器(ADC)等。
这些功能模块可以与外部设备进行交互,实现更多的应用。
5. 可编程性:C51芯片支持编程和擦写,可以通过编程器重新下载程序。
这使得开发者可以反复测试和调试,并随时更新程序内容。
二、C51芯片的应用领域1. 工控系统:C51芯片具有高度可靠性和稳定性,可以应用于工业控制系统中,如PLC(可编程逻辑控制器)和变频器等。
通过与传感器、执行器等设备的配合,实现自动控制和监控。
2. 电子产品:C51芯片广泛应用于各种电子产品中,如电视、音频设备、移动电话等。
通过C51芯片的高度集成度和低功耗特性,可以实现功能强大、耐用节能的产品。
3. 汽车电子:C51芯片在汽车电子领域也有广泛的应用。
它可以用于车载电子控制单元(ECU)和车身电子系统中,实现车辆的智能化控制和诊断功能。
4. 医疗设备:C51芯片也被广泛应用于医疗设备领域,如心电图仪、血压监测仪等。
其高性能和可靠性使得设备具有更高的准确性和稳定性。
5. 物联网:C51芯片非常适合用于物联网设备的开发。
单片机原理c51C51是英特尔公司推出的一款经典的8位单片机,它以其高性能、低功耗和丰富的外设接口而被广泛应用于各种嵌入式系统中。
C51采用哈佛结构,由CPU 核心、存储器、输入输出端口和时钟等组成。
在这篇文章中,我将从C51的结构、工作原理、指令集和应用方面进行详细介绍。
首先,我们来了解C51的基本结构。
C51的核心是一个8位的中央处理器,它包含一个紧凑的指令集、寻址模式和寄存器集。
C51的存储器主要包括ROM(只读存储器)和RAM(随机存储器)。
ROM用于存储程序代码和常量数据,而RAM用于存储变量和运行时数据。
C51还有一些特殊功能寄存器(SFR),用于控制和配置外设接口。
C51的工作原理是通过时钟信号进行同步操作的。
C51的时钟可以是外部提供的,也可以是内部产生的。
时钟信号按照一定的频率进行周期性的振荡,它驱动着C51的工作节奏。
每当时钟信号发生跳变,C51就执行一条指令。
C51的指令由操作码和操作数组成,操作码表示要执行的操作,而操作数则是操作所需要的数据。
C51的指令集非常丰富,包含多种逻辑运算、算术运算、位操作和数据传输等指令。
C51支持直接寻址、间接寻址和立即寻址等多种寻址模式,可以满足各种不同的应用需求。
C51还具有很强的中断处理能力,它可以响应外部中断和定时器中断,并在中断发生时暂停当前任务,转而执行中断服务程序。
C51的应用非常广泛。
由于其高性能和低功耗的特点,C51常常被用于无线通信系统、工业控制系统、汽车电子系统、医疗设备等领域。
它可以控制各种外设接口,如LED显示、数码管显示、键盘输入、AD/DA转换、串行通信等。
此外,C51还支持多任务操作系统,使得多个任务可以同时运行,提高了系统的并行处理能力。
总之,C51是一款经典的8位单片机,它拥有强大的性能和丰富的外设接口,可以满足各种嵌入式系统的需求。
C51采用哈佛结构,通过时钟信号进行同步操作,具有丰富的指令集和多种寻址模式。
C51的数据类型引言概述:C51是一种常用的单片机系列,其数据类型在嵌入式系统开发中具有重要的作用。
本文将详细介绍C51的数据类型及其特点,帮助读者更好地理解和应用C51单片机。
一、基本数据类型1.1 位数据类型C51提供了位数据类型,用于表示单个位的值。
位数据类型可以用于对单个引脚进行操作,如设置或清除引脚的状态。
位数据类型包括bit、sbit和bool,其中bit用于定义全局位变量,sbit用于定义特殊功能寄存器位,bool用于定义逻辑变量。
1.2 字符数据类型C51支持字符数据类型,用于存储单个字符的值。
字符数据类型可以用于处理文本数据,如显示字符、输入字符等。
在C51中,字符数据类型使用关键字char进行定义,可以表示ASCII码字符集中的任意字符。
1.3 整数数据类型C51提供了多种整数数据类型,用于存储整数值。
这些整数数据类型包括有符号整数和无符号整数,分别用于表示带符号和不带符号的整数。
常用的整数数据类型有int、unsigned int、short和unsigned short等。
二、浮点数据类型2.1 单精度浮点数C51支持单精度浮点数数据类型,用于存储小数值。
单精度浮点数可以表示较大范围的小数,并具有一定的精度。
在C51中,单精度浮点数使用关键字float进行定义,可以进行浮点数运算。
2.2 定点数C51还支持定点数数据类型,用于表示固定小数位数的数值。
定点数可以提高计算速度,并且不需要浮点数运算库的支持。
在C51中,定点数使用关键字fixed进行定义,可以进行定点数运算。
2.3 高精度数C51还提供了高精度数数据类型,用于存储较大范围和高精度的数值。
高精度数可以进行精确的计算,并且可以表示较大的数值。
在C51中,高精度数使用关键字long进行定义,可以进行高精度数运算。
三、数组和结构体3.1 数组C51支持数组数据类型,用于存储相同类型的多个数据。
数组可以按照索引访问和操作其中的元素,方便进行批量处理。
C51数据类型引言概述:C51是一种广泛应用于嵌入式系统开辟的单片机编程语言,其中数据类型是程序设计中非常重要的组成部份。
正确理解和使用C51数据类型可以匡助程序员更高效地开辟嵌入式系统。
本文将详细介绍C51数据类型的相关知识。
一、基本数据类型1.1 位(bit):C51中最小的数据单位是位,用于表示二进制数据。
1.2 字节(byte):一个字节由8位组成,是C51中最基本的数据类型。
1.3 整型(int):C51中整型数据类型可以表示整数值,包括有符号和无符号整型。
二、浮点数据类型2.1 单精度浮点数(float):C51支持单精度浮点数,用于表示小数值。
2.2 双精度浮点数(double):C51也支持双精度浮点数,提供更高的精度。
2.3 浮点数据类型在嵌入式系统中通常用于处理需要高精度计算的场景。
三、数组数据类型3.1 一维数组:C51支持一维数组,可以存储相同类型的多个数据。
3.2 多维数组:除了一维数组,C51还支持多维数组,可以存储更复杂的数据结构。
3.3 数组数据类型在嵌入式系统中常用于存储传感器数据、采样数据等。
四、结构体数据类型4.1 结构体:C51支持结构体数据类型,可以将不同类型的数据组合在一起。
4.2 结构体成员:结构体可以包含多个成员变量,每一个成员变量可以是不同的数据类型。
4.3 结构体数据类型在嵌入式系统中常用于定义复杂的数据结构、数据包等。
五、枚举数据类型5.1 枚举:C51支持枚举数据类型,用于定义一组有限的命名常量。
5.2 枚举值:枚举类型中的每一个值都有一个对应的整数值。
5.3 枚举数据类型在嵌入式系统中常用于定义状态、标志位等。
结论:正确理解和使用C51数据类型对于嵌入式系统开辟至关重要。
程序员应该熟悉各种数据类型的特点和用法,合理选择适合的数据类型,以提高程序的效率和可靠性。
希翼本文对读者有所匡助,谢谢阅读。
C51单片机是一种基于C语言的微控制器,具有强大的处理能力和灵活的编程特性。
以下是一些关于C51单片机的基础知识:
硬件结构:C51单片机采用冯·诺依曼结构,由运算器、控制器、存储器、输入输出设备等组成。
存储器:C51单片机内部有一个程序存储器(Flash ROM)、一个数据存储器(RAM)和一个特殊功能寄存器(SFR)。
程序存储器用于存储程序,数据存储器用于存储变量和临时数据,特殊功能寄存器用于控制各种外设和功能。
指令系统:C51单片机的指令系统类似于C语言,包括算术指令、逻辑指令、数据传输指令、程序控制指令等。
外设:C51单片机有多种外设,如定时器/计数器、串行通信接口、中断控制器、I/O端口等。
这些外设可以通过特殊功能寄存器进行配置和控制。
开发环境:C51单片机的开发环境通常包括编译器、调试器和集成开发环境(IDE)。
编译器将C语言代码转换为单片机可执行的机器码,调试器用于在单片机上进行程序调试和仿真,IDE提供了代码编写、编译、调试和下载的一体化环境。
应用领域:C51单片机广泛应用于各种嵌入式系统,如智能仪表、家电控制、通信设备、工业自动化等领域。
总之,C51单片机是一种功能强大、易于编程的微控制器,通过学习和掌握其基础知识,可以开发出各种高效的嵌入式应用系统。
C51数据类型引言概述:C51数据类型是指在C语言中使用的一种数据类型,特指在C51单片机编程中使用的数据类型。
C51是一种广泛应用于嵌入式系统开辟的单片机架构,其数据类型的选择和使用对于编程的效率和性能至关重要。
本文将从五个大点出发,详细阐述C51数据类型的特点和使用方法。
正文内容:1. 基本数据类型1.1 位数据类型:C51中的位数据类型用于表示单个位的值,可以用于对单个引脚进行操作。
常用的位数据类型有bit和sbit,前者用于普通变量,后者用于特殊功能寄存器。
1.2 字符数据类型:C51中的字符数据类型用于表示单个字符的值,采用ASCII 编码。
常用的字符数据类型有char和sfr,前者用于普通变量,后者用于特殊功能寄存器。
1.3 整数数据类型:C51中的整数数据类型用于表示整数值,包括有符号和无符号整数。
常用的整数数据类型有int、unsigned int、short和unsigned short,分别表示有符号整数、无符号整数、短整数和无符号短整数。
2. 扩展数据类型2.1 长整数数据类型:C51中的长整数数据类型用于表示较大范围的整数值,常用的数据类型有long和unsigned long,分别表示有符号长整数和无符号长整数。
2.2 浮点数数据类型:C51中的浮点数数据类型用于表示小数值,常用的数据类型有float和double,分别表示单精度浮点数和双精度浮点数。
2.3 枚举数据类型:C51中的枚举数据类型用于定义一组取值范围有限的符号常量,常用于状态表示和开关控制。
3. 数组和指针3.1 数组:C51中的数组是一种用于存储相同类型数据的集合,可以按照索引访问其中的元素。
数组在嵌入式系统中常用于存储传感器数据和缓冲区。
3.2 指针:C51中的指针是一种用于存储内存地址的变量,可以用于间接访问和修改数据。
指针在嵌入式系统中常用于动态内存分配和函数调用。
4. 结构体和联合体4.1 结构体:C51中的结构体是一种用于存储多个不同类型数据的集合,可以按照成员名访问其中的数据。
一:数据类型·运算符·表达式1.1 C51支持的数据类型 数据类型 名称 长度 值域 bit 1 bit 0,1 Unsigned char ,char 1 byte 0~255,‐128~127 Unsigned int ,int 2byte 0~65525,‐32768~32767Unsigned long ,long4 byte 0~4294967295 Float 4 byte 6位数字 基本类型 Double 8 byte 10位数字数组 结构体共用体构造类型 枚举指针类型2~3byte 存储空间,最大64KB 空类型1.2 常量和变量常量:#define CONST 10变量:bit b_start //位变量 Char c_start//字符变量 其他略。
1.3 C51存储器·寄存器定义定义:分为片内数据存储器·片外数据存储器·片内程序存储器·片外程序存储器。
1.31 C51的数据存储类型 关键字 存储器对应关系 data 直接寻址片外数据存储器(128byte ) bdat 片内位寻址存储空间(16byte ) idata 间接寻址片内数据存储空间,可以访问RAM 全部内容 pdata 分页寻址片外数据存储器(256byte ) Xdata 片外数据存储器(64KB ) Code 代码存储器(64KB ) 例子:char data c_Var; //无符号char 型变量,定义到内部存储空间低128byte 1.32 寄存器 Sfr SBUF=0x99; //定义串行数据寄存器Sfr16 T2=0xcc ; //定义T2计时器数据存储器Sbit D0=P2^1;定义位变量Sbit CY=0xd7;使用绝对地址定义使用sbit 定义变量空间Bdata unsigned char uc_shield_byte; Sbit b_x= uc_shield_byte^1; //定义首位 Sbit b_y= uc_shield_byte^2;Sbit b_z=uc_shield_byte^3;1.4逻辑运算与: && 或: || 非: !位逻辑运算位与: &位或: |位异或: ^位取反: ~1.5移位运算左移位:<<,个位左移,补0;右移位:>>,高位右移,补0;二:C51控制流(1) 顺序结构(2) 选择结构1.I f……else语句2.I f语句3.S witch语句Switch(判断条件){Case 常量表达式1:{语句块1}break;……Default:{语句n+1}break;}4.I f和switch嵌套(3) 循环结构1.W hile语句2.D o while语句Do{代码块;}while(条件);3.F or语句三:函数1.无参数函数定义Void 函数名(void)//无参数,无返回值函数定义{}Int 函数名(char a,char b)//带参数,带返回值函数定义 {}2.局部变量和全局变量静态局部变量和动态局部变量Static int a;静态(static不可省略)Auto int a;动态(auto可省略)3.内部函数和外部函数(1)内部函数:static unsigned char Fun(int a);内部函数只能被该源文件中的其他函数调用(2)外部函数:extern unsigned char Fun(int a);外部函数可以被其他源文件调用的函数四:数组和指针(1) 数组:z一维数组:类型 数组名【size】;z二维数组类型 数组名【size A】【size B】;z字符数组Char ch1【】={‘j’,’a’,’c’,’k’,’x’,’u’};以字符形式赋值Char ch1[]={“jackxu”}; 以字符串形式赋值 (2) 指针1)指针和指针变量类型 *变量名Int *ptr1;float *ptr2;char *ptr3;2)指针的引用Int a=10;Int *p=&a;X=a ;直接访问方式X=*p;间接访问方式(3) 数组和指针Int a[]={1,2,3,4,5,6,7,8,9,10},*ip;Ip=a; //*ip代表a[0],*(ip+i)代表a[i];二维数组与指针同上;(4) 字符串和指针不能用指针变量来修改字符串常量;(5) 数组,指针和函数的关系1)数组可作为函数的参数:int sum(int a[],int num);2)指针作为函数参数:int sum(int *ip,int num);3)返回指针的函数:char *ip(char *ip,char c);(6) 指针数组和指向指针的指针1)类型 *数组名【size】;Char *name【3】={“I”,“love”,“you”};定义了三个字符型指针数组并进行了初始化3)类型 **指针变量名 //指针变量的变量声明*指针变量 //获取指针变量指向的指针**指针变量 //获取指针变量指向的指针内容例子:Main(){Char *name[]={“Tom”,”Jacky”,”Andy”};Char **cp=name;For(int i=0;i<3;i++){Printf(“cp=d%\n”,cp);Printf(“*cp=s%\n”,*cp);Printf(“**cp=c%\n”,**cp);}}程序输出结果为:cp=0x1000;*cp=Tom**cp=TCp=0x1002*cp=Jacky**cp=Jcp=0x1004;*cp=Andy**cp=A五:结构,联合和枚举 定义:1)Stuct 结构名{类型说明符 成员1类型说明符 成员2。
单片机c51原理及应用单片机C51是一种常见的8位微控制器,它采用哈佛架构,由英特尔公司推出。
C51广泛应用于各种嵌入式系统中,具有体积小、功耗低、可编程性强等特点,因此在工业控制、通信、家电、汽车电子等领域有广泛的应用。
单片机C51的原理是基于哈佛架构的,即指令和数据存储在不同的存储体中。
具体来说,C51中的指令存储器称为代码存储器,用于存储程序的指令;数据存储器则用于存储程序中的数据、变量等。
C51一般包含一个中央处理器、存储器、I/O接口和定时器/计数器等功能模块。
C51的应用非常广泛,下面分别介绍其在工业控制、通信、家电和汽车电子领域的应用。
1. 工业控制:C51可用于工业自动化控制系统中。
通过与传感器、执行器等外部设备的连接,C51能够实时监测工业过程的状态,并根据需求来控制执行器的动作。
例如,在自动化流水线上,C51可根据传感器检测到的物料情况来控制传送带的速度和方向。
2. 通信:C51可以用于通信系统中。
通过串口通信模块,C51可以与其他设备进行数据交换。
例如,C51可以实现与计算机的通信,将采集到的数据发送给计算机进行处理;也可以实现与无线通信模块的通信,用于无线数据传输。
3. 家电:C51可以应用于各种家电产品中,如电视、空调、洗衣机等。
通过与传感器和控制器的连接,C51可以实现家电的自动控制和智能化。
例如,C51可以根据温度传感器采集到的数据自动调整空调的工作模式和温度设置,以达到更加舒适的室内环境。
4. 汽车电子:C51也广泛应用于汽车电子领域。
通过与汽车各种传感器和执行器的连接,C51可以实现对汽车的电子控制。
例如,C51可以与车速传感器和制动控制器连接,实现车辆的智能制动系统;也可以与发动机控制器连接,实现发动机的自动控制和故障检测。
除了上述应用领域,C51还可以应用于医疗设备、农业自动化、安防系统等多个领域。
总之,单片机C51由于其体积小、功耗低、可编程性强等特点,在各个领域都有广泛的应用前景。
单片机教程第一课点亮一盏灯任务:把实验板上的任一盏灯点亮。
目的:入门第一课,了解单片机基本工作原理,对指令控制硬件有初步认识。
今天我们开始51单片机学习的第一课,以后还会陆续学习其它内容,今天我们先从最简单的学起,为了能更直观地了解到指令对硬件的控制,我们会采用汇编语言进行讲解,以使初学者更容易理解,建议大家在看过课程后,都实际自己在实验板进行操作。
这里,我们先假定大家已经清楚KEIL的建立工程项目和进行程序编译的方法,如果有不明白的,可以下载KEIL使用教程,这里就不重复讲述如何使用KEIL。
另外,我们也先假定大家已经清楚如何将编译生成的HEX文件烧录到STC芯片里。
如果有不懂的,可以看看wan1jing版主写的教程。
. 这里讲课不按传统教科书方式进行,而是按实际需要,用到才学。
所以一些基础的知识,以后会逐步在课程里讲述。
本人水平有限,讲述过程中如有错误,欢迎批评指正。
好里,言归正传,开始了。
首先,我们看看实验板的电路图。
由图中可以看出,单片机的P0口8个IO每个均接有一只LED发光管及串有一只电阻到电源正极,而我们的目的就是要把LED点亮,显而易见,只需要把我们的P0口相对应的IO口写成低电平,LED就可以通电工作。
在51单片机里,上电后,芯片复位后其所有引脚均是高电平,因此,正常状态下,通电后,LED是不发光的,因此,我们需要用一个指令,使这个引脚变为低电平,(知识点:数字电路里,只存在二种状态,0和1,一般用高电平表示1,低电平表示0。
)我们在KEIL里建一个项目,写入如下的语句:好了,编译,生成HEX文件,烧进我们的实验,怎么样,灯亮了吧。
这里起作用的就是CLR P0.0这一条语句,它的作用就是把P0.0端口写成低电平,相对应的语句是SETB P0.0,它的作用刚好相反,是把P0.0写成高电平,同理,我们可以很容易知道,如果要控制其它端口,只要更换P0.0为其它端口名即可。
ORG语句在汇编里作用只是用来告诉编译器,定位到某个地址放置跟着的代码。
因为上电复位了,单片机总是从地址0000H开始执行的,所以,在开始地址,我们放上一跳转指令AJMP ,它是无条件跳转到指定的地址,为什么要跳转到100H?这个留在讲中断时再讲。
关于AJMP $,是指跳转到本行,也即是单片机执行到这里,会不停地在本行循环,不会再往下执行,一般放程序后面,使单片机执行到这里就停在这里。
好了,到这里,大家都应该明白怎么把一盏灯点亮了吧。
看似神秘的单片机就是这么简单,它的引脚,要么是高电平,要么低电平(P0口有点特殊,这个留待以后再讲)。
我们要做的,只不过是编个程序,控制引脚在适当的时候按我们的意愿去输出高电平或者低电平。
仅此而已。
本课到这里结束,留个作业,大家尝试一下,把其它的灯也点亮。
第二课闪动的灯任务:使把实验板上的任一盏灯闪动起来。
目的:学习延时程序,对MCU执行时间有个初步概念。
今天,我们来学习第二课——闪动的灯。
上一课,我们已经把实验板上的灯点亮了,同时学习了CLR、SETB语句,同时,我们知道了,只要把端口电平写为低或高,即可使该端口上的LED亮或者灭。
今天,我们就要让这个灯闪起来。
我们在KEIL里建一个项目,写入如下的语句:图1 然后我们编译,烧进实验板,怎么样?灯闪了没有?没有!连亮都没有亮过!为什么呢?这是因为,单片机的执行速度是非常快的,每条指令执行时间需1-4个机器周期不等,而每个机器周期包含12个时钟周期,在12M晶振下,每个时钟周期是1/12000000,所以每个机器周期只有12/12000000=1us。
SETB、CLR指令均是1个机器周期,在1微秒时间内 LED变化,人眼当然是看不到的。
所以,我们要给它加上延时,让它亮了之后,延时一段时间再灭,这样,就能看到变化了。
图2 我们来说说标号,程序里START,DELAY这些红色的字,汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。
书写标号时,规定第一字符必须是字母或半角下划线“_”,它后面可以跟英文和数字字符、制符表等,并可任意组合,以冒号(:)结束。
再有标号不能用操作码助记符和寄存器的代号表示。
标号可单独占一行或写在指令前。
我们加上延时子程序,然后用ACALL指令来调用,我们注意到,在DELAY子程序后,我们加了RET指令,这个RET执行完之后,返回到调用语句指令之后继续执行。
每个被调用的子程序,必须在程序末加上RET。
DELAY子程序里我们用了R7,R6,R5,这些寄存器是在51芯片RAM中,共有4组,每组有8个,从R0~R7。
如何切换这4 组,我们留在以后说。
MOV R7,#5H 是将数值5写进R7之中,我们注意到,对于非0~9开头的数值,我们要在前面加上0,譬如#0C3H,不能写成#C3H。
当然,我们可以写成MOV R5,#255,用十进制表示数值。
这个是单周期指令。
DJNZ R7,D1 的意思是将R7的值减1,然后判断它是不是0,如果不为0就跳转到标号D1处执行,如果是0就往下执行。
这个是双周期指令。
从程序中我们可以看到,首先是R7被写上数值5,R6数值195(16进制的C3),R5数值255(16进制FF),然后不断的执行255次DJNZ R5,$,完成后,把R6减1,判断其是否为0,不为0再把R5写上255,再执行。
如此反复。
因此,在12M晶振下,我们可以计算出这个延时子程序的延时时间是: ((255*2+1)*195+195*2+1)*5+5*2+1=500191us 约为0.5秒。
这样,程序执行完亮灯后,就延时0.5秒再关闭,这样,我们就可以看到灯亮和灯灭。
好了,我们的灯已亮过了,又灭了,如果我们要让它不停的闪动,怎么办呢?图3 我们把它点亮,延时,再关掉,再延时,再点亮,如此反复,就可以了。
我们注意到,在程序末,没有往时的AJMP $,而是用了AJMP START。
呵呵,相信大家都明白了吧,是跳转到开始位置。
这样,就能反复循环执行。
灯,也就闪起来了。
在这里,我们把MOV R7,#5H提出来,放在主程序里,作为入口参数,这样做有什么好处呢?这样,我们可以调节R7的值,使调用的延时子程序延时时间改变,那么,我们就可以做出,亮长一点时间,灭短一点时间的程序来,或者相反。
在这里,只要在延时之前,改变R7的值,再ACALL DELAY就可以了。
这样的程序,有点累赘,大家都注意到了吧,MOV R7,#5H和ACALL DELAY重复了,我们再来把它简化一下。
图4 我们引入一个新的语句CPL P0.0,它的作用就是取反P0.0的状态。
也就是说,如果原来P0.0是高电平,那么,执行后就是低电平,反之亦然。
经过简化,是不是简洁了好多。
呵呵。
在这里,MOV R7,#5H 仍然被写在主程序,这样有好处,就是程序其它地方还可以调用DELAY,只要改变R7的值,就能得到不同的延时时间,通用延时子程序喔。
呵呵。
顺便一提,R7每增加数值1,延时时间会增加0.1秒,也就是说,这个延时子程序延时时间可以从0.1秒到25.5秒。
大家可以试试,改成255(0FFH)看看,是不是要好久才能看到灯闪一下。
^_^ 好了,今天课程到此结束,留个作业,把各个灯闪起来。
试试让闪动、亮、暗的时间不同。
有兴趣还可以想想怎么让不同的灯按不同的频率闪动。
[本帖最后由 sunhm 于 2008-6-9 11:06 编辑]第三课跑马灯任务:用实验板上的8个LED实现多款跑马灯。
目的:学习移位指令,查表指令,比较判断指令。
今天我们来学习跑马灯。
这个几乎是所有51学习的必修课。
一般来说开始就会学习这个,因为考虑到我们论坛里大家的起点水平不同,所以前面增加了二课,以利于大家有个初步的概念。
从前二课课程来看,的确是很有必要。
呵呵好了,言归正传,今天我们学习跑马灯。
最基本的跑马灯就是让P0口上的8个LED逐个点亮。
讲到这里,也许有人就要说了,用上一课的点亮灯加延时就可以,对!原理正是如此,也有同学在第二课帖子里写出这样的程序来。
但今天我们引入一个新的语句,使得实现这一功能的程序大大简化。
先看程序图一累加器A,51系统内一个非常重要,并且要经常用到的东东,呵呵,大部分指令都跟它有关,在51系统里,就数它可以做的东西最多了,不少运算都是必须通过它来完成,如乘法、除法、还有本课要学习的查表都必须通过它来完成,等等。
初学者只要记住它是一个8位,可以位操作的东东就可以了,呵呵,以后学习更多的语句时再来了解它的作用。
RL A ,累加器A内容不带进位向左环移一位,相对应的还有RR A,即是向右移,还有RLC A,RRC A,这两个是带进位位的。
C,进位位,51里一个极重要的东东。
一般用它来实现数据位操作、判断等等,它的地位可以比美累加器A。
大家记住它,它只是一个位,并不象累加器A,R0~R7寄存器那些有8个位。
这里我们了解一下移位指令是怎么工作。
看图,这是累加器A进行移位时的状态。
图二由图我们可以看到,累加器包括8个位,由高位D7至低位D0,这里的图是右移指令,即RR A执行时的情况,每执行一次,最右边的位D0被移出送到D7的位置,其它的移就向右移一位。
下面则是带进位位的右移。
图三由图我们可以看到,当右移时,D0先移到C,C的位就移入D7,其它的顺序右移。
以上是右移,左移的道理一样。
带进位位移位,我们可以理解成共9个位参加操作。
这样就很清楚了,我们先在累加器A里放入数值0FEH(二进制数1111 1110),然后这个数值被送到P0口,则P0口上8个位对应累加器A上8个位,那么,最低位的P0.0上的LED灯被点亮。
点亮后,我们继续调用第二课里用到的延时子程序进行延时,并且,将累加器A进行左移操作,完成后,累加器里的值就变成0FDH(二进制数 1111 1101),再将A的值送到P0口,点亮第二个LED。
如此循环,则P0口上的LED被逐个点亮。
大家可以试试,将RL A变换成RR A,或者RLC A, RRC A,看看情况有什么不同。
领会一下移位,带进位移位的不同之处。
想一想,通过移位,C进位位的数值是如何被移进累加器A的。
这个在以后很多地方都要用到的技巧,希望大家细心领会。
再补充一下,进位位在这里初始值是0的,可以通过CLR C,SETB C来将它改变。
好了,这样的跑马灯相对比较简单,如果我们要做出花式比较多的跑马灯。
我们来学习查表指令。
图四DELAY子程序就沒有写出来了,大家自己补充进去。
DPTR,数据指针,它是16位的,包含DPH,DPL两个8位。
对于51的代码地址,是以16位进行表示的,大家注意到,我们写程序的ORG 0000H,ORG 0100H了吗?MOV DPTR,#TAB1,将TAB1代码的存放地址送入到指针中。