#include "reg52.h"
#include "onewire.h"
#include "iic.h"
#include "ds1302.h"
#define smgTime 2
#define keyTime 5
#define _A_ 0x88
#define _P_ 0x8c
#define _E_ 0x86
#define _C_ 0xc6
#define _H_ 0x89
#define _F_ 0x8e
#define _ 0xbf
sfr P4=0xc0;
sbit pulse_in=P3^4;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P42=P4^2;
sbit P44=P4^4;
sfr AUXR=0x8e;
unsigned char trigger_flag=1;
unsigned char L4blink=0;
unsigned char L4=0;
unsigned char pressing=0;
unsigned char last_trigger_time[2]={0x00,0x00};
unsigned char bigger_flag=0;
unsigned char threeSec=0;
unsigned char tmp;
unsigned char led_stat=0xff;
unsigned char s;
unsigned char write_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char read_addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char init_time[7]={0x24, 0x58, 0x23, 0x19, 0x04, 0x06, 0x20};//s m h date month day year
//unsigned char curr_time[7]={0x45,0x59,0x12,0x31,0x12,0x01,0x23};
unsigned char sec=0;
unsigned char min=0;
unsigned char hour=0;
unsigned char seg_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char ad_dat=0;
unsigned int temp_dat16=0;
double temp_dat=0;
double last_temp_dat=0;
double volt_dat=0;
double last_volt_dat=0;
unsigned int timer1counter=0;
unsigned int pulse_counter=0;
unsigned int pulse_dat=0;
unsigned char damp_per=0;
unsigned char last_damp_per=0;
unsigned char damp_Hcode=0;
unsigned char damp_Lcode=0;
unsigned char interface_mod=1;//1 2 3 ||4 || time echo para ||temperature||
unsigned char echo_mod=1;// 1 2 3
unsigned char temp_para=30;
unsigned char trigger_times=0;
unsigned char max_temp=0;
unsigned char max_damp=0;
unsigned char press_counter=0;
double ave_temp=0;
double ave_damp=0;
double sum_temp=0;
unsigned int sum_damp=0;
void scan_keys();
void display_ctrl(void);
void test();
latch enable and write/
void write_latch(unsigned char n,unsigned char val){
P0=val;
switch(n){
case 4:
P2&=0x1f;
P2|=0x80;
break;
case 5:
P2&=0x1f;
P2|=0xa0;
break;
case 6:
P2&=0x1f;
P2|=0xc0;
break;
case 7:
P2&=0x1f;
P2|=0xe0;
break;
case 0:
P2&=0x1f;
}
P2&=0x1f;//close hc573 latch;
}
void enable_latch(unsigned char n){
switch(n){
case 4:
P2&=0x1f;
P2|=0x80;
break;
case 5:
P2&=0x1f;
P2|=0xa0;
break;
case 6:
P2&=0x1f;
P2|=0xc0;
break;
case 7:
P2&=0x1f;
P2|=0xe0;
break;
case 0:
P2&=0x1f;
}
}
///
//delay/
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void delay_ms(unsigned int t){
while(t--){
Delay1ms();
}
}
void delay_with_scan(unsigned int t){//16 ms 1 round
while(t--){
//Delay1ms();
display_ctrl();
//test();
}
}
/set and get time///
void set_ds1302(){
unsigned char i;
Write_Ds1302_Byte(0x8e, 0x00);
for(i=0;i<7;i++){
Write_Ds1302_Byte(write_addr[i], init_time[i]);
}
Write_Ds1302_Byte(0x8e, 0x80);
}
void get_ds1302(){
sec=Read_Ds1302_Byte(0x81);
min=Read_Ds1302_Byte(0x83);
hour=Read_Ds1302_Byte(0x85);
}
///
light data///
void iic_read_ain1(){
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x01);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
ad_dat=IIC_RecByte();
IIC_Ack(1);
IIC_Stop();
}
void conv2volt(void){
volt_dat=((double)ad_dat*(5.0/255.0));
}
///
get temperture data/
void get_temp(void){
unsigned char TL;
unsigned char TH;
Init_DS18B20();
Write_DS18B20(0xcc);//skip rom
Write_DS18B20(0x44);//convert
delay_with_scan(50);//waiting for converting
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
TL=Read_DS18B20();//low 8bits ****!!!!!!!!!!!attention!!!!!!!!!!!!***lowComsFirst
TH=Read_DS18B20();//high 8bits !!!!!!!!!!!!
temp_dat16=0x0000;
temp_dat16|=TH;
temp_dat16=temp_dat16<<8;
temp_dat16|=TL;//combine to get a 16bits data
temp_dat=temp_dat16*(0.0625);
}
///timer setting/
void Timer1Init(void) //5ms@12.000MHz
{
EA=1;
ET1=1;
AUXR |= 0x40;
TMOD &= 0x0F;
TL1 = 0xA0;
TH1 = 0x15;
TF1 = 0;
TR1 = 1;
}
void timer1server() interrupt 3{
TL1 = 0xA0;
TH1 = 0x15;
scan_keys();
timer1counter++;
//if(trigger_flag==0)threeSec++;
if(pressing){
press_counter++;
}
else{
press_counter=0;
}
//if(threeSec==600 && trigger_flag==0){
// trigger_flag=1;
//threeSec=0;
//interface_mod=tmp;
//}
if((timer1counter%20==0)&& L4blink==1){
if(L4){
enable_latch(4);
led_stat&=0xf7 ;//1111 0111
P0=led_stat;
enable_latch(0);
}
else{
enable_latch(4);
led_stat|=0x08 ;//1111 0111
P0=led_stat;
enable_latch(0);
}
L4=1-L4;
}
if(timer1counter==200){//1s
//yo++;
//if(yo==100)yo=0;
timer1counter=0;
pulse_dat=pulse_counter;
pulse_counter=0;
}
}
void Timer0Init(void){
AUXR |= 0x80;
TMOD &=0xf0; //0000 0110
TMOD |=0x06;//8bits auto load, counter
TL0=0xff;//into server every pulse
TH0=0xff;
EA=1;
ET0=1;
TR0=1;
}
void timer0server() interrupt 1{
pulse_counter++;
}
///dampness data///
void get_damp_percent(){
if(pulse_dat>2000 || pulse_dat<200){
damp_Hcode=_A_;
damp_Lcode=_A_;
}
else{
damp_per=(unsigned char)(pulse_dat*0.044+1.12);
damp_Hcode=seg_code[(damp_per/10)];
damp_Lcode=seg_code[damp_per%10];
}
}
///
//display data///
void display_bit(unsigned char pos,unsigned char code_val,unsigned char isdot){
write_latch(6,0x01<<(pos-1));//position
if(isdot){
write_latch(7,code_val&0x7f);//
}
else{
write_latch(7,code_val);
}
}
void smg_off(unsigned char pos){
write_latch(6,0x01<<(pos-1));
write_latch(7,0xff);
}
unsigned char bcd2dec(unsigned char n){
unsigned char tmp=0x00;
unsigned char h;
unsigned char l;
h=(n&0xf0)>>4;
l=(n&0x0f);
tmp=h*10+l;
return tmp;
}
void display_time(){
display_bit(1,seg_code[hour>>4],0);
delay_ms(smgTime);
smg_off(1);
display_bit(2,seg_code[hour&0x0f],0);
delay_ms(smgTime);
smg_off(2);
display_bit(3,_,0);
delay_ms(smgTime);
smg_off(3);
//
display_bit(4,seg_code[min>>4],0);
delay_ms(smgTime);
smg_off(4);
display_bit(5,seg_code[min&0x0f],0);
delay_ms(smgTime);
smg_off(5);
display_bit(6,_,0);
delay_ms(smgTime);
smg_off(6);
display_bit(7,seg_code[sec>>4],0);
delay_ms(smgTime);
smg_off(7);
display_bit(8,seg_code[sec&0x0f],0);
delay_ms(smgTime);
smg_off(8);
}
void display_para(){
display_bit(1,_P_,0);
delay_ms(smgTime);
smg_off(1);
display_bit(2,0xff,0);
delay_ms(smgTime);
smg_off(2);
display_bit(3,0xff,0);
delay_ms(smgTime);
smg_off(3);
display_bit(4,0xff,0);
delay_ms(smgTime);
smg_off(4);
display_bit(5,0xff,0);
delay_ms(smgTime);
smg_off(5);
display_bit(6,0xff,0);
delay_ms(smgTime);
smg_off(6);
display_bit(7,seg_code[temp_para/10],0);
delay_ms(smgTime);
smg_off(7);
display_bit(8,seg_code[temp_para%10],0);
delay_ms(smgTime);
smg_off(8);
}
void display_temp_echo(){
display_bit(1,_C_,0);
delay_ms(smgTime);
smg_off(1);
display_bit(2,0xff,0);
delay_ms(smgTime);
smg_off(2);
display_bit(3,seg_code[(unsigned char)max_temp/10],0);
delay_ms(smgTime);
smg_off(3);
display_bit(4,seg_code[(unsigned char)max_temp%10],0);
delay_ms(smgTime);
smg_off(4);
display_bit(5,_,0);
delay_ms(smgTime);
smg_off(5);
display_bit(6,seg_code[(unsigned char)ave_temp/10],0);
delay_ms(smgTime);
smg_off(6);
display_bit(7,seg_code[(unsigned char)ave_temp%10],1);
delay_ms(smgTime);
smg_off(7);
display_bit(8,seg_code[((unsigned char)(ave_temp*10))%10],0);
delay_ms(smgTime);
smg_off(8);
}
void display_damp_echo(){
display_bit(1,_H_,0);
delay_ms(smgTime);
smg_off(1);
display_bit(2,0xff,0);
delay_ms(smgTime);
smg_off(2);
display_bit(3,seg_code[(unsigned char)max_damp/10],0);
delay_ms(smgTime);
smg_off(3);
display_bit(4,seg_code[(unsigned char)max_damp%10],0);
delay_ms(smgTime);
smg_off(4);
display_bit(5,_,0);
delay_ms(smgTime);
smg_off(5);
display_bit(6,seg_code[(unsigned char)ave_damp/10],0);
delay_ms(smgTime);
smg_off(6);
display_bit(7,seg_code[(unsigned char)ave_damp%10],1);
delay_ms(smgTime);
smg_off(7);
display_bit(8,seg_code[((unsigned char)(ave_damp*10))%10],0);
delay_ms(smgTime);
smg_off(8);
}
void display_time_echo(){
display_bit(1,_F_,0);
delay_ms(smgTime);
smg_off(1);
display_bit(2,seg_code[trigger_times/10],0);
delay_ms(smgTime);
smg_off(2);
display_bit(3,seg_code[trigger_times%10],0);
delay_ms(smgTime);
smg_off(3);
display_bit(4,seg_code[bcd2dec(last_trigger_time[0])/10],0);
delay_ms(smgTime);
smg_off(4);
display_bit(5,seg_code[bcd2dec(last_trigger_time[0])%10],0);
delay_ms(smgTime);
smg_off(6);
display_bit(6,_,0);
delay_ms(smgTime);
smg_off(5);
display_bit(7,seg_code[bcd2dec(last_trigger_time[1])/10],0);
delay_ms(smgTime);
smg_off(7);
display_bit(8,seg_code[bcd2dec(last_trigger_time[1])%10],0);
delay_ms(smgTime);
smg_off(8);
}
void display_temp_damp(){
display_bit(1,_E_,0);
delay_ms(smgTime);
smg_off(1);
display_bit(2,0xff,0);
delay_ms(smgTime);
smg_off(2);
display_bit(3,0xff,0);
delay_ms(smgTime);
smg_off(3);
display_bit(4,seg_code[(unsigned char)temp_dat/10],0);
delay_ms(smgTime);
smg_off(4);
display_bit(5,seg_code[(unsigned char)temp_dat%10],0);
delay_ms(smgTime);
smg_off(5);
display_bit(6,_,0);
delay_ms(smgTime);
smg_off(6);
display_bit(7,damp_Hcode,0);
delay_ms(smgTime);
smg_off(7);
display_bit(8,damp_Lcode,0);
delay_ms(smgTime);
smg_off(8);
}
void display_ctrl(){
if(interface_mod==1){
display_time();
}
else if(interface_mod==2){
if(echo_mod==1){
display_temp_echo();
}
if(echo_mod==2){
display_damp_echo();
}
if(echo_mod==3){
display_time_echo();
}
}
else if(interface_mod==3){
display_para();
}
else if(interface_mod==4){
display_temp_damp();
}
}
/read keyboard//
void scan_keys(){
P32=0;P33=1;
if(P42==0){
delay_with_scan(keyTime);
if(P42==0){
//s9
if(interface_mod==3){
temp_para--;
}
if(interface_mod==2 && echo_mod==3){
while(P42==0){
pressing=1;
}
pressing=0;
if(press_counter>=400){//>= 2s clear all data
trigger_times=0;
sum_temp=0;
sum_damp=0;
max_temp=0;
max_damp=0;
}
}
}
}
if(P44==0){
delay_with_scan(keyTime);
if(P44==0){
//s5
if(interface_mod==2){
if(echo_mod==1){
echo_mod=2;
}
else if(echo_mod==2){
echo_mod=3;
}
else if(echo_mod==3){
echo_mod=1;
}
}
}
}
///
P32=1;P33=0;
if(P42==0){
delay_with_scan(keyTime);
if(P42==0){
//s8
if(interface_mod==3){
temp_para++;
}
}
}
if(P44==0){
delay_with_scan(keyTime);
if(P44==0){
//s4
if(interface_mod==1){
interface_mod=2;
}
else if(interface_mod==2){
interface_mod=3;
}
else if(interface_mod==3){
interface_mod=1;
}
}
}
}
//if collect
void if_collect_data(){
unsigned char t=188;
iic_read_ain1();
conv2volt();
if(last_volt_dat>3.0 && volt_dat<3.0 && trigger_flag){
trigger_times++;
last_trigger_time[0]=hour;
last_trigger_time[1]=min;
get_damp_percent();
get_temp();
sum_damp+=damp_per;
ave_damp=sum_damp/(double)trigger_times;
sum_temp+=temp_dat;
ave_temp=sum_temp/(double)trigger_times;
if((damp_per>last_damp_per)&&(temp_dat>last_temp_dat)){
bigger_flag=1;
}
else{
bigger_flag=0;
}
if(damp_per>max_damp)max_damp=damp_per;
if(temp_dat>max_temp)max_temp=temp_dat;
tmp=interface_mod;
interface_mod=4;
while(t--){
display_ctrl();
}
interface_mod=tmp;
last_damp_per=damp_per;
last_temp_dat=temp_dat;
}
last_volt_dat=volt_dat;
}
//
void init_sys(){
write_latch(4,0xff);
}
void led_ctrl(){
if(interface_mod==1){
enable_latch(4);
led_stat&=0xfe;
P0=led_stat;
enable_latch(0);
}
else{
enable_latch(4);
led_stat|=0x01;
P0=led_stat;
enable_latch(0);
}
if(interface_mod==2){
enable_latch(4);
led_stat&=0xfd;//1111 1101
P0=led_stat;
enable_latch(0);
}
else{
enable_latch(4);
led_stat|=0x02;
P0=led_stat;
enable_latch(0);
}
if(interface_mod==3){
enable_latch(4);
led_stat&=0xfb;//1111 1011
P0=led_stat;
enable_latch(0);
}
else{
enable_latch(4);
led_stat|=0x04;//0000 0100
P0=led_stat;
enable_latch(0);
}
if(temp_dat>temp_para){
L4blink=1;
}
else{
L4blink=0;
}
if(damp_Hcode==_A_){
enable_latch(4);
led_stat&=0xef;//1110 1111
P0=led_stat;
enable_latch(0);
}
else{
enable_latch(4);
led_stat|=0x10;//0001 0000
P0=led_stat;
enable_latch(0);
}
if((trigger_times>=2)&&(bigger_flag)){
enable_latch(4);
led_stat&=0xdf;//1101 1111
P0=led_stat;
enable_latch(0);
}
else{
enable_latch(4);
led_stat|=0x20;//0010 0000
P0=led_stat;
enable_latch(0);
}
}
void main(){
Timer1Init();
Timer0Init();
init_sys();
set_ds1302();
iic_read_ain1();
conv2volt();
last_volt_dat=volt_dat;
while(1){
get_ds1302();
if_collect_data();
led_ctrl();
display_ctrl();
//get_temp();
//test();
}
}
吐槽一下,全篇七百多行,给我写个半死,这题目对于省赛来说工作量是不是有点太大了?