蓝桥杯 单片机 决赛 第7届 电压、频率采集设备
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯 单片机 决赛 第7届 电压、频率采集设备
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這屆題中我覺得重要的就是eeprom的寫入的時候是大于兩個字節的,所以要分成兩個來寫,還有一個就是對于S11和S10的使用要特別注意約束條件。
題目:
代碼:
main.c
#include "reg52.h" #include"intrins.h" #include"ds1302.h" #include"iic.h" sfr AUXR=0x8e; sfr P4=0xC0; int code write_add[]={0x80,0x82,0x84}; int code read_add[]={0x81,0x83,0x85}; int time[]={0x55,0x59,0x23}; int judge_time[]={0x00,0x00,0x00}; int code xianshi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; int temp_h,temp_m,temp_s; int time_mode=0; int v_mode=0; int f_mode=0; int count_f;int num_f; int num_t;//周期 int num_v; int smg_mode=0; int shanshuo=0;//閃爍 int v_h=2000; int v_l=1000; int judge_mode; int judge_temp=0; sbit R1=P3^0; sbit R2=P3^1; sbit R3=P3^2; sbit R4=P3^3; sbit C4=P3^4; sbit C3=P3^5; sbit C2=P4^2; sbit C1=P4^4; void choose_573(int i) {switch(i){case(0):P2=(P2&0x1f)|0x00;break;case(4):P2=(P2&0x1f)|0x80;break;case(5):P2=(P2&0x1f)|0xa0;break;case(6):P2=(P2&0x1f)|0xc0;break;case(7):P2=(P2&0x1f)|0xe0;break;} } void init_system() {choose_573(4);P0=0xff;choose_573(5);P0=0x00;choose_573(0); } //====================================時間 void write_time() {int i;Write_Ds1302_Byte(0x8e,0x00);for(i=0;i<3;i++){Write_Ds1302_Byte(write_add[i],time[i]);}Write_Ds1302_Byte(0x8e,0x80); } void read_time() {int i;for(i=0;i<3;i++){time[i]=Read_Ds1302_Byte(read_add[i]);} } //==================================== //====================================555 and v void Timer0Init(void) //100微秒@11.0592MHz {AUXR |= 0x80; //定時器時鐘1T模式TMOD = 0x04; //設置定時器模式TL0 = 0xff; //設置定時初始值TH0 = 0xff; //設置定時初始值TF0 = 0; //清除TF0標志TR0 = 1; //定時器0開始計時ET0=1;EA=1; } void time0_service() interrupt 1 {count_f++; } void V() {num_v=get_v(); } //==================================== //====================================中斷 void Timer1Init(void) //5毫秒@11.0592MHz {AUXR |= 0x40; //定時器時鐘1T模式TMOD &= 0x0F; //設置定時器模式TL1 = 0x00; //設置定時初始值TH1 = 0x28; //設置定時初始值TF1 = 0; //清除TF1標志TR1 = 1; //定時器1開始計時ET1=1;EA=1; } int count_1;int count_2; void time1_server() interrupt 3 {count_1++;count_2++;if(count_1>=100){count_1=0;num_f=count_f;count_f=0; // V();num_t=1000000/num_f;}if(count_2>=200){count_2=0;if(shanshuo==0){shanshuo=1;}else{shanshuo=0;}} } //==================================== //====================================鍵盤 void Delay10ms() //@11.0592MHz {unsigned char i, j;i = 108;j = 145;do{while (--j);} while (--i); } void key_board() {R1=0;R2=R3=R4=1;C1=C2=C3=C4=1;//S7if(C1==0){Delay10ms();if(C1==0){smg_mode=0;time_mode=0;}while(!C1);}//S11 加if(C2==0){Delay10ms();if(C2==0){if(smg_mode==0)//time{if(time_mode==1){temp_h=(time[2]/16)*10+time[2]%16;temp_h++;if(temp_h>=24){temp_h=0;}time[2]=((temp_h/10)*6)+temp_h;write_time();}if(time_mode==2){temp_m=(time[1]/16)*10+time[1]%16;temp_m++;if(temp_m>=60){temp_m=0;}time[1]=((temp_m/10)*6)+temp_m;write_time();}if(time_mode==3){temp_s=(time[0]/16)*10+time[0]%16;temp_s++;if(temp_s>=60){temp_s=0;}time[0]=((temp_s/10)*6)+temp_s;write_time();}}if(smg_mode==1){if(v_mode==1){v_h=v_h+500;if(v_h>9500){v_h=9500;}}if(v_mode==2){v_l=v_l+500;if(v_l>v_h){v_l=v_l-500;}}}}while(!C2); }R2=0;R1=R3=R4=1;C1=C2=C3=C4=1;//S6if(C1==0){Delay10ms();if(C1==0){smg_mode=1;v_mode=0;}while(!C1);}//S10減if(C2==0){Delay10ms();if(C2==0){if(smg_mode==0)//time{if(time_mode==1){temp_h=(time[2]/16)*10+time[2]%16;temp_h--;if(temp_h<0){temp_h=23;}time[2]=((temp_h/10)*6)+temp_h;write_time();}if(time_mode==2){temp_m=(time[1]/16)*10+time[1]%16;temp_m--;if(temp_m<0){temp_m=59;}time[1]=((temp_m/10)*6)+temp_m;write_time();}if(time_mode==3){temp_s=(time[0]/16)*10+time[0]%16;temp_s--;if(temp_s<0){temp_s=59;}time[0]=((temp_s/10)*6)+temp_s;write_time();}}if(smg_mode==1){if(v_mode==1){v_h=v_h-500;if(v_h<v_l){v_h=v_h+500;}}if(v_mode==2){v_l=v_l-500;if(v_l<0){v_l=0;}}}}while(!C2);}R3=0;R1=R2=R4=1;C1=C2=C3=C4=1;//S5if(C1==0){Delay10ms();if(C1==0){smg_mode=2;f_mode=0;}while(!C1);}//S9 查詢if(C2==0){Delay10ms();if(C2==0){smg_mode=3;judge_temp=0;}while(!C2);}R4=0;R1=R2=R3=1;C1=C2=C3=C4=1;//S4if(C1==0){Delay10ms();if(C1==0){if(smg_mode==0){time_mode++;if(time_mode>=4){time_mode=0;}}if(smg_mode==1){v_mode++;if(v_mode>=3){v_mode=0;write_EEPROM(0x01,v_h);Delay10ms();write_EEPROM(0x02,v_h>>8);Delay10ms();write_EEPROM(0x03,v_l);Delay10ms();write_EEPROM(0x04,v_l>>8);}}if(smg_mode==2){f_mode++;if(f_mode>=2){f_mode=0;}}if(smg_mode==3){judge_temp++;if(judge_temp>=2){judge_temp=0;}}}while(!C1);} } //==================================== //====================================數碼管 void Delay400us() //@11.0592MHz {unsigned char i, j;i = 5;j = 74;do{while (--j);} while (--i); } void SMG(int wei,int dat) {choose_573(6);P0=0x80>>(wei-1);choose_573(7);P0=xianshi[dat];choose_573(0);Delay400us();choose_573(7);P0=xianshi[10];choose_573(0); } void smg_display() {if(smg_mode==0)//時間顯示{if(time_mode==3&&shanshuo==1){SMG(1,10);SMG(2,10);}else{SMG(1,time[0]%16);SMG(2,time[0]/16);}SMG(3,11);if(time_mode==2&&shanshuo==1){SMG(4,10);SMG(5,10);}else{SMG(4,time[1]%16);SMG(5,time[1]/16);}SMG(6,11);if(time_mode==1&&shanshuo==1){SMG(7,10);SMG(8,10);}else{SMG(7,time[2]%16);SMG(8,time[2]/16);} }if(smg_mode==1){if(v_mode==0){SMG(1,num_v%10);SMG(2,(num_v%100)/10);SMG(3,(num_v%1000)/100);SMG(4,(num_v%10000)/1000);SMG(5,10);SMG(6,11);SMG(7,smg_mode);SMG(8,11);}if(v_mode==1&&shanshuo==1){SMG(1,v_l%10);SMG(2,(v_l%100)/10);SMG(3,(v_l%1000)/100);SMG(4,(v_l%10000)/1000);SMG(5,10);SMG(6,10);SMG(7,10);SMG(8,10);}else if(v_mode==2&&shanshuo==1){SMG(1,10);SMG(2,10);SMG(3,10);SMG(4,10);SMG(5,v_h%10);SMG(6,(v_h%100)/10);SMG(7,(v_h%1000)/100);SMG(8,(v_h%10000)/1000);}else if((v_mode==1||v_mode==2)&&shanshuo==0){SMG(1,v_l%10);SMG(2,(v_l%100)/10);SMG(3,(v_l%1000)/100);SMG(4,(v_l%10000)/1000);SMG(5,v_h%10);SMG(6,(v_h%100)/10);SMG(7,(v_h%1000)/100);SMG(8,(v_h%10000)/1000);}}if(smg_mode==2){if(f_mode==0){SMG(1,num_f%10);SMG(2,(num_f%100)/10);SMG(3,(num_f%1000)/100);SMG(4,(num_f%10000)/1000);SMG(5,(num_f%100000)/10000);SMG(6,11);SMG(7,smg_mode);SMG(8,11);}if(f_mode==1){SMG(1,num_t%10);SMG(2,(num_t%100)/10);SMG(3,(num_t%1000)/100);SMG(4,(num_t%10000)/1000);SMG(5,(num_t%100000)/10000);SMG(6,11);SMG(7,smg_mode);SMG(8,11);}}if(smg_mode==3){if(judge_temp==0){SMG(1,judge_mode);SMG(2,0);SMG(3,10);SMG(4,10);SMG(5,10);SMG(6,10);SMG(7,10);SMG(8,10);}if(judge_temp==1){SMG(1,judge_time[0]%16);SMG(2,judge_time[0]/16);SMG(3,11);SMG(4,judge_time[1]%16);SMG(5,judge_time[1]/16);SMG(6,11);SMG(7,judge_time[2]%16);SMG(8,judge_time[2]/16);}} } //==================================== //====================================判斷 void judge_work() {//大于if(num_v==v_h){ // Delay10ms(); // if(num_v<v_h){int i;judge_mode=1;for(i=0;i<3;i++){judge_time[i]=time[i];}}}//小于if(num_v==v_l&&num_v<v_h){Delay10ms();if(num_v>=v_l){int i;judge_mode=0;for(i=0;i<3;i++){judge_time[i]=time[i];}}} } //==================================== //====================================eeprom_read void eeprom_read() {v_h=read_EEPROM(0x02);v_h=(v_h<<8)|read_EEPROM(0x01);v_l=read_EEPROM(0x04);v_l=(v_l<<8)|read_EEPROM(0x03); } //==================================== void main() {init_system();write_time();Timer0Init();Timer1Init();eeprom_read();while(1){read_time();key_board();smg_display();V();judge_work();} }iic.c
/*程序說明: IIC總線驅動程序軟件環境: Keil uVision 4.10 硬件環境: CT107單片機綜合實訓平臺 8051,12MHz日 期: 2011-8-9 */#include "reg52.h" #include "intrins.h"#define DELAY_TIME 5#define SlaveAddrW 0xA0 #define SlaveAddrR 0xA1//總線引腳定義 sbit SDA = P2^1; /* 數據線 */ sbit SCL = P2^0; /* 時鐘線 */void IIC_Delay(unsigned char i) {do{_nop_();}while(i--); } //總線啟動條件 void IIC_Start(void) {SDA = 1;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 0;IIC_Delay(DELAY_TIME);SCL = 0; }//總線停止條件 void IIC_Stop(void) {SDA = 0;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 1;IIC_Delay(DELAY_TIME); }//發送應答 void IIC_SendAck(bit ackbit) {SCL = 0;SDA = ackbit; // 0:應答,1:非應答IIC_Delay(DELAY_TIME);SCL = 1;IIC_Delay(DELAY_TIME);SCL = 0; SDA = 1;IIC_Delay(DELAY_TIME); }//等待應答 bit IIC_WaitAck(void) {bit ackbit;SCL = 1;IIC_Delay(DELAY_TIME);ackbit = SDA;SCL = 0;IIC_Delay(DELAY_TIME);return ackbit; }//通過I2C總線發送數據 void IIC_SendByte(unsigned char byt) {unsigned char i;for(i=0; i<8; i++){SCL = 0;IIC_Delay(DELAY_TIME);if(byt & 0x80) SDA = 1;else SDA = 0;IIC_Delay(DELAY_TIME);SCL = 1;byt <<= 1;IIC_Delay(DELAY_TIME);}SCL = 0; }//從I2C總線上接收數據 unsigned char IIC_RecByte(void) {unsigned char i, da;for(i=0; i<8; i++){ SCL = 1;IIC_Delay(DELAY_TIME);da <<= 1;if(SDA) da |= 1;SCL = 0;IIC_Delay(DELAY_TIME);}return da; } int get_v() {int temp;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x03);IIC_WaitAck();IIC_Stop();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();temp=IIC_RecByte();IIC_SendAck(1);IIC_Stop();temp=temp*1.96+0.5;temp=temp*10;return temp; } void write_EEPROM(int add,int dat) {IIC_Start(); IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop(); } int read_EEPROM(int add) {int temp;IIC_Start();IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Start();IIC_SendByte(0xa1);IIC_WaitAck();temp=IIC_RecByte();IIC_SendAck(1);IIC_Stop();return temp; }iic.h
#ifndef _IIC_H #define _IIC_Hvoid IIC_Start(void); void IIC_Stop(void); bit IIC_WaitAck(void); void IIC_SendAck(bit ackbit); void IIC_SendByte(unsigned char byt); unsigned char IIC_RecByte(void); int get_v(); void write_EEPROM(int add,int dat); int read_EEPROM(int add); #endifds1302.c
/*程序說明: DS1302驅動程序軟件環境: Keil uVision 4.10 硬件環境: CT107單片機綜合實訓平臺 8051,12MHz日 期: 2011-8-9 */#include <reg52.h> #include <intrins.h>sbit SCK=P1^7; sbit SDA=P2^3; sbit RST = P1^3; // DS1302復位 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); RST=0; }unsigned char Read_Ds1302_Byte ( unsigned char address ) {unsigned char i,temp=0x00;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_();return (temp); }ds1302.h
#ifndef __DS1302_H #define __DS1302_Hvoid Write_Ds1302(unsigned char temp); void Write_Ds1302_Byte( unsigned char address,unsigned char dat ); unsigned char Read_Ds1302_Byte( unsigned char address ); #endif總結
以上是生活随笔為你收集整理的蓝桥杯 单片机 决赛 第7届 电压、频率采集设备的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字电视业务PSI/SI学习系列
- 下一篇: 自由软件到底值多少钱?