找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2957|回复: 4
收起左侧

求助这个交通灯仿真图的单片机源代码

[复制链接]
回帖奖励 50 黑币 回复本帖可获得 50 黑币奖励! 每人限 1 次
ID:252101 发表于 2017-11-27 10:33 | 显示全部楼层 |阅读模式
哪位大神能帮我看看有没有这个图的源代码,小弟新人感激不尽
-1744fc35e121ab6a.jpg
回复

使用道具 举报

ID:164602 发表于 2017-11-27 15:27 | 显示全部楼层
你这个就是交通灯的电路嘛。
这有一个示例程序。不一定能配你的硬件,但可以参考的。它对应电路如图所示。
1.jpg 2.jpg

  1. #include<reg51.h>

  2. //--定义使用的IO口--//
  3. #define GPIO_DIG   P0
  4. #define GPIO_PLACE P1

  5. #define GPIO_TRAFFIC P2

  6. sbit RED10   = P2^0;   //上人行道红灯
  7. sbit GREEN10 = P2^1;   //上人行道绿灯
  8. sbit RED11   = P2^2;
  9. sbit YELLOW11= P2^3;
  10. sbit GREEN11 = P2^4;

  11. sbit RED00   = P3^0;        //右人行道红灯
  12. sbit GREEN00 = P3^1;        //右人行道绿灯
  13. sbit RED01   = P2^5;
  14. sbit YELLOW01= P2^6;
  15. sbit GREEN01 = P2^7;

  16. //--定义全局变量--//
  17. unsigned char code DIG_PLACE[8] = {
  18. 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制   查表的方法控制
  19. unsigned char code DIG_CODE[17] = {
  20. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  21. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  22. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  23. unsigned char DisplayData[8];
  24. //用来存放要显示的8位数的值
  25. unsigned char Time, Second;                  //用来存放定时时间

  26. //--声明全局函数--//
  27. void DigDisplay(); //动态显示函数
  28. void Timer0Cofig(void);

  29. /*******************************************************************************
  30. * 函 数 名         : main
  31. * 函数功能                   : 主函数
  32. * 输    入         : 无
  33. * 输    出         : 无
  34. *******************************************************************************/

  35. void main(void)
  36. {
  37.         Second = 1;

  38.         Timer0Cofig();

  39.         while(1)
  40.         {
  41.                 if(Second == 70)
  42.                 {
  43.                         Second = 1;
  44.                 }

  45.                 //--宝田路通行,30秒--//
  46.                 if(Second < 31)
  47.                 {
  48.                         DisplayData[0] = 0x00;
  49.                         DisplayData[1] = 0x00;
  50.                         DisplayData[2] = DIG_CODE[(30 - Second) % 100 / 10];
  51.                         DisplayData[3] = DIG_CODE[(30 - Second) %10];
  52.                         DisplayData[4] = 0x00;
  53.                         DisplayData[5] = 0x00;
  54.                         DisplayData[6] = DisplayData[2];
  55.                         DisplayData[7] = DisplayData[3];
  56.                         DigDisplay();

  57.                         //--宝田路通行--//

  58.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  59.                         RED00 = 1;
  60.                         GREEN00 = 1;

  61.                         GREEN11 = 0;    //宝田路绿灯亮                        
  62.                         GREEN10        = 0;    //宝田路人行道绿灯亮

  63.                         RED01 = 0;      //前进路红灯亮
  64.                         RED00 = 0;      //前进路人行道红灯亮
  65.                 }

  66.                 //--黄灯等待切换状态,5秒--//
  67.                 else if(Second < 36)
  68.                 {
  69.                         DisplayData[0] = 0x00;
  70.                         DisplayData[1] = 0x00;
  71.                         DisplayData[2] = DIG_CODE[(35 - Second) % 100 / 10];
  72.                         DisplayData[3] = DIG_CODE[(35 - Second) %10];
  73.                         DisplayData[4] = 0x00;
  74.                         DisplayData[5] = 0x00;
  75.                         DisplayData[6] = DisplayData[2];
  76.                         DisplayData[7] = DisplayData[3];
  77.                         DigDisplay();

  78.                         //--黄灯阶段--//

  79.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  80.                         RED00 = 1;
  81.                         GREEN00 = 1;

  82.                         YELLOW11 = 0;    //宝田路黄灯亮                        
  83.                         RED10        = 0;     //宝田路人行道红灯亮

  84.                         YELLOW01 = 0;    //前进路红灯亮
  85.                         RED00 = 0;       //前进路人行道红灯亮
  86.                 }

  87.                 //--前进路通行--//
  88.                 else if(Second < 66)
  89.                 {
  90.                         DisplayData[0] = 0x00;
  91.                         DisplayData[1] = 0x00;
  92.                         DisplayData[2] = DIG_CODE[(65 - Second) % 100 / 10];
  93.                         DisplayData[3] = DIG_CODE[(65 - Second) %10];
  94.                         DisplayData[4] = 0x00;
  95.                         DisplayData[5] = 0x00;
  96.                         DisplayData[6] = DisplayData[2];
  97.                         DisplayData[7] = DisplayData[3];
  98.                         DigDisplay();

  99.                         //--黄灯阶段--//

  100.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  101.                         RED00 = 1;
  102.                         GREEN00 = 1;

  103.                         RED11 = 0;       //宝田路红灯亮                        
  104.                         RED10 = 0;       //宝田路人行道红灯亮

  105.                         GREEN01 = 0;     //前进路绿灯亮
  106.                         GREEN00 = 0;     //前进路人行道绿灯亮
  107.                 }

  108.                 //--黄灯等待切换状态,5秒--//
  109.                 else
  110.                 {
  111.                         DisplayData[0] = 0x00;
  112.                         DisplayData[1] = 0x00;
  113.                         DisplayData[2] = DIG_CODE[(70 - Second) % 100 / 10];
  114.                         DisplayData[3] = DIG_CODE[(70 - Second) %10];
  115.                         DisplayData[4] = 0x00;
  116.                         DisplayData[5] = 0x00;
  117.                         DisplayData[6] = DisplayData[2];
  118.                         DisplayData[7] = DisplayData[3];
  119.                         DigDisplay();

  120.                         //--黄灯阶段--//

  121.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  122.                         RED00 = 1;
  123.                         GREEN00 = 1;

  124.                         YELLOW11 = 0;    //宝田路黄灯亮                        
  125.                         RED10        = 0;     //宝田路人行道红灯亮

  126.                         YELLOW01 = 0;    //前进路红灯亮
  127.                         RED00 = 0;       //前进路人行道红灯亮
  128.                 }
  129.         }                                
  130. }

  131. /*******************************************************************************
  132. * 函 数 名         : DigDisplay
  133. * 函数功能                   : 使用数码管显示
  134. * 输    入         : 无
  135. * 输    出         : 无
  136. *******************************************************************************/

  137. void DigDisplay()
  138. {
  139.         unsigned char i;
  140.         unsigned int j;


  141.         for(i=0; i<8; i++)
  142.         {
  143.                 GPIO_PLACE = DIG_PLACE[i];           //发送位选
  144.                 GPIO_DIG = DisplayData[i];     //发送段码
  145.                 j = 10;                                                   //扫描间隔时间设定
  146.                 while(j--);        
  147.                 GPIO_DIG = 0x00;               //消隐
  148.         }
  149. }

  150. /*******************************************************************************
  151. * 函 数 名         : Timer0Cofig
  152. * 函数功能                   : 配置定时器
  153. * 输    入         : 无
  154. * 输    出         : 无
  155. *******************************************************************************/

  156. void Timer0Cofig(void)
  157. {
  158.         TMOD = 0x01;     //定时器0选择工作方式1
  159.     TH0  = 0x3C;         //设置初始值,定时50MS
  160.     TL0  = 0xB0;
  161.     EA   = 1;             //打开总中断
  162.     ET0  = 1;                 //打开定时器0中断
  163.     TR0  = 1;                 //启动定时器0        
  164. }

  165. /*******************************************************************************
  166. * 函 数 名         : Timer0
  167. * 函数功能                   : 定时器0中断函数
  168. * 输    入         : 无
  169. * 输    出         : 无
  170. *******************************************************************************/                  

  171. void Timer0() interrupt 1
  172. {
  173.         TH0 = 0x3C;         //设置初始值
  174.         TL0 = 0xB0;
  175.         Time++;
  176.         if(Time == 20)
  177.         {
  178.                 Second ++;
  179.                 Time = 0;
  180.         }
  181. }
复制代码
回复

使用道具 举报

ID:252941 发表于 2017-11-27 16:18 | 显示全部楼层
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit renrh=P3^0;          //人行道右红
sbit renrl=P3^1;// 人行道右绿
sbit rensh=P2^0;  //人上下红灯
sbit rensl=P2^1; //人上下绿灯
sbit cherh=P2^5; //车左右红灯
sbit chery=P2^6; //车左右黄灯
sbit cherl=P2^7; //车左右绿灯
sbit chesh=P2^2; //车上下红灯
sbit chesy=P2^3;//车上下黄灯
sbit chesl=P2^4;//车上下绿灯
uint8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
                             0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
uint8 smgwei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint8 sec,sum;
uint8 smgshu[8];
void delay(uint16 i)
{
          while(i--);
}
void init0()   //定时器0初始化
{
        TMOD=0x01;
        TH1=0x3c;
        TL1=0xb0;  //定时50ms
        TR0=1;
        ET0=1;
        EA=1;
}
void smgsaomiao()  //扫描显示
{
        uint8 i;
        for(i=0;i<8;i++)
        {
                P0=smgshu[i];
                P1=smgwei[i];
                delay(300);
        }
}
void main()
{       
        init0();
        sec=1;
        while(1)
        {
                if(sec==70)       
                {
                        sec=1;
                }
                if(sec<31)
                {
                        P2=0xff;
                        P3=0xff;
                        renrh=0;
                        chesl=0;
                        cherh=0;
                        rensl=0;
                        smgshu[0]=0x00;
                        smgshu[1]=0x00;
                        smgshu[2]=smgduan[(30-sec)/10];
                        smgshu[3]=smgduan[(30-sec)%10];
                        smgshu[4]=0x00;
                        smgshu[5]=0x00;
                        smgshu[6]=smgduan[(30-sec)/10];
                        smgshu[7]=smgduan[(30-sec)%10];
                        smgsaomiao();               
                }
                if(sec>30&&sec<36)
                {
                        P3=0xff;
                        P2=0xff;
                        renrh=0;
                        chesy=0;
                        chery=0;
                        rensh=0;
                        smgshu[0]=0x00;
                        smgshu[1]=0x00;
                        smgshu[2]=smgduan[(36-sec)/10];
                        smgshu[3]=smgduan[(36-sec)%10];
                        smgshu[4]=0x00;
                        smgshu[5]=0x00;
                        smgshu[6]=smgduan[(36-sec)/10];
                        smgshu[7]=smgduan[(36-sec)%10];
                        smgsaomiao();       
                }
                if(sec>35&&sec<66)
                {
                        P3=0xff;
                        P2=0xff;
                        renrl=0;
                        chesh=0;
                        cherl=0;
                        rensh=0;
                        smgshu[0]=0x00;
                        smgshu[1]=0x00;
                        smgshu[2]=smgduan[(65-sec)/10];
                        smgshu[3]=smgduan[(65-sec)%10];
                        smgshu[4]=0x00;
                        smgshu[5]=0x00;
                        smgshu[6]=smgduan[(65-sec)/10];
                        smgshu[7]=smgduan[(65-sec)%10];
                        smgsaomiao();       
                }
                if(sec>65&&sec<71)
                {
                        P3=0xff;
                        P2=0xff;
                        renrh=0;
                        chesy=0;
                        chery=0;
                        rensh=0;
                        smgshu[0]=0x00;
                        smgshu[1]=0x00;
                        smgshu[2]=smgduan[(70-sec)/10];
                        smgshu[3]=smgduan[(70-sec)%10];
                        smgshu[4]=0x00;
                        smgshu[5]=0x00;
                        smgshu[6]=smgduan[(70-sec)/10];
                        smgshu[7]=smgduan[(70-sec)%10];
                        smgsaomiao();       
                }
        }               
}
void time0() interrupt 1
{
        TH1=0x3c;
        TL1=0xb0;
        sum++;
        if(sum==20)       
        {
                sum=0;
                sec++;
        }
}
回复

使用道具 举报

ID:252101 发表于 2017-11-27 18:42 | 显示全部楼层
Wuwds 发表于 2017-11-27 16:18
#include
typedef unsigned char uint8;
typedef unsigned int uint16;

老铁,这个代码是我的那个图的吗
回复

使用道具 举报

ID:142559 发表于 2017-11-27 20:18 | 显示全部楼层
这就是一个交通灯的仿真,你可以在网上搜交通灯程序。不过最好还是自己写
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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