您的位置:首页 > 其它

中断定时器与流水灯

2016-04-02 14:33 337 查看
此程序为设置Led流水灯与数码管第0一位的0-16数字循环亮。不能将数码管程序放进主函数里,因为延迟函数delay,可能会在add自加到40时刚好在dalay里面,这时不会有数码管的闪烁。

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit wela=P2^7;          //位选
sbit dula=P2^6;          //段选
int num,add,temp=0xfe;
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uchar n);
void main()
{

TMOD=0x01;     //工作方式
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;

EA=1;           //总中断打开
ET0=1;          //定时器中断打开
TR0=1;          //定时器打开

wela=1;
P0=0xfe;
wela=0;
dula=1;
P0=table[0];
dula=0;         //数码管初始化

P1=temp;        //Led灯初始化

while(1)
{

delay(100);
delay(500);
temp=_crol_(temp,1);
P1=temp;
}

}

void add_1() interrupt 1       //计时器中断函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
add++;
if(add==40)
{
num++;
add=0;
dula=1;
P0=table[num];
if(num==16)
num=-1;
}
}
//流水灯延迟函数
void delay(uchar n)
{
int i=0, j=0;
for(i=0; i<n; i++)
for(j=0; j<125; j++)
;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单片机