蓝桥杯单片机-小蜜蜂老师-工厂灯光控制系统(P15代码)

1.代码

  1. HEADFILE.h

#ifndef __HEADFILE_H_
#define __HEADFILE_H_

#include <STC15F2K60S2.H>
#define Y4 P2 = (P2 & 0x1f) | 0x80
#define Y5 P2 = (P2 & 0x1f) | 0xa0
#define Y6 P2 = (P2 & 0x1f) | 0xc0
#define Y7 P2 = (P2 & 0x1f) | 0xe0
#define Y0 P2 = (P2 & 0x1f) | 0x00

#include"LED.h"
#include"KEY.h"
#include"SEG.h"
#include"TIMER.h"
#include"UART.h"
#include"DELAY.h"

#endif
  1. main.c

#include"HEADFILE.h"

void main()
{
    System_Init();
    LED_Running();
    SEG_Running();
    Timer0_Init();
    UART_Init();
    while(1)
    {
        Timer0_Service();
        SEG_CLOCK();
        Working();
        Key_Scan();
    }
}
  1. LED.c

#include"HEADFILE.h"

void System_Init()
{
    Y5;
    P0 = 0x00;                               
    Y4;
    P0 = 0xff;                                
    Y0;
}

void LED_Running()
{
    unsigned char i=0;
    Y4;
    for(i=0; i<8; i++)                
    {
        P0 = 0xfe << i;
        Delay(100);
    }
    for(i=0; i<8; i++)               
    {
        P0 = ~(0xfe << i);
        Delay(100);
    }
    Y0;
}
  1. LED.h

#ifndef __LED_H_
#define __LED_H_

void LED_Running();
void System_Init();

#endif
  1. SEG.c

#include"HEADFILE.h"

unsigned char code SEG_duanma[] = {0xc0,0xf9,0xa4,0xb0,0x99,
                                                                     0x92,0x82,0xf8,0x80,0x90,
                                                                     0xbf,0x00,0xff};

void SEG_Running()
{
    unsigned char i;
    for(i=0; i<=8; i++)
    {
        Y6;
        P0 = ~(0xff<<i);
        Y7;
        P0 = 0x00;
        Delay(100);
        Y0;
    }
    for(i=1; i<=8; i++)
    {
        Y6;
        P0 = 0xff<<i;
        Y7;
        P0 = 0x00;
        Delay(100);
        Y0;
    }
}

void SEG_Display_Bit(unsigned char position,number)
{
    Y6;
    P0 = 0x01 << (position - 1);
    Y7;
    P0 = SEG_duanma[number];
    Delay(1);
}    
  1. SEG.h

#ifndef __SEG_H_
#define __SEG_H_

void SEG_Running();
void SEG_Display_Bit(unsigned char position,number);

#endif
  1. KEY.c

#include"HEADFILE.h"

sbit L7 = P0^6;
sbit L8 = P0^7;
sbit S5 = P3^2;
sbit S4 = P3^3;

unsigned char LED_state = 0xff;

void Key_Scan()                                       
{
    if(S4 == 0)
    {
        Delay(10);
        while(S4 == 0)
        {
            Timer0_Service();
            SEG_CLOCK();
        }
        LED_state = (LED_state | 0x80) & (~LED_state | 0x7f);
        Y4;
        P0 = LED_state;
        Y0;
    }

    if(S5 == 0)
    {
        Delay(10);
        while(S5 == 0)
        {
            Timer0_Service();
            SEG_CLOCK();
        }
        LED_state = (LED_state | 0x40) & (~LED_state | 0xbf);
        Y4;
        P0 = LED_state;
        Y0;
    }
}
  1. KEY.h

#ifndef __KEY_H_
#define __KEY_H_

void Key_Init();
void Key_Scan();

#endif
  1. TIMER.c

#include"HEADFILE.h"

unsigned char h = 0,m = 0,s = 0,count = 0;
unsigned char state_flag = 0;

