keil c51单片机 流水灯。

8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。 发光二极管:P2^0~P2^8 蜂鸣器:P1^5

第1个回答  2014-02-18
#include<reg51.h>

unsigned int n;
unsigned char m = 0, temp = 254;

sbit SPK = P1^5;

main()

{
TMOD = 0x01;
TH0 = (65536 - 1000) / 256;
TL0 = (65536 - 1000) % 256;
TR0 = 1;
ET0 = 1;
EA = 1;
P2 = temp;
while(1);
}

void T0_INT() interrupt 1
{
TH0 = (65536 - 1000) / 256;
TL0 = (65536 - 1000) % 256;
n++;
if(n >= 1000) {
n = 0;
m++;
if (m == 8) {m = 0; temp = 254;}
else {temp <<= 1; temp += 1;}
}
if(n < 500) {SPK = ~SPK; P2 = temp;}
else P2 = 255;
}

以上程序已经实验成功。
第2个回答  2014-02-18
#include<reg51.h>
#define uchar unsigned char
uchar LED,t=0;
sbit fmq=P1^5;
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t>=10)
{
t=0;
fmq=~fmq;
if(fmq)P2=0xff;
else {
P2=LED;
LED=(LED>>1)|0x01;
if(LED==0xff)LED=0xfe;}
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
LED=0x01;
while(1);
}
第3个回答  2014-02-17
你的蜂鸣器是交流的还是直流的?追问

直流

追答

这个很简单呀,一会给你写一个

追问

追答

/*********************************************************************************************************

** 主函数

*********************************************************************************************************/

void main()

{

    static uint8 LedIndex,step;                            //LedIndex用于指示哪一个LED亮,step用于led的亮灭状态

    Timer0Cnt_50ms = 0;                                    //计数器清0

    

    Timer0_Init();

    

    for(;;){

        if(Timer0Cnt_50ms >= 10) {

            Timer0Cnt_50ms = 0;                            //每500ms就对计数器清零,并执行动作

            

            if(step != 0) {

                BEEP_OFF();

                LED_ALL_OFF();

                step = 0;

                LedIndex++;

                if (LedIndex>=8)

                    LedIndex = 0;

            } else {

                step = 1;

                BEEP_ON();

                LED_ON(LedIndex);

            }

        }

    }

}



追问

看不懂

追答

下载整个程序仿真,自己慢慢看

相似回答