单片机流水灯仿真实验程序和线路图

 

 name sy11

cseg at 0000h

    ljmp start

cseg at 4100h

start:mov a,#01h

loop:mov p1,a

        mov r1,#5

del1:mov r2,#200

del2:mov r3,#126

del3:djnz r3,del3

        djnz r2,del2

        djnz r1,del1

             rl a

        jmp loop

      sjmp start

        end

这是我写的一个温控程序   你参考下
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar tem;
sbit aa=P2^0;
sbit bb=P2^1;
sbit cc=P2^2;
sbit DQ=P3^7;
sbit jia=P3^0;
sbit jian=P3^2;
sbit ji=P2^3;
sbit deng=P2^5;
//////////////////////////////////////
char gong,gongshi,gongge;
uint num,num0;
/////////////////////////////////////
void delay(uint z)  //z=110为一毫秒
{
 while(z--);
}

void delay_50us(uint t)   //延时50us
{
 uchar j;
 for(;t>0;t--)
  for(j=19;j>0;j--);
}

//////////////////////////////////////////////////////////////////////////////////

void init18b20() //初始化18b20
{
 uchar t;
 DQ=1;
 delay(8);
 DQ=0;
 delay(80);
 DQ=1;
 delay(8);
 t=DQ;
 delay(6);
}

void wb18b20(uchar dat)  //向18b20写入1字节的数据
{
 uchar i;
 for(i=0;i<8;i++)
 {
  DQ=0;
  DQ=dat&0x01;
  delay(5);
  DQ=1;
  dat=dat>>1;
 }
 delay(5);
}

uchar rb18b20() //从18b20读1字节的数据
{
 uchar i, value;
 for(i=0;i<8;i++)
 {
  DQ=0;
  value>>=1;
  DQ=1;
  if(DQ)
  value=value|0x80;
  delay(4);
 }
 return value;
}

void rt18b20()  //从18b20度温度值
{
 uchar a,b,c;
 init18b20();
 wb18b20(0xcc);
 wb18b20(0x44);
 delay_50us(1);

init18b20();
 wb18b20(0xcc);
 wb18b20(0xbe);
 a=rb18b20();
 b=rb18b20();
 b<<=4;
 b+=(a&0xf0)>>4;
 c=b&0x80;
 if(c==0x00)
  {}
 else
 {
  b=~b;
 }

 tem=b;
}

void inittimer0()
{
 
 TMOD=0x01;
 EA=1;
 ET0=1;

 TH0=(65536-20500)/256;
 TL0=(65536-20500)%256;

 TR0=1;

}
//////////////////////////////////////////////////////////////////////////////////

void keyscan()
{
 if(jia==0)
 {
  delay(10);
  if(jia==0)
  {
    P0=table[10];
    gong++;
    if(gong==100)
    {
     gong=0;
    }

  };
  while(!jia);
  delay(10);
  while(!jia);
 }

 if(jian==0)
 {
  delay(10);
  if(jian==0)
  {
   P0=table[10];
   gong--;
   if(gong==-1)
   {
    gong=99;
   }

  };
  while(!jian);
  delay(10);
  while(!jian);
 }
}

void led()
{

 cc=0;bb=0;aa=0;P0=table[gong/10];delay(500);

 cc=0;bb=0;aa=1;P0=table[gong%10];delay(500);

 cc=0;bb=1;aa=0;P0=table[tem/10];delay(500);

 cc=0;bb=1;aa=1;P0=table[tem%10];delay(500);
       
}

void wenkong()
{
 if((tem>gong)|(tem==gong))
 {
  ji=1;
  deng=1;
 }
 else
 {
  ji=0;
  deng=0;
 }

}

void main()
{

 gong=30;
 ji=0;
 inittimer0();
 while(1)
 {
  wenkong();
  keyscan();
 }
}

void timer0() interrupt 1
{
   TH0=(65536-20500)/256;
 TL0=(65536-20500)%256;
 num++;
 led();
 if(num==10)
 {
   rt18b20();
  num=0;
 }

}

 

第二篇:单片机流水灯程序大全

1、用Proteus软件画出电路原理图。要求在P1.0至P1.7口 线上分别接LED0至LED7八个发光二极管,在P3.0口线上 接一蜂鸣器。

2、编写程序:要求LED0至LED7以秒速率循环右移。

3、编写程序:要求LED0至LED7以秒速率循环左移。

4、编写程序:要求在灯移动的同时,蜂鸣器逐位报警。

查询方式右移

ORG 0000H

CLRO: MOV IE, #00H;关闭中断

MOV TMOD, #10H;方式1

MOV SP, #30H; 开辟栈底

MOV TH1, #3CH;采用定时器1定时50ms

MOV TL1, #0B0H;

SETB TR1;开启定时器

MOV P1, #07FH;起始状态LED7亮

MOV A, #7FH;

MOV P3, #0FFH;

MAIN: MOV R3,#14H;20次

LCALL TIME; 定时一秒

CLR P3.0;

RR A;右移

MOV P1, A;灯右移

LJMP MAIN;

定时一秒的子程序

TIME: JBC TF1, LOOP2;溢出标志位为1跳转

AJMP TIME;

