一、题目展示
二、代码展示
2.1 main.c
#include <STC15F2K60S2.h>
#include "iic.h"
#define uchar unsigned char
#define uint unsigned int
uchar SMG_duanma[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
uchar yi,er,san,si,wu,liu,qi,ba;
float real_high_limit_dianya = 4.5;
float real_low_limit_dianya = 0.5;
float low_limit_dianya = 0.5;
float high_limit_dianya = 4.5;
sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L8 = P0^7;
uchar tt = 0;
uchar t = 0;
uchar miao = 0;
uchar Mode = 0;
uchar Mode_limit_high_low = 0;
uchar continue_check_juli = 0;
uchar juli = 45;
void SelectHC138(uchar channel);
void Initsys();
void SMG_Bit(uchar pos, uchar value);
void Delay_one_ms();
void SMG_Display();
void Delay_five_ms();
void Alone_Key();
void Display_Mode_dianya();
void Display_Mode_canshu();
void Display_Mode_ceju();
void LED_Display();
void Timer0Init(void);
void L8_light();
void main()
{
Initsys();
Timer0Init();
while(1)
{
if(Mode == 0)
{
Display_Mode_dianya();
}
else if(Mode == 1)
{
Display_Mode_canshu();
}
else if(Mode == 2)
{
Display_Mode_ceju();
}
SMG_Display();
Alone_Key();
LED_Display();
L8_light();
}
}
void L8_light()
{
float Rb2_dianya;
Rb2_dianya = Read_ADC_Rb2() * 0.01963;
if(Rb2_dianya >= real_low_limit_dianya && real_high_limit_dianya >= Rb2_dianya)
{
continue_check_juli = 1;
Write_DAC(136);
}
else
{
continue_check_juli = 0;
Write_DAC(0);
}
}
void LED_Display()
{
P0 = 0XFF;
if(Mode == 0)
{
SelectHC138(4);
L1 = 0;
L2 = 1;
L3 = 1;
}
else if(Mode == 1)
{
SelectHC138(4);
L1 = 1;
L2 = 0;
L3 = 1;
}
else if(Mode == 2)
{
SelectHC138(4);
L1 = 1;
L2 = 1;
L3 = 0;
}
}
void Display_Mode_dianya()
{
unsigned long Rb2_dianya;
Rb2_dianya = Read_ADC_Rb2() * 0.01963 * 100;
yi = 0XC1;
er = san = si = wu = 0XFF;
liu = SMG_duanma[Rb2_dianya / 100] - 0X80;
qi = SMG_duanma[Rb2_dianya % 100 / 10];
ba = SMG_duanma[Rb2_dianya % 10];
}
void Display_Mode_canshu()
{
if(Mode_limit_high_low == 0)
{
yi = 0X8C;
er = san = liu = 0XFF;
if(miao == 0)
{
si = SMG_duanma[(uint)high_limit_dianya] - 0X80;
wu = SMG_duanma[(uint)(high_limit_dianya * 10) % 10];
}
else if(miao != 0)
{
si = 0XFF;
wu = 0XFF;
}
qi = SMG_duanma[(uint)low_limit_dianya] - 0X80;
ba = SMG_duanma[(uint)(low_limit_dianya * 10) % 10];
}
else if(Mode_limit_high_low == 1)
{
yi = 0X8C;
er = san = liu = 0XFF;
si = SMG_duanma[(uint)high_limit_dianya] - 0X80;
wu = SMG_duanma[(uint)(high_limit_dianya * 10) % 10];
if(miao == 0)
{
qi = SMG_duanma[(uint)low_limit_dianya] - 0X80;
ba = SMG_duanma[(uint)(low_limit_dianya * 10) % 10];
}
else if(miao != 0)
{
qi = ba = 0XFF;
}
}
}
void Display_Mode_ceju()
{
float Rb2_dianya;
Rb2_dianya = Read_ADC_Rb2() * 0.01963;
if(Rb2_dianya >= real_low_limit_dianya && real_high_limit_dianya >= Rb2_dianya)
{
yi = 0XC3;
er = san = si = wu = liu = 0XFF;
qi = SMG_duanma[juli / 10];
ba = SMG_duanma[juli % 10];
continue_check_juli = 1;
Write_DAC(136);
}
else
{
yi = 0XC3;
er = san = si = wu = 0XFF;
liu = qi = ba = 0X88;
continue_check_juli = 0;
Write_DAC(0);
}
}
void SelectHC138(uchar 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;
}
}
void Initsys()
{
SelectHC138(4);
P0 = 0XFF;
SelectHC138(5);
P0 = 0X00;
SelectHC138(6);
P0 = 0XFF;
SelectHC138(7);
P0 = 0XFF;
}
void SMG_Bit(uchar pos, uchar value)
{
SelectHC138(6);
P0 = 0X01 << pos;
SelectHC138(7);
P0 = value;
}
void Delay_one_ms()
{
uint i;
for(i = 845; i > 0; i--);
}
void SMG_Display()
{
SMG_Bit(0,yi);
Delay_one_ms();
SMG_Bit(1,er);
Delay_one_ms();
SMG_Bit(2,san);
Delay_one_ms();
SMG_Bit(3,si);
Delay_one_ms();
SMG_Bit(4,wu);
Delay_one_ms();
SMG_Bit(5,liu);
Delay_one_ms();
SMG_Bit(6,qi);
Delay_one_ms();
SMG_Bit(7,ba);
Delay_one_ms();
}
void Delay_five_ms()
{
uint i,j;
for(j = 0; j < 5; j++)
for(i = 845; i > 0; i--);
}
void Alone_Key()
{
if(P30 == 0)
{
Delay_five_ms();
if(P30 == 0)
{
if(Mode == 1 && Mode_limit_high_low == 0 && high_limit_dianya != 0.5)
{
high_limit_dianya = high_limit_dianya - 0.5;
}
else if(Mode == 1 && Mode_limit_high_low == 1 && low_limit_dianya != 0.5)
{
low_limit_dianya = low_limit_dianya - 0.5;
}
}
while(!P30);
}
if(P31 == 0)
{
Delay_five_ms();
if(P31 == 0)
{
if(Mode == 1 && Mode_limit_high_low == 0 && (uint)high_limit_dianya != 5)
{
high_limit_dianya = high_limit_dianya + 0.5;
}
else if(Mode == 1 && Mode_limit_high_low == 1 && (uint)low_limit_dianya != 5)
{
low_limit_dianya = low_limit_dianya + 0.5;
}
}
while(!P31);
}
if(P32 == 0)
{
Delay_five_ms();
if(P32 == 0)
{
if(Mode == 1)
{
if(Mode_limit_high_low == 0)Mode_limit_high_low = 1;
else if(Mode_limit_high_low == 1)Mode_limit_high_low = 0;
}
}
while(!P32);
}
if(P33 == 0)
{
Delay_five_ms();
if(P33 == 0)
{
if(Mode == 0){Mode = 1;Mode_limit_high_low = 0;high_limit_dianya = real_high_limit_dianya;low_limit_dianya = real_low_limit_dianya;}
else if(Mode == 1){Mode = 2;real_high_limit_dianya = high_limit_dianya;real_low_limit_dianya = low_limit_dianya;}
else if(Mode == 2){Mode = 0;continue_check_juli = 0;}
}
while(!P33);
}
}
void Timer0Init(void)
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0xA0;
TH0 = 0x15;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Timer0Server() interrupt 1
{
tt++;
t++;
if(tt == 20)
{
if(continue_check_juli == 1)
{
P0 = 0XFF;
SelectHC138(4);
L8 = ~L8;
}
tt = 0;
}
if(t == 90)
{
if(Mode == 1)
{
miao = ~miao;
}
t = 0;
}
}
2.2 iic.c
#include "iic.h"
#define DELAY_TIME 5
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit;
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
float Read_ADC_Rb2()
{
float dat;
IIC_Start();
IIC_SendByte(0X90);
IIC_WaitAck();
IIC_SendByte(0X03);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0X91);
IIC_WaitAck();
dat = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return dat;
}
void Write_DAC(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0X90);
IIC_WaitAck();
IIC_SendByte(0X40);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
2.3 iic.h
#ifndef __IIC_H__
#define __IIC_H__
#include <STC15F2K60S2.h>
#include "intrins.h"
sbit SDA = P2^1;
sbit SCL = P2^0;
void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
float Read_ADC_Rb2();
void Write_DAC(unsigned char dat);
#endif