导航:首页 > 编程语言 > 8051单片机编程300例

8051单片机编程300例

发布时间:2025-07-25 01:21:28

⑴ 8051单片机的汇编程序编程问题!!!

既然向我求助,那我就写一下大概的思路和C语言程序,至于汇编语言,兄弟可自己由C语言翻译,我今天的确没太有时间.
周期为2个ms的方波,也就是说半个周期为1ms,也就是说,P1.2每1ms翻转一次;
同理,P1.3每3.5ms翻转一次,因为只能用一个定时器,所以,取1ms和3.5ms的最大公约数,是0.5ms,也就是说,让定时器0.5ms中断一次,然后每两个中断,翻转一次P1.2,每7个中断翻转一次P1.3;
这就是编程思路,那么我们来看具体的编程细节;
6Mhz,也就是指令周期是2us,0.5ms需要250个计数,250<256,为了速度和效率,我们让定时器1工作在自动重载模式下,也就是模式2;

C语言整个程序编程如下;

#include <reg52.h>
bit P1_2_Turn_Cnt = 0; //----用于P1.2的计数翻转,因为只有两次,大可不必用unsigned char类型的
unsigned char P1_3_Turn_Cnt = 0; //----用于P1.3的计数翻转,因为要7次,所以用unsigned char
sbit P1_3 = P1^3;
sbt P1_2 = P1^2;
void main(void)
{
//----初始化定时器,工作在模式2,自动重载,开中断,每0.5ms中断一次
TH1 = 256 - 250; //----设置定时器,250 X 2us = 500us = 0.5ms
TL1 = 256 -250;
TMOD = 0x20; //----定时器/计数器1 工作在模式2下;
ET1 = 1; //----开定时器1中断
TR1 = 1; //-----启动定时器
EA = 1; //----开总中断
while(1); //----定时器初始化完成,方波工作在定时器内部完成;
}

void ISR_Timer1(void) interrupt 3
{
P1_2_Turn_Cnt = ~P1_2_Turn_Cnt;//---P1_2翻转计数,由于初始化为0,所以第1次会翻转为1;
//---由此推论,奇数次翻转后状态为1,偶数次中断会翻转为
//---0,所以当P1_2_Turn_Cnt = 0时,P1_2翻转.
if(P1_2_Turn_Cnt == 0)
{
P1_2 = ~P1_2;
}
P1_3_Turn_Cnt++;
if(P1_3_Turn_Cnt >= 7)
{
P1_3_Turn_Cnt = 0;
P1_3 = ~P1_3;
}
}

以上就是这个程序实现的全部过程,你可以自己手动翻译成汇编语言,也可以用Keil的Debug模式自动翻译,因为我时间有限,所以就不给你翻译了,请见谅!

⑵ 用单片机8051如何做一个定时器的一秒延时

使用单片机8051实现一秒延时的基本思路是通过循环等待定时器的中断,或者通过软件方式循环等待一定次数。这里提供一个简单的软件延时方法。

首先,我们需要在程序中定义两个存放延时期数的寄存器,这里用30H和31H来表示。具体数值需要根据晶振频率来确定。

接下来是延时程序的实现:

MOV 30H,#一个数
MOV 31H,#一个数
LOOP:DJNZ 30H,LOOP1
LOOP1:DJNZ 31H,LOOP

这段代码的意思是先将一个延时期数写入30H,再将另一个延时期数写入31H。然后进入一个循环,先检查30H中的数值是否为0,如果不为0则继续循环,直到30H中的数值为0,跳转到LOOP1标签处。在LOOP1标签处,再次检查31H中的数值是否为0,如果不为0则继续循环,直到31H中的数值为0,再返回到LOOP标签处继续循环。

这样的设计思路是基于8051单片机的内部定时器工作原理,通过软件循环等待的方式实现延时。

需要注意的是,具体延时期数的数值需要根据实际使用的晶振频率来计算,通常晶振频率为12MHz或6MHz时,可以利用8051的机器周期来计算延时期数。例如,对于12MHz的晶振,每个机器周期为1/12us,那么要实现一秒延时,就需要等待1000000个机器周期。

