找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 985|回复: 3
收起左侧

STC89C52单片机交通灯(计数器实现)+Proteus仿真

[复制链接]
ID:1097346 发表于 2024-5-8 11:31 | 显示全部楼层 |阅读模式
  1. #include <REGX52.H>
  2. void YellowShan2();
  3. void YellowShan1();
  4. void delay_s(num);
  5. void delay_ms(num);
  6. void delay_us(num);
  7. void NBX();
  8. void DXX();
  9. void Timer0_Init();
  10. sbit r1=P1^2;
  11. sbit y1=P1^3;
  12. sbit g1=P1^4;
  13. sbit r2=P1^5;
  14. sbit y2=P1^6;
  15. sbit g2=P1^7;
  16. unsigned int num1=0;
  17. unsigned int num2;

  18. void main()
  19. {
  20.         Timer0_Init();
  21.         r1=0;
  22.         y1=0;
  23.         g1=0;
  24.         r2=0;
  25.         y2=0;
  26.         g2=0;
  27.         while(1)
  28.         {
  29.                 if (num2==0)
  30.                 {
  31.                         NBX();
  32.                 }
  33.                 else if (num2==1)
  34.                 {
  35.                         YellowShan1();
  36.                 }
  37.                 else if (num2==2)
  38.                 {
  39.                         DXX();
  40.                 }
  41.                 else if (num2==3)
  42.                 {
  43.                         YellowShan2();
  44.                 }
  45.         }
  46. }
  47. void YellowShan1()
  48. {
  49.                 r1=1;
  50.                 y1=0;
  51.                 g1=0;
  52.                 r2=0;
  53.                 y2=1;
  54.                 g2=0;
  55.                 delay_ms(25);
  56.                 r1=1;
  57.                 y1=0;
  58.                 g1=0;
  59.                 r2=0;
  60.                 y2=0;
  61.                 g2=0;
  62.                 delay_ms(25);
  63. }
  64. void YellowShan2()
  65. {
  66.                 r1=0;
  67.                 y1=1;
  68.                 g1=0;
  69.                 r2=1;
  70.                 y2=0;
  71.                 g2=0;
  72.                 delay_ms(25);
  73.                 r1=0;
  74.                 y1=0;
  75.                 g1=0;
  76.                 r2=1;
  77.                 y2=0;
  78.                 g2=0;
  79.                 delay_ms(25);
  80. }
  81. void delay_us(unsigned int num)
  82. {
  83.         unsigned int i=0,j=0;        
  84.         for(i=0;i<num;i++)
  85.         {
  86.                 for(j=0;j<20;j++);
  87.         }
  88. }
  89. void delay_ms(unsigned int num)
  90. {
  91.         while(num--!=0)         
  92.         {
  93.                 delay_us(100);
  94.         }
  95. }
  96. void delay_s(unsigned int num)
  97. {
  98.         while(num--!=0)         
  99.         {
  100.                 delay_ms(60);
  101.         }
  102. }
  103. void NBX()
  104. {
  105.         r1=1;
  106.         y1=0;
  107.         g1=0;
  108.         r2=0;
  109.         y2=0;
  110.         g2=1;
  111. }
  112. void DXX()
  113. {
  114.         r1=0;
  115.         y1=0;
  116.         g1=1;
  117.         r2=1;
  118.         y2=0;
  119.         g2=0;
  120. }
  121. void Timer0_Init()  // 定时器0初始化函数  
  122. {  
  123.     TMOD &= 0xF0;  // 清除Timer0模式位  
  124.     TMOD |= 0x01;  // 设置Timer0为模式1(16位定时/计数器模式)  
  125.     TH0 = (65536 - 50000) / 256;  // 设置定时器初值,这里设置为50ms溢出一次  
  126.     TL0 = (65536 - 50000) % 256;  
  127.     ET0 = 1;  // 使能Timer0中断  
  128.     EA = 1;  // 使能全局中断  
  129.     TR0 = 1;  // 启动Timer0  
  130. }
  131. void Timer0_ISR (void) interrupt 1  // Timer0中断服务程序  
  132. {  
  133.                 static unsigned int count = 0;  // 静态变量,用于计数  
  134.     TH0 = (65536 - 50000) / 256;  // 重新加载定时器初值  
  135.     TL0 = (65536 - 50000) % 256;  
  136.     count++;  // 计数器加1  
  137.     if (count >= 5)  // 如果计数到20,即1秒到达  
  138.     {  
  139.         count = 0;  // 清零计数器  
  140.         // 在这里添加需要每秒执行的操作,例如更新LED状态、打印日志等  
  141.                         
  142.                  num1++;
  143.                 if(num1==50)
  144.                         {
  145.                                 num2=1;
  146.                         }
  147.                 else if(num1==60)
  148.                         {
  149.                                 num2=2;
  150.                         }
  151.                 else if(num1==110)
  152.                         {
  153.                                 num2=3;
  154.                         }        
  155.                 else if(num1==120)
  156.                         {
  157.                                 num2=0;
  158.                                 num1=0;
  159.                         }               
  160.         }
  161. }
复制代码

Proteus仿真是8.17版本的,其他版本打开会报错: 交通灯.7z (193.18 KB, 下载次数: 12)
回复

使用道具 举报

ID:961114 发表于 2024-5-8 17:27 | 显示全部楼层
还得是STC8H8K64U 带硬件USB,可以USB仿真 USB下载   
软件仿真可以淘汰了
回复

使用道具 举报

ID:406814 发表于 2024-6-7 00:51 | 显示全部楼层
STC89C52 的库文件可以分享一下吗? 我不缺例子,我缺的是STC89C52 的proteus使用的lib文件
回复

使用道具 举报

ID:253767 发表于 2024-6-7 06:11 | 显示全部楼层
durongze 发表于 2024-6-7 00:51
STC89C52 的库文件可以分享一下吗? 我不缺例子,我缺的是STC89C52 的proteus使用的lib文件

我也是这样。请楼主给予分享。谢谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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