找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1938|回复: 3
打印 上一主题 下一主题
收起左侧

求一个单片机交通灯程序的编写思路

[复制链接]
跳转到指定楼层
楼主
由于本论坛禁止直接求程序,禁止伸手党,所以向大家请教一下大致的实现方法与思路,理清头绪后我自己来写程序去实现,谢谢大家

基于单片机设计实现十字路口交通灯控制。
要求具有以下:
1)搭建硬件电路。
2)控制器软件设计。
3)使用8个二极管(南红D1、南绿D2、北红D3、北绿D4、东红D5、东绿D6、西红D7、西绿D8)模拟十字路口交通灯管理;
4)用绿灯闪烁3s代替黄灯;
5)南北向做主路口;
6)6个LED数码管分别作为南向、北向、东向的2位倒计时显示装置
7)具备断电记忆功能。
1.3发挥部分
1)增加其它自主创新功能;
2)进行实物类设计并对设计进行验证。
stc89C52的单片机

51hei图片_20210706111714.jpg (147.02 KB, 下载次数: 39)

51hei图片_20210706111714.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:954312 发表于 2021-7-19 23:48 | 只看该作者
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#define uint unsigned int
#define uchar unsigned char

#define PA         XBYTE[0x7F00]   //PA端口地址
#define PB         XBYTE[0x7F01]               
#define PC         XBYTE[0x7F02]
#define COM         XBYTE[0x7F03]

        uchar temp,aa,nn;
        
        sbit shi=P3^0;
        sbit ge=P3^1;        /*对要使用的单片机各个口进行定义*/
        bit flag=0;
   sbit key1=P2^0;
        sbit key2=P2^1;
        sbit key3=P2^2;
   sbit key4=P2^3;
   sbit key5=P2^4;
   sbit key6=P3^3;
        uchar code table[]={
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};         /*将数字0123456789的16进制数定义成数组用以显示*/
   //定义所有函数
        void delay(uint z);
        void disp(uint n);
        void  xint0();
        void  xint1();
        void timer0();
        void nb_flash(void);
        void dx_flash(void);
        void nanbei();
        void dongxi();                 
   void nanbeizuo();
        void dongxizuo();
   void dongxizuogreen();
        void nanbeizuogreen();
        void  dongxigreen();
        void  nanbeigreen();
        void allred();
        void allyellow();
        //主函数
        void main()        
        {
                uint num;
                num=0;
                aa=0;
                COM =0x82;        //PA口输出,PB口输入,PC口输出
                TMOD=0x01;        //定时器工作方式1
                TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                EA=1;            //开启总中断
                ET0=1;           //开启定时器中断
                TR0=1;           //开启定时器0
                EX0=1;           //外部中断0允许标志
                IT0=0;           //外部中断0电平触发
                EX1=1;           //外部中断1允许标志
                IT1=0;                      //外部中断1电平触发
               
                while(1){
                         nanbei();
                         nb_flash();
                         nanbeizuo();
                         dongxi();
                         dx_flash();
                         dongxizuo();
          }
               
  }

        void delay(uint z)                    //延时函数
        {
                uint x,y;
                for(x=z;x>0;x--)
                        for(y=110;y>0;y--);
        }

        void timer0() interrupt 1            //定时器0中断
        {
                TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                aa++;
                if(aa==18)
                {
                        aa=0;
                        flag=1;
                }        
               
        }
        void disp(uint n)                    //数码管显示函数
        {
          while(!flag)
          {
                  ge=0;
                  PC=table[n%10];
                  delay(50);
                  shi=1;ge=1;
                  shi=0;
                  PC=table[n/10];
                  delay(50);
                  shi=1;ge=1;
           }
          if(flag==1)
             flag=0;
        }
        void nanbei()                    //南北绿灯东西红灯及数码管显示
        {                //南北通行
                uint num;
                        num=60;
                        disp(num);
                  
                        while(num<=60&&num>0)
                        {        PA=0xd8;
                                num--;
                           P1=0xe1;
                                disp(num);                        
                        }                        
        }
        void nanbeizuo()                    //南北方向左转及数码管显示
        {                uint num;
                        num=15;
                  
                        disp(num);
                        while(num<=15&&num>0)
                        {        P1=0xe4;         
                                num--;
                             PA=0xe9;
                           disp(num);                        
                        }
        }
        void dongxizuo()                     //东西方向左转及数码管显示
        {                uint num;                        
                         num=15;
                  
                        while(num<=15&&num>0)
                        {        P1=0xe4;
                                PA=0xea;         
                                disp(num);
                                num--;
                        }
        }
        void dongxi()                     //东西绿灯南北红灯及数码管显示
        {                uint num;

                         num=45;
                   disp(num);
                        while(num<=45&&num>0)
                        {        
            PA=0xe4;        
                                P1=0xcc;         
                                disp(num);
                                num--;
                        }
        }
        void nb_flash(void)              //南北方向黄灯闪烁及数码管显示
        {
                uint a;
               
                for(a=3;a>0;a--)
                {        PA=0xd8;
                        disp(a);
                        P1=0xe2;
                        
                         delay(100);
                        P1=0xe0;
                        
                }
        }
        void dx_flash(void)                //东西方向黄灯闪烁及数码管显示
        {
                uint a;
               
                for(a=3;a>0;a--)
                {         PA=0xe4;
                         disp(a);
                         P1=0xd4;
                         delay(100);
                         P1=0xa4;
                        
                }
        }
void  xint0()  interrupt 0               //外部中断0
{        
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
   if(key1==0){
                if(key1==0)
                {
                        delay(20);
                        allred();
                        
                }
        }        
        if(key2==0){
                if(key2==0)
                {
                        
                        delay(20);
                        allyellow();
                        
                }               
        }
        if(key3==0){
                if(key3==0)
                {
                        delay(20);
                        nanbeigreen();
                }               
        }
        if(key4==0){
                if(key4==0)
                {
                        delay(20);
                        dongxigreen();
                }               
        }
        if(key5==0){
                if(key5==0)
                {
                        delay(20);
                        nanbeizuogreen();
                }               
        }
        
}
void  allred()                         //南北东西方向全部红灯   
{                        
              
                        P1=0xe4;
              PC=0x00;
         PA=0xe8;                          
                        return;
}
void  allyellow()                       //南北东西方向全部黄灯   
{               
              
                   P1=0xd2;
              PC=0x00;
         PA=0x00;                          
                        return;
}

void  nanbeizuogreen()                    //南北方向左转绿灯  
{                        
                        P1=0xe4;
              PC=0x00;
         PA=0xe9;                          
                        return;
}
void  dongxizuogreen()                    //东西方向左转绿灯  
{                        
                        P1=0xe4;
              PC=0x00;
         PA=0xea;                          
                        return;
}

void  nanbeigreen()                       //南北方向绿灯  
{                        
                        P1=0xe1;
              PC=0x00;
         PA=0xe8;  
                        return;
}
void  dongxigreen()                       //东西方向绿灯  
{                        
                        P1=0xcc;
              PC=0x00;
         PA=0xe8;         
                        return;
}
void  xint1()  interrupt 2                     //外部中断1
{        
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
          dongxizuogreen();
}


回复

使用道具 举报

板凳
ID:752974 发表于 2021-7-21 10:47 | 只看该作者
这种问题去十字路口仔细观察一下,就知道其控制规律了。
回复

使用道具 举报

地板
ID:332444 发表于 2021-7-21 13:03 | 只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表