本实验目的是当数码管在流动的过程中,每过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插件自动生成