基于STC89C51实现红绿灯模拟(附源码+操作过程)

本次模拟使用两组红绿灯

  1. 组一绿灯亮3s后闪烁三次(组二红灯持续亮)
  2. 绿灯闪烁后熄灭,黄灯闪烁6次(组二红灯持续亮)
  3. 组二红灯熄灭,组一红灯亮,组二绿灯亮3s后闪烁三次(组一红灯持续亮)
  4. 绿灯闪烁后熄灭,黄灯闪烁6次(组一红灯持续亮)
  5. ......循环上面步骤

硬件连接

硬件:普中-7STC89C516RD+

基于STC89C51实现红绿灯模拟(附源码+操作过程)_第1张图片基于STC89C51实现红绿灯模拟(附源码+操作过程)_第2张图片

 绿灯D3(led3)接P21、 黄灯D4(led4)接P22、 红灯D5(led5)接P23

 绿灯D6(led6)接P24、 黄灯D7(led7)接P25、 红灯D8(led8)接P26

sbit led1 = P2 ^ 0; //定义管脚
//组一
sbit led3 = P2 ^ 1;//绿灯
sbit led4 = P2 ^ 2;//黄灯
sbit led5 = P2 ^ 3;//红灯
//组二
sbit led6 = P2 ^ 4;
sbit led7 = P2 ^ 5;
sbit led8 = P2 ^ 6;

延时函数------STC-ISP自动生成

基于STC89C51实现红绿灯模拟(附源码+操作过程)_第3张图片

void Delay3000ms()      //延时1000ms(1s=1000ms=1000000us) STC-ISP内生成的函数
{
    unsigned char i, j, k;

    i = 22;
    j = 3;
    k = 227;
    do
    {
        do
        {
            while (--k);
        }
        while (--j);
    }
    while (--i);
}

void Delay500ms()		//延时500ms(1s=1000ms=1000000us)
{
	unsigned char i, j, k;

	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

 

 亮灯函数编写

void Green1()
{
    led3 = 0; //组一绿灯亮
    Delay3000ms();
    led3 = 1; //组一绿灯灭
    for (i = 0; i < 3; i++) //绿灯闪烁3次
    {
        led3 = 0;
        Delay500ms();//发光到熄灭之间的时间间隔
        led3 = 1;
        Delay500ms();//熄灭后到下一次发光之间的时间间隔
    }
}

void yellow1()
{
    //黄灯闪烁6次
    for (i = 0; i < 6; i++)
    {
        led4 = 0; //黄灯亮
        Delay500ms();//发光到熄灭之间的时间间隔
        led4 = 1; //黄灯灭
        Delay500ms();//熄灭后到下一次发光之间的时间间隔
    }
}

void Green2()
{
    led6 = 0; //组一绿灯亮
    Delay3000ms();
    //绿灯闪烁3次
    for (i = 0; i < 3; i++)
    {
        led6 = 0;
        Delay500ms();//发光到熄灭之间的时间间隔
        led6 = 1;
        Delay500ms();//熄灭后到下一次发光之间的时间间隔
    }
}

void yellow2()
{
    //黄灯闪烁
    for (i = 0; i < 6; i++)
    {
        led7 = 0; //黄灯亮
        Delay500ms();//发光到熄灭之间的时间间隔
        led7 = 1; //黄灯灭
        Delay500ms();//熄灭后到下一次发光之间的时间间隔
    }
}

完整代码

#include "reg52.h"

//定义管脚
//组一
sbit led3 = P2 ^ 1;//绿灯
sbit led4 = P2 ^ 2;//黄灯
sbit led5 = P2 ^ 3;//红灯
//组二
sbit led6 = P2 ^ 4;
sbit led7 = P2 ^ 5;
sbit led8 = P2 ^ 6;

int i;

void Delay3000ms()      //延时1000ms(1s=1000ms=1000000us) STC-ISP内生成的函数
{
    unsigned char i, j, k;

    i = 22;
    j = 3;
    k = 227;
    do
    {
        do
        {
            while (--k);
        }
        while (--j);
    }
    while (--i);
}

void Delay500ms()		//延时500ms(1s=1000ms=1000000us)
{
	unsigned char i, j, k;

	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void Green1()
{
    led3 = 0; //组一绿灯亮
    Delay3000ms();
    led3 = 1; //组一绿灯灭
    for (i = 0; i < 3; i++) //绿灯闪烁3次
    {
        led3 = 0;
        Delay500ms();//发光到熄灭之间的时间间隔
        led3 = 1;
        Delay500ms();//熄灭后到下一次发光之间的时间间隔
    }
}

void yellow1()
{
    //黄灯闪烁6次
    for (i = 0; i < 6; i++)
    {
        led4 = 0; //黄灯亮
        Delay500ms();//发光到熄灭之间的时间间隔
        led4 = 1; //黄灯灭
        Delay500ms();//熄灭后到下一次发光之间的时间间隔
    }
}

void Green2()
{
    led6 = 0; //组一绿灯亮
    Delay3000ms();
    //绿灯闪烁3次
    for (i = 0; i < 3; i++)
    {
        led6 = 0;
        Delay500ms();//发光到熄灭之间的时间间隔
        led6 = 1;
        Delay500ms();//熄灭后到下一次发光之间的时间间隔
    }
}

void yellow2()
{
    //黄灯闪烁
    for (i = 0; i < 6; i++)
    {
        led7 = 0; //黄灯亮
        Delay500ms();//发光到熄灭之间的时间间隔
        led7 = 1; //黄灯灭
        Delay500ms();//熄灭后到下一次发光之间的时间间隔
    }
}

void main()
{
    while (1)
    {
        led8 = 0; //第二组红灯亮
        Green1();
        yellow1();
        led8 = 1; //第二组红灯灭
        led5 = 0; //第一组红灯亮
        Green2();
        yellow2();
        led5 = 1; //第一组红灯灭
    }
}

在keil编写完代码后运行,连接单片机,打开STC-ISP,按如下图操作,若单片机提前通电,在点击下载/编程后需要重新上电(按开关重启)方可成功,加油

基于STC89C51实现红绿灯模拟(附源码+操作过程)_第4张图片基于STC89C51实现红绿灯模拟(附源码+操作过程)_第5张图片

 

 

 

你可能感兴趣的:(c++,开发语言,单片机,c语言)