奶爸业余单片机学习之:用数码管及LED实现交通灯(初版)

/*

* 人行道交通灯程序:LED2(红灯)、LED3(黄灯)、LED4(绿灯)
* 红灯30秒,绿灯3秒,绿灯15秒,倒计时
灯亮时间显示在数码管上
* 晶振11.0592MHz,LED、数码管由三八译码器控制,T0中断

*程序思路:由于三八译码器每次只能输出一个低电平,因此必须用动态扫描方式点亮数码管及LED,中断间隔1ms

*亮灯时间倒数,红灯60秒,绿灯20秒,黄灯3秒,顺序:红 - 绿 -黄 -红循环,因此每经历1000次中断,实现数字递减。

*/

#include<reg52.h>
unsigned char K;//1s定时标志
unsigned char SMG_BUFFER[2]={0xff,0xff};//数码管显示缓冲

unsigned char RED,YELLOW,GREEN;
sbit LED2_RED = P0^0; //红灯接口
sbit LED3_YELLOW = P0^1;//黄灯接口
sbit LED4_GREEN = P0^2; //绿灯接口

//三八译码器控制数码管,个位:01000,十位:01001
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED1 = P1^4;

//数码管0~9
unsigned char code SMG[10]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//数码管显示
void SMG_DISPLAY()
{
  unsigned char SHIJIAN;//灯亮时间
  static unsigned char color = 0;//颜色标志:0:红灯,1:黄灯,2:绿灯 ,默认从红灯开始
  if(SHIJIAN <= 1)//倒数到1秒时,开始变化,
  {
    switch(color)
    {
    case 0:color = 2;SHIJIAN = 10;RED = 1;break;//红灯60秒,结束后红转绿,红灯标志位置1
    case 1:color = 0;SHIJIAN = 3;YELLOW = 1;break;//黄灯3秒,结束后黄转红,黄灯标志位置1
    case 2:color = 1;SHIJIAN = 20;GREEN = 1;break;//;绿灯20秒,结束后绿转黄,绿灯标志位置1
    default:break;
    }
  }
  else SHIJIAN--; //时间递减
  if(SHIJIAN == 1)//直到1,时间发生变化
  {
    RED = 0;YELLOW = 0; GREEN = 0;//各标志位置0
  }
  SMG_BUFFER[0] = SMG[SHIJIAN % 10];//数码管显示,个位
  SMG_BUFFER[1] = SMG[SHIJIAN / 10 % 10]; //十位
}

//定时器配置
void config_interruptime0()
{
  TMOD = TMOD & 0XF0;
  TMOD = TMOD | 0X01;
  TH0 = 0XFC;
  TL0 = 0X66;
  EA = 1;
  ET0 = 1;
  TR0 = 1;
}

void init()
{
  ADDR3 = 1;
  ENLED1 = 0;
}
int main()
{
  init();
  config_interruptime0();
  while(1)
  {
    if(K == 1)//检查1秒定时时间是否达到
    {
      K = 0;//K重置
      SMG_DISPLAY();//刷新显示
    }
  }
  return 0;
}

void interruptime0() interrupt 1
{
  static unsigned int cnt = 0;
  static unsigned int i = 0;
  TH0 = 0XFC; //1ms初值
  TL0 = 0X66;
  cnt++;

  switch(i)
  {
    case 0:P0 = 0XFF; ADDR0 = 0; ADDR1 = 0; ADDR2 = 0; i++; P0 = SMG_BUFFER[0];break;//数码管个位显示
    case 1:P0 = 0XFF; ADDR0 = 1; ADDR1 = 0; ADDR2 = 0; i++; P0 = SMG_BUFFER[1];break;//数码管十位显示
    case 2:P0 = 0XFF; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; i=0; //LED显示
    if(RED == 1)
    {
      LED2_RED = 0;
    }
    if(YELLOW == 1)
    {
      LED3_YELLOW = 0;
    }
    if(GREEN == 1)
    {
      LED4_GREEN = 0;
    }
    break;
  }
  if(cnt == 1000)
  {
    K = 1;//1秒时间达到时,K = 1
    cnt = 0;
  }
}

时间: 2024-10-11 00:24:44

奶爸业余单片机学习之:用数码管及LED实现交通灯(初版)的相关文章

奶爸业余单片机学习之:UART串口通信学习笔记(二)

/************************************** 串口通信实验* 晶振11.0592MHz* 波特率9600bps* 中断方式实现:单片机接收电脑数据,加1后发送回电脑***************************************/ #include<reg52.h> unsigned char dat; /**********串口通信配置*******************/void UART_CONFIG(unsigned long baud

奶爸业余单片机学习之:UART串口通信学习笔记(一)

