-
2008-05-09
51编程用定时器 中断和查询的延迟方法 - [IT]
昨天写的程序的那个延迟算法实在是太龌龊了,自己都看不下去了··
今天补上用定时器中断和查询的延迟方法。
这个是中断法
#include <AT89X51.H>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00}; //这个码字貌似有点问题,不过先不管这些细节了····
unsigned char second;
unsigned char tcount; TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //分别对高位和地位赋初值
TR0=1;
ET0=1;
EA=1;
tcount=0;
second=0;
P0=dispcode[second/10];
P2=dispcode[second%10];
while(1);
}
void t0(void) interrupt 1 using 0 //使用中断向量1,如果是用的计数器1就要用中断向量4
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
if(second==60)
{
second=0;
}
P0=dispcode[second/10];
P2=dispcode[second%10];
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}下面是用的查询的方法,个人感觉比中断的方法简单。
#include <AT89X51.H>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char second;
unsigned char tcount;
void main(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
tcount=0;
second=0;
P0=dispcode[second/10];
P2=dispcode[second%10];
while(1)
{
if(TF0==1)
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
if(second==60)
{
second=0;
}
P0=dispcode[second/10];
P2=dispcode[second%10];
}
TF0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
}
} -
2008-05-08
51单片机一个很简单的流水灯算法
下午玩我的51开发板,想到一个很简单的流水灯算法。。。
拿出来晒一下···
#include<AT89X52.h>
void delay20ms()
{
unsigned char ii,jj,kk;
for(ii=0;ii<20;ii++)
for(jj=0;jj<20;jj++)
for(kk=0;kk<248;kk++)
{;}
} //这个延时写的比较龌龊,大家不要学我就是了····主要是用定时器中断延迟我还没想//好怎样返回。就让芯片做点无用功吧···(其实定时器的原理也是在做无用功)
void main()
{
unsigned char temp,i,a,b;while(1)
{
temp=0xfe;
P0=temp;
for(i=0;i<8;i++)
{
a=temp>>i;
b=temp<<(8-i);
P0=a|b; //这就是我说的比较经典的地方。用看来位运算也是一个很//强大的东西呀···(可能是我比较菜,老鸟们别笑偶啊··)
delay20ms();
}
}
}







