定时器模式一的初始化
#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; } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)