打开软件
1与其它等于其它,0与其它等于0
1或其它等于1,0或其它等于其它
TMOD=TMOD&0xF0;//0xF0=1111 0000进行与操作,高四位保持,低四位清零,高四位定时器1,低四位定时器0
TMOD=TMOD|0x01;//0x01=0000 0001进行或操作,高四位保持,低四位置0001
只配置了定时器0为16位定时器/计数器模式,不影响定时器1的配置TF0=0;//初始状态TF0置0,只有当溢出时,单片机硬件自动置TF0为1,响应中断时,硬件又自动置TF0为0
TR0=1;//配置定时器0时GATE已配置为0,TR0=1允许计时

TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
定时器算配置好了,接下来配置中断,给CPU信号说,来!到点儿了!先别忙那个了,干这个!
ET0=1;
EA=1;
PT0=0;
综上,定时器0初始化函数代码为:

之所以多1是因为65535是从0开始计数,如果从1开始计数,则是1到65536,而我们设置初始值,相当于从1开始计数而不是0,所以TL0=(65536-1000)%256,TH0=(65536-1000)/256
12MHz定时器时钟为12T所以1T就是1MHz
void Timer0_Init()//定时器0初始化函数12MHz下配置的12T
{
TMOD&=0xF0;//高四位保持,低四位清零,a=a&b简写为a&=b
TMOD|=0x01;//高四位保持,低四位0001
TL0=0X18;//低四位(65536-1000)%256设置1毫秒定时器
TH0=0XFC;//高四位(65536-1000)/256设置1毫秒定时器
TF0=0;//TF0初始化,溢出为1,平时为0
TR0=1;//允许定时器开始计数
//打开中断
ET0=1;
EA=1;
//设置优先级
PT0=0;
}
定时器中断配置好了,接下来是中断后要干事情了,需要中断函数
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;//用于定时比65536微秒更长的时间比如1秒,设置一个变量
TL0=0x18;//每次进入中断函数后,初始化函数里的初始值会自动清0,如果不想下次从0开始计数则需要
TH0=0xFC;//重新给TL0和TH0赋值
T0Count++;//每进一次中断是1毫秒,累加到T0Count中
if(T0Count==1000)//1秒等于1000毫秒
{
T0Count=0;//先初始化清零
//下来写想要干的事儿,点灯等等
}
}
不懂static可以跳转到这里,希望可以帮助到你节约时间
下来把定时器0做模块化
跳转到这个链接:51单片机学习之旅------模块化编程集_51单片机模版编程-CSDN博客
跳转到这个链接:51单片机学习之旅------模块化编程集_51单片机模版编程-CSDN博客
下来做按键模块化
跳转到这个链接:51单片机学习之旅------模块化编程集_51单片机模版编程-CSDN博客 跳转到这个链接:51单片机学习之旅------模块化编程集_51单片机模版编程-CSDN博客
同理是delay模块化,
跳转到这个链接:51单片机学习之旅------模块化编程集_51单片机模版编程-CSDN博客
跳转到这个链接:51单片机学习之旅------模块化编程集_51单片机模版编程-CSDN博客
下面是main.c文件内容:
#include <REGX52.H>
#include "timer0.h"
#include "key.h"
#include <INTRINS.H>//函数库中有连续左移,右移函数
unsigned char keynumber=0,ledmode=0;
void main()
{
P2=0xFE;//先让最低位亮一个灯
Timer0Init();//定时器0中断初始化
while(1)
{
keynumber=key();//读取按键
if(keynumber)//按键1控制led灯的模式,0模式循环左移,1模式循环右移
{
if(keynumber==1)
{
ledmode++;
if(ledmode>=2)
{
ledmode=0;
}
}
}
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0=0x18;
TH0=0xFC;
T0Count++;
if(T0Count>=500)
{
T0Count=0;
if(ledmode==0)
{
P2=_crol_(P2,1);//_crol_(待移项,需要左移left的位数),最高位与最低位相连成环,一直移
}
if(ledmode==1)
{
P2=_cror_(P2,1);//_cror_(待移项,需要右移right的位数)
}
}
}