网站制作专业的公司叫什么,元谋县住房和城乡建设局网站,qq推广官网,外贸网站设计模板TMOD负责确定T0和T1的工作模式#xff0c;TCON控制T0和T1的启动或停止计数#xff0c;同时包含定时器状态 TF1#xff1a;定时器1溢出标志 TF0#xff1a;定时器0溢出标志
0~65535 每隔1微秒计数器1#xff0c;总时间65535微秒#xff0c;赋上初值64535#xff0c;则只…
TMOD负责确定T0和T1的工作模式TCON控制T0和T1的启动或停止计数同时包含定时器状态 TF1定时器1溢出标志 TF0定时器0溢出标志
0~65535 每隔1微秒计数器1总时间65535微秒赋上初值64535则只有1000微秒即1毫秒
第一步编写Timer_Init()
首先配置TMOD 所以初始化TMOD 0x01; //0000 0001 整体操作TMOD TMOD 0xF0; //低四位清零高四位不变 TMOD TMOD | 0x01; //最低位置1其他位不变
接下来配置TCON TF0 0; TR0 1;
还要配置TH0和TL0 用64535存在这两个盒子里盒子最大只能存八字节也就是256所以 TH0 64535 / 256; TL0 64535 % 256;
最后配置中断系统 要打开的开关置1 ET0 1; EA 1; PT0 0;
来看看代码
#include REGX52.Hvoid Timer0_Init(void) //1毫秒11.0592MHz
{TMOD 0xF0; //设置定时器模式TMOD | 0x01; //设置定时器模式TL0 0x66; //设置定时初值TH0 0xFC; //设置定时初值TF0 0; //清除TF0标志TR0 1; //定时器0开始计时//中断系统ET0 1;EA 1;PT0 0;
}void main()
{Timer0_Init();while(1){}
}unsigned int T0Count;
void Timer0_Routine() interrupt 1
{TL0 0x66; //设置定时初值TH0 0xFC; //设置定时初值T0Count ;if(T0Count 1000){T0Count 0;P2_0 ~P2_0;}
}接下来把定时器模块化 创建Timer0头文件和.c文件存放Timer0_Init() 中断函数保留在主函数中根据不同的需要进行修改 然后把T0Count 改为静态局部变量使之生命周期与文件相同否则执行完一次之后会被初始化
利用按键控制流水灯流动方向的主函数代码 Key函数读取按键按一次改变一次流水方向每500毫秒中断一次判断流水模式进行移位 crol 是循环左移函数 , _cror_是循环右移函数需要INTRINS.H头文件
#include REGX52.H
#include INTRINS.H
#include Timer0.h
#include Key.hunsigned char KeyNum, LEDMode;void main()
{P2 0xFE; // 1111 1110 点亮最后一位然后利用循环移位函数_crol_ 和_cror_Timer0_Init();while(1){KeyNum Key();if(KeyNum){if(KeyNum 1){LEDMode ;if(LEDMode 2) LEDMode 0;}}}
}void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 0x66; //设置定时初值TH0 0xFC; //设置定时初值T0Count ;if(T0Count 500) //每500毫秒移位一次LEDMode决定方向{T0Count 0;if(LEDMode 0) P2 _crol_(P2, 1);if(LEDMode 1) P2 _cror_(P2, 1);}
}而定时器时钟只需要在此基础上进行修改利用之前模块化好的LCD1602模块和Timer0模块下面给出主函数
#include REGX52.H
#include LCD1602.h
#include Timer0.h
#include Delay.hunsigned int Sec, Min, Hour;void main()
{LCD_Init();Timer0_Init();LCD_ShowString(1, 1, Clock:);LCD_ShowString(2, 1, : :);while(1){LCD_ShowNum(2, 1, Hour, 2);LCD_ShowNum(2, 4, Min, 2);LCD_ShowNum(2, 7, Sec, 2);}
}void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 0x66; //设置定时初值TH0 0xFC; //设置定时初值T0Count ;if(T0Count 1000){T0Count 0;Sec ;if(Sec 60) Sec 0, Min ;if(Min 60) Min 0, Hour ;if(Hour 24) Hour 0;}
}