找回密码
 立即注册

QQ登录

只需一步,快速开始

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

蓝桥杯单片机开发第9届省赛彩灯控制器及源代码

[复制链接]
跳转到指定楼层
楼主
ID:656536 发表于 2020-3-24 18:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <stc15f2k60s2.h>
#include <I2C.h>

sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

unsigned char code LedChar[] = {
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,
        0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0x7F
};
unsigned char LedBuff[8] = {
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsigned char code dat_led[4][8] = {
  {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F},  //模式1
        {0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE},  //模式2
        {0x7E,0xBD,0xDB,0xE7},                      //模式3
        {0xE7,0xDB,0xBD,0x7E}                              //模式4
};
unsigned char mode=0,site=0;   //mode控制流水灯模式,site控制流水灯的位置
unsigned int time_led = 400;//LED流转间隔
unsigned char pwn_duty = 0;//脉冲宽度
unsigned char grade_led = 1;//LED亮度等级
unsigned char s6_set = 0;
bit s4_set = 0;   //在非设置状态下按下S4可以显示LED的亮度等级
unsigned char dat_rb2 = 0;

void InitSystem();
void ScanKeys();
void ConfigSMG();
void Read_Rb2();
void LED();
void Timer0Init(void);                //1毫秒@12.000MHz
unsigned char I2CRead(unsigned char addr);
void I2CWrite(unsigned char addr,unsigned char dat);

void main()
{
        InitSystem();
        Timer0Init();
        mode = I2CRead(0x01);
        time_led = I2CRead(0x08)*10;
  while(1)
        {
                ConfigSMG();
                Read_Rb2();
          LED();
                ScanKeys();
        }
}
void SelectHC573(unsigned char chane)
{
  switch(chane)
        {
          case 4:P2 = (P2&0x1F)|0x80;break;
                case 5:P2 = (P2&0x1F)|0xA0;break;
                case 6:P2 = (P2&0x1F)|0xC0;break;
                case 7:P2 = (P2&0x1F)|0xE0;break;
                default:P2 = (P2&0x1F)|0x00;break;
        }
}
/*******关闭LED和蜂鸣器、继电器******/
void InitSystem()
{
  SelectHC573(5);
        P0 = 0x00;
        SelectHC573(4);
        P0 = 0xFF;
        SelectHC573(0);
}
/******数码管显示函数******/
void ConfigSMG()
{
        if(s6_set>0)
        {
                LedBuff[0] = LedChar[16];
                LedBuff[1] = LedChar[mode];
                LedBuff[2] = LedChar[16];
                LedBuff[3] = 0xFF;
                if(time_led>=1000)
                {
                        LedBuff[4] = LedChar[time_led/1000];
                        LedBuff[5] = LedChar[time_led/100%10];
                        LedBuff[6] = LedChar[time_led/10%10];
                        LedBuff[7] = LedChar[time_led%10];
                }
                else
                {
                        LedBuff[4] = 0xFF;
                  LedBuff[5] = LedChar[time_led/100];
                        LedBuff[6] = LedChar[time_led/10%10];
                        LedBuff[7] = LedChar[time_led%10];
                }
        }
        else
        {
          LedBuff[0] = 0xFF;
                LedBuff[1] = 0xFF;
                LedBuff[2] = 0xFF;
                LedBuff[3] = 0xFF;
                LedBuff[4] = 0xFF;
                LedBuff[5] = 0xFF;
                LedBuff[6] = 0xFF;
                LedBuff[7] = 0xFF;
        }
        if(s4_set)
        {
                LedBuff[0] = 0xFF;
                LedBuff[1] = 0xFF;
                LedBuff[2] = 0xFF;
                LedBuff[3] = 0xFF;
                LedBuff[4] = 0xFF;
                LedBuff[5] = 0xFF;
          LedBuff[6] = LedChar[16];
                LedBuff[7] = LedChar[grade_led];
        }
}
/******EEPROM相关函数********/
void I2CWrite(unsigned char addr,unsigned char dat)
{
  I2CStart();
        I2CSendByte(0xA0);
        I2CWaitACK();
        I2CSendByte(addr);
        I2CWaitACK();
        I2CSendByte(dat);
        I2CWaitACK();
        I2CStop();
}
unsigned char I2CRead(unsigned char addr)
{
  unsigned char dat;
        I2CStart();
        I2CSendByte(0xA0);
        I2CWaitACK();
        I2CSendByte(addr);
        I2CWaitACK();
        
        I2CStart();
        I2CSendByte(0xA1);
        I2CWaitACK();
        dat = I2CRecByte();
        I2C_ACK(0);
        I2CStop();
        return dat;
}
/******PCF8591数据采集*******/
void Read_Rb2()
{
  I2CStart();
        I2CSendByte(0x90);
        I2CWaitACK();
        I2CSendByte(0x03);
        I2CWaitACK();
        I2CStop();
        
        I2CStart();
        I2CSendByte(0x91);
        I2CWaitACK();
        dat_rb2 = I2CRecByte();
        I2C_ACK(0);
        I2CStop();
}
/******LED亮度控制函数******/
void LED()
{
  if(dat_rb2<60)
        {
          pwn_duty = 5;
                grade_led = 1;
        }
        else if(dat_rb2<120)
        {
          pwn_duty = 10;
                grade_led = 2;
        }
        else if(dat_rb2<180)
        {
          pwn_duty = 15;
                grade_led = 3;
        }
        else
        {
          pwn_duty = 20;
                grade_led = 4;
        }
}
/********按键扫描与处理逻辑*********/
void Delay1ms()                //@12.000MHz
{
        unsigned char i;

        i = 1000;
        while(i--);
}
void ScanKeys()
{
/*****按键S7*****/        
  if(S7==0)   
        {
          Delay1ms();
                if(S7==0)
                {
      if(TR0==0)
                        {
                          TR0 = 1;
                        }
                        else
                        {
                                s6_set = 0;
                          TR0 = 0;
                        }
                        while(S7==0);
                }
        }
/******按键S6*****/        
        if(S6==0)
        {
          Delay1ms();
                if(S6==0)
                {
                                s6_set++;
                                 if(s6_set==2)
                         {
                                 I2CWrite(0x01,mode);
                                 Delay1ms();
                         }
                         else if(s6_set>=3)
                         {
                                 s6_set = 0;
                                 I2CWrite(0x08,time_led/10);
                                 Delay1ms();
                         }
                         while(S6==0);
                }
        }
/*****按键S5*****/
        if(S5==0)
        {
                Delay1ms();
                if(S5==0)
                {
                                if(s6_set==2)
                                {
                                        time_led = time_led+100;
                                        if(time_led>=1200)
                                        {
                                                time_led = 1200;
                                        }
                                }
                                else if(s6_set==1)
                                {
                                        mode++;
                                        if(mode>=4)
                                        {
                                                mode = 4;
                                        }
                                }
                                while(S5==0);
                }
        }
/******按键S4*****/
        if(S4==0)
        {
                Delay1ms();
                if(S4==0)
                {
                                if(s6_set==2)
                                {
                                        time_led = time_led-100;
                                        if(time_led<400)
                                        {
                                                time_led = 400;
                                        }
                                }
                                else if(s6_set==1)
                                {
                                        mode--;
                                        if(mode<=1)
                                        {
                                                mode = 1;
                                        }
                                }
                                else
                                {
                                  s4_set = ~s4_set;
                                }
                                while(S4==0);
                 }
                }
}
/*******数码管刷新*******/
void ScanSMG()
{
        static unsigned char i = 0;
  P0 = 0xFF;
        SelectHC573(6);
        P0 = 0x01<<i;
        SelectHC573(7);
        P0 = LedBuff[i++];
        if(i>=8)
                i = 0;
}
/****配置定时器0****/
void Timer0Init(void)                //1毫秒@12.000MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        ET0 = 1;
        EA = 1;
}
void InterruptTimer0()  interrupt 1   //定时器服务函数
{
        static unsigned int cnt = 0;
        static unsigned char PWN = 0;
  ScanSMG();
        PWN++;
        cnt++;
        if(PWN<=pwn_duty)  //控制LED的亮度大小
        {
          SelectHC573(4);
          P0 = dat_led[mode-1][site];
        }
        else if(PWN<20)
        {
          SelectHC573(4);
          P0 = 0xFF;
        }
        else
        {
          SelectHC573(4);
                PWN = 0;
          P0 = dat_led[mode-1][site];
        }
        if(cnt>=time_led)   //控制LED的流转间隔
        {
          SelectHC573(4);
          P0 = dat_led[mode-1][site];
                cnt = 0;
                site++;
                if(mode<=2)
                {
            if(site>=8)
        site = 0;                                
                }
                else
                {
                  if(site>=4)
                                site = 0;
                }
        }
}





第9届彩灯控制器_1.rar

44.89 KB, 下载次数: 20, 下载积分: 黑币 -5

省赛试题-第9届-彩灯控制器.pdf

283.36 KB, 下载次数: 12, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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