怎样运营网站,做图素材网站 千,肥乡邯郸做网站,上海家装10强名单目录 一#xff0c;定时器#xff0c;中断系统#xff0c;寄存器工作原理
二#xff0c;定时器的应用
#xff08;1#xff09;用独立按键和左移右移循环函数相结合生成流水灯
#xff08;2#xff09;实现一个定时器时钟 一#xff0c;定时器#xff0c;中断…目录 一定时器中断系统寄存器工作原理
二定时器的应用
1用独立按键和左移右移循环函数相结合生成流水灯
2实现一个定时器时钟 一定时器中断系统寄存器工作原理
1.定时器介绍 单片机的定时器资源
在简单的系统中使用一到两个定时器就足够了
工作原理 定时器工作模式
16位最常用本次只学习16位
对原理图进行拆分 根据左边提供的脉冲16位计数器内部会加一到达最大值会溢出申请中断
和沙漏相似 时钟
本次选择为定时器 选择12兆C/横杠T为0的模式C代表counter 是计数器T则为Timer是计时器横杠是低电平给0为timer给1为counter本次需要选择0 中断系统 流程图 中断资源 定时器和中断系统的结合运行
想要实现以上内容还需要结合寄存器
TCON寄存器
TMOD寄存器 需要配置的是M1M0以及C/横杠T
中断除了可以被TR0单独控制还可以和GATE一起控制通过逻辑的与非门实现 实际写程序的时候重要的是配置寄存器
可位寻址可以单独为一位赋值不可位寻址只能全体赋值
实际操作 测试中断是否进行
#include REGX52.Hvoid Timer0_Init() //初始化设定需要的模式
{TMOD0x01; //0000 0001TF00;TR01;TH064535/256; //取高8位TL064535%256; //取低8位ET01;EA1;PT00;
}void main()
{Timer0_Init();while(1){}}unsigned int T0Count;
void Timer0_Routine() interrupt 1
{TH064535/256; TL064535%256; //重新赋初值T0Count;if(T0Count1000){T0Count0;P2_0~P2_0; //间隔为一秒进行闪烁}}可以利用stc软件生成配置函数但是需要增加和删除一部分代码
删除第一行的AUXR寄存器再配置上中断寄存器ET0EAPT0。
void Timer0_Init() //初始化设定需要的模式 1毫秒12.000MHz
{TMOD 0xF0; //设置定时器模式TMOD | 0x01; //设置定时器模式TL0 0x18; //设置定时初值TH0 0xFC; //设置定时初值TF0 0; //清除TF0标志TR0 1; //定时器0开始计时ET01;EA1;PT00;
}
二定时器的应用
1用独立按键和左移右移循环函数相结合生成流水灯
#include REGX52.H
#include Timer0.h
#include Key.H
#include INTRINS.Hunsigned char KeyNum,LEDMode;
void main()
{P20xFE;Timer0_Init();while(1){KeyNumKey();if(KeyNum){if(KeyNum1){LEDMode;if(LEDMode2)LEDMode0;}}}}void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 0x18; TH0 0xFC; //设置初值T0Count;if(T0Count500){T0Count0;if(LEDMode0)P2_crol_(P2,1);if(LEDMode1)P2_cror_(P2,1);}}插入头文件 #include INTRINS.H
循环函数1.crol 向左移最后一个字母为LEFT的缩写有两个参数 2.cror 向右移最后一个字母为Right的缩写有两个参数。
实现效果实现LED流水灯且可以通过独立按键K1来改变流水灯的方向向右或者向左实现流水灯由于使用循环函数不用担心会移出去可以一直循环移动。
2实现一个定时器时钟
#include REGX52.H
#include Delay.H
#include LCD1602.H
#include Timer0.Hunsigned char 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 0x18; TH0 0xFC; //设置初值T0Count;if(T0Count1000){T0Count0;Sec;if(Sec60){Sec0;Min;if(Min60){Min0;Hour;}if(Hour24){Hour0;}}}}
显示效果 独立按键原理图