求解单片机编程:利用定时器/计数器T0的方式2,采用中断方式,在PL0引脚输出10KHZ方波。时钟频率12MHZ
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求解单片机编程:利用定时器/计数器T0的方式2,采用中断方式,在PL0引脚输出10KHZ方波。时钟频率12MHZ相关的知识,希望对你有一定的参考价值。
参考技术A 定时50us#include <reg51.h>
void main(void)
TMOD = 0x02;
TH0 = 0x00;
TL0 = 0x0CE;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1);
void Timer0Interrupt(void) interrupt 1
TH0 = 0x00;
TL0 = 0x0CE;
P1^0=~P1^0;
追问
不用C语言。单片机语言呢
追答ORG 0000H
LJMP START
ORG 000BH
LJMP Timer0Interrupt
START:
MOV SP,#60H
MOV TMOD,#02H
MOV TH0,#00H
MOV TL0,#0CEH
SETB EA
SETB ET0
SETB TR0
SJMP $
Timer0Interrupt:
MOV TH0,#00H
MOV TL0,#0CEH
CPL P1.0
RETI
END
编程题 设MCS-51单片机系统中晶振频率为12MHz,欲使用定时器/计数器1,采用方式1编写实现1秒定时时间的程
并写出定时时间的计算步骤
采用12Mhz晶振的51单片机,软件如下(调试通过)#include <reg52.h>
#define PERIODH (65536l-50000l)/0X100 //设50ms中断1次TH1初值
#define PERIODL (65536l-50000l)%0X100 //设50ms中断1次TL1初值
//如果需要极精确的延时,应根据实际编译后的产生的汇编指令,扣除掉中断响应中重装所占用的时间
unsigned int count;//延时时间变量
void timer1() interrupt 3 using 1
//定时器每0.05秒一次中断
TH1 = PERIODH;
TL1 = PERIODL;
if(count)
//计数未到0,则保持定时器运行,计数器-1
count--;
else
//计数到0,关定时器
TR1 =0; //stop timer 1
//以秒为基本定时单位的子程序
void Delay1S(unsigned char x)
TH1 =PERIODH;
TL1 =PERIODL;
TR1 = 1;//此时定时开始
count = 20*x;//因50ms中断1次,故乘20
while(count);
main()
TMOD = 0X10;//方式1
EA = 1;//总中断允许
ET1 = 1;//定时器1中断允许
while(1)
Delay1S(1);//延时1秒
Delay1S(2);//延时2秒
Delay1S(3);//延时3秒
Delay1S(4);//延时4秒
Delay1S函数是调用时才开始计时,根据需要的定时长度到时停止计时。如果定时精度要求不高,可以不用在中段服务程序中关闭定时器,每次调用误差也就在50ms。
可以用KEIL仿真看一下实际时间 参考技术A #include <reg51.h>
unsigned char i;
void main()
TMOD=0x10;
TH1=0x3c;
TL1=0xb0;
EA=1;
ET1=1;
TR1=1;
while(1)
if(i==20)
i=0;
//下面写你要处理的的其他程序,你只要了定时1s。
void a(void) interrupt 3
unsigned char i;
TH1=0x3c;
TL1=0xb0;
i++;
12Mhz的51单片机,经过12分频后为1MHz,则一个指令周期为1/1Mhz = 1us.
则定时50ms为 0xffff - 0x3cb0,即65535 - 15535 = 50000us = 50ms,则20次的定时:20×50ms=1s。
明白了吗?怪简单的问题……
祝你顺利哦!本回答被提问者和网友采纳 参考技术B 这个太简单了,给你个方法,你自己弄吧,不会多看看书。
1 使能定时器
2 使能定时器中断
3 编写中断程序
我估计你是觉得1秒的时间,定时器达不到,你可以在中断里面再自己写个计数,或者开启计数器2,这样两两相乘,时间就能到1秒钟了。
要做到精确的定时,就要用计数器2,然后在Keil里可以看到时间,再对定时器进行微调就好了。 参考技术C void sheding()
TMOD=0x10;//定时器/计数器工作方式寄存器的设定
TH1=(65536-50000)/256;
TL1=(65536-50000)%265;
//定时器/计数器控制寄存器设定
EA=1; //全局中断允许位
ET1=1; //打开定时器/计数器1
TR1=1;
void zhongduan() interrupt 3
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
k++;
if(k==20)
k=0;
shu++;
if(shu==86400)
shu=0;
参考技术D #include <reg51.h>
unsigned int num ;
void InitTimer1(void)
TMOD = 0x10;
TH1 = 0x3C; //50ms定时
TL1 = 0x0B0;
EA = 1;
ET1 = 1;
TR1 = 1;
void main(void)
InitTimer1();
void Timer1Interrupt(void) interrupt 3
TH1 = 0x3C;
TL1 = 0x0B0;
num++;
if(num==20) ; //1S时间到。
以上是关于求解单片机编程:利用定时器/计数器T0的方式2,采用中断方式,在PL0引脚输出10KHZ方波。时钟频率12MHZ的主要内容,如果未能解决你的问题,请参考以下文章