void Timer0_Init()
{
    TMOD = (TMOD & 0xf0) | 0x01;            
    TH0 = (65535 - 50000) / 256;           
    TL0 = (65535 - 50000) % 256;
    
    TR0 = 1;                                                    
    ET0 = 1;                                                    
    EA = 1;
}

void Timer0_Routine() interrupt 1
{
    TH0 = (65535 - 50000) / 256;
    TL0 = (65535 - 50000) % 256;
    state_flag = 1;
}

void Timer0_Service()                                                    
{    
    if(state_flag == 1)
    {
        state_flag = 0;
        count++;
        if(count == 20)
        {
            count = 0;
            s++;
            if(s == 60)
            {
                s = 0;
                m++;
                if(m == 60)
                {
                    m = 0;
                    h++;
                    if(h == 60)
                    {
                        h = 0;
                    }
                }
            }
        }
    }
}
    
void SEG_CLOCK()                                                       
{
    SEG_Display_Bit(1,h/10);
    SEG_Display_Bit(2,h%10);
    SEG_Display_Bit(3,10);
    SEG_Display_Bit(4,m/10);
    SEG_Display_Bit(5,m%10);
    SEG_Display_Bit(6,10);
    SEG_Display_Bit(7,s/10);
    SEG_Display_Bit(8,s%10);
}
  1. TIMER.h

#ifndef __TIMER_H_
#define __TIMER_H_

void Timer0_Init();
void Timer0_Routine();
void Timer0_Service();
void SEG_CLOCK();

#endif
  1. UART.c

#include"HEADFILE.h"

unsigned char urdata = 0x00;
extern unsigned char h, m, s;
extern unsigned char LED_state;

void UART_Init()
{
    TMOD = (TMOD & 0x0f) | 0x20;    
    TH1 = 0xfd;
    TL1 = 0xfd;
    TR1 = 1;
    
    SCON = 0x50;                                    
    AUXR = 0x00;                                   
    ES = 1;                                               
    EA = 1;                                             
}

void UART_SendByte(unsigned char dat)             
{
    SBUF = dat;
    while(TI == 0);
    TI = 0;
}


void UART_Receive()    interrupt 4                                                //½ÓÊÜÖжÏ
{
    if(RI == 1)
    {
        RI = 0;
        urdata = SBUF;
    }
}

void Working()
{
    if(urdata != 0x00)
    {
        switch(urdata & 0xf0)
        {
            case 0xa0:Y4; P0 =  ~(urdata & 0x0f); Y0; urdata = 0x00; 
                                LED_state = P0;
                                break;
            case 0xb0:UART_SendByte(h / 1 * 16 + h % 10);
                                UART_SendByte(m / 10 * 16 + m % 10);
                                UART_SendByte(s / 10 * 16 + s % 10); urdata = 0x00;
                                break;
        }
    }
}
  1. UART.h

#ifndef __UART_H_
#define __UART_H_

void UART_Init();
void UART_Receive();
void UART_SendByte(unsigned char dat);
void Working();

#endif
  1. DELAY.c

#include"HEADFILE.h"

void Delay(unsigned int n)
{
    while(n--)
    {
        unsigned char i, j;
        i = 11;
        j = 190;
        do
        {
            while (--j);
        } while (--i);
        }
}
  1. DELAY.h

#ifndef __DELAY_H_
#define __DELAY_H_
 
void Delay(unsigned int n);

#endif

2.总结

  1. 数码管流水灯。数码管可以多位一起选,就像LED灯一样。

  1. 按键等待。按键在等待抬起的时候,要将显示时间的模块也放在循环中(在我的代码中,定时器中断的程序只有一个标志位,计数时间到了之后的操作放在另外一个函数,所以这个函数也放在while循环中)

  1. 按键一位取反。用与或赋值法。

  1. LED和数码管P0口端口复用。在判断串口发送过来的数据的程序中,将P0口的数据记录下来,在判断按键是否按下的程序中,对需要的某一位按位取反。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倒霉蛋要写检讨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值