找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2888|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

藍(lán)橋杯單片機(jī)開發(fā)第6屆省賽簡易溫度采集與控制裝置及源代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:656536 發(fā)表于 2020-3-24 18:00 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
#include <stc15f2k60s2.h>

sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;

sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;

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 int num = 3525;   //接收按鍵數(shù)字
unsigned char max = 0,min = 0;
unsigned char temp;    //18B20溫度接收位
unsigned char mode_temp = 0;
unsigned int delay_Led = 0;  //Led閃爍時(shí)間間隔
bit mode_set = 0;   // 0 顯示溫度  1 設(shè)置溫度
bit flag_Led = 0;   // Led閃爍標(biāo)志位

void Timer0Init(void);                //1毫秒@12.000MHz
void InitSystem();
void ConfigSMG();
void ScanKeys();
void Led_light();
void Setmode_Temp();
extern bit Start18B20();  //18B20初始化
extern unsigned char Get18B20Temp();  //獲取溫度

void main()
{
  InitSystem();
        Timer0Init();
        while(1)
        {
                Start18B20();
                Setmode_Temp();
          ConfigSMG();
                ScanKeys();
        }
}
/******HC573選擇函數(shù)*******/
void Select74HC573(unsigned char channel)
{
  switch(channel)
        {
          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;
        }
}
/*******關(guān)閉LED和蜂鳴器、繼電器******/
void InitSystem()
{
  Select74HC573(5);
        P0 = 0x00;
        Select74HC573(4);
        P0 = 0xFF;
        Select74HC573(0);
}
/*******數(shù)碼管顯示******/
void ConfigSMG()
{
  if(mode_set==0)   //顯示溫度
        {
                temp = Get18B20Temp();
          LedBuff[0] = LedChar[16];
                LedBuff[1] = LedChar[mode_temp];
                LedBuff[2] = LedChar[16];
                LedBuff[3] = 0xFF;
                LedBuff[4] = 0xFF;
                LedBuff[5] = 0xFF;
                LedBuff[6] = LedChar[temp/10];
                LedBuff[7] = LedChar[temp%10];
        }
        else             //設(shè)置溫度范圍
        {
          LedBuff[0] = LedChar[16];
                LedBuff[1] = LedChar[max/10];
                LedBuff[2] = LedChar[max%10];
                LedBuff[3] = 0xFF;
                LedBuff[4] = 0xFF;
                LedBuff[5] = LedChar[16];
                LedBuff[6] = LedChar[min/10];
                LedBuff[7] = LedChar[min%10];
        }
}
/*******按鍵配置函數(shù)*******/
void Delay1ms()                //@12.000MHz
{
        unsigned char i, j;

        i = 12;
        j = 169;
        do
        {
                while (--j);
        } while (--i);
}
void ScanKeys()
{
  R1 = 0;
        R2 = R3 = R4 = 1;
        C1 = C2 = C3 = C4 = 1;
        if(C1==0)        //按鍵0
        {
          Delay1ms();
                if(C1==0)
                {
                        if(mode_set)
                        {
                          num = num *10 + 0;
                                if(num>9999)
                                        num = 0;
                        }
                  while(C1==0)
                        {
                          ConfigSMG();
                        }
                }
        }
        else if(C2==0)    //按鍵1
        {
          Delay1ms();
                if(C2==0)
                {
                        if(mode_set)
                        {
                          num = num *10 + 1;
                                if(num>9999)
                                        num = 1;
                        }
                  while(C2==0)
                        {
                          ConfigSMG();
                        }
                }
        }
        else if(C3==0)    //按鍵2
        {
          Delay1ms();
                if(C3==0)
                {
                        if(mode_set)
                        {
                          num = num *10 + 2;
                                if(num>9999)
                                        num = 2;
                        }
                  while(C3==0)
                        {
                          ConfigSMG();
                        }
                }
        }
        R2 = 0;
        R1 = R3 = R4 = 1;
        C1 = C2 = C3 = C4 = 1;
        if(C1==0)      //按鍵3
        {
          Delay1ms();
                if(C1==0)
                {
                        if(mode_set)
                        {
                          num = num *10 + 3;
                                if(num>9999)
                                        num = 3;
                        }
                  while(C1==0)
                        {
                          ConfigSMG();
                        }
                }
        }
        else if(C2==0)    //按鍵4
        {
          Delay1ms();
                if(C2==0)
                {
                        if(mode_set)
                        {
                          num = num *10 + 4;
                                if(num>9999)
                                        num = 4;
                        }
                  while(C2==0)
                        {
                          ConfigSMG();
                        }
                }
        }
        else if(C3==0)    //按鍵5
        {
          Delay1ms();
                if(C3==0)
                {
                        if(mode_set)
                        {
                          num = num *10 + 5;
                                if(num>9999)
                                        num = 5;
                        }
                  while(C3==0)
                        {
                          ConfigSMG();
                        }
                }
        }
        R3 = 0;
        R1 = R2 = R4 = 1;
        C1 = C2 = C3 = C4 = 1;
        if(C1==0)      //按鍵6
        {
          Delay1ms();
                if(C1==0)
                {
                        if(mode_set)
                        {
                          num = num *10 + 6;
                                if(num>9999)
                                        num = 6;
                        }
                  while(C1==0)
                        {
                          ConfigSMG();
                        }
                }
        }
        else if(C2==0)    //按鍵7
        {
          Delay1ms();
                if(C2==0)
                {
                        if(mode_set)
                        {
                          num = num *10 + 7;
                                if(num>9999)
                                        num = 7;
                        }
                  while(C2==0)
                        {
                          ConfigSMG();
                        }
                }
        }
        else if(C3==0)    //按鍵8
        {
          Delay1ms();
                if(C3==0)
                {
                        if(mode_set)
                        {
                          num = num *10 + 8;
                                if(num>9999)
                                        num = 8;
                        }
                  while(C3==0)
                        {
                          ConfigSMG();
                        }
                }
        }
        R4 = 0;
        R1 = R2 = R3 = 1;
        C1 = C2 = C3 = C4 = 1;
        if(C1==0)      //按鍵9
        {
          Delay1ms();
                if(C1==0)
                {
                        if(mode_set)
                        {
                          num = num *10 + 9;
                                if(num>9999)
                                        num = 9;
                        }
                  while(C1==0)
                        {
                          ConfigSMG();
                        }
                }
        }
        else if(C2==0)    //設(shè)置按鍵
        {
          Delay1ms();
                if(C2==0)
                {
                        mode_set = ~mode_set;
                  while(C2==0)
                        {
                          ConfigSMG();
                        }
                }
        }
        else if(C3==0)   //清除按鍵
        {
          Delay1ms();
                if(C3==0)
                {
                        if(mode_set)
                        {
                          num = 0;
                        }
                  while(C3==0)
                        {
                          ConfigSMG();
                        }
                }
        }
}
/******LED閃爍設(shè)置*******/
void Led_light()
{
  Select74HC573(4);
  if(mode_temp==0)
        {
          delay_Led = 800;
                if(flag_Led)
                {
                  flag_Led = 0;
                        P0 = 0xFE;  //打開LED1
                }
                else
                {
                  P0 = 0xFF;  //關(guān)閉LED1
                }
        }
        else if(mode_temp==1)
        {
          delay_Led = 400;
                if(flag_Led)
                {
                  flag_Led = 0;
                        P0 = 0xFE;  //打開LED1
                }
                else
                {
                  P0 = 0xFF;  //關(guān)閉LED1
                }
        }
        else if(mode_temp==2)
        {
          delay_Led = 200;
                if(flag_Led)
                {
                  flag_Led = 0;
                        P0 = 0xFE;  //打開LED1
                }
                else
                {
                  P0 = 0xFF;  //關(guān)閉LED1
                }
        }
        Select74HC573(0);
}

