一、题目分析
这套题考了NE555和PCF8591,属于比较常规的题目,唯一需要注意的就是ADC在进行双通道读取时,数据篡位的问题,这里出解决办法。
if(adc_count == 100){ PCF8591_ADC(1); }else if(adc_count == 105){ ADC_AIN1 = (unsigned int)(PCF8591_ADC(1) * 500.0 / 255); }else if(adc_count == 120){ PCF8591_ADC(3); }else if(adc_count >= 125){ adc_count = 0; ADC_AIN3 = (unsigned int)(PCF8591_ADC(3) * 500.0 / 255); }
在读取前加一次读取即可。
二、代码
#include "task.h" unsigned int key_count=0; unsigned int dsp_count=0; unsigned int led_count=0; unsigned int adc_count=0; unsigned int fre_count=0; unsigned int cp=0; unsigned char ui=1; unsigned int fre=0; unsigned int cycle=0; unsigned int ADC_AIN1=0; unsigned int ADC_AIN3=0; unsigned int f_volt=0; unsigned int f_fre=0; unsigned char led_state=0xff; bit led=0; void Timer2_Init(void) //1毫秒@12.000MHz { AUXR |= 0x04; //定时器时钟1T模式 T2L = 0x20; //设置定时初始值 T2H = 0xD1; //设置定时初始值 AUXR |= 0x10; //定时器2开始计时 IE2 |= 0x04; //使能定时器2中断 } void Timer0_Init() { TMOD = 0x05; TH0 = 0; TL0 = 0; //ET0 = 1; TR0 = 1; } void Init_Sys() { LED(0xff); BUZ(0x00); Init_DSP(); Init_Key(); Timer0_Init(); EA = 1; } void Timer2_Isr(void) interrupt 12 { GetDisplayStruct()->SegDisplay(); if(GetKeyStruct()->state)cp++; if(key_count < 10)key_count++; if(dsp_count < 50)dsp_count++; if(led_count < 75)led_count++; if(adc_count < 125)adc_count++; if(fre_count < 1000)fre_count++; } void Task_Collect() { if(fre_count >= 1000) { fre_count = 0; fre = (TH0 << 8) | TL0; cycle = (unsigned int)((1.0 / fre) * 1000000); TH0 = TL0 = 0; } if(adc_count == 100){ PCF8591_ADC(1); }else if(adc_count == 105){ ADC_AIN1 = (unsigned int)(PCF8591_ADC(1) * 500.0 / 255); }else if(adc_count == 120){ PCF8591_ADC(3); }else if(adc_count >= 125){ adc_count = 0; ADC_AIN3 = (unsigned int)(PCF8591_ADC(3) * 500.0 / 255); } } void Task_LED() { if(led_count >= 75) { led_count = 0; if(led == 0) { if(ADC_AIN3 > f_volt){ led_state &= ~0x01; }else led_state |= 0x01; if(fre > f_fre){ led_state &= ~0x02; }else led_state |= 0x02; if(ui == 1) { led_state &= ~0x04; led_state |= 0x08; led_state |= 0x10; } if(ui == 2) { led_state &= ~0x08; led_state |= 0x04; led_state |= 0x10; } if((ui == 3) || (ui == 4)) { led_state &= ~0x10; led_state |= 0x08; led_state |= 0x04; } } else led_state = 0xff; LED(led_state); } } void Task_key() { if(key_count >= 10) { key_count = 0; GetKeyStruct()->pFun(); } switch(GetKeyStruct()->value) { case 4: if(ui == 1)ui = 2; else if(ui == 2)ui = 3; else if((ui == 3) || (ui ==4))ui = 1; GetKeyStruct()->value = 0; break; case 5: if(ui == 3)ui = 4; else if(ui == 4)ui = 3; GetKeyStruct()->value = 0; break; case 6: f_volt = ADC_AIN3; GetKeyStruct()->value = 0; break; case 7: if(cp >= 1000)led = ~led; else f_fre = fre; cp=0; GetKeyStruct()->value = 0; break; } } void Task_Seg() { DisplayStruct* seg = GetDisplayStruct(); if(dsp_count < 50) return; dsp_count = 0; if(ui == 1) { seg->dot = 10; seg->buf[0] = 11; seg->buf[1] = (fre > 999999)?(fre / 1000000 % 10):(10); seg->buf[2] = (fre > 99999)?(fre / 100000 % 10):(10); seg->buf[3] = (fre > 9999)?(fre / 10000 % 10):(10); seg->buf[4] = (fre > 999)?(fre / 1000 % 10):(10); seg->buf[5] = (fre > 99)?(fre / 100 % 10):(10); seg->buf[6] = (fre > 9)?(fre / 10 % 10):(10); seg->buf[7] = fre % 10; } if(ui == 2) { seg->dot = 10; seg->buf[0] = 12; seg->buf[1] = (cycle > 999999)?(cycle / 1000000 % 10):(10); seg->buf[2] = (cycle > 99999)?(cycle / 100000 % 10):(10); seg->buf[3] = (cycle > 9999)?(cycle / 10000 % 10):(10); seg->buf[4] = (cycle > 999)?(cycle / 1000 % 10):(10); seg->buf[5] = (cycle > 99)?(cycle / 100 % 10):(10); seg->buf[6] = (cycle > 9)?(cycle / 10 % 10):(10); seg->buf[7] = cycle % 10; } if(ui == 3) { seg->dot = 5; seg->buf[0] = 13; seg->buf[1] = 14; seg->buf[2] = 1; seg->buf[3] = 10; seg->buf[4] = 10; seg->buf[5] = ADC_AIN1 / 100 % 10; seg->buf[6] = ADC_AIN1 / 10 % 10; seg->buf[7] = ADC_AIN1 % 10; } if(ui == 4) { seg->dot = 5; seg->buf[0] = 13; seg->buf[1] = 14; seg->buf[2] = 3; seg->buf[3] = 10; seg->buf[4] = 10; seg->buf[5] = ADC_AIN3 / 100 % 10; seg->buf[6] = ADC_AIN3 / 10 % 10; seg->buf[7] = ADC_AIN3 % 10; } }
附上所有代码链接,大家可以参考学习。