找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1559|回复: 5
打印 上一主题 下一主题
收起左侧

简单的交通灯,为什么进不了中断

[复制链接]
跳转到指定楼层
楼主
#include <reg52.h>

#define u8 unsigned int
#define u16 unsigned char
#define GPIO_dig P0
#define GPIO_traffic P1

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

sbit RED_1=P1^0;
sbit GREEN_1=P1^1;
sbit RED_2=P1^2;
sbit YELLOW_2=P1^3;
sbit GREEN_2=P1^4;
sbit RED_3=P1^5;
sbit YELLOW_3=P1^6;
sbit GREEN_3=P1^7;
sbit RED_4=P3^1;
sbit GREEN_4=P3^0;

u8 code smgduan[17]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

u8 DisplayData[8];
u8 second;

void delay(u16 z)
{
    while(z--);
}

void DigDisplay()
{
    u8 i;
    for(i=0; i<8; i++)
    {
        switch(i)
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//显示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//显示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//显示第2位
            case(3):
                LSA=1;LSB=1;LSC=0; break;//显示第3位
            case(4):
                LSA=0;LSB=0;LSC=1; break;//显示第4位
            case(5):
                LSA=1;LSB=0;LSC=1; break;//显示第5位
            case(6):
                LSA=0;LSB=1;LSC=1; break;//显示第6位
            case(7):
                LSA=1;LSB=1;LSC=1; break;//显示第7位            
        }
        GPIO_dig=DisplayData[i];
        delay(100);
        GPIO_dig=0x00;
    }
}

void Time0Init()
{
    TMOD|=0x01;
    TH0=0xFC;
    TL0=0x18;
    EA=1;
    ET0=1;
    TR0=1;
}

void main()
{
    second=1;
    Time0Init();
    while(1)
    {
        if(second==70)
        {
            second=1;
        }
        if(second < 31)
        {
            DisplayData[0] = 0x00;
            DisplayData[1] = 0x00;
            DisplayData[2] = smgduan[(30 - second) % 100 / 10];
            DisplayData[3] = smgduan[(30 - second) %10];
            DisplayData[4] = 0x00;
            DisplayData[5] = 0x00;
            DisplayData[6] = DisplayData[2];
            DisplayData[7] = DisplayData[3];
            DigDisplay();

            GPIO_traffic=0xff;
            RED_4=1;
            GREEN_4=1;

            GREEN_2=0;
            GREEN_1=0;
            RED_3=0;
            RED_4=0;
        }        

        else if(second < 36)
        {
            DisplayData[0] = 0x00;
            DisplayData[1] = 0x00;
            DisplayData[2] = smgduan[(35 - second) % 100 / 10];
            DisplayData[3] = smgduan[(35 - second) %10];
            DisplayData[4] = 0x00;
            DisplayData[5] = 0x00;
            DisplayData[6] = DisplayData[2];
            DisplayData[7] = DisplayData[3];
            DigDisplay();

            GPIO_traffic=0xff;
            RED_4=1;
            GREEN_4=1;

            GREEN_1=0;
            YELLOW_2=0;
            YELLOW_3=0;
            RED_4=0;
        }        

        else if(second < 66)
        {
            DisplayData[0] = 0x00;
            DisplayData[1] = 0x00;
            DisplayData[2] = smgduan[(65 - second) % 100 / 10];
            DisplayData[3] = smgduan[(65 - second) %10];
            DisplayData[4] = 0x00;
            DisplayData[5] = 0x00;
            DisplayData[6] = DisplayData[2];
            DisplayData[7] = DisplayData[3];
            DigDisplay();

            GPIO_traffic=0xff;
            RED_4=1;
            GREEN_4=1;
            
            RED_1=0;
            RED_2=0;
            GREEN_3=0;
            GREEN_4=0;
        }        

        else
        {
            DisplayData[0] = 0x00;
            DisplayData[1] = 0x00;
            DisplayData[2] = smgduan[(70 - second) % 100 / 10];
            DisplayData[3] = smgduan[(70 - second) %10];
            DisplayData[4] = 0x00;
            DisplayData[5] = 0x00;
            DisplayData[6] = DisplayData[2];
            DisplayData[7] = DisplayData[3];
            DigDisplay();

            GPIO_traffic=0xff;
            RED_4=1;
            GREEN_4=1;
            
            YELLOW_2=0;
            RED_1=0;
            YELLOW_3=0;
            GREEN_4=0;   
        }
    }
}

void Time0() interrupt 1
{
    static u16 a;
    TH0=0xFC;
    TL0=0x18;
    a++;
    if(a == 1000)
    {
        a=0;
        second ++;
    }
}



IMG20180221224747.jpg (4.86 MB, 下载次数: 32)

IMG20180221224747.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:284681 发表于 2018-2-21 22:50 | 只看该作者
数码管不走路
回复

使用道具 举报

板凳
ID:284696 发表于 2018-2-22 08:45 | 只看该作者
要开中断的
回复

使用道具 举报

地板
ID:231046 发表于 2018-2-22 08:46 | 只看该作者
void main()
{
    second=1;
  //  Time0Init();
不用调用
回复

使用道具 举报

5#
ID:213173 发表于 2018-2-22 09:48 | 只看该作者
因为你使用的数据类型与宏定义数据类型不一致,char是8位,int是16位.
#define u8 unsigned int
#define u16 unsigned char
void Time0() interrupt 1
{
    static u16 a;
    TH0=0xFC;
    TL0=0x18;
    a++;
    if(a == 1000)  //超过255
    {
        a=0;
        second ++;
    }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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