找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机十字路口交通信号灯控制程序

[复制链接]
ID:402388 发表于 2018-9-25 20:58 | 显示全部楼层 |阅读模式
1) 完成南北方向、东西方向交通信号灯的电路设计;
2) 两个按键,按下K1键时,东西放行南北禁行;松开K1键恢复正常。按下K2键时,南北放行东西禁行;松开K2键恢复正常。

正常情况下,放行线——绿灯亮放行x秒后,黄灯亮警告y秒,然后红灯亮禁止(x+y)秒;禁止线——红灯亮禁止(x+y)秒,然后绿灯亮放行x秒后,黄灯亮警告y 秒。

  1. #include<reg51.h>


  2. void delay(int t );        //延时函数
  3. void display(char dat);        //显示函数
  4. void deal(char m);        //显示50次函剩,时间为1s
  5. void led();        //led显示和数码管产生函数
  6. void csh();        //中断初始函数


  7. sbit led_A=P2^0;   //数码管位
  8. sbit led_B=P2^1;   //数码管位


  9. //***************led指示灯引脚定义*****************//
  10. sbit dx_R=P2^2;
  11. sbit dx_Y=P2^3;
  12. sbit dx_G=P2^4;


  13. sbit nb_R=P2^7;
  14. sbit nb_Y=P2^6;
  15. sbit nb_G=P2^5;


  16. char N=12;         //初始时间是12
  17. char tab_disp[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极码表


  18. //中断初始函数
  19. void csh()
  20. {
  21.         EA=1;        //开总中断
  22.       
  23.         EX1=1;        //开外部中断1
  24.         IT1=0;        //低电平
  25.       
  26.         EX0=1;        //开外部中断1
  27.         IT0=0;        //低电平
  28. }


  29. //外部中断0,东西放行,南北禁止函数
  30. void dx_int0() interrupt 0 using 0
  31. {
  32.         dx_R=1;dx_Y=1;dx_G=0;        //指示灯1是亮,0是灭
  33.         nb_R=0;nb_Y=1;nb_G=1;        //指示灯1是亮,0是灭
  34.         N=N;
  35.         P0=0xff;
  36. }


  37. //外部中断1,南北放行,东西禁止函数
  38. void nb_int0() interrupt 2 using 2
  39. {
  40.         dx_R=0;dx_Y=1;dx_G=1;        //指示灯1是亮,0是灭
  41.         nb_R=1;nb_Y=1;nb_G=0;        //指示灯1是亮,0是灭
  42.         N=N;
  43.         P0=0xff;
  44. }


  45. //延时函数
  46. void delay(int t )
  47. {
  48.         while(t--);
  49. }


  50. //显示函数
  51. void display(char dat)
  52. {
  53.         led_A=led_B=1;         
  54.         P0=tab_disp[dat/10]; //赋显示的数
  55.         led_A=0;
  56.         delay(1000);              //延时
  57.       
  58.         led_A=led_B=1;      
  59.         P0=tab_disp[dat%10]; //赋显示的数
  60.         led_B=0;
  61.         delay(1000);        //延时
  62. }


  63. //显示50次函剩,时间为1s
  64. void deal(char m)
  65. {
  66.         int t=50;
  67.         while(t--)        display(m);  
  68. }


  69. //led显示和数码管产生函数
  70. void led()
  71. {
  72.         char i;
  73.         N=12;                                                   //初始时间是25      
  74.         for(i=N;i>0;i--)         //一秒一秒的减
  75.         {
  76.                 if(i>0&&i<=2)
  77.                 {
  78.                         dx_R=1;dx_Y=0;dx_G=1;        //指示灯1是亮,0是灭
  79.                         nb_R=0;nb_Y=1;nb_G=1;        //指示灯1是亮,0是灭
  80.                 }
  81.                 else
  82.                 {
  83.                         dx_R=1;dx_Y=1;dx_G=0;        //指示灯1是亮,0是灭
  84.                         nb_R=0;nb_Y=1;nb_G=1;        //指示灯1是亮,0是灭
  85.                 }
  86.                
  87.                 deal(i);
  88.                
  89.         }
  90.                
  91.         N=12;                                                                //时间变成25
  92.         for(i=N;i>0;i--)         //一秒一秒的减
  93.         {
  94.                 if(i>0&&i<=2)
  95.                 {
  96.                         dx_R=0;dx_Y=1;dx_G=1;          //指示灯1是亮,0是灭
  97.             nb_R=1;nb_Y=0;nb_G=1;  //指示灯1是亮,0是灭
  98.                 }
  99.                 else
  100.                 {
  101.                         dx_R=0;dx_Y=1;dx_G=1;         //指示灯1是亮,0是灭
  102.             nb_R=1;nb_Y=1;nb_G=0;        //指示灯1是亮,0是灭
  103.                 }
  104.                
  105.                 deal(i);
  106.                
  107.         }
  108. }


  109. /*主函数*/
  110. void main(void)
  111. {
  112.         csh();        //中断初始函数
  113.         while(1)
  114.         {
  115.                 led();        //led显示和数码管产生函数
  116.         }
  117. }
复制代码



回复

使用道具 举报

ID:1 发表于 2018-9-25 21:36 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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