既然向我求助,那我就写一下大概的思路和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;
}
程序存储器特定入口:
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%的矩形波称之为方波,方波有低电平为零与为负之分。必要时,可加以说明“低电平为零”、“低电平为负”。