51单片机的程序(c语言版),用数码管进行倒计时。

51单片机的程序(c语言版),用数码管进行倒计时。,第1张

你是不是用2了锁存器啊。

P2=led_table[ten];

led_ten=1;//打开锁存器

led_ten=0;//关闭锁存期

存储10位

P2=led_table[single];

led_single=1;//打开锁存器

led_single=0;//关闭锁存器

存储个位

另外led_ten,led_single 你要先定义一下吧

//右边补0,直接移位就可以temp<,=1; 如果流水灯只有一个亮,下面的程序就是对的,移位之后补1

#include "reg51h"

void delay(unsigned char m);

main()

{

unsigned char temp;

temp=0xfe; //temp=1111 1110,使得P1口的某个引脚为低电平(亮)

while(1)

{

P1=temp; //P1口的数据来自temp,而temp的数据是不断变化的

temp=temp<<1 | 0x01;//temp向左移动一位,右边补0

if(temp==0xff)

temp=0xfe; //( 这里就是要填补的空!!!!!!!!!)

delay(20);

}

}

void delay(unsigned char m) //延时子程序

{

unsigned char i,j,k; //定义字符型变量,范围为0至255

for (i=0;i<m;i++)

{

for (j=0;j<100;j++)

{

for (k=0;k<100;k++);

}

}

#include <AT89X51H>

//设CPU是时钟12MHz的8051系列

data unsigned int ms;

sbit KEY=P2^3;

void SetupTimer0()

{

    TMOD &= 0XF0; //仅保留T1信息

    TMOD |= 0X02; //设置T0: 定时功能,方式2,自动重载8位定时器/计数器

    TH0 = 256-250;//定时每025ms中断一次

    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();

}

}

以上就是关于51单片机的程序(c语言版),用数码管进行倒计时。全部的内容,包括:51单片机的程序(c语言版),用数码管进行倒计时。、一个用C语言做51单片机做流水灯控制向左移动一位,右边补0的一段程序作业.求指教!、51单片机C语言编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9723113.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存