#include "main.h"
#include "ds1302.h"
#include "onewire.h"
#include "iic.h"
#define _138 P2
#define HC573_CLEAR {_138=_138&0X1F;}
#define HC573_U6_EN {_138=_138&0X1F|0X80;HC573_CLEAR;}
#define HC573_U7_EN {_138=_138&0X1F|0XE0;HC573_CLEAR;}
#define HC573_U8_EN {_138=_138&0X1F|0XC0;HC573_CLEAR;}
#define HC573_U9_EN {_138=_138&0X1F|0XA0;HC573_CLEAR;}
#define Enable 1
#define Disble 0
#define N_BUZZ P06
#define BUZZ(state) {N_BUZZ=state;HC573_U9_EN;}
#define LED P0
#define LED1 P00
#define LED2 P01
#define LED3 P02
#define LED4 P03
#define LED5 P04
#define LED6 P05
#define LED7 P06
#define LED8 P07
#define NIXIE P0
#define NULL 200
#define NIXIE_CLEAR {for (i=0;i<8;i++) NixieDisp[i]=NULL;}
#define _ 10
#define C 12
#define E 13
#define P 14
#define POINT 20
#define DATA_DISP 1
#define PARAM_DISP 0
#define TIME 1
#define TEMPER 2
#define LLED 3
#define LED1_PIN 0
#define LED2_PIN 1
#define LED3_PIN 2
#define LED4_PIN 3
#define LED5_PIN 4
#define LED6_PIN 5
#define LED7_PIN 6
#define LED8_PIN 7
uint8 NixieDisp[8];
void Timer1Init(void);
uint8 KBD_Scan(void);
void PCF8591_Init(uint8 ch);
uint8 PCF8591_Conversion(void);
//bit CheckLED3=1; //1 需要检测
uint8 LEDBit=0xff;
bit LED_State=1; //暗
void main(void)
{
uint8 time[3];
uint8 i;
uint8 KeyVal;
bit DataORParam=DATA_DISP;
uint8 TimeOrTemperOrLED=TIME;
float TemperVal;
uint8 u8AD_ConverVal;
float fLED_Val;
/* 参数 */
char LLEDParam=4;
char TimeParam=17;
char TemperParam=25;
char TempLLEDParam=LLEDParam;
char TempTimeParam=TimeParam;
char TempTemperParam=TemperParam;
BUZZ(Disble);
LED=0xff;HC573_U6_EN;
PCF8591_Init(1);
DS1302_SetTime(16,59,50);
NIXIE_CLEAR;
Timer1Init();
while(1)
{
KeyVal=KBD_Scan();
if (KeyVal==4)
{
DataORParam=!DataORParam; //显示or数据界面切换
TimeOrTemperOrLED=TIME;
if (DataORParam==DATA_DISP)
{
LLEDParam=TempLLEDParam;TimeParam=TempTimeParam;TemperParam=TempTemperParam;
}
NIXIE_CLEAR;
}
if (KeyVal==5)
{
TimeOrTemperOrLED++;
if (TimeOrTemperOrLED>LLED) TimeOrTemperOrLED=TIME;
NIXIE_CLEAR;
}
DS1302_ReadTime(time); //采样
TemperVal=DS18B20_ReadTemper();
u8AD_ConverVal=PCF8591_Conversion();
if (TemperVal<(float)TemperParam) {LEDBit &= ~(1<<LED2_PIN);}
else {LEDBit |= 1<<LED2_PIN;}
if (*(time+0)>=TimeParam || *(time+0)<=8) {LEDBit &= ~(1<<LED1_PIN);}
else {LEDBit |= 1<<LED1_PIN;}
fLED_Val=5.0f*(float)u8AD_ConverVal/255.0; //亮度值
if (fLED_Val>1.0) LED_State=0; //亮
else LED_State=1; //暗
LEDBit|=0xf8; //关闭指示灯
if (LED_State==1)
{
LEDBit &= ~(1<<(LLEDParam-1));
}
if (DataORParam==DATA_DISP)
{
switch (TimeOrTemperOrLED)
{
case TIME:
{
*(NixieDisp+7)=*(time+2)%10;
*(NixieDisp+6)=*(time+2)/10%10;
*(NixieDisp+5)=_;
*(NixieDisp+4)=*(time+1)%10;
*(NixieDisp+3)=*(time+1)/10%10;
*(NixieDisp+2)=_;
*(NixieDisp+1)=*(time+0)%10;
*(NixieDisp+0)=*(time+0)/10%10;
}
break;
case TEMPER:
{
*(NixieDisp+0)=C;
*(NixieDisp+6)=(uint16)TemperVal%10+POINT;
*(NixieDisp+5)=(uint16)TemperVal/10%10;
TemperVal*=10;
*(NixieDisp+7)=(uint16)TemperVal%10;
}
break;
case LLED:
{
*(NixieDisp+7)=LED_State;
*(NixieDisp+0)=E;
*(NixieDisp+2)=(uint16)fLED_Val%10+POINT;
fLED_Val*=10;
*(NixieDisp+3)=(uint16)fLED_Val%10;
fLED_Val*=10;
*(NixieDisp+4)=(uint16)fLED_Val%10;
Delay(100);
}
break;
default:
break;
} //switch (TimeOrTemperOrLED)
}
else //参数页面
{
switch (TimeOrTemperOrLED)
{
case TIME:
{
if (KeyVal==8) TempTimeParam--;
if (KeyVal==9) TempTimeParam++;
if (TempTimeParam<0) TempTimeParam=23;
if (TempTimeParam>23) TempTimeParam=0;
*(NixieDisp+0)=P;
*(NixieDisp+1)=1;
*(NixieDisp+6)=TempTimeParam/10;
*(NixieDisp+7)=TempTimeParam%10;
}
break;
case TEMPER:
{
if (KeyVal==8) TempTemperParam--;
if (KeyVal==9) TempTemperParam++;
if (TempTemperParam<0) TempTemperParam=99;
if (TempTemperParam>99) TempTemperParam=0;
*(NixieDisp+0)=P;
*(NixieDisp+1)=2;
*(NixieDisp+6)=TempTemperParam/10;
*(NixieDisp+7)=TempTemperParam%10;
}
break;
case LLED:
{
if (KeyVal==8) TempLLEDParam--;
if (KeyVal==9) TempLLEDParam++;
if (TempLLEDParam<4) TempLLEDParam=8;
if (TempLLEDParam>8) TempLLEDParam=4;
*(NixieDisp+0)=P;
*(NixieDisp+1)=3;
*(NixieDisp+6)=TempLLEDParam/10;
*(NixieDisp+7)=TempLLEDParam%10;
}
break;
default:
break;
} //switch (TimeOrTemperOrLED)
} //else //参数页面
} //while(1)
} //main()
#define UCOL1 P44
#define UCOL2 P42
#define UROM1 P32
#define UROM2 P33
uint8 scan(void)
{
UCOL1=0;UCOL2=1;
UROM1=UROM2=1;
if (UROM1==0) {Delay(10);if (UROM1==0) return 5;}
if (UROM2==0) {Delay(10);if (UROM2==0) return 4;}
UCOL1=1;UCOL2=0;
UROM1=UROM2=1;
if (UROM1==0) {Delay(10);if (UROM1==0) return 9;}
if (UROM2==0) {Delay(10);if (UROM2==0) return 8;}
return 0;
}
uint8 KBD_Scan(void)
{
static bit press=1;
uint8 keyval=scan();
if (keyval && press)
{
press=0;
return keyval;
}
else if (keyval==0) press=1;
return 0;
}
void Timer1Init(void) //1毫秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x30; //设置定时初值
TH1 = 0xF8; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
EA = 1;
ET1 = 1;
}
code uint8 table[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0xbf, //-
0x7f, //.
0xC6, //C
0x86, //E
0x8c, //P
0xff,0xff,0xff,0xff,0xff,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
};
void Timer1(void) interrupt 3 //2ms
{
static uint8 offset=0;
static uint16 LTime=0,MTime=0;
NIXIE=0xff;HC573_U7_EN;
if (*(NixieDisp+offset)!=NULL)
{
NIXIE=0x01<<offset;HC573_U8_EN;
NIXIE=table[NixieDisp[offset]];HC573_U7_EN;
}
offset++;
if (offset>7) offset=0;
LED=LEDBit;HC573_U6_EN;
if (LED_State==0) //亮
{
LTime=0;
MTime++;
if (MTime>=1500) {MTime=0;LEDBit|=1<<LED3_PIN;}
}
else
{
MTime=0;
LTime++;
if (LTime>=1500) {LTime=0;LEDBit &= ~(1<<LED3_PIN);}
}
}
#define SlaveAddrW 0x90
#define SlaveAddrR 0x91
void PCF8591_Init(uint8 ch)
{
IIC_Start();
IIC_SendByte(SlaveAddrW);
IIC_WaitAck();
IIC_SendByte(ch);
IIC_WaitAck();
IIC_Stop();
}
uint8 PCF8591_Conversion(void)
{
uint8 temp=0;
IIC_Start();
IIC_SendByte(SlaveAddrR);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_SendAck(0);
temp=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
void Delay(uint16 time) //@12.000MHz
{
unsigned char i, j;
while(time--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
蓝桥杯第十一届单片机模拟题参考程序
于 2022-03-30 13:56:26 首次发布