试题





代码
sys.h
#ifndef __SYS_H__
#define __SYS_H__#include <STC15F2K60S2.H>
//ds1302.c
extern unsigned char time[3];
void w_ds1302();
void r_ds1302();
//iic.c
float v_adc(unsigned char addr);
//sys.c
extern float light_v;
extern float rb2_v;
extern unsigned char UI;
extern unsigned char UI_keep;
extern unsigned char ui2_son;
extern unsigned char ui2_son_flag;
extern unsigned char flag_touch[3];
extern unsigned char time_touch[3][3];
extern bit flag_happen;
void init74hc138(unsigned char addr);
void init();
void led_ui();
void rb2_or_light();
//seg_key.c
extern unsigned char Seg_Buff[8];
void Seg_Loop();
void Key_Loop();
void seg_ui();
#endif
main.c
#include "sys.h"
bit flag_seg=0;
bit flag_key=0;
bit flag_ds=0;
bit flag_rb2=0;
bit flag_light=0;
void Timer0_Init(void) //100微秒@12.000MHz
{AUXR |= 0x80; //定时器时钟1T模式TMOD &= 0xF0; //设置定时器模式TL0 = 0x50; //设置定时初始值TH0 = 0xFB; //设置定时初始值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0 = 1; //使能定时器0中断EA = 1;
}
void main(){init();Timer0_Init();w_ds1302();while(1){led_ui();if(flag_seg){flag_seg=0;Seg_Loop();}if(flag_key){flag_key=0;Key_Loop();seg_ui();}if(flag_ds){flag_ds=0;r_ds1302();}if(flag_light){flag_light=0;light_v=v_adc(3);seg_ui();}if(flag_rb2){flag_rb2=0;rb2_v=v_adc(1);seg_ui();}rb2_or_light();}
}
void Timer0_Isr(void) interrupt 1
{static unsigned char count1=0,count2=0;static unsigned int count3=0,count4=0,count5=0;count1++;count2++;count3++;count5++;if(count1==2){count1=0;flag_seg=1;}if(count2==50){count2=0;flag_key=1;}if(count3==1000){flag_light=1;}else if(count3==2000){count3=0;flag_rb2=1;}if(flag_happen){count4++;if(count4==30000){count4=0;flag_happen=0;UI=UI_keep;}}if(count5==5000){count5=0;flag_ds=1;}
}
sys.c
#include "sys.h"
unsigned char UI=0;
unsigned char UI_keep;
unsigned char ui2_son=0;
unsigned char ui2_son_flag=0;
unsigned char flag_touch[3]={0,0,0};
unsigned char time_touch[3][3]={0,0,0,0,0,0,0,0,0};
bit flag_happen=0;
float light_v;
float rb2_v;
void init74hc138(unsigned char addr){P2=(P2&0x1f)|(addr<<5);P2&=0x1f;
}
void init(){P0=0x00;init74hc138(5);P0=0xff;init74hc138(4);
}
void led(unsigned char addr){P0=~(0x01<<(addr-1));init74hc138(4);
}
void led_ui(){switch(UI){case 0:led(1);break;case 1:led(2);break;case 2:led(3);break;case 4:led(8);break;}
}
void rb2_or_light(){EA = 0;if(light_v<rb2_v&&flag_happen==0){flag_happen=1;flag_touch[ui2_son_flag]=1;ui2_son_flag++;if(ui2_son_flag==3)ui2_son_flag=0;time_touch[2][0]=time_touch[1][0];time_touch[2][1]=time_touch[1][1];time_touch[2][2]=time_touch[1][2];time_touch[1][0]=time_touch[0][0];time_touch[1][1]=time_touch[0][1];time_touch[1][2]=time_touch[0][2];time_touch[0][0]=time[0];time_touch[0][1]=time[1];time_touch[0][2]=time[2];UI_keep=UI;UI=4;}EA =1;
}
seg_key.c
#include "sys.h"
sbit ROW3=P3^2;
sbit ROW4=P3^3;
sbit COL1=P4^4;
sbit COL2=P4^2;
code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A 10
0xc6, //C 11
0x8c, //P 12
0xbf, //- 13
0xff, //熄灭 14
0xc1 //U 15
};
unsigned char Seg_Buff[8]={14,14,14,14,14,14,14,14};
unsigned char keyval,keyold,keyup,keydown;
void seg(unsigned char addr,unsigned char num){P0=0xff;init74hc138(7);P0=0x01<<addr;init74hc138(6);P0=Seg_Table[num];if(UI==1&&(addr==1||addr==5))P0&=0x7f;init74hc138(7);
}
void Seg_Loop(){static unsigned char i=0;seg(i,Seg_Buff[i]);i++;if(i==8) i=0;
}
unsigned char key_scan(){COL1=0;COL2=1;if(ROW3==0) return 5;if(ROW4==0) return 4;COL1=1;COL2=0;if(ROW4==0) return 8;return 0;
}
void Key_Loop(){keyval=key_scan();keydown=keyval&(keyold^keyval);keyup=~keyval&(keyold^keyval);if(keyval==4&&keyold!=4){UI++;if(UI==3) UI=0;ui2_son=0;}if(UI==2){if(keyval==5&&keyold!=5){ui2_son++;if(ui2_son==3) ui2_son=0;}if(keyval==8&&keyold!=8){ui2_son_flag=0;flag_touch[0]=0;flag_touch[1]=0;flag_touch[2]=0;}}keyold=keyval;keyval=0;
}
void ui0(){Seg_Buff[7]=time[0]%10;Seg_Buff[6]=time[0]/10;Seg_Buff[5]=13;Seg_Buff[4]=time[1]%10;Seg_Buff[3]=time[1]/10;Seg_Buff[2]=13;Seg_Buff[1]=time[2]%10;Seg_Buff[0]=time[2]/10;
}
void ui1(){Seg_Buff[7]=(unsigned char)(rb2_v*100+0.5)%10;Seg_Buff[6]=(unsigned char)(rb2_v*100+0.5)/10%10;Seg_Buff[5]=(unsigned char)(rb2_v*100+0.5)/100%10;Seg_Buff[4]=15; //USeg_Buff[3]=(unsigned char)(light_v*100+0.5)%10;Seg_Buff[2]=(unsigned char)(light_v*100+0.5)/10%10;Seg_Buff[1]=(unsigned char)(light_v*100+0.5)/100%10;Seg_Buff[0]=12; //p
}
void ui2(){Seg_Buff[0]=10;Seg_Buff[1]=ui2_son+1;if(flag_touch[ui2_son]){Seg_Buff[7]=time_touch[ui2_son][0]%10;Seg_Buff[6]=time_touch[ui2_son][0]/10;Seg_Buff[5]=time_touch[ui2_son][1]%10;Seg_Buff[4]=time_touch[ui2_son][1]/10;Seg_Buff[3]=time_touch[ui2_son][2]%10;Seg_Buff[2]=time_touch[ui2_son][2]/10;}else{Seg_Buff[7]=13;Seg_Buff[6]=13;Seg_Buff[5]=13;Seg_Buff[4]=13;Seg_Buff[3]=13;Seg_Buff[2]=13;}
}
void ui4(){Seg_Buff[7]=time_touch[0][0]%10;Seg_Buff[6]=time_touch[0][0]/10;Seg_Buff[5]=time_touch[0][1]%10;Seg_Buff[4]=time_touch[0][1]/10;Seg_Buff[3]=time_touch[0][2]%10;Seg_Buff[2]=time_touch[0][2]/10;Seg_Buff[1]=11;Seg_Buff[0]=11;
}
void seg_ui(){switch(UI){case 0:ui0();break;case 1:ui1();break;case 2:ui2();break;case 4:ui4();break;}
}
iic.c
#include "sys.h"
#include "intrins.h"
#define DELAY_TIME 10
sbit sda=P2^1;
sbit scl=P2^0;
static void I2C_Delay(unsigned char n)
{do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }while(n--);
}
void I2CStart(void)
{sda = 1;scl = 1;I2C_Delay(DELAY_TIME);sda = 0;I2C_Delay(DELAY_TIME);scl = 0;
}
void I2CStop(void)
{sda = 0;scl = 1;I2C_Delay(DELAY_TIME);sda = 1;I2C_Delay(DELAY_TIME);
}
void I2CSendByte(unsigned char byt)
{unsigned char i;for(i=0; i<8; i++){scl = 0;I2C_Delay(DELAY_TIME);if(byt & 0x80){sda = 1;}else{sda = 0;}I2C_Delay(DELAY_TIME);scl = 1;byt <<= 1;I2C_Delay(DELAY_TIME);}scl = 0;
}
unsigned char I2CReceiveByte(void)
{unsigned char da;unsigned char i;for(i=0;i<8;i++){ scl = 1;I2C_Delay(DELAY_TIME);da <<= 1;if(sda) da |= 0x01;scl = 0;I2C_Delay(DELAY_TIME);}return da;
}
unsigned char I2CWaitAck(void)
{unsigned char ackbit;scl = 1;I2C_Delay(DELAY_TIME);ackbit = sda; scl = 0;I2C_Delay(DELAY_TIME);return ackbit;
}
void I2CSendAck(unsigned char ackbit)
{scl = 0;sda = ackbit; I2C_Delay(DELAY_TIME);scl = 1;I2C_Delay(DELAY_TIME);scl = 0; sda = 1;I2C_Delay(DELAY_TIME);
}
unsigned char adc(unsigned char addr){unsigned char temp;EA = 0;I2CStart();I2CSendByte(0x90);I2CWaitAck();I2CSendByte(addr);I2CWaitAck();I2CStart();I2CSendByte(0x91);I2CWaitAck();temp=I2CReceiveByte();I2CSendAck(1);I2CStop();EA = 1;return temp;
}
float v_adc(unsigned char addr){return (float)(adc(addr)/256.0*5.0);
}
ds1302.c
#include "sys.h"
#include "intrins.h"
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST=P1^3;
unsigned char time[3]={50,59,23};
void Write_Ds1302(unsigned char temp)
{unsigned char i;for (i=0;i<8;i++) { SCK = 0;SDA = temp&0x01;temp>>=1; SCK=1;}
}
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{RST=0; _nop_();SCK=0; _nop_();RST=1; _nop_(); Write_Ds1302(address); Write_Ds1302(dat/10*16|dat%10); RST=0;
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{unsigned char i,temp=0x00;unsigned char dat1,dat2;RST=0; _nop_();SCK=0; _nop_();RST=1; _nop_();Write_Ds1302(address);for (i=0;i<8;i++) { SCK=0;temp>>=1; if(SDA)temp|=0x80; SCK=1;} RST=0; _nop_();SCK=0; _nop_();SCK=1; _nop_();SDA=0; _nop_();SDA=1; _nop_();dat1=temp/16;dat2=temp%16;temp=dat1*10+dat2;return (temp);
}
void w_ds1302(){unsigned char i,addr=0x80;Write_Ds1302_Byte(0x8e,0x00);for(i=0;i<3;i++){Write_Ds1302_Byte(addr,time[i]);addr+=2;}Write_Ds1302_Byte(0x8e,0x80);
}
void r_ds1302(){unsigned char i,addr=0x81;for(i=0;i<3;i++){time[i]=Read_Ds1302_Byte(addr);addr+=2;}
}