找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5318|回复: 2
收起左侧

基于stm32的交通灯源程序与Proteus仿真

  [复制链接]
ID:273434 发表于 2020-11-28 20:21 | 显示全部楼层 |阅读模式
热乎乎的交通灯来了,基于stm32的交通灯,有仿真和源代码,欢迎大家下载---加油中国

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif
51hei.png

单片机源程序如下:
  1. #include "stm32f103_config.h"


  2. #define LED595_DATA           PBout(7)
  3. #define LED595_CLK                PBout(8)
  4. #define LED595_LATCH          PBout(9)

  5. #define DXR  PBout(0)
  6. #define DXG  PBout(1)
  7. #define DXY  PBout(10)

  8. #define NBR  PBout(11)
  9. #define NBG  PBout(12)
  10. #define NBY  PBout(13)

  11. unsigned char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

  12. void io_Init(void)//初始化GPIO
  13. {
  14.         GPIO_InitTypeDef  GPIO_InitStructure;        

  15.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         

  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;        //GPIO_PIN0-16               
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  19.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                         
  20.         GPIO_ResetBits(GPIOB,GPIO_Pin_All);               
  21. }


  22. void _delay_ms(int i)//延时函数
  23. {
  24.         u16 j;
  25.         while(i--)
  26.         {
  27.                 for(j=0;j<5600;j++);
  28.         }
  29. }

  30. void _delay_us(int i)//延时函数
  31. {
  32.         u16 j;
  33.         while(i--)
  34.         {
  35.                 for(j=0;j<5;j++);
  36.         }
  37. }

  38. void inp(unsigned char OutData)
  39. {
  40.         unsigned char i;
  41.         for(i=0; i<8; i++) //将8位数据按位发送,先发送高字节后发送低字节
  42.         {
  43.                 LED595_CLK=0;//时钟线低电平
  44.                 _delay_us(1);
  45.                 if( (OutData & 0x80) == 0x80)//判断数据高低位
  46.                 {
  47.                         LED595_DATA=1;                   //数据线高电平
  48.                 }
  49.                 else
  50.                 {
  51.                          LED595_DATA=0;          //数据线低电平
  52.                 }
  53.                 _delay_us(1);
  54.                 OutData = OutData << 1;         //数据左移1位
  55.                 LED595_CLK=1;                 //时钟线高电平
  56.                 _delay_us(1);
  57.         }
  58. }

  59. void LED595SendData(int a,int b)
  60. {
  61.         inp(duan[b%10]);
  62.         inp(duan[b/10]);
  63.         
  64.         inp(duan[a%10]);
  65.         inp(duan[a/10]);
  66.         
  67.     LED595_LATCH=0;  
  68.         _delay_us(1);
  69.     LED595_LATCH=1;
  70.         _delay_us(1);
  71. }


  72. int main(void)//主函数
  73. {        
  74.         int state=0;
  75.         int num=30;
  76.         
  77.         
  78.         RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_5);//系统时钟初始化
  79.         io_Init();//引脚初始化
  80.         uart_init(9600);//串口初始化
  81.         sendDat(0x02);sendDat(0x04);
  82.         while(1)
  83.         {
  84.                 num--;//倒计时
  85.                 if(num==0)
  86.                 {
  87.                         state++;if(state==4)state=0;//四种模式对应
  88.                         /*
  89.                         (1)南北红灯 东西绿灯(30秒)
  90.                         (2)南北红灯 东西黄灯(05秒)
  91.                         (3)南北绿灯 东西红灯(30秒)
  92.                         (4)南北黄灯 东西红灯(05秒)

  93.                         */
  94.                         switch (state)//更新时间
  95.                         {
  96.                                 case 0: num=30;sendDat(0x02);sendDat(0x04);break;
  97.                                 case 1: num= 5;sendDat(0x03);sendDat(0x04);break;
  98.                                 case 2: num=30;sendDat(0x01);sendDat(0x05);break;
  99.                                 case 3: num= 5;sendDat(0x01);sendDat(0x06);break;
  100.                         }
  101.                 }
  102.                
  103.                 switch (state)//根据状态点亮LED
  104.                 {
  105.                         case 0: DXR=0;DXY=0;DXG=1;NBR=1;NBY=0;NBG=0;break;
  106.                         case 1: DXR=0;DXY=1;DXG=0;NBR=1;NBY=0;NBG=0;break;
  107.                         case 2: DXR=1;DXY=0;DXG=0;NBR=0;NBY=0;NBG=1;break;
  108.                         case 3: DXR=1;DXY=0;DXG=0;NBR=0;NBY=1;NBG=0;break;
  109.                 }
  110.                
  111.                 switch (state)//根据状态显示当前倒计时
  112.                 {
  113.                         case 0: LED595SendData(num,num+5);break;
  114.                         case 1: LED595SendData(num,num);break;
  115.                         case 2: LED595SendData(num+5,num);break;
  116.                         case 3: LED595SendData(num,num);break;
  117.                 }
  118.                                 
  119.                 _delay_ms(100);//延时  速度快慢调这里
  120.         }

  121. }
复制代码

所有资料51hei提供下载:
stm32交通灯.7z (265.03 KB, 下载次数: 231)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:855592 发表于 2020-12-8 16:32 | 显示全部楼层
仿真可以用 但是为什么将程序下载到我的单片机开发板中只有蜂鸣器在响,但是屏幕上没有任何的显示,是不是电路不兼容?
回复

使用道具 举报

ID:934446 发表于 2021-6-16 21:00 | 显示全部楼层
楼主你好 为什么示波器上没有任何显示呢,,这个示波器应该可以去掉吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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