历时半个多月,在家苦练这么久,终于把11届省赛程序题做出来了,不枉我这十几天寒假过的那么枯燥无味。
sys.c
#ifndef _SYS_H_
#define _SYS_H_
#include <STC15F2K60S2.H>
#include <intrins.h>
sbit s4 = P3^3;
sbit s5 = P3^2;
sbit s6 = P3^1;
sbit s7 = P3^0;
#define uchar unsigned char
#define uint unsigned int
extern unsigned char T_Max,T_Min,T_Max_p,T_Min_p;
extern unsigned char InterFace;
extern unsigned char stat_led;
//sys.c
void Delay(unsigned int ms);
void Select_74H138(unsigned char channel);
void Init_System();
//void Timer0Init();
void Work_Led(unsigned char dat);
//nixie.c
void DisplayAlone(unsigned char pos,value);
void Display_Temp();
void Display_P();
void DisplaySMG();
void Work_DAC();
//key.c
void KeyScan();
#endif
nixie.c
#include <sys.h>
#include <onewire.h>
#include <iic.h>
//uchar code Nixie[] = {0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90,
// 0X40, 0X79, 0X24, 0X30, 0X19, 0X12, 0X02, 0X78, 0X00, 0X10, 0XBF, 0XFF};
0-9 0.-9. - 熄灭
uchar code Nixie[] = {0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90, 0XC6, 0X8C};
uchar T_Max = 30,T_Min = 20,T_Max_p = 30,T_Min_p = 20;
//uchar InterFace = 0;
uint temp;
void DisplayAlone(uchar pos,value)
{
Select_74H138(7);
P0 = 0XFF;
Select_74H138(6);
P0 = _crol_(0X01,pos);
Select_74H138(7);
P0 = Nixie[value];
Delay(1);
Select_74H138(0);
}
void Display_Temp()
{
// temp = Temper_Get();
DisplayAlone(0,10);
DisplayAlone(6,temp / 10);
DisplayAlone(7,temp % 10);
Select_74H138(7);
P0 = 0XFF;
}
void Display_P()
{
DisplayAlone(0,11);
DisplayAlone(3,T_Max / 10);
DisplayAlone(4,T_Max % 10);
DisplayAlone(6,T_Min / 10);
DisplayAlone(7,T_Min % 10);
Select_74H138(7);
P0 = 0XFF;
}
void DisplaySMG()
{
temp = Temper_Get();
switch(InterFace)
{
case 0: Display_Temp(); break;
case 1: Display_P(); break;
}
}
void Work_DAC()
{
// if(T_Max > T_Min)
// {
if(temp > T_Max)
{
stat_led = (stat_led | 0xf7) & 0xfe;
Work_Led(stat_led);
DAC_Out(204);
}
if(temp < T_Max && temp > T_Min)
{
stat_led = (stat_led | 0xf7) & 0xfd;
Work_Led(stat_led);
DAC_Out(153);
}
if(temp < T_Min)
{
stat_led = (stat_led | 0xf7) & 0xfb;
Work_Led(stat_led);
DAC_Out(102);
}
// }
}
key.c
#include <sys.h>
uchar InterFace = 0;
bit stat_s5 = 0;
void KeyScan()
{
if(s4 == 0)
{
Delay(5);
InterFace = (InterFace + 1) % 2;
if(InterFace)
{
T_Max_p = T_Max;
T_Min_p = T_Min;
}
else
{
stat_s5 = 0;
if(T_Max <= T_Min)
{
// stat_led = 0xf7;
T_Max = T_Max_p;
T_Min = T_Min_p;
stat_led = 0xff;
}
// else
// {
// stat_led = 0xff;
// }
}
while(s4 == 0)
DisplaySMG();
}
if(s5 == 0)
{
Delay(5);
if(InterFace)
{
stat_s5 = ~stat_s5;
}
while(s5 == 0)
DisplaySMG();
}
if(s6 == 0)
{
Delay(5);
if(stat_s5)
{
if(T_Max < 100)
T_Max++;
}
else
{
if(T_Min < 100)
T_Min++;
}
while(s6 == 0)
DisplaySMG();
if(T_Max <= T_Min)
{
stat_led = 0xf7;
}
else
{
stat_led = 0xff;
}
}
if(s7 == 0)
{
Delay(5);
if(stat_s5)
{
if(T_Max >= 0)
T_Max--;
}
else
{
if(T_Min >= 0)
T_Min--;
}
while(s7 == 0)
DisplaySMG();
if(T_Max <= T_Min)
{
stat_led = 0xf7;
}
else
{
stat_led = 0xff;
}
}
}
ds18b20.c
#include <onewire.h>
void Delay_us(uint us)//延时1us
{
do{
_nop_();
_nop_();
_nop_();
}while(us--);
}
bit DS18B20_Init()
{
bit i;
DQ = 0;//读写之前都要将该引脚拉低
Delay_us(500);
DQ = 1;//释放总线
Delay_us(50);
i = DQ;//读取DQ的值
Delay_us(100);
DQ = 1;
return i;
}
void Write_DS18B20(uchar dat)
{
uchar i;
for(i = 0; i < 8; i++)
{
DQ = 0;
Delay_us(2);
DQ = dat & 0x01;//从最低位开始传送
Delay_us(100);
DQ = 1;//释放总线,准备下一次数据的写入
dat >>= 1;
}
}
uchar Read_DS18B20()
{
uchar i,j,dat;
for(i = 0; i < 8; i++)
{
DQ = 0;
Delay_us(1);
DQ =1;
j = DQ;
Delay_us(100);
DQ = 1;//释放总线,准备下一次数据的写入
dat = (j <<7) | (dat >> 1);
}
return dat;
}
uint Temper_Get()
{
uchar MSB,LSB;
uint temp;
DS18B20_Init();
Write_DS18B20(0XCC);
Write_DS18B20(0X44);
Delay_us(500);
DS18B20_Init();
Write_DS18B20(0XCC);
Write_DS18B20(0XBE);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
DS18B20_Init();
temp = MSB & 0X0F;
temp <<= 8;
temp |= LSB;
temp = temp * 0.0625;
return temp;
}
pcf8591.c
#include <iic.h>
#include <onewire.h>
#include <sys.h>
void DAC_Out(uchar dat)
{
IIC_Start();
IIC_SendByte(0X90);//写数据
IIC_WaitAck();
IIC_SendByte(0X40);//允许D/A输出
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
iic.c
#include <iic.h>
void somenop()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();
}
void IIC_Start()
{
SDA = 1;
SCL = 1;
somenop();
SDA = 0;
somenop();
SCL = 0;
}
void IIC_Stop()
{
SDA = 0;
SCL = 1;
somenop();
SDA = 1;
}
void IIC_Ack(bit i)//应答位控制(主机发送应答)
{
if(i)
SDA = 0;
else
SDA = 1;
somenop();
SCL = 1;
somenop();
SCL = 0;
SDA = 1;
somenop();
}
bit IIC_WaitAck()//等待应答(读从机应答)
{
SDA = 1;
somenop();
SCL = 1;
somenop();
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
void IIC_SendByte(uchar dat)//通过IIC总线发送数据
{
uchar i;
for(i = 0; i < 8; i++)
{
if(dat & 0x80)
SDA = 1;
else
SDA = 0;
somenop();
SCL = 1;
dat <<= 1;
somenop();
SCL = 0;
}
}
uchar IIC_RecByte()//从IIC总线上接收数据
{
uchar i,dat;
for(i = 0; i < 8; i++)
{
SCL = 1;
somenop();
dat <<= 1;
if(SDA)
dat |= 0x01;
SCL = 0;
somenop();
}
return dat;
}
main.c
#include <sys.h>
#include <onewire.h>
#include <iic.h>
//void Timer0Init();
uchar stat_led = 0xff;
void main()
{
Init_System();
// Timer0Init();
while(1)
{
KeyScan();
DisplaySMG();
Work_DAC();
DisplaySMG();
}
}
sys.h
#ifndef _SYS_H_
#define _SYS_H_
#include <STC15F2K60S2.H>
#include <intrins.h>
sbit s4 = P3^3;
sbit s5 = P3^2;
sbit s6 = P3^1;
sbit s7 = P3^0;
#define uchar unsigned char
#define uint unsigned int
extern unsigned char T_Max,T_Min,T_Max_p,T_Min_p;
extern unsigned char InterFace;
extern unsigned char stat_led;
//sys.c
void Delay(unsigned int ms);
void Select_74H138(unsigned char channel);
void Init_System();
//void Timer0Init();
void Work_Led(unsigned char dat);
//nixie.c
void DisplayAlone(unsigned char pos,value);
void Display_Temp();
void Display_P();
void DisplaySMG();
void Work_DAC();
//key.c
void KeyScan();
#endif
iic.h
#ifndef _IIC_H_
#define _IIC_H_
#include <STC15F2K60S2.H>
#include <intrins.h>
sbit SDA = P2^1;
sbit SCL = P2^0;
#define uchar unsigned char
//iic.c
void somenop();
void IIC_Start();
void IIC_Stop();
void IIC_Ack(bit i);
bit IIC_WaitAck();
void IIC_SendByte(unsigned char dat);
unsigned char IIC_RecByte();
at24c02.c
//void Write_AT24C02(unsigned char addr,dat);
//unsigned char Read_AT24C02(unsigned char addr);
//pcf8591.c
void DAC_Out(unsigned char dat);
//void Work_DAC();
#endif
onewire.h
#ifndef _ONEWIRE_H_
#define _ONEWIRE_H_
#include <STC15F2K60S2.H>
#include <intrins.h>
sbit DQ = P1^4;
#define uchar unsigned char
#define uint unsigned int
//#define ulong unsigned long
//ds18b20.c
void Delay_us(unsigned int us);
bit DS18B20_Init();
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20();
unsigned int Temper_Get();
#endif