【Keil5】定时器应用普中STC89C5xx-RC Series

【Keil5】定时器应用普中STC89C5xx-RC Series,第1张

【Keil5】定时器应用//普中STC89C5xx-RC Series

定时器模式一的初始化 

#include 
#include "DSQ.h"

void DSQ_init(void)//1ºÁÃë
{
	TMOD&=0xF0;//寄存器高位不变,模式1
	TMOD|=0x01;//寄存器低位GATE:0 C/T:0 M1:0 M0:1,模式1
	TL0=0x18;//1000计数,模式1是16位,所以须设值TL0和TH0
	TH0=0xFC;
	TF0=0;//初值无溢出,最高位溢出时1,CPU响应后归零,只读
	TR0=1;//与GATE=0共同使用,不考虑INT0外部中断,允许计数
	ET0=1;
	EA=1;
	PT0=0;
}

 为什么要TMOD&=0xF0;TMOD|=0x01;?TMOD是不可位寻址,须整体赋值。本次只使用定时器0

 

为什么    TF0=0;TR0=1;?

TCON是可位寻址,每一位单独赋值的

 

为什么TL0=0x18;TH0=0xFC;?是设置从哪个数 数到2^16然后溢出

为什么ET0=1; EA=1; PT0=0;?是要把TF0下路接通

 

功能函数的routine不能乱写,不同单片机有自己的中断查询序号

 

 

定时器实现0号LED闪烁 

#include 
#include "DSQ.h"

void main()
{
	DSQ_init();//定时器初始化
	while(1)
	{//初始化后,程序一直停在while,定时器若响应,执行routine语句
	}
}
void Timer0_Routine() interrupt 1
{
	static int num=0;
	TL0=0x18;//重设计数,数1000,约1毫秒
	TH0=0xFC;
	num++;
	if(num>=1000)//约1秒
	{
		num=0;P2_0=~P2_0;//LED取反闪烁,num归0
	}
}

按独立按键的1键实现流水灯右移

按独立按键的4键实现流水灯左移

#include 
#include "DSQ.h"
int i=1;
int key;
void main()
{
	DSQ_init();
	P2=0xFE;//初始化
	while(1)		//初始化后程序一直在while,若定时器响应,则执行routine语句
	{
		key=DLAJ();
		if(key==1||key==4) i++;
	}
}
void Timer0_Routine() interrupt 1
{
	static int num=0;
	TL0=0x18;//计数1000,约1毫秒
	TH0=0xFC;
	num++;
	if(num>=500)//计数500,约半秒
	{
		num=0;
		if(i%2)
		{
			P2=(P2<<1)+1;//实现移位
			if(P2==0xFF) P2=0xFE;
		}
		else 
		{
			P2=~(~P2>>1);
			if(P2==0xFF) P2=0x7F;
		}
	}
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5710920.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存