定时器中断
书中P60例子:让LED1每秒闪烁1次
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit led1 = P1 ^ 0;
void main()
{
TMOD = 0X01; //设置定时器0为工作方式1
TH0 = (65536 - 45872) / 256;
TL0 = (65536 - 45872) % 256;
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
TR0 = 1; //启动定时器0
while(1); //程序停止,等待中断发生
}
//设置定时器中断
uchar num;
void T0_time() interrupt 1
{
TH0 = (65536 - 45872) / 256; //重装初值
TL0 = (65536 - 45872) % 256;
num++;
//到了1秒的时间
if(num == 20)
{
num = 0;
led1 = ~led1; //发光状态取反
}
}
代码优化
书中P61例子
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit led1 = P1 ^ 0;
uchar num;
void main()
{
TMOD = 0X01; //设置定时器0为工作方式1
TH0 = (65536 - 45872) / 256;
TL0 = (65536 - 45872) % 256;
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
TR0 = 1; //启动定时器0
while(1)
{
//到了1秒的时间
if(num == 20)
{
num = 0;
led1 = ~led1; //发光状态取反
}
};
}
//设置定时器中断
void T0_time() interrupt 1
{
TH0 = (65536 - 45872) / 256; //重装初值
TL0 = (65536 - 45872) % 256;
num++;
}
LED和数码管同时工作
书中P62例子
#include <reg52.h>
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit dula = P2 ^ 6; //U1锁存器的锁存端
sbit wela = P2 ^ 7;
sbit led1 = P1 ^ 0;
//U2锁存器的锁存端
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //共阴极数码管编码表
uchar num, num1, num2, shi, ge;
//延时
void sleep(uint delay)
{
uint i, j;
for (i = delay; i > 0; i--)
{
for (j = 110; j > 0; j--)
;
}
}
//数码管显示内容
void display(uchar shi, uchar ge)
{
dula = 1;
P0 = table[shi];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfe;
wela = 0;
sleep(5);
dula = 1;
P0 = table[ge];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
sleep(5);
}
void main()
{
TMOD = 0x11; //设置定时器0为工作方式1
TH0 = (65536 - 45872) / 256;
TL0 = (65536 - 45872) % 256;
TH1 = (65536 - 45872) / 256;
TL1 = (65536 - 45872) % 256;
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
TR0 = 1; //启动定时器0
ET1 = 1; //开定时器1中断
TR1 = 1; //启动定时器1
while (1)
{
display(shi, ge);
}
}
//设置定时器中断
void T0_time() interrupt 1
{
TH0 = (65536 - 45872) / 256; //重装初值
TL0 = (65536 - 45872) % 256;
num1++;
if (num1 == 4)
{
num1 = 0;
led1 = ~led1; //状态取反
}
}
//设置定时器中断
void T1_time() interrupt 3
{
TH1 = (65536 - 45872) / 256; //重装初值
TL1 = (65536 - 45872) % 256;
num2++;
if (num2 == 20)
{
num2 = 0;
num++;
//把数字送到数码管显示。数字满60归零
if (num == 60)
{
num = 0;
shi = num / 10; //十位数
ge = num % 10; //个位数
}
}
}
代码编写完成后,对着书反复排查了几遍,发现LED是在不停闪烁,但是数码管前两位始终显示00,并没有按照预设的进行倒计时走动。因此飞云怀疑书中的代码存在bug,或者是因为硬件升级,导致代码变动。暂时放在这里,留待以后解决。
1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 郭天祥51单片机开发教程学习(5)定时器中断
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 郭天祥51单片机开发教程学习(5)定时器中断