51单片机C语言编程

2021-06-23 教育 268阅读
#include 
//设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();
}
}
声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com