单片机编程题
用T1设计500MS的定时器,使P1端口上连接的8个发光二级管间隔500MS轮流点亮,晶体震汤器的频率为Fosc=12MHZ单片机应该是51单片机。不太明白怎么写程序。...
用T1设计500MS的定时器,使P1端口上连接的8个发光二级管间隔500MS轮流点亮,晶体震汤器的频率为Fosc=12MHZ
单片机应该是51单片机。不太明白怎么写程序。 展开
单片机应该是51单片机。不太明白怎么写程序。 展开
展开全部
定时器在12MHz的时钟时,每个机器周期(1us)+1,工作模式1时(16位模式)最大计数值为65536,所以定时时间最大在65.536ms,达不到500ms的要求!你可以设置50ms定时中断一次,在中断程序中计数够10次,让灯循环一次即可。
1、计算计数初值X:
由于晶振为12 MHz,所以机器周期Tcy为50 ms。所以:
X=65536-50000=15536=3CB0H
即应将3CH送入TH1中,B0H送入TL1中
2、求T0的方式控制字TMOD:
M1M0=01,GATE=0,C/T=0,可取方式控制字为10H;
3、程序:
ORG 0000H
LJMP MAIN ;跳转到主程序
ORG 001BH ;T1的中断入口地址
LJMP DVT1 ;转向中断服务程序
ORG 0100H
MAIN:
MOV A,#00000001H ;设定显示初值,共阴极接法
MOV R0,#00H ;记录定时次数的寄存器
MOV TMOD,#10H ;置T0工作于方式1
MOV TH1,#3CH ;装入计数初值
MOV TL1,#0B0H
SETB ET1 ;T0开中断
SETB EA ;CPU开中断
SETB TR1 ;启动T0
SJMP $ ;等待中断
DVT0:
INC R0 ;每中断一次(50ms)加1
CJNE R0,#10,EXIT ;不够10次即未到500ms退出
MOV P1,A ;亮灯
RL A ; A的值左移,准备下一次灯的状态
MOV R0,#00H ;清除计数值,重新计数
EXIT:
MOV TH0,#0D8H ;重新装入计数值
MOV TL0,#0F0H
RETI ;中断返回
end
1、计算计数初值X:
由于晶振为12 MHz,所以机器周期Tcy为50 ms。所以:
X=65536-50000=15536=3CB0H
即应将3CH送入TH1中,B0H送入TL1中
2、求T0的方式控制字TMOD:
M1M0=01,GATE=0,C/T=0,可取方式控制字为10H;
3、程序:
ORG 0000H
LJMP MAIN ;跳转到主程序
ORG 001BH ;T1的中断入口地址
LJMP DVT1 ;转向中断服务程序
ORG 0100H
MAIN:
MOV A,#00000001H ;设定显示初值,共阴极接法
MOV R0,#00H ;记录定时次数的寄存器
MOV TMOD,#10H ;置T0工作于方式1
MOV TH1,#3CH ;装入计数初值
MOV TL1,#0B0H
SETB ET1 ;T0开中断
SETB EA ;CPU开中断
SETB TR1 ;启动T0
SJMP $ ;等待中断
DVT0:
INC R0 ;每中断一次(50ms)加1
CJNE R0,#10,EXIT ;不够10次即未到500ms退出
MOV P1,A ;亮灯
RL A ; A的值左移,准备下一次灯的状态
MOV R0,#00H ;清除计数值,重新计数
EXIT:
MOV TH0,#0D8H ;重新装入计数值
MOV TL0,#0F0H
RETI ;中断返回
end
展开全部
/*由P1口控制8个发光二极管,
使8个指示灯依次一个一个闪动,
间隔时间500MS,
设晶振频率为12MHz。*/
#include<reg52.h> //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit P1_0=P1^0;
uchar tt,a;
void main() //主函数
{
TMOD=0x10;//设置定时器1为工作方式1
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;//开总中断
ET1=1;//开定时器1中断
TR1=1;//启动定时器1
a=0xfe;
while(1);//等待中断产生
}
void timer0() interrupt 3 //定时器中断函数
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
tt++;
if(tt==10)
{
tt=0;
P1=a;
a=_crol_(a,1);
}
}
使8个指示灯依次一个一个闪动,
间隔时间500MS,
设晶振频率为12MHz。*/
#include<reg52.h> //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit P1_0=P1^0;
uchar tt,a;
void main() //主函数
{
TMOD=0x10;//设置定时器1为工作方式1
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;//开总中断
ET1=1;//开定时器1中断
TR1=1;//启动定时器1
a=0xfe;
while(1);//等待中断产生
}
void timer0() interrupt 3 //定时器中断函数
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
tt++;
if(tt==10)
{
tt=0;
P1=a;
a=_crol_(a,1);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
最好自己搜一下定时器的用法,很简单,自己做是锻炼自己的最好方式
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询