本实验目的是当数码管在流动的过程中,每过1s,8个发光二极管会逐个流动,用定时器去实现。
通过学习,我们知道想实现定时器,必须满足以下条件:
- cpu开总中断;
- 定时器中断开放;
- 定时器选择定时模式,即TMOD的选择;
- 对定时器计时控制,即选择R0还是R1;
- 对定时器寄存器赋初值,计算方法是THX = (65536 - 计时数)/256,TLX=(65536-计时数)%256;
下面是实验代码实现:
/*
*包含头文件,定义宏
*/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void init();//初始化函数
uchar num, count;
sbit wela = P2 ^ 7;
sbit dula = P2 ^ 6;
uchar code duantable[] = {
0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d
};
uchar code weitable[] = {
0xfe, 0xfd, 0xfb,
0xf7, 0xef, 0xdf
};
//延时函数
void delay(uint time)
{
uint x, y;
for (x = time; x > 0; x--)
for (y = 110; y > 0; y--);
}
void main()
{
init();
while (1) {
//每个数码管间隔100ms以123456显示
for (num = 0; num < 6; num++) {
wela = 1;
P0 = weitable[num];
wela = 0;
dula = 1;
P0 = duantable[num];
dula = 0;
delay(100);
}
}
}
void timer() interrupt 1
{
//重新赋初值,每次计时50ms就重新开始
TH0 = (65536 - 50000) / 256;
TH1 = (65536 - 50000) % 256;
count++;
//当为20次的时候,就是1s
if (count == 20) {
count = 0;
P1 = _crol_(P1, 1);
}
}
void init()
{
EA = 1;//开总中断
ET0 = 1;//开定时器中断0
TMOD = 0x01;//计数模式为16位计时器
TR0 = 1;//计数运行控制位
TH0 = (65536 - 50000) / 256;//给低8位装初始值
TH1 = (65536 - 50000) % 256;//给高八位装初始值
P1 = 0xfe;
}
以上代码在TX-1C板子正常运行,如有不对,敬请拍砖。
文章的脚注信息由WordPress的wp-posturl插件自动生成
微信扫一扫,打赏作者吧~![[整理]三极管驱动继电器](http://www.jyguagua.com/wp-content/themes/begin/timthumb.php?src=http://www.jyguagua.com/wp-content/uploads/2014/02/11.jpg&w=280&h=210&zc=1)


