吴鉴鹰51单片机学习—中断、定时器同时点亮数码管和LED各种效果

LED闪烁有5种效果,数码管点亮有3种效果,包含小彩蛋哟

实现代码如下:

//#include <reg52.h>
#include <REGX52.H>

//typedef unsigned char uchar;
#define uchar unsigned char

sbit HC595_RCK = P0^6;
sbit HC595_SCK = P0^5;
sbit HC595_DATA = P0^7;

uchar LED_1_ARRAY[2] = {0x00, 0x00};

//点亮LED
void send_data(uchar l_one, uchar l_two)
{
    uchar i;
    HC595_RCK = 0;
    for(i = 0; i < 8; i++)
    {
        HC595_SCK = 0;
        HC595_DATA = l_one & 0x80? 1 : 0;
        l_one = l_one << 1;
        HC595_SCK = 1;
    }
    for(i = 0; i < 8; i++)
    {
        HC595_SCK = 0;
        HC595_DATA = l_two & 0x80? 1 : 0;
        l_two = l_two << 1;
        HC595_SCK = 1;
    }
    HC595_RCK = 1;
}

//led 效果1
code uchar Led8_One_Array[16] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
code uchar Led8_Two_Array[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

//led 效果2
code unsigned char Led8_One2_Array[16] = {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
code unsigned char Led8_Two2_Array[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF};

//led 效果4
code unsigned char Led8_One4_Array[16] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
code unsigned char Led8_Two4_Array[16] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

//led 效果5
code unsigned char Led8_One5_Array[17] = {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00};
code unsigned char Led8_Two5_Array[17] = {0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00};

sbit HC595_RCK2 = P1^0;
sbit HC595_SCK2 = P1^1;
sbit HC595_DATA2 = P1^4;

code uchar SM_Array[11] = {0x3F, 0x06, 0x5B, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7F, 0x6F, 0x00};
code uchar SHU_Wei_Array[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};

//数码管 520效果
code unsigned char SHU_Duan2_Array[8] = {0, 5, 2, 0, 1, 3, 1, 4};

//数码管显数
void Shu_Show_Data(uchar Data_One, uchar Data_Two)
{
    uchar i;
    HC595_RCK2 = 0;
    for(i = 0; i < 8; i++)
    {
        HC595_SCK2 = 0;
        HC595_DATA2 = Data_One & 0x80? 1 : 0;
        Data_One = Data_One << 1;
        HC595_SCK2 = 1;
    }
    for(i = 0; i < 8; i++)
    {
        HC595_SCK2 = 0;
        HC595_DATA2 = Data_Two & 0x80? 1 : 0;
        Data_Two = Data_Two << 1;
        HC595_SCK2 = 1;
    }
    HC595_RCK2 = 1;
}

void time0_init()
{
    TMOD = 0x01;  //设置 T0 为模式 1
    TH0 = 0xFC;  //为 T0 赋初值 0xFC67,定时 1ms
    TL0 = 0x66;
    TR0 = 1;
    
    EA = 1;  //使能总中断
    ET0 = 1;  //使能 T0 中断
}

unsigned int cnt = 0, cnt2 = 1, sec = 0;  //记录 T0 中断次数

uchar led_p_type = 1;//led效果,共5种
uchar led_run_c = 0;//led运行次数
char led_i = 0;//led内部计数
uchar led_giv = 0;//led公共计数变量

uchar shu_sec_array[8] = {0x00};
uchar shu_p_type = 1;//数码管效果,共4种
uchar shu_run_c = 0;//数码管运行次数
char shu_i = 0;//数码管内部计数
uchar shu_giv = 0;//数码管公共计数变量
uchar ii;//数码管循环变量
uchar iii = 0;//数码管延时大循环
uchar iiii = 0;//数码管延时大循环2

void main()
{

    time0_init();
    while(1)
    {
        if(cnt == 200)//0.2s
        {
            cnt = 0;
            switch(shu_p_type) {
                case 1:
                    if(iiii == 0) {
                        shu_giv = shu_i % 8;
                        for(ii = 0; ii < 8; ii++) {
                            if(ii == shu_giv) {
                                shu_sec_array[ii] = iii;
                            } else {
                                shu_sec_array[ii] = 10;
                            }
                        }
                        if(shu_giv == 7) {
                            shu_run_c ++;
                            shu_i = 0;
                            if(shu_run_c == 2) {
                                shu_run_c = 0;
                                shu_p_type ++;
                                shu_giv = 0;
                                iii = 0;
                                iiii = 0;
                                break;
                            }
                        }
                        iii ++;
                        if(iii == 10) {
                            shu_i ++;
                            iii = 0;
                        }
                    }
                    iiii ++;
                    if(iiii == 2) iiii = 0;
                break;
                case 2:
                    if(iii == 0) {
                        shu_giv = shu_i % 10;
                        for(ii = 0; ii < 8; ii++)
                            shu_sec_array[ii] = shu_giv;
                        shu_i ++;
                        if(shu_giv == 9) {
                            shu_run_c ++;
                            shu_i = 0;
                            if(shu_run_c == 2) {
                                shu_run_c = 0;
                                shu_p_type ++;
                                shu_giv = 0;
                                iii = 0;
                                break;
                            }
                        }
                    }
                    iii ++;
                    if(iii == 2) iii = 0;
                break;
                case 3:
                    for(ii = 0; ii < 8; ii++)
                        shu_sec_array[ii] = SHU_Duan2_Array[ii];
                    if(shu_i % 8 == 7) {
                        shu_run_c ++;
                        shu_i = 0;
                        if(shu_run_c == 3) {
                            shu_run_c = 0;
                            shu_p_type ++;
                            shu_giv = 0;
                            break;
                        }
                    }
                    shu_i ++;
                break;
                case 4:
                    sec ++;
                    shu_sec_array[7] = sec / 1 % 10;
                    shu_sec_array[6] = sec / 10 % 10;
                    shu_sec_array[5] = sec / 100 % 10;
                    shu_sec_array[4] = sec / 1000 % 10;
                    shu_sec_array[3] = sec / 10000 % 10;
                    shu_sec_array[2] = sec / 100000 % 10;
                    shu_sec_array[1] = sec / 1000000 % 10;
                    shu_sec_array[0] = sec / 10000000 % 10;
                break;
            }
        }

        if(cnt2 == 300) {//0.3s
            cnt2 = 0;
            switch(led_p_type) {
                case 1:
                    led_giv = led_i % 32;
                    if(led_giv < 16) {
                        LED_1_ARRAY[0] = Led8_One_Array[led_giv];
                        LED_1_ARRAY[1] = Led8_Two_Array[led_giv];
                    } else {
                        LED_1_ARRAY[0] = Led8_One_Array[31 - led_giv];
                        LED_1_ARRAY[1] = Led8_Two_Array[31 - led_giv];
                    }
                    led_i ++;
                    if(led_i == 32) {
                        led_run_c ++;
                        led_i = 0;
                        if(led_run_c == 2) {
                            LED_1_ARRAY[0] = Led8_Two2_Array[0];
                            LED_1_ARRAY[1] = Led8_Two2_Array[0];
                            led_run_c = 0;
                            led_p_type ++;
                            led_giv = 0;
                            break;
                        }
                    }
                break;
                case 2:
                    led_giv = led_i % 16;
                    LED_1_ARRAY[0] = Led8_One2_Array[led_giv];
                    LED_1_ARRAY[1] = Led8_Two2_Array[led_giv];
                    led_i ++;
                    if(led_i == 16) {
                        led_run_c ++;
                        led_i = 0;
                        if(led_run_c == 3) {
                            LED_1_ARRAY[0] = Led8_Two2_Array[0];
                            LED_1_ARRAY[1] = Led8_Two2_Array[0];
                            led_run_c = 0;
                            led_p_type ++;
                            led_giv = 0;
                            break;
                        }
                    }
                break;
                case 3:
                    if(led_i % 2 == 0) {
                        LED_1_ARRAY[0] = Led8_Two2_Array[15];
                        LED_1_ARRAY[1] = Led8_Two2_Array[15];
                    } else {
                        LED_1_ARRAY[0] = Led8_Two2_Array[0];
                        LED_1_ARRAY[1] = Led8_Two2_Array[0];
                    }
                    led_i ++;
                    if(led_i == 2) {
                        led_run_c ++;
                        led_i = 0;
                        if(led_run_c == 6) {
                            LED_1_ARRAY[0] = Led8_Two2_Array[0];
                            LED_1_ARRAY[1] = Led8_Two2_Array[0];
                            led_run_c = 0;
                            led_p_type ++;
                            led_giv = 0;
                            break;
                        }
                    }
                break;
                case 4:
                    led_giv = led_i % 16;
                    LED_1_ARRAY[0] = Led8_One4_Array[led_giv];
                    LED_1_ARRAY[1] = Led8_Two4_Array[led_giv];
                    led_i ++;
                    if(led_i == 16) {
                        led_run_c ++;
                        led_i = 0;
                        if(led_run_c == 3) {
                            LED_1_ARRAY[0] = Led8_Two2_Array[0];
                            LED_1_ARRAY[1] = Led8_Two2_Array[0];
                            led_run_c = 0;
                            led_p_type ++;
                            led_giv = 0;
                            break;
                        }
                    }
                break;
                case 5:
                    led_giv = led_i % 17;
                    LED_1_ARRAY[0] = Led8_One5_Array[led_giv];
                    LED_1_ARRAY[1] = Led8_Two5_Array[led_giv];
                    led_i ++;
                    if(led_i == 17) {
                        led_run_c ++;
                        led_i = 0;
                        if(led_run_c == 3) {
                            LED_1_ARRAY[0] = Led8_Two2_Array[0];
                            LED_1_ARRAY[1] = Led8_Two2_Array[0];
                            led_run_c = 0;
                            led_p_type = 1;
                            led_giv = 0;
                            break;
                        }
                    }
                break;
            }
        }
    }
}

uchar p = 0;

/* 定时器 0 中断服务函数 */
void InterruptTimer0() interrupt 1{
    TH0 = 0xFC;  //重新加载初值
    TL0 = 0x66;
    cnt++;  //中断次数计数值加 1
    cnt2++;

    Shu_Show_Data(SM_Array[shu_sec_array[p]], SHU_Wei_Array[p++]);
    if(p == 8) p = 0;
    
    send_data(LED_1_ARRAY[0], LED_1_ARRAY[1]);

}

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值