2019-07-21 17:59:54 mazhibing666 阅读数 2617
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18872 人正在学习 去看看 朱有鹏

花了一个星期制作的交通灯仿真程序+原理图,通过数码管显示路口的时间,通过led显示红绿灯。@[TOC]在这里插入图片描述
#include<reg51.H> // 对单片机的口进行了定义

#define uint unsigned int

#define uchar unsigned char

uchar code a[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//段码组合,共阳极

uchar code b[4]={0x01,0x02,0x04,0x08}; //位码组合

uchar code c[4]={0xcc,0xd4,0x78,0xb8};/P1 绿红、黄红、红绿、红黄/

//12MHz

//*************************************************************************************

uchar NB=25,DX=30,NBG=25,DXG=15,H=5; /数码管显示值设置/

uchar i,k=0,cnt=0,j=0;

sbit K0=P3^4; /支干道通行/

sbit K1=P3^5; /主干道通行/

sbit K4=P3^6; /返回/

sbit K3=P3^2; /设置时间/

sbit K2=P3^3; /紧急刹车/

void delay(uchar t); /定义延时程序/

void key(); /定义键盘程序/

void display(); /定义显示程序/

void settime(); /定义时间设置显示程序/

//程序初始********************

void init(void)

{

TMOD=0x01; /使用定时器0模式一/

TH0=0x3c; /(65536-5000)/256/

TL0=0xb0; /(65536-5000)%256/

IT0=1; //开中断

ET0=1;

TR0=1;

EA=1;

EX0=1;

EX1=1;

P1=c[k]; //开启交通灯

}

//中断0处理程序**************

void int0(void) interrupt 0 // 通行时间设置

{

EA=0;

P1=0xd8; /红灯全亮/

for(;?

{

settime();

 if(K1==0)       /*P3^6=0设置主干道通行时间*/

{  

      delay(40);

      if(K1==0)

{

         while(!K1)

         {settime();}

 DXG++;    /*主干道通行时间加1*/

         if(DXG==100)

         DXG=0;   

      }

}



 if(K0==0)        /*P3^5=0设置支干道通行时间*/

{  

         delay(40);

         if(K0==0)

   {

           while(!K0)

           {settime();}

  NBG++;      /*支干道通行时间加1*/

           if(NBG==100)

           NBG=0;  

         }

}



if(K4==0)          /*P3^7=0返回*/ 

   {  

     delay(40); 

  if(K4==0)

  {

     while(!K4)

  {

  }

         k=0;P1=c[k];

  NB=NBG,DX=NBG+H; 

     display(); 

  EA=1;



        break;

  }                

   }

}

}

//***************中断1处理程序

void int1(void) interrupt 2 //紧急情况

{

    /*东西南北红灯亮*/

EA=0;

TR0=!TR0; /停止计数/

for(;? /主支干道显示全为0/

{

P1=0xd8,

P0=a[0];

P2=b[0];

delay(20);



 P2=b[1];

delay(20);

P2=b[2];

delay(20);

P2=b[3];

delay(20);



if(K4==0)         /*返回*/

{

delay(20);

EA=1;

P1=c[k]; /返回紧急前状态开始计数/

TR0=!TR0; /重启计数/

break;

}

}

}

void time1(void) interrupt 1 /交通灯控制程序/

{

TH0=0x3c; /定时50ms/

TL0=0xb0;

cnt++;

if(cnt>=20) /每2050ms=1s自减一*/

{

NB–;

DX–;

cnt=0;

if(NB0||DX0)

{

k++;

if(k>3) /k取0,1,2,3/

k=0;

switch(k)

{

case 0:NB=NBG,DX=NBG+H;j=0;P1=c[k];break;   /*主干道通行显示绿红*/

   case 1:NB=H;j=1;P1=c[k];break;        /*主干道黄灯闪烁*/

case 2:NB=DXG+H,DX=DXG;j=0;P1=c[k];break;   /*支干道通行显示红绿*/

case 3:DX=H;j=2;P1=c[k];break;        /*支干道黄灯闪烁*/

}

}

}

}

void delay(uchar t) //延时程序延时0.1*nms

{

uchar i;

do

{

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

 ;;; 

} while(t–);

}

void settime()

{

P2=b[0],P0=a[(NBG+H)%10]; /*显示主干道通行时间  */

   delay(20); 



P2=b[1],P0=a[(NBG+H)/10]; 

delay(20); 



P2=b[2],P0=a[(DXG+H)%10];  /*显示支干道通行时间*/

delay(20); 

       

   P2=b[3],P0=a[(DXG+H)/10]; 

delay(20); 

}

void key() //键盘程序用KO K1模拟一道有车一道无车

{

 if(K1==0)        /*主干道有车支干道无车*/

{  

   delay(40);

   if(K1==0)    

   { 

      while(!K1)

      {  

        display();

      }

  k=0,P1=c[k];cnt=0;

      NB=NBG, DX=NBG+H;

     display();

   }

}

if(K0==0)         /*支干道有车主干道无车*/

{  

   delay(40);

   if(K0==0)

   {

      while(!K0)

      {

       display(); 

      }

     k=2,P1=c[k];cnt=0;

      NB=DXG+H,DX=DXG;

        display(); 

}

}

}

void display() //显示程序

{

P2=b[0],P0=a[NB%10]; /由k的不同值进入确定显示数值/

delay(20);

P2=b[1],P0=a[NB/10];

delay(20);

P2=b[2],P0=a[DX%10];

delay(20);

P2=b[3],P0=a[DX/10];

delay(20);

}

void main(void)

{ //主程序

init();

for(;?

{

display();

key();

//黄灯闪烁程序

while(j==1) /主干道黄灯闪烁/

   {              

   P1=0xdc;         /*给黄灯一高电平黄灯灭*/    

for(i=83;i>0;i--){display();}      /*执行for循环延时*/   

P1=c[k];         /*再给黄灯一低电平黄灯亮*/

for(i=83;i>0;i--){display();}

}

while(j==2)

     {              /*支干道黄灯闪烁*/

  

P1=0xf8;

for(i=83;i>0;i--){display();}

P1=c[k];

for(i=83;i>0;i--){display();}

}

}

}

2016-09-17 22:39:54 qq_31108501 阅读数 5391
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18872 人正在学习 去看看 朱有鹏

利用51单片机的控制二极管及数码管的显示来模拟交通灯,系统晶振为11.0592MHZ,东西方向红灯设置为30秒,南北方向红灯设置为20 秒,P1.3接一个应急按钮,按下第一次放开,南北方向绿灯一直亮,东西方向红灯一直亮(目的是为了方便大领导通行),按下放开第二次,南北绿灯闪3秒黄灯亮2秒后变红灯,东西方向变为绿灯,之后沿着之前的设置一直循环,下面是仿真图、程序源代码

仿真图

程序源代码如下:
作者:胡琴
联系qq:1257394091
网站:http://www.51hei.com 

本程序已经通过软件仿真以及在自己搭建的硬件上测试通过.
org 0000h
ajmp main
org 000bh
ajmp inti0
org 0030h
main:mov tmod,#01h
     mov ie,#82h
  mov th0,#4ch 
  mov tl0,#00h
  mov sp,#60h
  mov 31h,#30  ;东西绿灯初值30秒
  mov 32h,#30  ;南北红灯初值30秒
  clr 4fh  ;清标志位
  clr p1.1 ;开东西绿灯
  clr p1.5 ;开南北红灯
  setb tr0 ;启动T0
loop:lcall display  ;调用显示子程序
     lcall key   ;调用应急按键判断
     ajmp loop
inti0:push psw
      clr ea
   mov th0,#4ch
   mov tl0,#00h
   inc 35h
   mov a,35h
   cjne a,#20,out  ;判1秒是否到时
   mov 35h,#00
   jb 4fh,yi   ;判别标志位
   dec 31h ;东西时间每秒减1
   dec 32h ;南北时间每秒减1
   mov a,31h
   cjne a,#05,out ;判是否到25秒
   setb p2.0  ;到25秒关时间显示
   setb p2.1 
   setb p1.1   ;东西绿灯闪灭3秒
  lcall del500ms 
  clr p1.1
  lcall del500ms
  setb p1.1
  lcall del500ms
  clr p1.1
  lcall del500ms
  setb p1.1
     lcall del500ms
  clr p1.1
  lcall del500ms
  setb p1.1   ;灭东西绿灯
  sjmp er
out:setb ea
    pop psw
 reti 
  er:clr p1.2  ;东西黄灯亮2秒
  mov 33h,#4   ;延时2秒
loop1:lcall del500ms
      djnz 33h,loop1
   setb p1.2   ;2秒后灭东西黄灯
   clr p2.0  ;5秒后开时间显示
   clr p2.1
   mov 31h,#20   ;东西时间赋20秒初值
      mov 32h,#20 ;南北时间赋20秒初值
   setb 4fh
   setb p1.5  ;关南北红灯
   clr p1.0  ;点亮东西红灯
      clr p1.6  ;点亮南北绿灯
   sjmp out
   yi:dec 31h ;东西时间每秒减1
   dec 32h ;南北时间每秒减1
   mov a,31h
   cjne a,#5,out  ;判是否到15秒
   setb p2.6    ;到15秒关时间显示
   setb p2.7    ;
   setb p1.6  ;南北绿灯闪灭3秒
  lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6
  lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6
     lcall del500ms
  clr p1.6
  lcall del500ms
   setb p1.6    ;关南北绿灯
   clr p1.7   ;南北黄灯亮2秒
  mov 34h,#4   ;延时2秒
loop2:lcall del500ms
      djnz 34h,loop2
   setb p1.7   ;2秒后灭南北黄灯
   clr p2.6 ;5秒后开时间显示
   clr p2.7 ;
   mov 31h,#30 ;东西时间重赋30秒初值
   mov 32h,#30 ;南北时间重赋30秒初值
   clr p1.1    ;点亮东西绿灯
   clr p1.5    ;点亮南北红灯
   setb p1.0    ;关东西红灯
   clr 4fh
   sjmp out
display:mov a,31h  ;东西方向时间显示
        mov b,#10
  div ab
  mov 20h,a
  mov 21h,b
  disp1:mov a,20h
        mov dptr,#table
  movc a,@a+dptr
  mov p0,a
  clr p2.0
  lcall del1ms
  setb p2.0
  disp2:mov a,21h
        mov dptr,#table
  movc a,@a+dptr
  mov p0,a
  clr p2.1
  lcall del1ms
  setb p2.1
  disp3:mov a,32h   ;南北方向时间显示
  mov b,#10
  div ab
  mov 22h,a
  mov 23h,b
  disp4:mov a,22h
        mov dptr,#table
  movc a,@a+dptr
  mov p3,a
  clr p2.6
  lcall del1ms
  setb p2.6
  disp5:mov a,23h
        mov dptr,#table
  movc a,@a+dptr
  mov p3,a
  clr p2.7
  lcall del1ms
  setb p2.7
  ret
table:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h   ;0-9数字 
del1ms:mov r7,#10   ;1ms延时子程序
d1:mov r6,#50
   djnz r6,$
   djnz r7,d1
   ret
del500ms:mov r5,#5  ;500ms延时子程序
del3:mov r4,#200
del4:mov r3,#250
     djnz r3,$
  djnz r4,del4
  djnz r5,del3
  ret
key:jb p1.3,keyout
    jnb p1.3,$
 clr ea
 inc 36h
 mov a,36h
 cjne a,#2,key4
 mov 36h,#00
   setb p1.6   ;东西绿灯闪灭3秒
  lcall del500ms 
  clr p1.6
  lcall del500ms
  setb p1.6
  lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6
     lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6   ;灭东西绿灯
  clr p1.7  ;东西黄灯亮2秒
  mov 33h,#4   ;延时2秒
loop3:lcall del500ms
      djnz 33h,loop3
   setb p1.7   ;2秒后灭东西黄灯
   setb p1.0   ;关东西红灯
   setb p1.6  ;关南北绿灯
   clr p1.1  ;开西绿灯
   clr p1.5  ;开南北红灯
   setb ea
   sjmp keyout
key4:clr p1.6 ;;开南北绿灯
     clr p1.0   ;开东西红灯
  setb p1.1
  setb p1.2
  setb p1.3
  setb p1.4
  setb p1.5
  setb p1.7
 keyout:ret
end

利用51单片机的控制二极管及数码管的显示来模拟交通灯,系统晶振为11.0592MHZ,东西方向红灯设置为30秒,南北方向红灯设置为20 秒,P1.3接一个应急按钮,按下第一次放开,南北方向绿灯一直亮,东西方向红灯一直亮(目的是为了方便大领导通行),按下放开第二次,南北绿灯闪3秒黄灯亮2秒后变红灯,东西方向变为绿灯,之后沿着之前的设置一直循环,下面是仿真图、程序源代码

仿真图

程序源代码如下:
作者:胡琴
联系qq:1257394091
网站:http://www.51hei.com 

本程序已经通过软件仿真以及在自己搭建的硬件上测试通过.
org 0000h
ajmp main
org 000bh
ajmp inti0
org 0030h
main:mov tmod,#01h
     mov ie,#82h
  mov th0,#4ch 
  mov tl0,#00h
  mov sp,#60h
  mov 31h,#30  ;东西绿灯初值30秒
  mov 32h,#30  ;南北红灯初值30秒
  clr 4fh  ;清标志位
  clr p1.1 ;开东西绿灯
  clr p1.5 ;开南北红灯
  setb tr0 ;启动T0
loop:lcall display  ;调用显示子程序
     lcall key   ;调用应急按键判断
     ajmp loop
inti0:push psw
      clr ea
   mov th0,#4ch
   mov tl0,#00h
   inc 35h
   mov a,35h
   cjne a,#20,out  ;判1秒是否到时
   mov 35h,#00
   jb 4fh,yi   ;判别标志位
   dec 31h ;东西时间每秒减1
   dec 32h ;南北时间每秒减1
   mov a,31h
   cjne a,#05,out ;判是否到25秒
   setb p2.0  ;到25秒关时间显示
   setb p2.1 
   setb p1.1   ;东西绿灯闪灭3秒
  lcall del500ms 
  clr p1.1
  lcall del500ms
  setb p1.1
  lcall del500ms
  clr p1.1
  lcall del500ms
  setb p1.1
     lcall del500ms
  clr p1.1
  lcall del500ms
  setb p1.1   ;灭东西绿灯
  sjmp er
out:setb ea
    pop psw
 reti 
  er:clr p1.2  ;东西黄灯亮2秒
  mov 33h,#4   ;延时2秒
loop1:lcall del500ms
      djnz 33h,loop1
   setb p1.2   ;2秒后灭东西黄灯
   clr p2.0  ;5秒后开时间显示
   clr p2.1
   mov 31h,#20   ;东西时间赋20秒初值
      mov 32h,#20 ;南北时间赋20秒初值
   setb 4fh
   setb p1.5  ;关南北红灯
   clr p1.0  ;点亮东西红灯
      clr p1.6  ;点亮南北绿灯
   sjmp out
   yi:dec 31h ;东西时间每秒减1
   dec 32h ;南北时间每秒减1
   mov a,31h
   cjne a,#5,out  ;判是否到15秒
   setb p2.6    ;到15秒关时间显示
   setb p2.7    ;
   setb p1.6  ;南北绿灯闪灭3秒
  lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6
  lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6
     lcall del500ms
  clr p1.6
  lcall del500ms
   setb p1.6    ;关南北绿灯
   clr p1.7   ;南北黄灯亮2秒
  mov 34h,#4   ;延时2秒
loop2:lcall del500ms
      djnz 34h,loop2
   setb p1.7   ;2秒后灭南北黄灯
   clr p2.6 ;5秒后开时间显示
   clr p2.7 ;
   mov 31h,#30 ;东西时间重赋30秒初值
   mov 32h,#30 ;南北时间重赋30秒初值
   clr p1.1    ;点亮东西绿灯
   clr p1.5    ;点亮南北红灯
   setb p1.0    ;关东西红灯
   clr 4fh
   sjmp out
display:mov a,31h  ;东西方向时间显示
        mov b,#10
  div ab
  mov 20h,a
  mov 21h,b
  disp1:mov a,20h
        mov dptr,#table
  movc a,@a+dptr
  mov p0,a
  clr p2.0
  lcall del1ms
  setb p2.0
  disp2:mov a,21h
        mov dptr,#table
  movc a,@a+dptr
  mov p0,a
  clr p2.1
  lcall del1ms
  setb p2.1
  disp3:mov a,32h   ;南北方向时间显示
  mov b,#10
  div ab
  mov 22h,a
  mov 23h,b
  disp4:mov a,22h
        mov dptr,#table
  movc a,@a+dptr
  mov p3,a
  clr p2.6
  lcall del1ms
  setb p2.6
  disp5:mov a,23h
        mov dptr,#table
  movc a,@a+dptr
  mov p3,a
  clr p2.7
  lcall del1ms
  setb p2.7
  ret
table:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h   ;0-9数字 
del1ms:mov r7,#10   ;1ms延时子程序
d1:mov r6,#50
   djnz r6,$
   djnz r7,d1
   ret
del500ms:mov r5,#5  ;500ms延时子程序
del3:mov r4,#200
del4:mov r3,#250
     djnz r3,$
  djnz r4,del4
  djnz r5,del3
  ret
key:jb p1.3,keyout
    jnb p1.3,$
 clr ea
 inc 36h
 mov a,36h
 cjne a,#2,key4
 mov 36h,#00
   setb p1.6   ;东西绿灯闪灭3秒
  lcall del500ms 
  clr p1.6
  lcall del500ms
  setb p1.6
  lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6
     lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6   ;灭东西绿灯
  clr p1.7  ;东西黄灯亮2秒
  mov 33h,#4   ;延时2秒
loop3:lcall del500ms
      djnz 33h,loop3
   setb p1.7   ;2秒后灭东西黄灯
   setb p1.0   ;关东西红灯
   setb p1.6  ;关南北绿灯
   clr p1.1  ;开西绿灯
   clr p1.5  ;开南北红灯
   setb ea
   sjmp keyout
key4:clr p1.6 ;;开南北绿灯
     clr p1.0   ;开东西红灯
  setb p1.1
  setb p1.2
  setb p1.3
  setb p1.4
  setb p1.5
  setb p1.7
 keyout:ret
end

2011-02-28 20:16:00 david_luyang 阅读数 7780
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18872 人正在学习 去看看 朱有鹏

 

基于单片机的交通灯信号控制器设计

一:功能要求

设计一个基于单片机的交通灯信号控制器。已知东、西、南、北四个方向各有红黄绿色三个灯,在东西方向有两个数码管,在南北方向也有两个数码管。要求交通灯按照表1进行显示和定时切换,并要求在数码管上分别倒计时显示东西、南北方向各状态的剩余时间。

表格

 

二:任务分析与整体设计思路

通过分析可知本次设计要求实现的功能主要包括计时功能、动态扫描以及状态的切换等几部分。

计时功能:要实现计时功能则需要使用定时器来计时,通过设置定时器的初始值来控制溢出中断的时间间隔,再利用一个变量记录定时器溢出的次数,达到定时1秒钟的功能。当计时每到1秒钟后,东西、南北信号灯各状态的暂存剩余时间的变量减1。当暂存剩余时间的变量减到0时,切换到下一个状态,同时将下一个状态的初始的倒计时值装载到计时变量中。开始下一个状态,如此循环重复执行。

根据表1我们可以将其整个过程看做是一个以60秒钟为一个单位的大循环,这个单位又可以细分为4个小的部分,如下图所示:

时间条

 

当东西方向为红灯时,南北方向有25秒的绿灯加5秒的红灯组成;当南北方向为红灯时,南北方向有25秒的绿灯加5秒的红灯组成。这一点在做数码管倒计时显示的时候应该多加注意。

动态扫描:需要使用4个数码管分别显示东西、南北的倒计时数字,将暂存各状态剩余时间的数字从变量中提取出“十位”和“个位”,用动态扫描的方式在数码管中显示。

三:硬件电路图设计

       硬件protuse仿真电路如图所示。考虑到现实的情况,东西与南北方向的电路是呈镜像的。因此只需要考虑斜对称电路中的任何一边。

 

       本电路设计是用P0口的P0.0P0.5控制南北方向六盏灯,用P1口作数码管的段选,用P2口的前四个端口作为数码管的位选。具体连接方式见图。


交通灯

四:代码分析

 

 

五:问题思考

1、代码的继续优化

2、显示黄灯时黄灯的闪烁实现

3、功能的继续增强

……

 

【注】代码文档和仿真文件下载地址http://download.csdn.net/source/3049609

2020-02-27 12:18:56 weixin_43130546 阅读数 141
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18872 人正在学习 去看看 朱有鹏

51单片机-交通灯-红绿灯


1. 视频

bilibili视频地址:

https://www.bilibili.com/video/av91934816

51单片机-交通灯-红绿灯

2. 文件

文件下载地址:

https://download.csdn.net/download/weixin_43130546/12194351

3. 说明

绿灯亮10秒;黄灯亮5秒;红灯亮10秒

4. 代码


#include <reg52.h>

sbit DULA = P2^6;
sbit WELA = P2^7;

unsigned char code DUTable[16] = 
{
	0x3F,0x06,0x5B,0x4F,
	0x66,0x6D,0x7D,0x07,
	0x7F,0x6F,0x77,0x7C,
	0x39,0x5E,0x79,0x71
};

unsigned char code WETable[8] = 
{
	~0x80,~0x40,~0x20,~0x10,
	~0x08,~0x04,~0x02,~0x01
};

unsigned char LedBuff[8] = 
{
	0x3F,0x3F,0x00,0X00,
	0X00,0X00,0X00,0X00
};

unsigned char T0RH,T0RL;
bit flag1s = 0;

void ConfigTimer0(unsigned char ms);
void TransLED(void);

void main(void)
{
	ConfigTimer0(1);
	while(1)
	{
		if(flag1s)
		{
			flag1s = 0;
			TransLED();
		}
	}
}

void TransLED(void)
{
	static unsigned char num = 0;
	static unsigned char led = 0;

	if(0 == num)
	{
		switch(led)
		{
			case 0 : led = 1; num = 9; P1 = ~0x04; break;
			case 1 : led = 2; num = 4; P1 = ~0x02; break;
			case 2 : led = 0; num = 9; P1 = ~0x01; break;
		}
	}
	else
	{
		num--;
	}

	LedBuff[0] = DUTable[num/1%10];
	LedBuff[1] = DUTable[num/10%10];
}

void ConfigTimer0(unsigned char ms)
{
	unsigned long tmp;

	tmp = 11059200 / 12;
	tmp = tmp * ms / 1000;
	tmp = 65536 - tmp;
	tmp += 12;

	T0RH = (unsigned char)(tmp>>8);
	T0RL = (unsigned char)tmp;

	TH0 = T0RH;
	TL0 = T0RL;
	TMOD &= 0xF0;
	TMOD |= 0x01;
	EA = 1;
	ET0 = 1;
	TF0 = 0;
	TR0 = 1;
}

void LedScan(void)
{
	static unsigned char i = 0;

	P0 = 0x00;
	DULA = 1;
	DULA = 0;
	P0 = WETable[i];
	WELA = 1;
	WELA = 0;
	P0 = LedBuff[i];
	DULA = 1;
	DULA = 0;

	i++;
	if(i>=8)
	{
		i = 0;
	}
}

void InterruptTimer0(void) interrupt 1
{
	static unsigned int tmr1s = 0;

	TH0 = T0RH;
	TL0 = T0RL;

	LedScan();

	tmr1s++;
	if(tmr1s>=1000)
	{
		tmr1s = 0;
		flag1s = 1;
	}
}

2019-11-19 00:12:59 weixin_43130546 阅读数 182
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18872 人正在学习 去看看 朱有鹏

STC89C52_51单片机_例程4_交通灯_C语言代码







代码及文件下载链接

https://download.csdn.net/download/weixin_43130546/11984186

交通灯文件







交通灯

需要设置一个flag标志位,当到达1s时调用display()函数更新显示
主要就是display()函数!!!


#include<reg52.h>

sbit wei = P2^7;
sbit duan = P2^6;

unsigned char code weitable[6] = 
{
	~0x20,~0x10,~0x08,~0x04,~0x02,~0x01
};

unsigned char code duantable[16] = 
{
	0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
	0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
};

unsigned char ledbuff[6] = 
{
	0x00,0x00,0x00,0x00,0x00,0x00
};

unsigned char T0RH = 0,T0RL = 0;
bit flag = 1;

void configtimer0(unsigned char ms);
void display(void);

void main(void)
{
	EA = 1;
	configtimer0(1);
	while(1)
	{
		if(flag)
		{
			flag = 0;
			display();
		}
	}
}

void configtimer0(unsigned char ms)
{
	unsigned long tmp;

	tmp = 11059200 / 12;
	tmp = (tmp * ms) / 1000;
	tmp = 65536 - tmp;
	tmp += 12;

	T0RH = (unsigned char)(tmp>>8);
	T0RL = (unsigned char)tmp;

	TH0 = T0RH;
	TL0 = T0RL;
	TMOD &= ~(0xF<<0);
	TMOD |= 0x1<<0;
	ET0 = 1;
	TR0 = 1;
}

void display(void)
{
	static unsigned char color = 2;
	static unsigned char time = 0;

	if(time==0)
	{
		switch(color)
		{
			case 0 : P1 = ~0x18;time = 9;color = 1;break;
			case 1 : P1 = ~0x03;time = 4;color = 2;break;
			case 2 : P1 = ~0xC0;time = 9;color = 0;break;
			default : break;
		}
	}
	else
	{
		time--;
	}

	ledbuff[0] = duantable[time%10];
	ledbuff[1] = duantable[time/10];
}

void ledscan(void)
{
	static unsigned char i = 0;

	P0 = 0x00;
	duan = 1;
	duan = 0;

	P0 = weitable[i];
	wei = 1;
	wei = 0;
	P0 = ledbuff[i];
	duan = 1;
	duan = 0;

	if(i<5)
	{
		i++;
	}
	else
	{
		i = 0;
	}
}

void timer0(void) interrupt 1
{
	static unsigned int tim1s = 0;

	TH0 = T0RH;
	TL0 = T0RL;

	ledscan();

	tim1s++;
	if(tim1s>=1000)
	{
		tim1s = 0;
		flag = 1;
	}
}

没有更多推荐了,返回首页