单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:908|回复: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, 下载次数: 10)
沙发
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 单片机教程网