- 51单片机定时器中断的理解
- 个人最近几天学习总结
51单片机定时器问题
前面的几种方法没有任何难度,当一学习到定时器和中断的时候,我就觉得我有点笨了,第一遍很多东西没有理解,所以看了好几遍,第三遍的时候才勉强看懂,然后开始写代码,虽然写成功了,但是我还是觉得有些懵懵懂懂的.
于是我找了一些书还有开发板的帮助手册看,总结了一下。
谈谈自己的看法
定时器和中断
只学了一种模式的定时器0,所以就总结一下这一个
学习这个首先要看懂图,看懂图的话,后面的所有的都好理解了
-
中断的概念
单片机在执行程序时,中断也 随时有可能发生,但无论何时发生,只要一旦发生,单片机将立即暂停当前程序, 赶去处理中断程序,处理完中断程序后再返回刚才暂停处接着执行原来的程序。 -
接下来就是中断的内部结构图
①INT0 对应的是 P3.2 口的附加功能,可由 IT0(TCON.0)选择其为低电平有 效还是下降沿有效。当 CPU 检测到 P3.2
引脚上出现有效的中断信号时,中断标 志 IE0(TCON.1)置 1,向 CPU 申请中断。 ②INT1 对应的是 P3.3
口的附加功能,可由 IT1(TCON.2)选择其为低电平有 效还是下降沿有效。当 CPU 检测到 P3.3引脚上出现有效的中断信号时,中断标 志 IE1(TCON.3)置 1,向 CPU 申请中断。 ③T0 对应的是 P3.4口的附加功能
TF0(TCON.5),片内定时/计数器 T0 溢 出中断请求标志。当定时/计数器 T0 发生溢出时,置位 TF0,并向CPU 申请中断。
④T1 对应的是 P3.5 口的附加功能,TF1(TCON.7),片内定时/计数器 T1
溢出中断请求标志。当定时/计数器 T1 发生溢出时,置位 TF1,并向 CPU 申请中 断。
⑤RXD 和 TXD 对应对应的是 P3.0 和P3.1 口的附加功能,RI(SCON.0)或 TI (SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位 RI 或当串行口发送完一帧串行数据时置位 TI,向 CPU 申请中断。
- 可以把整个中断和定时器看做一条路走,单片机程序运行的时候,会根据定时器指定的时间去检查设置好的中断条件,然后开始中断执行,执行完之后,就开始恢复到原来的点去执行下一步.
- 很多时候都搞不清楚定时器的那些熟悉设置,贴在这里方便理解
- //定时器0
void Timer0(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //允许中断
EA = 1; //允许总中断
PT0 = 1; //中断优先级
}`
其实从代码开头到TR0=1;
都可以用stc-isp来生成,只要你设置好你单片机的属性,直接点生成复制过来就可以了。
你需要的就是理解整个运行流程,他们都是在沿着设置好的路线走而已.
两条路来选择你走得路,0或者1;
ET0 = 1; //允许中断
EA = 1; //允许总中断
PT0 = 1; //中断优先级
关于定时器和中断大概就是这么多,写下来方便自己看,也让搜索这些关键词的同学们加深印象
个人最近几天学习问题和解决方法
首先是REGX51.H头文件导入之后,还是依然报错,好像keil5没有办法导入REGX51.H一样
解决方法一:
手动去软件的安装目录下面复制头文件加入到工程里
然后重新编译就可以了.
解决方法二:
关闭软件之后再重新打开项目,然后再编译,就发现不会报错了.
这个方法也可以解决你右键转到定义函数出错的问题.
然后是,每次写完编译之后,都会报l16的警告i,是因为导入的函数库很多函数没有引用,所以才会这样
想让他不显示的话,可以选择编译设置里的BL51 Misc --> Wamings,里面输入你要忽略的警告就可以了.
然后是设置代码颜色的问题,keil4里的代码都是纯黑色,很难看出是否有错误,写起来也很不爽,keil5里这个方法可以自定义代码的颜色,编辑器颜色等等.
最后贴上我这个菜鸡做的俩个小练习