UART串口通信,全名:异步串口通信 UART的四种工作模式:(0,1,2,3) 模式1:SM0 = 0; SM1 = 1;REN = 1  //由SCON(串行口控制寄存器)控制,可位寻址.10位异步收发(8位数据),波特率可变(由定时器1的溢出率控制) 模式1功能:以TXD为例,平时没数据时,TXD为高电平,需要发送数据时,先发送一个起始位0,然后发送八位数据位(一个字节),最后发送一位停止位1: REN位为允许串行接收位:REN = 1:允许串行口接收数据:REN = 0:禁止串行口接收数

奶爸业余单片机学习之:定时器使用方法——非中断,TF值软件重置法

============定时器使用方法——非中断,TF值软件重置法======== 第一:设置特殊功能寄存器TMOD,配置好工作模式. 第二:设置计数寄存器TH0和TL0的初值. 第三:设置TCON,通过TR0置1来让定时器开始计数. 第四:判断TCON寄存器的TF0位,监测定时器溢出情况.  实例: //LED由三极管及73HC138控制//用定时器0实现亮与灭之间的1秒时 # include <reg52.h> sbit led2 = P0^0; sbit addr0 = P1^0;sbi

奶爸业余单片机学习之:C语言基础——指针(指针变量)学习笔记

指针变量的定义: 存放地址的变量称为指针变量 1. 定义指针变量的一般形式如下: 类型名 * 指针变量名1,* 指针变量名2,... * 指针变量名n ; 例如:  int * X, *Y, *Z; 等同于: int * X; int * Y; int * Z; 实例: #include<stdio.h>void main(){    int x = 1;    int y = 2;    int* A;        //声明一个指向整形变量的指针变量A    int* B;        

奶爸业余单片机学习之:定时器中断的使用方法——进入中断TF0(TF1)值硬件自动重置

/*============定时器中断的使用方法—---TF0(TF1)值硬件重置法======== 第一:打开总中断第二:打开定时器 中断第三:设置特殊功能寄存器TMOD,配置好工作模式. 第四:设置计数寄存器TH0和TL0的初值. 第五:设置TCON,通过TR0置1来让定时器开始计数.*/ //LED由三极管及73HC138控制//用定时器0实现亮与灭之间的1秒延时 # include <reg52.h> sbit led2 = P0^0; sbit addr0 = P1^0;sbit a

奶爸程序员的“育儿”心得

自我介绍一下,本人以前是.net程序员,去年下半年负责把项目从.net转到java,并且有跨机房迁移,亿级访问量,app服务端项目. 自我吐槽一下,工作了8年了,没有成为架构师,也没有进入管理层,没有成为技术大师,也没能成为分享大师.一直在做业务,并在这条路上越走越远.有的时候觉得很尴尬,但又有的时候觉得还蛮适合自己.过年之前,老婆生了一个小公举.宝宝饿了,"老婆快来喂奶!",宝宝又饿了,"老婆快来喂奶!",宝宝睡醒了又饿了,"老婆快来喂奶!"-

Sencha Touch+PhoneGap打造超级奶爸之喂养记(一) 源码免费提供

起源 非常高兴我的宝宝健康平安的出生了.对于初次做奶爸的我,喜悦过后,面临着各中担心,担心宝宝各项指标是否正常.最初几天都是在医院待着,从出生那一天开始,护士妹妹隔一段时间就会来问宝宝的喂奶,大小便,体温等情况.我想医生们应该也是通过这些数据来分析宝宝是否健康.宝宝刚才出生的几天,吃喝,大小便很频繁,但又不方便记录,很容易遗漏,所以想做一个APP来记录宝宝的一些数据.最近正在学习Sencha Touch+PhoneGap,经过几天的开发,基本成型,目前我的宝宝一些数据都是用这个软件来记录的.同时

义隆单片机学习笔记之(四) 编程及烧录

工具说明: 1.UIDE,编程环境 2.UWriter:烧录软件 下载地址: (见官网) 一 UIDE  1.1 创建工程: 1.2 选择型号: 1.3 编程及编译 二 UWriter 2.1 安装 (Serial number在购买烧录器的时候,从代理经销商处获得!) 2.2 选择目标芯片  2.3 配置选择 (注:由于是OTP,很多功能都是在配置的时候指定,所以这里非常重要.晶振.时钟的选择,延时程序要与之对应: 是否需要保护等,根据自己的需要而定) 编译之后生成的.map文件,详细的描述了

[51单片机学习笔记ONE]-----LED灯的多种使用方法

一.交替闪烁8个LED灯,时间间隔为1s 1 /****************************************************** 2 实验名称: 交替闪烁8个LED灯,时间间隔1s 3 实验时间: 2014年12月2日 4 ******************************************************/ 5 6 #include <reg51.h> 7 8 void delay(unsigned char a); 9 10 void m