51单片机C语言编程

控制过程1:第一步8灯整体一直闪(闪10下)。第二步整体灭5秒。第三步从右边逐个点亮并循环4遍。第4步循环完毕后全部熄灭;
控制过程2:第一步8灯整体闪3次。第二步从左边逐个点亮并循环2遍。第三步循环完毕后8灯一直流水;控制过程3:
第一步8灯整体保持全灭(灭的时间自己定,但必须要求能观察到灭这一现象)。第二步8灯从外到里依次点亮,重复两遍。第三步8灯从里到外依次点亮,重复两遍à循环完毕后8灯保持在4亮4灭的状态;
控制过程4:第一步整体保持全灭。第二步从左到右流水两遍。第三步从右到左逐个点亮三遍。第4步其中一盏灯保持闪。会追加分数

#include <AT89X51.H>
//设CPU是时钟12MHz的8051系列
data unsigned int ms;
sbit KEY=P2^3;
void SetupTimer0()
{
    TMOD &= 0XF0; //仅保留T1信息
    TMOD |= 0X02; //设置T0: 定时功能,方式2,自动重载8位定时器/计数器
    TH0 = 256-250;//定时每0.25ms中断一次
    TL0 = 256-250;
    TR0 = 1;      //开启定时器
    ET0 = 1;      //定时器0中断打开
}
 
void Timer0_ISR() interrupt 1 //中断服务程序
{
    static data unsigned char us250;
    if (++us250>=4) {++ms; us250=0;}
}
 

void process1()
{
unsigned char i,d;
unsigned int time,dlt;

//第一步8灯整体一直闪(闪10下)。
for (i=0; i<10; ++i)
{
P1=0; 
for (time=ms,dlt=0; dlt<500; dlt=ms-time);
      P1=0xFF;
for (time=ms,dlt=0; dlt<500; dlt=ms-time);
}

//第二步整体灭5秒。
P1=0xff;
for (time=ms,dlt=0; dlt<5000; dlt=ms-time);

//第三步从右边逐个点亮并循环4遍。
for (i=0; i<4; ++i)
for (d=1;d;d<<=1)
for (P1=~d,time=ms,dlt=0; dlt<500; dlt=ms-time);


//第4步循环完毕后全部熄灭;
P1=0xff;
}

void process2()
{
unsigned char i,d;
unsigned int time,dlt;

//第一步8灯整体闪3次。
for (i=0; i<3; ++i)
{
P1=0; 
for (time=ms,dlt=0; dlt<500; dlt=ms-time);
      P1=0xFF;
for (time=ms,dlt=0; dlt<500; dlt=ms-time);
}

//第二步从左边逐个点亮并循环2遍。
for (i=0; i<2; ++i)
for (d=0x80;d;d>>=1)
for (P1=~d,time=ms,dlt=0; dlt<500; dlt=ms-time);

//第三步循环完毕后8灯一直流水;
for (;KEY;)
for (d=1; d && KEY; d<<=1)
for (P1=d,time=ms,dlt=0; dlt<500 && KEY ; dlt=ms-time);
}

void process3()
{
unsigned char i,j,d;
unsigned int time,dlt;

//第一步8灯整体保持全灭, 灭的时间为500ms, 可以修改
P1=0XFF;
for (time=ms,dlt=0; dlt<500; dlt=ms-time);

//第二步8灯从外到里依次点亮,重复两遍。
for (i=0; i<2; ++i)
for (d=0x1,j=0x80;d<=0x8;d<<=1,j>>=1)
for (P1=~(d|j),time=ms,dlt=0; dlt<500; dlt=ms-time);

//第三步8灯从里到外依次点亮,重复两遍循环完毕后8灯保持在4亮4灭的状态
for (i=0; i<2; ++i)
for (d=0x8,j=0x10;d;d>>=1,j<<=1)
for (P1=~(d|j),time=ms,dlt=0; dlt<500 && KEY ; dlt=ms-time);
P1=0xc3;
for (;KEY;);

}


void process4()
{
unsigned char i,d;
unsigned int time,dlt;

//第一步整体保持全灭。灭的时间为1000ms, 可以修改
P1=0XFF;
for (time=ms,dlt=0; dlt<1000; dlt=ms-time);

//第二步从左到右流水两遍。
for (i=0; i<2; ++i)
for (d=1; d; d<<=1)
for (P1=d,time=ms,dlt=0; dlt<500; dlt=ms-time);

//第三步从右到左逐个点亮三遍。
for (i=0; i<3; ++i)
for (d=0x1;d;d<<=1)
for (P1=~d,time=ms,dlt=0; dlt<500; dlt=ms-time);

//第4步其中一盏灯保持闪
for (;KEY;)
{
for (d=0x8;KEY;d^=0x8)
for (P1=~d,time=ms,dlt=0; dlt<500 && KEY; dlt=ms-time);
}
}

void main()
{
 //   data unsigned char p0;
    ms=0;
    SetupTimer0();
    EA = 1;               //全局中断打开
while(1)
{
process1();
process2();
process3();
process4();
}
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-15
这个程序很简单,最重要的是用数组可以有效的解决你所要求的控制过程,先根据你所要求的控制过程写好数组(最好用二维数组),下面的编程过程很简单的。
第2个回答  2014-04-15
写一个数组,分别保存上面的值就行了
第3个回答  2014-04-15
是同一个程序,由p23控制吗?
相似回答