求解单片机编程:利用定时器/计数器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的主要内容,如果未能解决你的问题,请参考以下文章

51单片机学习笔记6 -- 定时器中断

51单片机学习笔记6 -- 定时器中断

4.10 51单片机-使用计数器测量NE555脉冲频率

4.10 51单片机-使用计数器测量NE555脉冲频率

51单片机中断程序大全

单片机单片机知识点提纲3