找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机红绿灯设计源代码

[复制链接]
ID:653096 发表于 2020-9-15 15:27 | 显示全部楼层 |阅读模式
51hei.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char

  3. uchar led[ ]={0x3f,0x06,0x5b,0x4f,0x66,
  4. 0x6d,0x7d,0x07,0x7f,0x6f};
  5. void delay_ms(uchar j)   //延时若干ms
  6. {
  7.         uchar i;       
  8.         while(j--)       
  9.         {
  10.         for(i=0;i<125;i++)
  11.         for(i=0;i<125;i++);
  12.         }
  13. }
  14. void delay_s(uchar i)  //延时i秒钟
  15. {
  16.         unsigned char a,b,c;   
  17.         while(i--)   
  18.         {
  19.         for(c=167;c>0;c--)
  20.         for(b=171;b>0;b--)
  21.         for(a=16;a>0;a--);
  22.         }
  23. }
  24. void dongxi(uchar a)   //东西绿灯  南北红灯
  25. {
  26.     uchar j=100;  //循环100次
  27.     for(a;a>0;a--)
  28.     {
  29.         P1=0X09;delay_ms(5);
  30.         while(j--)       
  31.         {
  32.             P0=0Xfb;       
  33.             P2=led[a/10];  //显示十位倒计时
  34.             delay_ms(5);   
  35.   P0=0Xf7;       
  36. P2=led[a%10];   //显示个位倒计时
  37. delay_ms(5);        
  38. if(a<=3)   //如果a小于3,则开始黄灯闪烁
  39. {
  40.     P1=0X12;  
  41.     delay_ms(5);
  42.     P1=0X00;
  43.     delay_ms(5);
  44. }
  45. }}}
  46.   void nanbei(uchar a)   //南北绿灯  东西红灯
  47. {
  48.     uchar j=100;
  49.     for(a;a>0;a--)
  50.     {   
  51.         P1=0X24;
  52.         delay_ms(5);
  53.         while(j--)       
  54.         {
  55.             P0=0Xfe;
  56.             P2=led[a/10];   //显示十位倒计时
  57.             delay_ms(5);   
  58.                  P0=0Xfd;       
  59. P2=led[a%10];   //显示个位倒计时               
  60. delay_ms(5);
  61. if(a<=3)   //如果a小于3,则开始黄灯闪烁               
  62. {
  63. P1=0X12;
  64. delay_ms(5);                        
  65. P1=0X00;       
  66. delay_ms(5);
  67. }
  68. }}}
  69. void main()
  70. {
  71.     EA=1;   //允许中断
  72.     EX0=1;   //允许外部中断0
  73.     IT0=1;   //跳沿触发
  74.     while(1)
  75.     {       
  76.         dongxi(10);   //东西通行时间10秒
  77.         nanbei(10);   //南北通行时间10秒
  78.     }
  79. }
  80. void int0() interrupt 0   //外部中断0函数
  81. {                  
  82.     uchar i;
  83.     EA=0;
  84.     P0=0xff;
  85.     for(i=5;i>0;i++)
  86.     {       
  87.         P1=0X12;
  88.         delay_ms(10);
  89.         P1=0X00;
  90.         delay_ms(10);
  91.     }
  92.     P1=0x0c;
  93.     delay_s(5);
  94.     EA=1;        
  95. }




  96. #include<reg51.h>
  97. #define u8 unsigned char
  98. #define u16 unsigned int
  99. sbit s1=P3^2;//应急通行
  100. u8 code display[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管0---9
  101. u8 buf[2]={1,0};//初始显示10
  102. u8 num;//1s计时
  103. u8 time=10;//10s倒计时
  104. bit flag=0;
  105. void time0_init()
  106. {
  107.         TMOD=0x01;//定时器0,工作于方式1
  108.         TH0=(65535-50000)/256;//定时50ms
  109.         TL0=(65535-50000)%256;
  110.         ET0=EA=TR0=1;
  111. }
  112. void delayms(u16 x)//毫秒延时函数
  113. {
  114. u16 i,j;
  115. for(i=0;i<x;i++)      //连数x次,约 x ms
  116. for(j=0;j<120;j++);   //数120 次,约1 ms
  117. }
  118. void scan()//数码管扫描函数
  119. {
  120.         P0=0xfa;P2=display[buf[1]];
  121.         delayms(5);
  122.         P0=0xf5;P2=display[buf[0]];
  123.         delayms(5);
  124. }
  125. void convert(u8 dat)//将数据转成适合数码管显示的数
  126. {
  127.         buf[1]=dat/10;
  128.         buf[0]=dat%10;
  129. }
  130. void main()//主函数
  131. {
  132.         EA=1;
  133.         EX0=1;
  134.         IT0=1;
  135.         time0_init();//初始化
  136.         flag=1;
  137.         while(1)
  138.         {
  139.                 convert(time);//正常数据转换
  140.                 scan();//倒计时显示
  141.                 if(flag==0)
  142.                 {       
  143.                         P1=0x24;
  144.                         if(time<=3){P1=0x12;}
  145.                 }
  146.                 else if(flag==1)
  147.                 {
  148.                         P1=0x09;
  149.                         if(time<=3){P1=0x12;}
  150.                 }
  151.         }               
  152. }                  
  153. void time0()interrupt 1
  154. {
  155.         TH0=(65535-50000)/256;//定时50ms
  156.         TL0=(65535-50000)%256;
  157.         num++;
  158.         if(num==20)//1s时间
  159. ……………………

  160. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
红绿灯.zip (96.49 KB, 下载次数: 16)
回复

使用道具 举报

ID:838086 发表于 2020-11-19 11:23 | 显示全部楼层
程序有错误
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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