|
- //头文件
- #include<iap15f2k61s2.h>
- #include<intrins.h>
- #include<stdio.h>
- #include"ds1302.h"
- #include"iic.h"
- //IO口定义
- sbit relay=P0^4;
- sbit buzzer=P0^6;
- sbit Trig=P1^0;
- sbit Echo=P1^1;
- //变量定义
- #define keyin P3
- #define time_display 0
- #define csb_display 1
- #define settime_display 2
- #define setdistance_display 3
- bit csb_flag=0;
- bit san_flag=0;
- bit flag=0;
- unsigned char LED_SMGwei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00};
- unsigned char SMGduan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40};
- unsigned char table[8];
- unsigned char display_turn=0;
- unsigned int csb_du=0;
- unsigned char trg,cont;
- unsigned char set_shi,set_fen,set_miao;
- unsigned char notice_distance=30;
- unsigned char time_weizhi=0;
- //微秒延迟
- void Delay_us(unsigned int time) //@11.0592MHz
- {
- unsigned int m=0;
- for(m=0;m<=time;m++)
- {
- _nop_();
- _nop_();
- _nop_();
- }
- }
- //定时器
- void Timer0Init(void) //1毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0xCD; //设置定时初值
- TH0 = 0xD4; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0=1;
- EA=1;
- }
- void timer0() interrupt 1
- {
- static unsigned char count=0,count2=0,i=0;
- static unsigned int count1=0;
- count++;count2++;
- if(count==1)
- {
- count=0;
- P2=0xe0;P0=~SMGduan[table[ i]];P2=0x00; P2=0xc0;P0=LED_SMGwei[ i];P2=0x00; i++; if(i==8)i=0; } if(count2==200) { count2=0; csb_flag=1; } if(flag) { count1++; if(count1==500) { count1=0; san_flag=!san_flag; } }}//毫秒延迟void Delay_ms(unsigned int time) //@11.0592MHz{ unsigned char i, j; unsigned int m; for(m=0;m<=time;m++) { _nop_(); _nop_(); _nop_(); i = 11; j = 190; do { while (--j); } while (--i); }} //独立按键void KeyRead(void) { unsigned char ReadData; ReadData=keyin^0xff; trg=ReadData&(ReadData^cont); cont=ReadData;}//蜂鸣器继电器控制void buzzer_relay(unsigned char buzzer_mode,unsigned char relay_mode){ P2=0xa0;relay=relay_mode;buzzer=buzzer_mode;P2=0x00;}//led控制void LED(unsigned char i){ P0=~LED_SMGwei[ i];P2=0x80;P2=0x00; }//超声波float csb(){ float length=0; unsigned int t=0; unsigned char i=8; do { Trig=!Trig; Delay_us(20); } while(i--); TR1=1; while((Echo==1)&&(TF1==0)); TR1=0; if(TF1==1) { TF1=0; length=999; } else { t=TH1; t<<=8; t|=TL1; length=t*0.017*1.085; } TH1=0; TL1=0; if(length==999)return length=999; else return (length+8);} //显示void display(unsigned int du,unsigned char mode,unsigned char num){ if(mode==1) { table[0]=du>=10000000? du/10000000%10:16; table[1]=du>=1000000? du/1000000%10:16; table[2]=du>=100000? du/100000%10:16; table[3]=du>=10000? du/10000%10:16; table[4]=du>=1000? du/1000%10:16; table[5]=du>=100? du/100%10:16; table[6]=du>=10? du/10%10:16; table[7]=du>=0? du%10:16; } else if(mode==0) table[num]=du;}unsigned char shi;unsigned char fen;unsigned char miao;void clock(){ EA=0; miao=(Read_Ds1302_Byte(0x81)/16)*10+Read_Ds1302_Byte(0x81)%16; fen=(Read_Ds1302_Byte(0x83)/16)*10+Read_Ds1302_Byte(0x83)%16; shi=(Read_Ds1302_Byte(0x85)/16)*10+Read_Ds1302_Byte(0x85)%16; EA=1; display(miao%10,0,7); display(miao/10,0,6); display(17,0,5); display(fen%10,0,4); display(fen/10,0,3); display(17,0,2); display(shi%10,0,1); display(shi/10,0,0);}void set_display(unsigned char mode){ if(mode==settime_display) { if(san_flag==1&&time_weizhi==1){ display(16,0,1); display(16,0,0); display(set_fen%10,0,4); display(set_fen/10,0,3); } else if(san_flag==0&&time_weizhi==1){ display(set_shi%10,0,1); display(set_shi/10,0,0); display(set_fen%10,0,4); display(set_fen/10,0,3); } if(san_flag==1&&time_weizhi==2){ display(16,0,4); display(16,0,3); display(set_shi%10,0,1); display(set_shi/10,0,0); } else if(san_flag==0&&time_weizhi==2){ display(set_fen%10,0,4); display(set_fen/10,0,3); display(set_shi%10,0,1); display(set_shi/10,0,0); } display(set_miao%10,0,7); display(set_miao/10,0,6); display(17,0,5); display(17,0,2); } else if(mode==setdistance_display){ display(notice_distance,1,0); }}void display_mode(unsigned char mode){ if(mode==time_display) { clock(); } else if(mode==csb_display) { display(csb_du,1,0); } else set_display(mode);}//数码管void SMG(){ P2=0xc0;P0=0xff;P2=0x00; P2=0xe0;P0=0x00;P2=0x00;}void main(){ LED(0); SMG(); buzzer_relay(1,0); Delay_ms(1000); LED(8); buzzer_relay(0,0); display_turn=time_display; settime(11,50,59); write_24c02(0x50,30); notice_distance=read_24c02(0x50); Timer0Init(); while(1) { if(csb_flag) { csb_du=csb(); csb_flag=0; } display_mode(display_turn); KeyRead(); if(trg==0x01) { display_turn=!display_turn; } if(trg==0x02) { if(display_turn==time_display){ if(time_weizhi==0) { set_shi=shi;set_fen=fen;set_miao=miao; display_turn=settime_display; } time_weizhi+=1;flag=1; } else if(display_turn==settime_display) { time_weizhi+=1; if(time_weizhi==3){ settime(set_shi,set_fen,set_miao); time_weizhi=0;flag=0; display_turn=time_display; } } if(display_turn==csb_display){ display_turn=setdistance_display; } else if(display_turn==setdistance_display){ write_24c02(0x50,notice_distance); display_turn=csb_display; } } if(trg==0x04) { if(display_turn==settime_display) { if(time_weizhi==1) { set_shi+=1; if(set_shi==24)set_shi=23; } if(time_weizhi==2) { set_fen+=1; if(set_fen==60)set_fen=59; } } else if(display_turn==setdistance_display){ notice_distance+=1; if(notice_distance==999)notice_distance=999; } } if(trg==0x08) { if(display_turn==settime_display) { if(time_weizhi==1) { if(set_shi==0){set_shi=0;continue;} set_shi-=1; } if(time_weizhi==2) { if(set_fen==0){set_fen=0;continue;} set_fen-=1; } } else if(display_turn==setdistance_display){ if(notice_distance==0){notice_distance=0;break;} notice_distance-=1; } } }}
复制代码
|
|