控制寄存器TCON(可位寻址)
工作模式寄存器TMOD(不可位寻址)
按键控制LED流水灯模式
需要模块化代码:Delay.c和.h、key.c和.h、Timer0.c和.h、
#include<REGX52.H>
#include“Timer0.h”
#include“Delay.h”
#include“Key.h”
unsigned char LEDMode,KeyNum;
//Timer0可以编程模块化代码。定时器0初始化
void Timer0_Init(){
//TMOD = 0x01; //不可位寻址,整体寻址。0000 0001 定时器0的模式1
//TMOD = 0x01;会把高四位,也就是定时器1清零。
TMOD&=0xF0;//把TMOD低四位清零,高四位保持不变
TMOD|=0x01;//把TMOD的最低位置1,高四位保持不变
TF0 = 0;//位寻址。1产生中断,0不产生中断。一开始不需要中断
TR0 = 1;//位寻址,定时器T0的运行控制位,TR0=1允许计数。计数器从0-65535us
//IE0和IT0先不用配置
//每隔1us加1,64535离溢出还有1000us,也就是1ms
//TL0和TH0如果这样计算会有1ms的差别,可以去STC软件里面取配置
TH0 = 64535/256; //高8位
TL0 = 64535%255; //低8位
ET0 = 1;
TF0 = 1;
PT0 = 0;
}
void main()
{
P2=0xFE;
Timer_Init();
while(1)
{
KeyNum=Key();
if(KeyNum)
{
if(KeyNum==1)
{
LEDMode++; //LED 一直是0101变化
if(LEDMode>=2)LEDMode=0;
}
}
}
}
//本来程序在while中执行,过了1ms中断过来就执行中断函数,然后在调回主程序中
//定时器中断模板。这部分不易于模块化,但是可以复制到定时器模块化文件中注释掉以便需要时直接赋值。
void Timer0_Runtime(void) interrupt 1{
static unsigned int T0Count;
//中断执行一次之后,TH0和TL0变成0,将会65ms中断,需要重新赋值
TH0 = 64535/256; //高8位
TL0 = 64535%255; //低8位
T0Count++;
if(T0Count>=1000)
{
T0Count = 0;
//P2_0 = ~P2_0;
if(LEDMode==0)
P2 = _crol_(P2,1); //左移
if(LEDMode==1)
P2 = _cror_(P2,1); //右移
}
}
定时器时钟
需要模块化代码:LCD1602、Delay、Timer0、
#include
unsigned char Sec,Min,Hour;
void main()
{
LCD_init();
Timer0Init();
LCD_ShowString(1,1,"Clock:");
LCD_ShowString(2,1," : : ");
while(1)
{
LED_ShowNum(2,1,Hour,2);
LED_ShowNum(2,2,Min,2);
LED_ShowNum(2,7,Sec,2);
}
}
void Timer0_Runtime(void) interrupt 1{
static unsigned int T0Count;
//中断执行一次之后,TH0和TL0变成0,将会65ms中断,需要重新赋值
TH0 = 64535/256; //高8位
TL0 = 64535%255; //低8位
T0Count++;
Sec++;
if(Sec>=60)
{
Sec=0;
Min++;
if(Min>=60)
{
Min=0;
Hour++;
if(Hour>=24)
{
Hour=0;
}
}
}
}