LOOP2: MOV TH1, #3CH;

MOV TL1, #0B0H;

DJNZ R3, TIME;R3先自减再,判断R3是否为0,为0跳转 RET;返回主程序

END

中断方式左移低电平有效

START: LJMP MAIN

ORG 000BH

LJMP TTCO

ORG 0100H

MAIN: MOV SP, #30H; 开辟栈底

SETB EA; 打开总中断

SETB ET0; 打开定时器中断

MOV R1, #00H;

MOV R2, #14H;

MOV A, #0FEH; 给A送值 MOV P1, A;初始状态LED0亮

LOOP: LCALL TIME;调用一秒的延时子程序

RL A;左移

MOV P1, A;灯左移

CLR P3.0;开启蜂鸣器

LJMP LOOP;

定时为1S,

TIME: MOV TMOD, #01H; 设置定时器为工作方式1 MOV TH0, #3CH;

MOV TL0, #0B0H;

SETB TR0;

LOOP2: CJNE R1, #14H,

MOV R1, #00H;

RET

ORG 2000H

中断程序

TTCO: MOV TH0, #3CH

MOV TL0, #0B0H;

INC R1

LOOP1: RETI

END

双向流水灯循环

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP TTC0

MAIN: MOV R0, #08H

MOV R1, #00H

MOV A, #0FEH

SETB EA

SETB ET0;

LOOP1: LCALL TIME

MOV P1, A

RL A

CPL P3.0;

DJNZ R0, LOOP1

MOV R0,#08H;

LOOP2: LCALL TIME

RR A ;

MOV P1,A;

CPL P3.0

DJNZ R0, LOOP2;

MOV R0,#08H; 初始化定时时间50us LOOP2; 出现R1=14H才往下执行,再次初始化定时时间

LJMP LOOP1;

TIME: MOV TMOD, #01H

MOV TH0, #3CH

MOV TL0, #0B0H

SETB TR0;

HERE: CJNE R1, #14H, HERE

MOV R1, #00H

RET

ORG 2000H

TTC0: INC R1;

MOV TH0, #3CH

MOV TL0, #0B0H

RETI

END

十六进制数,12MHZ,

ORG 0000H

CLRO: MOV IE, #00H;

MOV TMOD, #10H;方式1

MOV TH1, #3CH;定时器1定时50ms MOV TL1, #0B0H;

SETB TR1;开始定时器

MOV R3, #00H;

MOV P1, #0FFH;led初始全灭 MOV A, #00H;

MOV P3, #0FFH;

MOV SP, #30H;开辟堆栈 MAIN: LCALL TIME;

MOV R3, #00H;

ADDC A, #01H;高电平有效 MOV R2, A;保护A,

CPL A;对A取反

MOV P1, A;把A赋格P1 MOV A, R2;取出以前的A CLR P3.0;开启蜂鸣器

CJNE A, #0FFH, MAIN; MOV A, #00H;清零重新开始 LJMP MAIN;

延时1ms子程序

TIME: JBC TF1, LOOP2;溢出标志位 AJMP TIME;

LOOP2: INC R3;

MOV TH1, #3CH;

MOV TL1, #0B0H;

CJNE R3, #14H, TIME;执行20次

RET

END

LED0表示第七位--LED7表示第0位

ORG 0000H ; 十六进制计数规律翻转亮灯(由原来 子程序——查询 改写)

MAIN: MOV

CLR

MOV

MOV

LOOP1: LCALL

MOV

INC

MOV

JB

NEXT1: JB

NEXT2: JB

NEXT3: JB

NEXT4: JB

NEXT5: JB

NEXT6: JB

NEXT7: JB

LJMP

FZ1: SETB

LJMP

FZ2: SETB

LJMP

FZ3: SETB

LJMP

FZ4: SETB

LJMP

FZ5: SETB

LJMP

FZ6: SETB

LJMP

FZ7: SETB

LJMP

FZ8: SETB

OUT: MOV A, #01H EA R0, #14H;定20次 P1, #80H DELAY R0, #14H A 20H, A; 将A的值存入20H位寻址区 20H.0, FZ1; 判断20H.0是否为1 20H.1, FZ2; 。。。 20H.2, FZ3; 。。。 20H.3, FZ4; 。。。 20H.4, FZ5; 。。。 20H.5, FZ6; 。。。 20H.6, FZ7; 。。。 20H.7, FZ8; 。。。 OUT 0FH; 如果20H.0为1则将21H.7(0FH)置1 NEXT1; 跳转到上面继续判断下一位 0EH; 。。。 NEXT2; 。。。 0DH; NEXT3; 0CH; NEXT4; 0BH; NEXT5; 0AH; NEXT6; 09H; NEXT7; 08H; P1, 21H; 将翻过来的数输入到P1口

MOV 21H, #00H; 清零为重新输入新的值做准备 LJMP LOOP1

DELAY: MOV TMOD, #01H ;方式1

MOV TH0, #03CH; 定时50MS

MOV TL0, #0B0H

MOV IE, #00H

SETB TR0

LOOP2: JBC TF0, LOOP3

LJMP

LOOP3: DJNZ

RET

END LOOP2 R0, DELAY;R0自减判断循环

相关推荐