具体计算方法可以参考8051单片机的数据手册,或者使用在线的单片机延时计算工具进行计算。

总之,通过上述代码实现的延时方法虽然简单,但适用于8051单片机的基本开发和实验。对于更复杂的应用场景,可能需要考虑使用硬件定时器或更精确的延时算法

⑶ 已知8051单片机的fosc=12MHz,用T1 定时,试编程由P1.2 和P1.3 引脚分别输出周期为2ms 和500μs 的方波

代码如下:

第一个代码程序:

ORG 0000H

LJMP MAIN

ORG 001BH

JMP T1_INT

ORG 0030H
MAIN:
MOV TMOD, #20H
MOV TH1, #6
MOV TL1, #6
MOV IE, #88H
SETB TR1
MOV R7, #4
SJMP $
T1_INT:
CPL P1.3
DJNZ R7, T1_END
CPL P1.2
MOV R7, #4
T1_END:
RETI
END

第二个500us程序:

#include <reg51.h>
sbit P1_0=P1^0;
void main()
{
TMOD=0x01;
TH0=0xFC;
TL0=0x18;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void time0_int(void) interrupt 1
{
TH0=0xFC;
TL0=0x18;
P1_0=!P1_0;
}

(3)8051单片机编程300例扩展阅读:

程序存储器特定入口:

0000H: 复位或开机后的程序入口

0003H: 外部中断0 服务程序入口

000BH: 定时/计数器0 中断服务程序入口

0013H: 外部中断1 服务程序入口

001BH: 定时/计数器1 中断服务程序入口

0023H: 串行I/O 中断服务程序入口

定时/计数器

8031 片内有两个16位定时/计数器(增量式计数)

工作方式(方式0、方式1、方式2、方式3)

以定时/计数器1为例

⑴方式0(13位定时/计数)

方波是一种非正弦曲线的波形,通常会于电子和讯号处理时出现。理想方波只有“高”和“低”这两个值。电流的波形为矩形的电流即为方波电流。不论时间轴上下是不是对称的,只要是矩形就可叫方波,必要时,可加“对称”,“不对称”加以说明

通过单片机内部的计数器/定时器,采用软件编程来产生方波,这种方法的硬件线路较简单,系统的功能一般与软件设计相关。

选择MCS-51系列中的8031单片机,由于是用指示灯显示输出方波信号,一个LED显示灯即可满足设计要求。

方波是一种非正弦曲线的波形,通常会与电子和讯号处理时出现。理想方波只有“高”和“低”这两个值。电流或电压的波形为矩形的信号即为矩形波信号,高电平在一个波形周期内占有的时间比值称为占空比,也可理解为电路释放能量的有效释放时间与总释放时间的比值。

占空比为50%的矩形波称之为方波,方波有低电平为零与为负之分。必要时,可加以说明“低电平为零”、“低电平为负”。

阅读全文

与8051单片机编程300例相关的资料

热点内容
安卓11系统用什么虚拟机 浏览:687
苏州制冷压缩机 浏览:791
安卓手机如何看抖音注册时间 浏览:867
imvu为什么服务器错误 浏览:777
云免费云服务器购买费用 浏览:539
级联多模算法 浏览:923
安卓系统如何设置数字签名 浏览:467
dll存密码防反编译 浏览:443
医学专业编程用什么笔记本 浏览:939
广州地铁app为什么无法开通 浏览:377
单片机仿真整流电路 浏览:342
搜狐云服务器的设置方法 浏览:503
程序员谁 浏览:716
怎么把本地在密钥导入服务器上 浏览:74
苹果笔记本文件夹白条 浏览:523
systemsav文件夹可以删除吗 浏览:901
串口服务器怎样改ip地址 浏览:771
当前服务器正在维护中是什么意思 浏览:775
树莓派编写代码编译 浏览:836
正负数统计编程 浏览:327