#include #include #include #define osccal 0x7d//内部RC校正常数 #define Vref 2550//参考电压值 extern unsigned char twi_write(unsigned char addr, unsigned char dd); extern unsigned char twi_read(unsigned char addr, unsigned char *dd); const unsigned char seg_table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char led_buff[4]={0,0,0,0}; unsigned int adc_rel;//AD转换结果 unsigned char adc_mux;//AD通道 unsigned int temp; unsigned char data1,data2,t1,t2,t3; unsigned long t; /*****端口初始化********/ void port_init(void) { PORTB = 0xf8; DDRB = 0xf8; //关闭内部上拉电阻 PORTC = 0x7c; DDRC = 0x7c; PORTD = 0x00; DDRD = 0xff; } void init_devices(void) { CLI(); port_init(); timer1_init(); adc_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x04; SEI(); } void timer1_init(void) { TCNT1H = 0xFF; //setup TCNT1L = 0x83; OCR1AH = 0x00; OCR1AL = 0x7D; OCR1BH = 0x00; OCR1BL = 0x7D; ICR1H = 0x00; ICR1L = 0x7D; TCCR1A = 0x00; } #pragma interrupt_handler timer1_ovf_isr:9 void timer1_ovf_isr(void) { TCNT1H = 0xFF; //reload counter high value TCNT1L = 0x9F; //reload counter low value if(t<=(t1+t2)*1000||t1); } /********毫秒延时********/ void delay_ms(unsigned int time) { while(time!=0) { delay_us(1000); time--; } } /******************LED显示***********************/ void led_display_time(void) { unsigned char i; led_buff[0]=seg_table[t/100000]; led_buff[1]=seg_table[t%100000/10000]; led_buff[2]=seg_table[t%10000/1000]+0x80; led_buff[3]=seg_table[t%1000/100]; for(i=0;i<4;i++) { PORTD=led_buff[i]; PORTB&=~BIT(i+4); delay_ms(2); PORTB|=0xf0; } } void led_display_ready(void) { unsigned char i; led_buff[0]=0x6f; led_buff[1]=0x5c; led_buff[2]=0x5c; led_buff[3]=0x5e; for(i=0;i<4;i++) { PORTD=led_buff[i]; PORTB&=~BIT(i+4); delay_ms(2); PORTB|=0xf0; } } void led_display_adc(void) { unsigned char i; for(i=0;i<4;i++) { PORTD=led_buff[i]; PORTB&=~BIT(i+4); delay_ms(2); PORTB|=0xf0; } } void led_display_off(void) { unsigned char i; led_buff[0]=0x3f; led_buff[1]=0x3f; led_buff[2]=0x71; led_buff[3]=0x71; for(i=1;i<4;i++) { PORTD=led_buff[i]; PORTB&=~BIT(i+4); delay_ms(2); PORTB|=0xf0; } } void led_display_twi_data1(void) { unsigned char i; led_buff[0]=seg_table[data1/1000]; led_buff[1]=seg_table[data1%1000/100]; led_buff[2]=seg_table[data1%100/10]; led_buff[3]=seg_table[data1%10]; for(i=0;i<4;i++) { PORTD=led_buff[i]; PORTB&=~BIT(i+4); delay_ms(2); PORTB|=0xf0; } } void led_display_twi_data2(void) { unsigned char i; led_buff[0]=seg_table[data2/1000]; led_buff[1]=seg_table[data2%1000/100]; led_buff[2]=seg_table[data2%100/10]; led_buff[3]=seg_table[data2%10]; for(i=0;i<4;i++) { PORTD=led_buff[i]; PORTB&=~BIT(i+4); delay_ms(2); PORTB|=0xf0; } } void led_display_twi_t1(void) { unsigned char i; led_buff[0]=seg_table[t1/1000]; led_buff[1]=seg_table[t1%1000/100]; led_buff[2]=seg_table[t1%100/10]; led_buff[3]=seg_table[t1%10]; for(i=0;i<4;i++) { PORTD=led_buff[i]; PORTB&=~BIT(i+4); delay_ms(2); PORTB|=0xf0; } } void led_display_twi_t2(void) { unsigned char i; led_buff[0]=seg_table[t2/1000]; led_buff[1]=seg_table[t2%1000/100]; led_buff[2]=seg_table[t2%100/10]; led_buff[3]=seg_table[t2%10]; for(i=0;i<4;i++) { PORTD=led_buff[i]; PORTB&=~BIT(i+4); delay_ms(2); PORTB|=0xf0; } } void led_display_twi_t3(void) { unsigned char i; led_buff[0]=seg_table[t3/1000]; led_buff[1]=seg_table[t3%1000/100]; led_buff[2]=seg_table[t3%100/10]; led_buff[3]=seg_table[t3%10]; for(i=0;i<4;i++) { PORTD=led_buff[i]; PORTB&=~BIT(i+4); delay_ms(2); PORTB|=0xf0; } } /*************起动程序************ void qd(void) { unsigned char i; i=1; TCCR1B = 0x03; //start Timer while(t<=data1*1000) { led_display_time(); OCR2=i; i=((data3*2/3)/data1*t)/1000; } while(1) { led_display_time(); OCR2=i; i=(data3*2/3)+(255-(data3*2/3))/data2*(t-data1*1000)/1000; if(t>=(data1+data2)*1000) { TCCR1B = 0x00; //Timer stop t=0; break; } } }*/ /*************起动程序*************/ void qd(void) { unsigned char i; TCCR1B = 0x03; //start Timer i=data1*2/3; while(t<=t1*1000) { led_display_time(); OCR2=i; i=data1*2/3+(data2-data1)*2/3/t1*t/1000; } while(1) { led_display_time(); OCR2=i; i=data2*2/3+(255-(data2*2/3))/t2*(t-t1*1000)/1000; if(t>(t1+t2)*1000) { TCCR1B = 0x00; //Timer stop t=0; break; } } } /*************停车程序***************/ void tz(void) { TCCR1B = 0x03; //start Timer while(1) { led_display_off(); OCR2=200-(200/t3*t/1000); if(t>=t3*1000) { OCR2=0; TCCR1B = 0x00; //stop t=0; break; } } } /***********数据记忆程序***********/ void memory0(void) { unsigned char i; while (1) { led_display_twi_data1(); if((PINB&0x02)==0) { for(i=0;i<15;i++) led_display_twi_data1(); if(data1<255) data1++; for(i=0;i<15;i++) led_display_twi_data1(); } if((PINB&0x04)==0) { for(i=0;i<15;i++) led_display_twi_data1(); if(data1>0) data1--; for(i=0;i<15;i++) led_display_twi_data1(); } if((PINB&0x01)==0) { for(i=0;i<15;i++) led_display_twi_data1(); twi_write(0x08,data1); memory1(); for(i=0;i<15;i++) led_display_twi_data1(); break; } } } void memory1(void) { unsigned char i; while (1) { led_display_twi_t1(); if((PINB&0x02)==0) { for(i=0;i<15;i++) led_display_twi_t1(); if(t1<30) t1++; for(i=0;i<15;i++) led_display_twi_t1(); } if((PINB&0x04)==0) { for(i=0;i<15;i++) led_display_twi_t1(); if(t1>0) t1--; for(i=0;i<15;i++) led_display_twi_t1(); } if((PINB&0x01)==0) { for(i=0;i<15;i++) led_display_twi_t1(); twi_write(0x18,t1); memory2(); for(i=0;i<15;i++) led_display_twi_t1(); break; } } } void memory2(void) { unsigned char i; while (1) { led_display_twi_t2(); if((PINB&0x02)==0) { for(i=0;i<15;i++) led_display_twi_t2(); if(t2<30) t2++; for(i=0;i<15;i++) led_display_twi_t2(); } if((PINB&0x04)==0) { for(i=0;i<15;i++) led_display_twi_t2(); if(t2>0) t2--; for(i=0;i<15;i++) led_display_twi_t2(); } if((PINB&0x01)==0) { for(i=0;i<15;i++) led_display_twi_t2(); twi_write(0x28,t2); memory3(); for(i=0;i<15;i++) led_display_twi_t2(); break; } } } void memory3(void) { unsigned char i; while (1) { led_display_twi_data2(); if((PINB&0x02)==0) { for(i=0;i<15;i++) led_display_twi_data2(); if(data2<255) data2++; for(i=0;i<15;i++) led_display_twi_data2(); } if((PINB&0x04)==0) { for(i=0;i<15;i++) led_display_twi_data2(); if(data2>0) data2--; for(i=0;i<15;i++) led_display_twi_data2(); } if((PINB&0x01)==0) { for(i=0;i<15;i++) led_display_twi_data2(); twi_write(0x38,data2); memory4(); for(i=0;i<15;i++) led_display_twi_data2(); break; } } } void memory4(void) { unsigned char i; while (1) { led_display_twi_t3(); if((PINB&0x02)==0) { for(i=0;i<15;i++) led_display_twi_t3(); if(t3<30) t3++; for(i=0;i<15;i++) led_display_twi_t3(); } if((PINB&0x04)==0) { for(i=0;i<15;i++) led_display_twi_t3(); if(t3>0) t3--; for(i=0;i<15;i++) led_display_twi_t3(); } if((PINB&0x01)==0) { for(i=0;i<15;i++) led_display_twi_t3(); twi_write(0x48,t3); for(i=0;i<15;i++) led_display_twi_t3(); break; } } } /***********主程序**************/ void main(void) { unsigned char i; unsigned int adc_old; init_devices(); OSCCAL=osccal; TCCR2 = 0x61; adc_mux=0; adc_old=0; adc_rel=0; while(1) { twi_read(0x08, &data1); twi_read(0x18, &t1); twi_read(0x28, &t2); twi_read(0x38, &data2); twi_read(0x48, &t3); while(1) { led_display_ready(); if((PINB&0x01)==0) { for(i=0;i<15;i++) led_display_ready(); if(t1>1&&t2>1&&data2>99) { qd(); break; } for(i=0;i<15;i++) led_display_ready(); } if((PINB&0x06)==0) { for(i=0;i<15;i++) led_display_ready(); memory0(); for(i=0;i<15;i++) led_display_ready(); } } while(1) { led_display_adc(); if(adc_old!=adc_rel) { adc_old=adc_rel; ADCtoBCD(adc_old); } if((PINB&0x01)==0) { for(i=0;i<15;i++) led_display_off(); tz(); for(i=0;i<15;i++) led_display_off(); break; } } } }