交通灯

#include<reg52.h>//包含头文件,一般情况不需要改动,

//头文件包含特殊功能寄存器的定义

 

sbit LACTCH1=P2^2;    

sbit LACTCH2=P2^3;

/*------------------------------------------------

                 全局变量

------------------------------------------------*/

bit red,green,yellow,turnred;//定义红绿黄灯标志位

 

 

 

code unsigned char tab[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

                //共阴数码管 0-9

 

unsigned char Dis_Shiwei;//定义十位

unsigned char Dis_Gewei; //定义个位

/*------------------------------------------------

              

------------------------------------------------*/

void delay(unsigned int cnt)

{

 while(--cnt);

}

/*------------------------------------------------

              主程序

------------------------------------------------*/

main()

{

TMOD |=0x01;//定时器设置 10ms in 12M crystal

TH0=0xd8;

TL0=0xf0;

IE= 0x82;   //打开中断

TR0=1;

 

P1=0xfc;    //红灯亮

red =1;

while(1)

  {

  P0=Dis_Shiwei;//显示十位

  LACTCH1=1;    //锁存

  LACTCH1=0;

  P0=0xfe;

  LACTCH2=1;    // 锁存

  LACTCH2=0;

  delay(300);   //短暂延时

  P0=Dis_Gewei; //显示个位

  LACTCH1=1;    //锁存

  LACTCH1=0;

  P0=0xfd;

  LACTCH2=1;    // 锁存

  LACTCH2=0;

  delay(300);

  }

 

}

/*------------------------------------------------

             定时器0中断函数

------------------------------------------------*/

void tim(void) interrupt 1

{

static unsigned char second=60,count; //初值99

 

TH0=0xd8;//重新赋值

TL0=0xf0;

count++;

if (count==100)

    {

    count=0;

    second--;//秒减1

if(second==0)

   {

       if(red)

     {

  red=0;yellow=1;

          second=5;

  P1=0xF3;//黄灯亮5秒

 }

   else if(yellow && !turnred)

     {

  yellow=0;green=1;

          second=50;

  P1=0xCF;//绿灯亮50秒

 }

   else if(green)

     {

 yellow=1;green=0;

         second=5;

 P1=0xF3;//黄灯亮5秒

 turnred=1;

 }

       else if(yellow && turnred)

     {

     red=1;yellow=0;

 P1=0xFC;//红灯亮60秒

         second=60;

 turnred=0;

 }

 

   }

Dis_Shiwei=tab[second/10];//十位显示值处理

    Dis_Gewei=tab[second%10]; //个位显示处理

    

    }

}

本设计是交通灯用于十字路口的设计,是单片机控制的简易系统,结构很简单,我采用的是AT89C52作为芯片,采用一些相应的简单外围电路都是书本上的,比如外围的时钟晶振电路,复位电路等等,在硬件电路的设计方面,主题思想是用一片单片机加上输出的LED显示器和TRAFFICLIGHTS作为输出结果,通过按键来控制交通灯的输出,采用一个中断作为特殊车辆的控制位,采用P1口作为输入控制口即A道和B道的控制口,其为双向IO口同时作为交通灯的输出口,采用P0口作为LED的输出口,但P0口做输出口时需要接上拉电阻,其显示的是红绿黄灯的切换时间,在软件程序的设计方面,本设计采用了C语言作为编辑语言,其结构简单,语言方便,实现起来比较容易,作为特殊车辆,采用的是外部中断0即INT0作为它的控制口,我的程序大体的分为四部分,主程序和两个子程序即显示程序和延时程序,和一个宏定义。对于定时器,我采用了定时器0,主程序是一些程序的初始化比较简单,主要是开中断,开定时器和方式选择等等,遇到中断,和有按键按下就调用显示程序,程序的开始是宏定义,定义管脚的作用和名称,然后是延时程序中断程序和显示程序,在显示程序中字形码对应的是LED的输出(其为共阴极显示),应该特别注意的是在理想电路设计中我没注意电阻和电容的选择,其不影响仿真输出,但在实际电路中电阻和电容如果选择不正确可能影响输出结果。在仿真电路中使用总线形式用来节省空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值