单片机 8个按键分别控制对应的8个led的亮灭 程序设计

单片机 8个按键分别控制对应的8个led的亮灭 程序设计,第1张

八个灯接在单片机的P1口(P0,P2,P3,P4都一样)

while(1)

{

delay(你想要延时的时间);

P1=0xff;

delay(你想要延时的时间);

P1=0;

}

注意led最好加驱动,不然单片机会坏的。

假设:1开关接在p10口上

2led灯在p2口上,=0亮

ORG 0H

mov p1,#0ffh ;输入初始化

stat:

jb p10,jt ;p10=1转交替显示

mov a,#0feh ;00000001>A

loop:

acall yss ;显示及延时

rl a ;左移

cjne a,#1,loop ;不等于1继续

ajmp stat ;一圈结束查键值

jt:

mov a,#0aah ;01010101>A

acall yss ;显示及延时

cpl a ;取反 10101010

acall yss ;显示及延时

ajmp stat ;查键值

yss:

mov p2,a ;送显示

ys: ;延时

djnz r6,ys ;r6-1不等于0转ys

djnz r7,ys ;r7-1不等于0转ys

ret

END

方法:

1:设定一个变量i,可以从0到3循环的变化

2:检测一个经过消抖处理的按键,按一下,i+1

3:当i值为各个值时,执行相应的花样。

流水灯参考程序

#include

#include

#define uchar unsigned char

uchar j,temp;

void delay(unsigned int ms)

{

uchar t;

while(ms--)

for(t=0;t<123;t++);

}

void main()

{

P1=0xff;

delay(500);

temp=0xfe; //有点怪,led接在P23~P26

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

{

P1=temp;

delay(500);

temp=_crol_(temp,1);

}

P1=0xff;

while(1);

}

这个程序你可以用来试试。我以前做的。

//温控系统控制程序

//温度传感器:DS18B20

//显示方式:LED

#include <reg51h>

#define uchar unsigned char

sbit keyup=P1^0;

sbit keydn=P1^1;

sbit keymd=P1^2;

sbit out=P3^7; //接控制继电器

sbit DQ = P3^4; //接温度传感器18B20

uchar t[2],number=0,pt; //温度值

uchar  TempBuffer1[4]={0,0,0,0};

uchar Tmax=18,Tmin=8;

uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xf7};

uchar dismod=0,xiaodou1=0,xiaodou2=0,currtemp;

bit flag;

void t0isr() interrupt 1

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

switch(number)

{

case 0:

    P2=0x08;

      P0=distab[TempBuffer1[0]];

      break;

case 1:

    P2=0x04;

      P0=distab[TempBuffer1[1]];

      break;

case 2:

    P2=0x02;

      P0=distab[TempBuffer1[2]]&0x7f;

      break;

case 3:

    P2=0x01;

      P0=distab[TempBuffer1[3]];

      break;

default:

    break;

}

number++;

if(number>3)number=0;

}

void delay_18B20(unsigned int i)

{

while(i--);

}

/ds18b20初始化函数/

void Init_DS18B20(void) 

{

 bit x=0;

do{

 DQ=1;

 delay_18B20(8);

 DQ = 0;          //单片机将DQ拉低

 delay_18B20(90); //精确延时 大于 480us

 DQ = 1;          //拉高总线

 delay_18B20(14);

 x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败,继续初始化

}while(x);

 delay_18B20(20);

}

/ds18b20读一个字节/  

unsigned char ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

 {

  DQ = 0; // 给脉冲信号

  dat>>=1;

  DQ = 1; // 给脉冲信号

  if(DQ)

  dat|=0x80;

  delay_18B20(4);

 }

  return(dat);

}

/ds18b20写一个字节/  

void WriteOneChar(unsigned char dat)

{

  unsigned char i=0;

  for (i=8; i>0; i--)

  {

   DQ = 0;

  DQ = dat&0x01;

    delay_18B20(5);

  DQ = 1;

    dat>>=1;

}

}

/读取ds18b20当前温度/

unsigned char ReadTemperature(unsigned char rs)

