y看了郭天祥老师的视频点亮LED后,感慨颇多,于是在今年完成了多函数编写方法的教程。
在高中阶段我是个追求极度完美的人,再解答任何问题我都要追寻最简单的方法,或者是掌握问题本质,直接猜出答案,对,所以y的数理化并不差,但是临场发挥确实限制住了y。无奈与梦想大学失之交臂!
y的心气很高,不服输。于是独身一人去了杭州,进过三年的打拼进入了某大型企业类似于HK。即使是三本院校也无法阻止我前进的脚步!
我今天要写的就是精确控制85c51单片机输出一个方波,波形周期是1s。如果使用延时函数delay的化是非常的模糊,可能延时的是1.056s或者0.989s,这种事是作为一个技术人员所无法容许的。我要做出改变,我要精确控制引脚输出。
首先理解什么是中断。既然是理解那就举个栗子吧。
我要去上班但是在上班途中我买了早点,买早点的这个事就是中断。当然,昨晚我打游戏出了神话装备导致我多玩了一会,导致今天我起晚了,所以没时间买早点必须要尽快赶往公司打卡。这就是说中断是随机的。
中断里面必须含有以下三个条件。
- 中断源中断请求。及
INT0=0(低电平触发)
INT0=1(下降沿触发) - 中断标记位。及
EX0=1 - 中断打开位。及
EA=1
那么我们从实际出发吧。先写个中断函数。
中断函数的写法是void 函数名() interrupt 中断编号。
其中中断编号是0、1、2、3、4。
外部中断(INT0)0是0。
定时器中断0(T0)是1。
外部中断1(INT1)是2。
定时器中断(T1)1是3。
串口中断(TX/RX)是4
此时我们使用的是定时器触发所以选择1或者3,依据优先级选择1。
创建时间配置函数,这个函数主要的目的是用来初始化定时器的。
先理解参数首先是定时器的工作方式
因为我要延迟1s所以我要准备两个定时器。
因为要选择16位定时器计数器所以选择方式1,而且只用一个定时器所以
TMOD=0x01 // 00000001
设备的定时器和晶振频率有关,因为我的机器使用的晶振不是11.0592MHZ而是12MHZ所以
使用公式:
定时时间(T)
应为要延迟1s,又因为1s=50ms*20次,所以完成if函数
在定时器中实现i++;
那么50ms如何设置TH0和TL0的初始值呢?,当然要用我们的ISP软件啦!
依据上图所以
EA=1
ET0=1
TR0=1
确确实实是1s一闪烁,什么for循环还要在那不停的调试真的很麻烦!
函数截图
程序下载地址
https://download.csdn.net/download/qq_43161960/79140301