/******溫度區(qū)間設(shè)置******/
void Setmode_Temp()
{
  max = num/100;
        min = num%100;
        if(max>min)
        {
                if(temp<min)
                {
                        mode_temp = 0;
                        EA = 0;
                        Select74HC573(5);
                  P0 = 0x00;       //關(guān)閉繼電器
                        Select74HC573(0);
                        EA = 1;
                }
                else if(temp>max)
                {
                        mode_temp = 2;
                        EA = 0;
                        Select74HC573(5);
                  P0 = 0x10;       //打開繼電器
                        Select74HC573(0);
                        EA = 1;
                }
                else
                {
                        mode_temp = 1;
                        EA = 0;
                        Select74HC573(5);
                  P0 = 0x00;       //關(guān)閉繼電器
                        Select74HC573(0);
                        EA = 1;
                }
                Led_light();
        }
        else    //設(shè)置溫度錯(cuò)誤
        {
          Select74HC573(4);
                P0 = 0xFD;     //LED2常亮
                Select74HC573(0);
                P0 = 0xFF;
        }
}
/*******數(shù)碼管動態(tài)刷新*******/
void ScanSMG()
{
  static unsigned char i = 0;
        P0 = 0xFF;
        Select74HC573(6);
        P0 = 0x01<<i;
        Select74HC573(7);
        P0 = LedBuff[i++];
        if(i>=8)
                i = 0;
        Select74HC573(0);
}
/*******定時(shí)器0配置******/
void Timer0Init(void)                //1毫秒@12.000MHz
{
        AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TL0 = 0x18;                //設(shè)置定時(shí)初值
        TH0 = 0xFC;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
        ET0 = 1;
        EA = 1;
}
void InterruptTimer0()  interrupt 1
{
        static unsigned int cnt = 0;
  ScanSMG();
        cnt++;
        if(cnt>=delay_Led)
        {
          flag_Led = 1;
                cnt = 0;
        }
}

省賽試題-第6屆-簡易溫度采集與控制裝置.pdf

351.53 KB, 下載次數(shù): 19, 下載積分: 黑幣 -5

第6屆溫度采集與控制_1.rar

47.18 KB, 下載次數(shù): 29, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表