赞
踩
第一次发CSDN,代码都是自己写的,仅供参考,不保证全对,也是第一次参加蓝桥杯单片机组,也是自己学习的证明吧。
Main文件
- #include <STC15F2K60S2.H>
- #include "stdio.h"
- #include "Key.h"
- #include "Nixie.h"
- #include "ds1302.h"
- #include "iic.h"
- #include "onewire.h"
- unsigned char keynum;
- unsigned char String[10];
- unsigned char String_Buff[9];
- unsigned int NE_Count,NE;
- unsigned int T,Now_T;
- unsigned char T_CS=30;
- unsigned char SD,Now_SD;
- unsigned char AD;
- unsigned char showmode;
- unsigned char MAX_T;
- unsigned int PJ_T,SUM_T;
- unsigned char MAX_SD;
- unsigned int PJ_SD,SUM_SD;
- unsigned char Inter_Time;
- unsigned char Last_Hou,Last_Min;
- bit CA_Flag;
- bit WSD_Flag;
- bit WSD_ShowFlag;
- bit WSD_NYFlag=1;
- unsigned char led_char=0xff;
- unsigned char LED_SS;
- bit LED_SSFlag;
- bit LED_SGFlag;
- bit LED_LOW;
- void Timer0Init(void) //1毫秒@12.000MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD |= 0x04; //设置定时器模式
- TL0 = 0xff; //设置定时初值
- TH0 = 0xff; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0=EA=1;
- }
- void Timer1Init(void) //1毫秒@12.000MHz
- {
- AUXR |= 0x40; //定时器时钟1T模式
- TMOD &= 0x0F; //设置定时器模式
- TL1 = 0x20; //设置定时初值
- TH1 = 0xD1; //设置定时初值
- TF1 = 0; //清除TF1标志
- TR1 = 1; //定时器1开始计时
- ET1=EA=1;
- }
-
- void Init_All()
- {
- P0=0x00;
- P2=(P2&0x1f)|0xa0;
- P2&=0x1f;
- Timer0Init();
- Timer1Init();
- Set_Time();
- Read_T();
- }
- void Nixie_Logic()
- {
- if(WSD_ShowFlag)
- {
- if(WSD_NYFlag)
- sprintf(String,"E %02d-%02d",T,(unsigned int)SD);
- else
- sprintf(String,"E %02d-AA",Now_T);
- }
- else
- {
- switch(showmode)
- {
- case 0x00:sprintf(String,"%02u-%02u-%02u",(unsigned int)Time_Tab[0],(unsigned int)Time_Tab[1],(unsigned int)Time_Tab[2]);break;
- case 0x10:sprintf(String,"C %02d-%02d.%01d",(unsigned int)MAX_T,PJ_T/10,PJ_T%10);break;
- case 0x11:sprintf(String,"H %02d-%02d.%01d",(unsigned int)MAX_SD,PJ_SD/10,PJ_SD%10);break;
- case 0x12:sprintf(String,"F%02d%02d-%02d",(unsigned int)Inter_Time,(unsigned int)Last_Hou,(unsigned int)Last_Min);break;
- case 0x20:sprintf(String,"P %02d",(unsigned int)T_CS);break;
- }
- }
-
- Nixie_Set(String,String_Buff);
- }
-
-
- void WSD_JS()
- {
- if(WSD_Flag)
- {
- WSD_Flag=0;
- if((NE>=200) && (NE<=2000))
- {
- WSD_NYFlag=1;
- Inter_Time++;
- Last_Hou=Time_Tab[0];
- Last_Min=Time_Tab[1];
- if((Now_T>T) && ((NE*0.0444+1.111)>SD))
- {
- LED_SGFlag=1;
- }
- else LED_SGFlag=0;
-
- T=Now_T;
- SD=(NE*0.0444)+1.111;
- if(T>MAX_T) MAX_T=T;
- if(SD>MAX_SD) MAX_SD=SD;
- SUM_T+=T*10;
- SUM_SD+=SD*10;
- PJ_T=SUM_T/Inter_Time;
- PJ_SD=SUM_SD/Inter_Time;
- }
- else
- {
- WSD_NYFlag=0;
- }
- }
- }
-
-
- void Key_Logic()
- {
- if(!WSD_ShowFlag)
- {
- if(!(showmode==0x12 && Key_Get[1][1]==0))
- {
- keynum=Key();
- }
-
- if(keynum==1)
- {
- switch(showmode&0xf0)
- {
- case 0x00:showmode=0x10;break;
- case 0x10:showmode=0x20;break;
- case 0x20:showmode=0x00;break;
- }
- }
- if(keynum==3)
- {
- switch(showmode)
- {
- case 0x10:showmode=0x11;break;
- case 0x11:showmode=0x12;break;
- case 0x12:showmode=0x10;break;
- }
- }
-
- if(keynum==2)
- {
- if(showmode==0x20)
- {
- T_CS++;
- if(T_CS>99) T_CS=0;
- }
- }
-
- if(keynum==4)
- {
- if(showmode==0x20)
- {
- T_CS--;
- if(T_CS>200) T_CS=99;
- }
- }
-
- if(CA_Flag && showmode==0x12)
- {
- CA_Flag=0;
- MAX_T=PJ_T=MAX_SD=PJ_SD=Inter_Time=Last_Hou=Last_Min=0;
- //
- T_CS=0;
- }
- }
- else
- {
- WSD_JS();
- }
-
- }
-
- void LED_Logic()
- {
- if(showmode==0x00)led_char&=0xfe;
- else led_char|=0x01;
-
- if((showmode&0xf0)==0x10)led_char&=0xfd;
- else led_char|=0x02;
-
- if(WSD_ShowFlag)led_char&=0xfb;
- else led_char|=0x04;
-
- if(Now_T>T_CS)
- {
- LED_SSFlag=1;
- }
- else
- {
- LED_SSFlag=0;
- LED_SS=0;
- led_char|=0x08;
- }
- if(LED_SSFlag)
- {
- if(LED_SS<100)led_char&=0xf7;
- else if(LED_SS>=100 && LED_SS<200) led_char|=0x08;
- else{LED_SS=0;}
- }
-
- if(!WSD_NYFlag)led_char&=0xef;
- else led_char|=0x10;
-
- if(Inter_Time>=2)
- {
- if(LED_SGFlag)
- led_char&=0xdf;
- else led_char|=0x20;
- }
-
- if(LED_LOW)
- {
- LED_LOW=0;
- P0=led_char;
- P2=(P2&0x1f)|0x80;
- P2&=0x1f;
- }
-
- }
-
- void main()
- {
- Init_All();
- while(1)
- {
- Nixie_Logic();
- Key_Logic();
- LED_Logic();
- }
- }
- void T0_LP() interrupt 1
- {
- NE_Count++;
- }
- void T1_LP() interrupt 3
- {
- unsigned int Count,Count1;
- unsigned int CA,WSD_Count;
- unsigned char AD_Count;
- Nixie_Loop(String_Buff);
- Key_Loop();
- Count++;
- Count1++;
- AD_Count++;
- LED_LOW=1;
- if(LED_SSFlag)
- {
- LED_SS++;
- }
-
- //亮度
- if(AD_Count>=200)
- {
- AD_Count=0;
- if(ADC()<50 && WSD_ShowFlag==0)
- {
- WSD_Flag=1;
- WSD_ShowFlag=1;
- }
- }
- if(WSD_ShowFlag)
- {
- WSD_Count++;
- if(WSD_Count>=3000)
- {
- WSD_Count=0;
- WSD_ShowFlag=0;
- }
- }
-
- //NE 温度
- if(Count1>=500)
- {
- Count1=0;
- NE=NE_Count*2;
- NE_Count=0;
- Now_T=Read_T();
- }
- //时间
- if(Count>=1000)
- {
- Count=0;
- Read_Time();
- }
-
- if(showmode==0x12 && Key_Get[1][1]==0)
- {
- CA++;
- if(CA>=2000)
- {
- CA_Flag=1;
- CA=0;
- }
- }
- if(showmode==0x12 && Key_Get[1][1]==1)
- {
- if(CA>0)
- {
- keynum=4;
- CA=0;
- }
- }
-
- }
Nixie文件
- #include <STC15F2K60S2.H>
- void Nixie_Set(unsigned char* str,unsigned char* buff)
- {
- unsigned char i,j,temp;
- for(i=1,j=0;i<9;i++,j++)
- {
- switch(str[j])
- {
- case '0':temp=0xc0;break;
- case '1':temp=0xf9;break;
- case '2':temp=0xa4;break;
- case '3':temp=0xb0;break;
- case '4':temp=0x99;break;
- case '5':temp=0x92;break;
- case '6':temp=0x82;break;
- case '7':temp=0xf8;break;
- case '8':temp=0x80;break;
- case '9':temp=0x90;break;
- case ' ':temp=0xff;break;
- case '-':temp=0xbf;break;
- case 'C':temp=0xc6;break;
- case 'H':temp=0x89;break;
- case 'F':temp=0x8e;break;
- case 'P':temp=0x8c;break;
- case 'E':temp=0x86;break;
- case 'A':temp=0x88;break;
-
- }
- if(str[j+1]=='.')
- {
- temp&=0x7f;
- j++;
- }
- buff[i]=temp;
- }
- }
- void Nixie_Loop(unsigned char* buff)
- {
- static unsigned char i=1;
- P0=0xff;
- P2=(P2&0x1f)|0xe0;
- P2&=0x1f;
-
- P0=0x01<<(i-1);
- P2=(P2&0x1f)|0xc0;
- P2&=0x1f;
-
- P0=buff[i];
- P2=(P2&0x1f)|0xe0;
- P2&=0x1f;
-
- i++;
- if(i>8) i=1;
- }
Key文件
- #include <STC15F2K60S2.H>
- sbit H1=P3^3;
- sbit H2=P3^2;
- sbit L1=P4^4;
- sbit L2=P4^2;
- unsigned char Key_Get[2][2]={{1,1},{1,1}};
- unsigned char Last_Key_Get[2][2]={{1,1},{1,1}};
- unsigned char Key()
- {
- unsigned char i,j;
- for(i=0;i<2;i++)
- {
- for(j=0;j<2;j++)
- {
- if(Key_Get[i][j]==0)
- {
- if(Last_Key_Get[i][j]==1)
- {
- Last_Key_Get[i][j]=0;
- return i*2+j+1;
- }
- else return 0;
- }
- }
- }
- return 0;
- }
- void Key_Loop()
- {
- static unsigned char Buff[2][2]={{0xff,0xff},{0xff,0xff}};
- static unsigned char loop;
- unsigned char i;
- Buff[loop][0]=(Buff[loop][0]<<1)|L1;
- Buff[loop][1]=(Buff[loop][1]<<1)|L2;
- for(i=0;i<2;i++)
- {
- if(Buff[loop][i]==0xff)
- {
- Last_Key_Get[loop][i]=1;
- Key_Get[loop][i]=1;
- }
- else if(Buff[loop][i]==0x00)
- Key_Get[loop][i]=0;
- }
- loop++;
- loop%=2;
- switch(loop)
- {
- case 0:H2=1;H1=0;break;
- case 1:H1=1;H2=0;break;
- }
- }
iic文件
- /* # I2C代码片段说明
- 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
- 2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
- 中对单片机时钟频率的要求,进行代码调试和修改。
- */
- #include <STC15F2K60S2.H>
- #include "intrins.h"
- #define DELAY_TIME 5
- 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 temp;
- EA=0;
- I2CStart();
- I2CSendByte(0x90);
- I2CWaitAck();
- I2CSendByte(0x01);
- I2CWaitAck();
-
- I2CStart();
- I2CSendByte(0x91);
- I2CWaitAck();
- temp=I2CReceiveByte();
- I2CSendAck(1);
- I2CStop();
- EA=1;
- return temp;
- }
onewire文件
- /* # 单总线代码片段说明
- 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
- 2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
- 中对单片机时钟频率的要求,进行代码调试和修改。
- */
- #include <STC15F2K60S2.H>
- sbit DQ=P1^4;
- //
- void Delay_OneWire(unsigned int t)
- {
- unsigned char i;
- while(t--){
- for(i=0;i<12;i++);
- }
- }
-
- //
- void Write_DS18B20(unsigned char dat)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- DQ = 0;
- DQ = dat&0x01;
- Delay_OneWire(5);
- DQ = 1;
- dat >>= 1;
- }
- Delay_OneWire(5);
- }
-
- //
- unsigned char Read_DS18B20(void)
- {
- unsigned char i;
- unsigned char dat;
-
- for(i=0;i<8;i++)
- {
- DQ = 0;
- dat >>= 1;
- DQ = 1;
- if(DQ)
- {
- dat |= 0x80;
- }
- Delay_OneWire(5);
- }
- return dat;
- }
-
- //
- bit init_ds18b20(void)
- {
- bit initflag = 0;
-
- DQ = 1;
- Delay_OneWire(12);
- DQ = 0;
- Delay_OneWire(80);
- DQ = 1;
- Delay_OneWire(10);
- initflag = DQ;
- Delay_OneWire(5);
-
- return initflag;
- }
- unsigned int Read_T()
- {
- unsigned char TL,TH;
- unsigned int T;
- init_ds18b20();
- Write_DS18B20(0xcc);
- Write_DS18B20(0x44);
- init_ds18b20();
- Write_DS18B20(0xcc);
- Write_DS18B20(0xbe);
- TL=Read_DS18B20();
- TH=Read_DS18B20();
- T=(TH<<8)|TL;
- T=T>>4;
- T+=(TL&0x0f)*0.0625;
- return T;
- }
头文件就不写出来了,毕竟都一样。
我自己测试功能感觉都是正确的,毕竟没有人会认为自己写的代码有问题哈哈哈,评论如果问题我看到的话会回复,没回复的话要不就是没看到,要不就是我也不知道。
好了就这么多,加纳!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。