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

 我来答
晴说科技
2019-07-16 · 科技数码资讯分析,解读不一样视角!
晴说科技
采纳数:7 获赞数:8913

向TA提问 私信TA
展开全部

代码如下:

第一个代码程序:

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%的矩形波称之为方波,方波有低电平为零与为负之分。必要时,可加以说明“低电平为零”、“低电平为负”。

晨枫叶轻舞
2019-07-20 · TA获得超过4693个赞
知道答主
回答量:1387
采纳率:35%
帮助的人:42.3万
展开全部

定时器T1定时250μs,工作方式设置为方式2,用TL1作为8位定时器,产生250μs的定时,定时初值X为:X=2^8-(12* 10^6* 250 * 10^(-6))/12=6

TH1=TL1=6H,TMOD=20H

源代码如下:

MOV  TMOD,#20H

MOV   TH1,#06H

MOV   TL1,#06H

SETB  TR1

DS1_RPTA:

MOV   R2,#04H

DS1_RPTB:

JNB    TF1,$

CLR    TF1

CPL    P1.3

DJNZ R2,DS1_RPTB

CPL        P1.2

LJMP    DS1_RPTA

51单片机中有两个定时器T0和T1,分别是由两个8位的专用寄存器组成,即定时/计数器T0由TH0和TL0组成,T1由TH1和TL1组成。单片机中的定时器溢出时申请的中断,达到计时或计数的目的。并使用定时控制寄存器控制它。其中的:

TF1:定时器1溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除。或用软件清除。

TF0:定时器0溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除,或用软件清除。

扩展资料

定时器工作的流程:

以51为例用定时器0方式一产生50毫秒的定时:

1、确定使用哪个定时器,使用哪种方式,通过TMOD设置,TMOD的低四位是设置定时器0的,高四位是用来设置定时器1的,其中的M0,M1是用来设置定时器工作在哪种方式,GATE一般用不要设置,C/T是选择计数模式还是定时模式的,如:TMOD = 0X01,就说明定时器0工作在方式1。

2、设置定时的时间,用定时器定时,如:50毫秒,可以用这种方式TH0 = (65535 - 50000) / 256,TL0 = (65535 - 50000) % 256;可以这样理解:因为这是定时器的初值,也就是说计数脉冲就是在这个数的基础上向上递增,到达65535后就溢出产生中断。

3、打开中断,使用IE寄存器,首先打开总中断EA = 1,这一步是所有中断所必须的,然后打开定时器0中断,ET0 =1。

4、这时准备工作结束,启动定时器,使用TCON寄存器,TR0 = 1,实现了一个50毫秒的定时。

参考资料来源:《单片机原理及应用》 曹巧媛 编著 电子工业出版社   第四章 单片机定时功能及应用  第一节 定时器/计数器的结构与工作原理   第二节  定时计数器的操作模式及应用  第三节 定时器综合应用举例

参考资料来源:百度百科--定时器中断



本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
做而论道
高能答主

2013-01-03 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.1亿
展开全部
;
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP 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
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
尚云社
2013-01-03 · TA获得超过391个赞
知道小有建树答主
回答量:229
采纳率:0%
帮助的人:280万
展开全部
#include <reg51.h>
typedef unsigned char u8;
#define _500US 500
#define N 4
sbit _500USOUT = P1^3;
sbit _2MSOUT = P1^2;
u8 Cnt;
void InitTim1(void); //初始化timer1
//============================================timer1初始化
void InitTim1(void)
{
TMOD = 0x20;
TL1 = 256 - (_500US / 2);
TH1 = 256 - (_500US / 2);
Cnt = 0;
TR1 = 1;
ET1 = 1;
EA = 1;
}
//============================================timer1中断
void Tim1Isr(void)interrupt 3
{
_500USOUT = !_500USOUT;
if(++Cnt == N)
{
_2MSOUT = !_2MSOUT;
Cnt = 0;
}
}
//============================================main函数
void main(void)
{
_500USOUT = 1;
_2MSOUT = 1;
InitTim1();
while(1)
;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式