{

unsigned char tt[2];

  delay_18B20(80);  

Init_DS18B20();

WriteOneChar(0xCC);   //跳过读序号列号的 *** 作

WriteOneChar(0x44);  //启动温度转换

  delay_18B20(80);  

Init_DS18B20();

WriteOneChar(0xCC);  //跳过读序号列号的 *** 作

WriteOneChar(0xBE);  //读取温度寄存器等(共可读9个寄存器)前两个就是温度

tt[0]=ReadOneChar();  //读取温度值低位

tt[1]=ReadOneChar();  //读取温度值高位

return(tt);

}

void covert1(void) //将温度转换为LED显示的数据

{

   uchar x=0x00,y=0x00;

   t[0]=pt;

   pt++;

   t[1]=pt;

   if(t[1]&0x080)      //判断正负温度

   {

    TempBuffer1[0]=0x0c;      //c代表负

t[1]=~t[1];  /下面几句把负数的补码/

t[0]=~t[0];   /换算成绝对值/

x=t[0]+1;

t[0]=x;

if(x==0x00)t[1]++;

   }

  else TempBuffer1[0]=0; //A代表正

  t[1]<<=4; //将高字节左移4位

  t[1]=t[1]&0xf0;

  x=t[0]; //将t[0]暂存到X,因为取小数部分还要用到它

  x>>=4; //右移4位

  x=x&0x0f; //和前面两句就是取出t[0]的高四位

  y=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节

  TempBuffer1[1]=(y%100)/10;

  TempBuffer1[2]=(y%100)%10;

  t[0]=t[0]&0x0f; //小数部分

  TempBuffer1[3]=t[0]10/16;

 //以下程序段消去随机误检查造成的误判,只有连续12次检测到温度超出限制才切换加热装置

if(currtemp>Tmin)xiaodou1=0;

if(y<Tmin)

{

xiaodou1++;

currtemp=y;

xiaodou2=0;

}

if(xiaodou1>12)

{

out=0;

flag=1;

xiaodou1=0;

}

if(currtemp<Tmax)xiaodou2=0;

if(y>Tmax)

{

xiaodou2++;

currtemp=y;

xiaodou1=0;

}

if(xiaodou2>12)

{

out=1;

flag=0;

xiaodou2=0;

}

out=flag;

}

void convert(char tmp)

{

uchar a;

if(tmp<0)

{

TempBuffer1[0]=0x0c;

a=~tmp+1;

}

else 

{

TempBuffer1[0]=0;

a=tmp;

}

TempBuffer1[1]=(a%100)/10;

TempBuffer1[2]=(a%100)%10;

}

void keyscan( )

{

uchar keyin;

keyin=P1&0x07;

if(keyin==0x07)return;

else if(keymd==0)

{

dismod++;

dismod%=3;

while(keymd==0);

switch(dismod)

{

case 1:

    convert(Tmax);

      TempBuffer1[3]=0x11;

      break;

case 2:

    convert(Tmin);

      TempBuffer1[3]=0x12;

      break;

default:

    break;

}

}

else if((keyup==0)&&(dismod==1))

{

Tmax++;

convert(Tmax);

while(keyup==0);

}

else if((keydn==0)&&(dismod==1))

{

Tmax--;

convert(Tmax);

while(keydn==0);

}

else if((keyup==0)&&(dismod==2))

{

Tmin++;

convert(Tmin);

while(keyup==0);

}

else if((keydn==0)&&(dismod==2))

{

Tmin--;

convert(Tmin);

while(keydn==0);

}

xiaodou1=0;

xiaodou2=0;

}

main()

{

TMOD=0x01;

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TR0=1;

ET0=1;

EA=1;

out=1;

flag=0;

ReadTemperature(0x3f);

  delay_18B20(50000); //延时等待18B20数据稳定  

 while(1)

{

pt=ReadTemperature(0x7f); //读取温度,温度值存放在一个两个字节的数组中

if(dismod==0)covert1();

keyscan();

delay_18B20(30000);

}

}

以上就是关于单片机 8个按键分别控制对应的8个led的亮灭 程序设计全部的内容,包括:单片机 8个按键分别控制对应的8个led的亮灭 程序设计、单片机程序设计(要求是汇编语言),按键控制流水灯的花色高分求解、利用单片机控制8个发光二极管,设计8个灯同时闪烁的控制程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存