#include<reg52.h> #include<intrins.h> #define uchar unsigned char uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; int i=5000; char dir=0; char count=1; char count1=0; void main() { TMOD=0x20; TL1=56; TH1=56; P1=0xfe; EA=1; ET1=1; TR1=1; while(1) { P0=tab[count1]; }; } void timer1() interrupt 3 { i--; if(i==2500) { P1=0xff; } if(i==0&&dir==0) { P1=_crol_(0xfe,count); count++; i=5000; if(count==8) { dir=1; count=1; count1++; } } if(i==0&&dir==1) { P1=_cror_(0x7f,count); count++; i=5000; if(count==8) { dir=0; count=1; count1++; } } if(count1==16) { count1=0; } }解释一下这个程序
时间: 2023-08-15 11:06:49 浏览: 120
这是一个使用STC89C52单片机控制8位LED流水灯和一个4位数码管的程序。
程序中使用了定时器1来控制LED流水灯的移动,使用了定时器1的中断来触发流水灯的移动和数码管的显示。程序中使用了一个数组tab来存储数码管的显示数据,其中每一个元素代表一个数字的显示数据。程序中使用了_crol_和_cror_两个函数来实现LED流水灯的循环移位,这两个函数是编译器提供的循环移位函数。
程序的主要流程是在定时器1的中断函数中实现的。在定时器1中断函数中,首先减小计时器i的值。当i减小到2500时,将P1口的值设置为0xff,使所有LED灯熄灭。当i减小到0时,根据dir的值(0表示向左移动,1表示向右移动)决定移动方向。向左移动时,将P1口的值左移count位,并将最低位设置为0,表示移动一位。向右移动时,将P1口的值右移count位,并将最高位设置为0,表示移动一位。当count等于8时,表示已经移动了8位,需要改变移动方向和位移量。当count1等于16时,表示已经移动了16位,需要重新从第一个数字开始循环显示。
在主函数中,将P0口的值设置为tab[count1],以显示当前计数器的值。同时,while循环保持程序不退出,以保证定时器1中断函数可以正常运行。
需要注意的是,这个程序中使用了定时器1,因此需要在程序中设置定时器1的相关寄存器,还需要在程序中开启定时器1的中断。同时,需要在程序中设置中断向量,以便程序可以正确地跳转到中断函数中。
此外,程序中使用了编译器提供的_crol_和_cror_函数,如果您使用的编译器不支持这两个函数,需要修改程序中涉及到这两个函数的部分。
阅读全文