8051单片机的汇编程序编程问题!!!
已知8051单片机的时钟频率为6MHz,用T1定时。试编程由P1.2和P1.3引脚分别输出周期为2ms和7ms的方波。请写出详细的分析过程,谢谢~~~...
已知8051单片机的时钟频率为6MHz,用T1定时。试编程由P1.2和P1.3引脚分别输出周期为2ms和7ms的方波。请写出详细的分析过程,谢谢~~~
展开
2个回答
展开全部
既然向我求助,那我就写一下大概的思路和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模式自动翻译,因为我时间有限,所以就不给你翻译了,请见谅!
周期为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模式自动翻译,因为我时间有限,所以就不给你翻译了,请见谅!
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询