物联网控制技术 知识点总结 第三章 汇编语言 第四章 C51语言

发布于:2025-06-19 ⋅ 阅读:(19) ⋅ 点赞:(0)

51单片机的编程语言

编程语言的应用主要出现在综合应用题使用编程语言设计算法,多结合实验实例,练习编程能力,小编觉得不用纠结语言。

汇编语言

结合寻址方式理解汇编语言指令

51单片机的寻址方式

结合51单片机的体系结构来理解不同的寻址方式
在这里插入图片描述

立即寻址

操作数包含在指令代码中,称为立即数,用“#”表示。
寻址空间:程序存储器

MOV A, #30H 
直接寻址

直接使用数所在的单元的地址找到操作数。
寻址空间:片内RAM低128字节、SFR

MOV A, 00H 
寄存器寻址

对工作寄存器R0~R7、累加器A、通用寄存器B、地址寄存器DPTR中的数进行操作。
寻址空间:工作寄存器R0~R7, A, B, DPTR

MOV A, Rn
寄存器间接寻址

将寄存器中存储的地址处的数据取出。“@”间址提示符。
寻址空间:
片内RAM: @R0, @R1, SP
片外RAM: @R0, @R1, @DPTR

MOV A, @R0
变址寻址

常用于访问存放在ROM单元中的数据表格,实现查表操作。
ROM:@A+PC, @A+DPTR

MOVC A, @A+DPTR
相对寻址

将PC中的当前内容(基地址)与指令第二字节给出的数(偏移量)相加,结果作为跳转指令的转移地址。
寻址空间:ROM256字节范围内:PC+偏移量

JC 23H ;若C=1则跳转至 当前PC基地址+23
位寻址

对片内RAM的位寻址区和某些可位寻址的特殊功能寄存器进行位操作时的寻址方式。
寻址空间:片内RAM的位寻址区(20H~2FH字节地址)某些可位寻址的专用寄存器SFR

MOV C, 30H
SETB 3DH

C51语言

C51语言,使用C51语言写中断

中断服务函数

函数类型 函数名 (形式参数表)[interrupt n][using n]

  1. 中断函数没有返回值
  2. 中断函数不能进行参数传递
  3. 任何情况下都不能直接调用中断函数
  4. 如果在中断函数中再调用其他函数,则被调用的函数所使用的寄存器区必须和中断函数使用的寄存器区不同

中断初始化程序:选择外部中断的触发方式、开中断、设置中断优先级
中断服务程序

控制8只LED交替闪烁

#include <reg51.h>
//定义延时函数Delay(),i时形式参数,不能赋初值
void Delay(unsigned int j){
	unsigned int j;
	for(;i>0;i--)
		for(j=0;j<333;j++)
			{;}		//空函数
}
//主函数
void main(){
	EA=1;		//总中断允许
	EX0=1;		//外部中断0中断允许
	IT0=1;		//选择外部中断0为跳沿触发方式
	while(1){	//循环
		P1=0;	//P1口的8至LED全亮
	}
}
void int0()interrupt 0 using 0{
	EX0=0;		//禁止外部中断0中断
	P1=0x0f;	//低4位LED灭,高4位LED亮
	Delay(800);	//延时800ms
	P1=0xf0;	//高4位LED灭,低4位LED亮
	Delay(800);	//延时800ms
	EX0=1;		//中断返回前,打开外部中断0中断
}

定时器0方式1中断

#include <reg51.h>
char i=100;		//给变量i赋初值
void main(){
	TMOD=0x01;	//设置定时器T0为方式1
	TH0=0xee;	//向TH0写入初值的高8位
	TL0=0x00;	//向TL0写入初值的低8位
	P1=0x00;	//P1口8只LED点亮
	EA=1;		//总中断允许
	ET0=1;		//定时器T0中断允许
	TR0=1;		//启动定时器T0
	while(1);	//循环
	{;}
}
//定时器T0中断服务程序
void T0_int(void) interrupt 1{
	TH0=0xee;	//给T0装入16位初值,计数4608后,T0溢出
	TL0=0x00;
	i--;		//循环次数减1
	if(i<=0){
		P1=~P1;	//P1口按位取反
		i=100;	//重新设置循环次数
	}
}

串行口方式0

#include <reg51.h>
#include <stdio.h>
sbit P10=0x90;
Xdata char nIndex;
Delay();
main(){
	SCON=0x00;		//串行口初始化为方式0
	ES=1;
	EA=1;			//全局中断允许
	nIndex=1;
	SBUF=nIndex;
	P10=0;
	while(1){;}
}
void Serial_Port()interrupt 4 using 0{
	if(TI==1){
		P10=1;
		Delay();
		P10=1;
		nIndex<<=1;
		if(nIndex==0) nIndex=1;
		SBUF=nIndex;
	}
	TI=0;
	RI=0;
}
Delay(){
	int nCounter;
	for(nCounter=0;nCounter<128;nCounter++);
}

网站公告

今日签到

点亮在社区的每一天
去签到