|
#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
2020-3-24 17:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
351.53 KB, 下載次數(shù): 19, 下載積分: 黑幣 -5
-
-
第6屆溫度采集與控制_1.rar
2020-3-24 17:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
47.18 KB, 下載次數(shù): 29, 下載積分: 黑幣 -5
|