C51单片机项目:红绿灯

#include<reg52.h>
sbit ENLCD=P1^5;
sbit ENLED=P1^4;
sbit ADDR3=P1^3;
sbit ADDR2=P1^2;
sbit ADDR1=P1^1;
sbit ADDR0=P1^0;

unsigned char ge1=5,shi1=1,ge2=0,shi2=1,LED1;
unsigned long cnt=0,n=0,j=0;
unsigned char LED[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void dongxi();
void nanbei();
void dongxishu(unsigned char sec);
void nanbeishu(unsigned char sec);

void delay()
{
    unsigned int i;
      for(i=0;i<=1000;i++);
}
void main()
{
    ENLCD=0;
    ENLED=0;
    ADDR3=1;
    EA=1;
    ET1=1;
       TMOD=0x10;
       TH1=0xFC;
       TL1=0x66;
       TR1=1;
    while(1){
        if(0<cnt && cnt<=10000)
        {LED1=0x7E;}//0111 1110
        else if(10000<cnt && cnt<=15000)
        {LED1=0xBE;}//0111 1101
        else if(15000<cnt && cnt<=25000)
        {LED1=0xDB;}
        else if(25000<cnt && cnt<=30000)
        {LED1=0xBD;
        cnt=0;}

        dongxi(); //东西数码管的显示
        nanbei(); //南北对应数码管的显示

    }
}
void nanbei()
{ //8s---0s---2s---0s---8s---0s…………
    static unsigned char a=0,m=10;
    if(n==1000){
        n=0;
        m--;//8s
        nanbeishu(m);
    }
    if(m==0){
        a++;
        if(a==1){
            m=5;  //2s
        }
        else if(a==2){
            m=15;a=0;  //8s
        }
    }

}
void dongxi()
{ //8s---0s---2s---0s---8s---0s…………
    static unsigned char a=0,k=15;
    if(j==1000){
        j=0;
        k--; //8s
        dongxishu(k);
    }
    if(k==0){
        a++;
        if(a==1){
            k=10;  //2s
        }
        else if(a==2){
            k=5;a=0;  //8s
        }
    }

}

void dongxishu(unsigned char sec)
{
    ge1=sec%10;
    shi1=sec/10%10;
}

void nanbeishu(unsigned char sec1)
{
    ge2=sec1%10;
    shi2=sec1/10%10;
}

void interrupt_deng()interrupt 3
{
    static unsigned char i=0;
    TH1 = 0xFC;
    TL1 = 0X66;      //cnt为LED灯的秒数
    cnt++;j++,n++;//j为东西方向数码管的秒数,n为南北方向数码管的秒数
    switch(i)
    {
    case 0: ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=LED[ge1];break;//东西数码管
    case 1: ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=LED[shi1];break;//东西数码管
    case 2: ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=LED[ge2];break;//南北数码管
    case 3: ADDR2=1;ADDR1=0;ADDR0=1;i++;P0=LED[shi2];break;//南北数码管
    case 4:    ADDR2=1;ADDR1=1;ADDR0=0;P0=LED1;i=0;break;
    }
}    

东西方向一组红黄绿灯,南北方向一组红黄绿灯,倒计时秒数在数码管上显示。

  东西方向 南北方向  
时间 红(led0) 黄(led1) 绿(led2) 红(led5) 黄(led6) 绿(led7) P0
10s 亮 15s         亮 10s 01111110    0x7E
5s       亮 5s   10111110    0xBE
10s     亮 10s 亮 15s     11011011    0xDB
5s   亮 5s       11011101    0xBD
时间: 2024-10-14 04:55:17

C51单片机项目:红绿灯的相关文章

C51单片机项目:时钟

#include<reg52.h> sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; sbit ENLCD = P1^5; sbit KeyIn2 = P2^5; sbit KeyIn3 = P2^6; sbit BUZZ = P1^6; unsigned char LED[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF

新唐单片机项目总结

最近做了两个单片机项目,新唐的029和mini58ZDE的MCU,都是cortex-M0,一个厂家所以API基本一致,大致了解了串口中断及定时器功能以及ADC采样相关的编程内容. 4G项目即mini58zde,主要是从GPS中读数据然后从另外一个串口转发出去 GPS模块  ------ 串口1接收 ----数据处理组包 -----串口0发送------上位机 GPS模块是不断地有数据来,数据格式为 $GNRMC,014053.00,A,3205.65222,N,11853.26056,E,0.0

C51单片机实现呼吸灯和花样流水灯程序

1.用C51单片机实现花样流水灯,代码如下: #include <reg52.h> #define LED_A P1 //led灯所用的接口,是哪个口就写P几void delayms(){ unsigned char x = 0; unsigned char i; unsigned char y = 0; while(y < 0.001) //定义led灯的切换的延时时间,越小越快. {   //(y < 0.001);(x<100);(i<100)都可以修改 x =

51单片机

STARTUP.A51//启动文件. 清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的main函数 <reg51.h>  //特殊寄存器的字节地址和位地址,sfr定义字节变量.sbit定义位变量,用通俗名作为变量名,并赋地址值,从而用名称来使用这些特殊寄存器. <intrins.h> //定义了一些外部函数,在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便. /*-----------------------------

8位单片机可用的 mktime localtime函数

8位单片机可用的 mktime  localtime函数及源码 最近在做一个8位单片机项目,其中用到了时间戳转换函数,这个在32位机上一个库函数就解决了问题,没想到在8位单片机中没有对应库(time.h),没有办法只有自己来写. 目标:1,满足和库函数mktime  localtime所计算出的数据一至:2,考虑8位单片机的处理能力慢软件效率问题. 分享给大家,方便有同样需求的朋友. gcc 环境进行测试: 测试程序: 1 #include <stdio.h> 2 #include <s

Arduino和C51开发光敏传感器

技术:51单片机.Arduino.光敏传感器.PCF8591.AD/DA转换 概述 本文介绍了如何接收传感器的模拟信号和如何使用PCF8591 AD/DA转换模块对光敏传感器的模拟信号进行转换.讲述了51单片机和Arduino如何读取模拟信号,并通过串口实时显示出来. 详细 代码下载:http://www.demodashi.com/demo/14737.html 一.光敏传感器 光敏传感器是利用光敏元件将光信号转换为电信号的传感器,它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长.光传

单片机的非OS的事件驱动

单片机的非OS的事件驱动 Part 1 前言 很多单片机项目恐怕都是没有操作系统的前后台结构,就是main函数里用while无限循环各种任务,中断处理紧急任务.这种结构最简单,上手很容易,可是当项目比较大时,这种结构就不那么适合了,编写代码前你必须非常小心的设计各个模块和全局变量,否则最终会使整个代码结构杂乱无序,不利于维护,而且往往会因为修改了某部分代码而莫名其妙的影响到其他功能,而使调试陷入困境. 改变其中局面的最有效措施当然是引入嵌入式操作系统,但是大多数的操作系统都是付费的(特别是商业项

51单片机头文件

intrins.h 在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便. 内部函数 描述 _crol_ 字符循环左移 _cror_ 字符循环右移 _irol_ 整数循环左移 _iror_ 整数循环右移 _lrol_ 长整数循环左移 _lror_ 长整数循环右移 _nop_ 空操作8051 NOP 指令 _testbit_ 测试并清零位8051 JBC 指令 reg51.h at89x51.h文件中对P1.1的操作是写成P1_1 reg51.h文件中对P1.

STC15系列单片机教程之一:OneLED

STC15系列单片机教程之一:OneLED STC15系列单片机教程之一:OneLED一.开发软件准备二.STC15F2K60S单片机IO分配三.程序编写1.Keil 新建项目2.编写程序3. 程序的编译四.固件下载总结 本系列教程开始学习STC15系列单片机的C语言编程,读者需要有C语言的基础知识. 一.开发软件准备 1. 安装编程软件:Keil 2. 下载软件STC_Isp 3. 配置keil下的STC单片机编程环境 点击添加信号和头文件到Keil中,为 keil软件添加STC系列单片机器件