找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2796|回复: 1
收起左侧

我的单片机交通灯实验,包括源码,原理图等资料

[复制链接]
ID:807635 发表于 2020-7-24 15:53 | 显示全部楼层 |阅读模式
   本实验主要利用了定时器和中断的知识,定时器定时,显示不同的灯。通过中断控制显示时长,闪烁。中断处理按键,可靠性更高。
   定时器T0利用的方式1,方式1是一个16位的定时器,中断的次数会相对较低。因为交通灯是秒级的控制,不需要很高的中断频率,如果用方式2的8位自动重装方式,每秒中断数千次,你仍然需要再次分频以获得秒或十分之一秒的信号,实在是没有必要。

图3.2共有4个按键K1、K2、K3、K4,分别连接到单片机P2.0、P2.1、P2.2、P2.3引脚,按键后对应引脚为低电平,通过4个二极管D17、D18、D19、D20连接到P3.2(外部中断0),这是二极管构成的相与电路,即任意按一个键能在P3.2上产生一个低电平或下降沿,作为中断触发信号。
五、软件设计思想
1、定时思想。
采用定时器T0或T1的方式1定时50ms,每50ms中断进行计数,计数10次即0.5s,计数20次即1s,对秒计数实现所需要的定时时间。
2、亮灯控制思想。
单片机控制灯引脚与灯对应如下,0点亮。
一共有四种状态S0、S1、S2、S3,
a、南北通行S0状态:   
51hei.png
设置一个秒计数单元SEC每秒+1,设置两个控制值变量a,b。
首先令SEC=0,a=0xfc,b=0xf3,处于S0状态;
SEC==25,a=0xfd,b=0x75,处于S1状态;
SEC==30,a=0xf7,b=0x9e,处于S2状态;
SEC==55,a=0xfb,b=0xae,处于S3状态;
SEC==60,SEC=0,a=0xfc,b=0xf3,处于S0状态;
P0=a,P1=b。
设置一个秒计数单元SEC每秒+1,设置两个控制值变量a,b。
首先令SEC=0,a=0xf7,b=0x9e,处于S0状态;
SEC==25,a=0xfb,b=0xae,处于S1状态;
SEC==30,a=0xfc,b=0xf3,处于S2状态;
SEC==55,a=0xfd,b=0x75,处于S3状态;
SEC==60,SEC=0,a=0xf7,b=0x9e,处于S0状态;
P0=a,P1=b。

3、交通灯键控
按键后即进入外部中断0,在外部中断0中断程序中判断:若是按K1键,控制南北通行状态,并将定时器T0关闭,即可保持南北通行状态;若是按K2键,控制东西通行状态,并将定时器T0中断关闭,即可保持东西通行状态;若是按K3键,开启定时器T0中断,恢复正常交通灯。
4、闪烁控制
在需要闪烁时,0.5s按正常显示,0.5s全灭,即是闪烁效果。实现方法是:当=0.5s的时刻,并且在南北通行的最后5s(19<sec<25)或在东西通行的最后5s(49<sec<55),灭绿灯: P0=a|0xf9,P1==b|0x24,当=1s的时刻,按正常显示。

单片机源程序如下:
  1. #include "reg51.h"
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uint second1=0;
  5. uint i=0;
  6. sbit key1=P2^0;
  7. sbit key2=P2^1;
  8. sbit key3=P2^2;

  9. uchar keyvalue=0;  // 记录按键值
  10. uchar second=0;     //记录时间

  11. void NSgreen_WEred() //南北绿灯、东西红灯
  12. {
  13.    P0=0xfc;P1=0xf3;
  14. }

  15. void NSyellow_WEred() //南北黄灯、东西红灯
  16. {
  17.    P0=0xfd;P1=0x75;
  18. }

  19. void WEgreen_NSred() //东西绿灯、南北红灯  
  20. {
  21.    P0=0xf7;P1=0x9e;
  22. }

  23. void WEyellow_NSred()//东西黄灯、南北红灯
  24. {
  25.    P0=0xfb;P1=0xae;
  26. }

  27. void Timer0Init()
  28. {
  29.    TMOD|=0x01;
  30.    TH0=(65536-50000)/256;  //0x3C;50ms
  31.    TL0=(65536-50000)%256; //0xB0;
  32.    EA=0;
  33.    ET0=1;
  34.    TR0=1;
  35. }

  36. void normal_traffic()
  37. {
  38. if(second==0)
  39. {
  40.     P0=0xfc;P1=0xf3;}//南北绿灯、东西红灯
  41.   if( second>=5&&second<10)
  42.      {                     
  43.       if( second1%2==0)//定时0.5s
  44.           {P0=0xfc;P1=0xf3;}
  45.       else
  46.                             {P0=0xfd;P1=0xf7;}//绿灯闪烁
  47.      }
  48.   if( second==10)//南北黄灯、东西红灯
  49.         {P0=0xfd;P1=0x75;}
  50.   if( second==15)
  51.         {P0=0xf7;P1=0x9e;}//东西绿灯、南北红灯
  52.   if( second>=21&& second<25)
  53.      {
  54.       if( second1%2==0)//定时0.5s
  55.                         {P0=0xf7;P1=0x9e;}
  56.      else
  57.                  {P0=0xff;P1=0xbe;}//绿灯闪烁
  58.      }
  59.   if( second==25)
  60.          {P0=0xfb;P1=0xae;}//东西黄灯、南北红灯
  61.         if(second==30)
  62.                 second=0;
  63. }

  64. void display()
  65. {
  66.    if(key1==0)
  67.       {
  68.         keyvalue=1;
  69.       }
  70.     if(key2==0)
  71.       {
  72.         keyvalue=2;
  73.       }
  74.     if(key3==0)
  75.       {
  76.         keyvalue=0;
  77.       }
  78. }

  79. void main()
  80. {
  81.          P0=0xff;
  82.          P1=0xff;
  83.    Timer0Init();
  84.    while(1)
  85.    {
  86.      display();
  87.                  if(keyvalue==1)
  88.                  {
  89.                          NSgreen_WEred();
  90.                  }
  91.                  if(keyvalue==2)
  92.                  {
  93.                          WEgreen_NSred();
  94.                  }
  95.                  if(keyvalue==0)
  96.                  {
  97.                          EA=1;
  98.                          normal_traffic();
  99.                  }
  100.          }
  101. }

  102. void Timer0() interrupt 1
  103. {
  104.     TH0=(65536-50000)/256;  //0x3C;50ms
  105.     TL0=(65536-50000)%256; //0xB0;
  106.        i++;
  107.         if(i==10)
  108.         {
  109.                 second1++;
  110.         }
  111.     if(i==20)
  112.       {
  113.         second++;
  114.                                 i=0;
  115.       }
  116. }
复制代码


实验途中要注意,每个按键对应的LED灯,在与开发板连接时需要保证端口正确。实验原理图等,在文档“实验二”内。

实验二.docx

46.36 KB, 下载次数: 16, 下载积分: 黑币 -5

交通灯实验源码.rar

20.92 KB, 下载次数: 16, 下载积分: 黑币 -5

回复

使用道具 举报

ID:90852 发表于 2020-9-23 13:39 | 显示全部楼层
这个资源还真是不错的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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