第十一屆藍橋杯單片機組省賽(第二場)原始碼
這個原始碼是本人在省賽當天復盤時寫的,并有幸獲得了江蘇省一等獎,不過代碼比較簡單,適合新人作為參考,如果有不足的地方,希望各位在評論區戳我,一起改正,一起學習!

#include<stc15f2k60s2.h>
#include<onewire.h>
#include<iic.h>
#define uchar unsigned char
#define uint unsigned int
void Delay(uint t);
void InitSystem();
void SelectHC573(uchar n);
void DisplaySMG(uchar pos, uchar value);
void SMG_off();
void Display_C();
void Display_P();
void Select_Display();
void Read_Temp();
void PCF8591_DAC(uchar dat);
void KeyScan();
void Setting();
sbit S7 = P3^0; //定義S7
sbit S6 = P3^1; //定義S6
sbit S5 = P3^2; //定義S5
sbit S4 = P3^3; //定義S4
uint Temp = 0x0000; //當前溫度值
uchar Range[2] = {20,30}; //溫度上下限
uchar Oldrange[2] = {0,0}; //保存歷史設定引數
uchar code SMG_Duamma[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
bit Stat_C = 0; //界面切換標志位
bit Stat_P = 0; //引數切換標志位
void main()
{
InitSystem();
while(1)
{
Read_Temp();
Select_Display();
KeyScan();
Setting();
}
}
//****簡單的延時函式****//
void Delay(uint t)
{
while(t--);
}
//****系統初始化函式****//
void InitSystem()
{
SelectHC573(4);
P0 = 0xff; //關閉所有LED
SelectHC573(5);
P0 = 0x00; //關閉蜂鳴器和繼電器
}
//****HC573選通函式****//
void SelectHC573(uchar n)
{
switch(n)
{
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;
}
}
//****數碼管顯示模塊****//
void DisplaySMG(uchar pos, uchar value) //點亮單個數碼管
{
SelectHC573(7);
P0 = 0x00; //消隱
SelectHC573(6);
P0 = 0x01 << pos;
SelectHC573(7);
P0 = value;
}
void SMG_off() //關閉所有數碼管
{
SelectHC573(6);
P0 = 0xff;
SelectHC573(7);
P0 = 0xff;
}
void Display_C() //資料顯示界面
{
DisplaySMG(0, 0xc6);
Delay(200);
DisplaySMG(6, SMG_Duamma[Temp / 10]);
Delay(200);
DisplaySMG(7, SMG_Duamma[Temp % 10]);
Delay(200);
SMG_off();
}
void Display_P() //引數顯示界面
{
DisplaySMG(0, 0x8c);
Delay(200);
DisplaySMG(3, SMG_Duamma[Range[1] / 10]);
Delay(200);
DisplaySMG(4, SMG_Duamma[Range[1] % 10]);
Delay(200);
DisplaySMG(6, SMG_Duamma[Range[0] / 10]);
Delay(200);
DisplaySMG(7, SMG_Duamma[Range[0] % 10]);
Delay(200);
SMG_off();
}
void Select_Display()
{
if(Stat_C == 0)
Display_C();
else if(Stat_C == 1)
Display_P();
}
//****溫度采集模塊****//
void Read_Temp()
{
uchar LSB,MSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay(1000);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
init_ds18b20();
Temp = (MSB << 8) | LSB;
Temp >>= 4;
}
//****DAC模擬電壓輸出模塊****//
void PCF8591_DAC(uchar dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
//****按鍵模塊****//
void KeyScan()
{
if(S4 == 0)
{
Delay(500);
if(S4 == 0)
{
if(Stat_C == 0)
{
Oldrange[0] = Range[0];
Oldrange[1] = Range[1];
Stat_P = 0;
}
else
{
if(Range[0] > Range[1])
{
Range[0] = Oldrange[0];
Range[1] = Oldrange[1];
}
}
Stat_C = ~Stat_C;
while(S4 == 0);
}
}
if(S5 == 0)
{
Delay(500);
if(S5 == 0)
{
Stat_P = ~Stat_P;
}
while(S5 == 0);
}
if(S6 == 0)
{
Delay(500);
if(S6 == 0)
{
if(Stat_C == 1)
{
if(Range[Stat_P] < 99)
Range[Stat_P]++;
}
}
while(S6 == 0);
}
if(S7 == 0)
{
Delay(500);
if(S7 == 0)
{
if(Stat_C == 1)
{
if(Range[Stat_P] > 0)
Range[Stat_P]--;
}
}
while(S7 == 0);
}
}
//****輸出功能和指示燈模塊****//
void Setting()
{
if(Temp > Range[1])
{
PCF8591_DAC(204); //輸出電壓4.0V
SelectHC573(4);
P0 = (P0 & 0xf8) | 0x06; //點亮L1
}
else if(Temp >= Range[0])
{
PCF8591_DAC(153); //輸出電壓3.0V
SelectHC573(4);
P0 = (P0 & 0xf8) | 0x05; //點亮L2
}
else
{
PCF8591_DAC(102); //輸出電壓2.0V
SelectHC573(4);
P0 = (P0 & 0xf8) | 0x03; //點亮L3
}
if(Range[0] > Range[1])
{
SelectHC573(4);
P0 &= 0xf7; //點亮L4
}
else
{
SelectHC573(4);
P0 |= 0x08; //熄滅L4
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/224859.html
標籤:其他
