藍橋杯單片機比賽國家二等獎 對代碼有疑問的可以+qq討論
分享一些平時練習的代碼
這是第三屆國賽的要求
詳細代碼主函數如圖所示
采用CT170D系開發板 STC15F2K60S2單片機控制
為了簡單方便 我將所有的代碼整理成了一個c文件 方便初學者下載使用
單片機源程序如下:
- #include<stc15f2k60s2.h>
- #include "intrins.h"
- #define DELAY_TIME 5
- #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();}
- #define SlaveAddrW 0xA0
- #define SlaveAddrR 0xA1
- #define uint unsigned int
- #define uchar unsigned char
- uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
- //***************iic***********************//
- sbit SD = P2^1; /* êy?Y?? */
- sbit SCL = P2^0; /* ê±?ó?? */
- void 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);
- void EEPROM_write(add,dat);
- uchar EEPROM_read(add);
- //********************ds1302*****************//
- sbit SCK=P1^7;
- sbit SDA=P2^3;
- sbit RST = P1^3; // DS1302?′??
- void Write_Ds1302(unsigned char temp);
- void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
- unsigned char Read_Ds1302_Byte( unsigned char address );
- void DS_init();
- void DS_get();
- void allinit();
- void keyscan16();
- void display1(uchar yi, uchar er);
- void display2(uchar san, uchar si);
- void display3(uchar wu, uchar liu);
- void display4(uchar qi, uchar ba);
- void delayms(int ms);
- char num=-2;
- uchar yi,er,san,si,wu,liu,qi,ba;
- uchar temp;
- uchar shezhi,queren,fuwei,tuichu;
- uchar shuzhi;
- uchar shijian[]={0,0,6,0,0,0,0};
- uchar t_flag,tt,n,flag;
- uchar beeflag,tttt,nn,i;
- uchar wei=0;
- uint ttt;
- uchar qian,zhong,hou,eeqian,eezhong,eehou;
- uchar shiflag=0,xiuflag=0,xincode=0;
- //**************CS*******************//
- sbit TX = P1^0; //·¢é?òy??
- sbit RX = P1^1; //?óê?òy??
- uint t,distance;
- uchar mode;
- void CS_get();
- void send_wave();
- void Timer0Init(void) ;
- void Timer1Init(void) ;
- void main()
- {
- allinit();
- // EEPROM_write(0x01,65);delayms(5);
- // EEPROM_write(0x02,43);delayms(5);
- // EEPROM_write(0x03,21);delayms(5);
- DS_init();
- Timer0Init() ;
- Timer1Init() ;
- EA=1;ET0=1;TR0=1;
-
- while(1)
- {
- // shuzhi=EEPROM_read(0x01);delayms(5);
- keyscan16();
- DS_get();
- // if(num==5)
- // {
- // yi=1;er=2;san=3;si=4;wu=5;liu=6;qi=7;ba=8;
- // }
-
- // yi=shuzhi/100;er=shuzhi%100/10;san=shuzhi%10;
- // si=11;wu=11;liu=11;qi=11;ba=11;
- if (shezhi==0)
- {
- if((shijian[2]>=7)&&(shijian[2]<=22)) mode=1;
- else if(((shijian[2]<7)||(shijian[2]>22))) {mode=2;shiflag=1;}
- }
-
- else if (shezhi==1) {mode=2;xiuflag=1;shiflag=0;}
-
-
-
- if((mode==1)&&(xincode==0))
- {
- CS_get();
- if(distance<=30)
- {
- flag=1;
- }
- yi=shijian[2]/10;er=shijian[2]%10;
- san=10;si=shijian[1]/10;wu=shijian[1]%10;
- liu=10;qi=shijian[0]/10;ba=shijian[0]%10;
- }
-
- else if((mode==2)&&(xincode==0))
- {
- if(num==-2)
- {
- yi=10;er=10;
- san=11;si=11;wu=11;
- liu=11;qi=11;ba=11;
- }
- else if(num>=-1)
- {
- if(num>=0)
- {
- temp=num;
- num=-1;
- if(wei==0)
- {
- san=temp;si=11;wu=11;liu=11;qi=11;ba=11;
- wei++;
- }
- else if(wei==1)
- {
- san=san;si=temp;wu=11;liu=11;qi=11;ba=11;
- wei++;
- }
- else if(wei==2)
- {
- san=san;si=si;wu=temp;liu=11;qi=11;ba=11;
- wei++;
- }
- else if(wei==3)
- {
- san=san;si=si;wu=wu;liu=temp;qi=11;ba=11;
- wei++;
- }
- else if(wei==4)
- {
- san=san;si=si;wu=wu;liu=liu;qi=temp;ba=11;
- wei++;
- }
- else if(wei==5)
- {
- san=san;si=si;wu=wu;liu=liu;qi=qi;ba=temp;
- wei++;
- }
- }
- else if(num==-1)
- {
- san=san;si=si;wu=wu;liu=liu;qi=qi;ba=ba;
- }
- }
-
- if((wei==6)&&(queren==1))
- {
- queren=0;
- wei=0;
- num=-2;
- qian=san*10+si;zhong=wu*10+liu;hou=qi*10+ba;
- eeqian = EEPROM_read(0x01);delayms(5);
- eezhong= EEPROM_read(0x02);delayms(5);
- eehou = EEPROM_read(0x03);delayms(5);
- if(qian==eeqian)
- if(zhong==eezhong)
- if(hou=eehou)
- {
- if(shiflag==1)
- {flag=1;}
- else if(xiuflag==1)
- {
- xincode=1;
- }
- }
- else i++;
- else i++;
- else i++;
- if(i==3)
- {
- beeflag=1;
- i=0;
- if(xiuflag==1) {xiuflag=0;shezhi=0;}
- }
- }
- }
-
- if(xincode==1)
- {
- if(num==-2)
- {
- yi=11;er=10;
- san=11;si=11;wu=11;
- liu=11;qi=11;ba=11;
- }
- if(num>=0)
- {
- temp=num;
- num=-1;
- if(wei==0)
- {
- san=temp;si=11;wu=11;liu=11;qi=11;ba=11;
- wei++;
- }
- else if(wei==1)
- {
- san=san;si=temp;wu=11;liu=11;qi=11;ba=11;
- wei++;
- }
- else if(wei==2)
- {
- san=san;si=si;wu=temp;liu=11;qi=11;ba=11;
- wei++;
- }
- else if(wei==3)
- {
- san=san;si=si;wu=wu;liu=temp;qi=11;ba=11;
- wei++;
- }
- else if(wei==4)
- {
- san=san;si=si;wu=wu;liu=liu;qi=temp;ba=11;
- wei++;
- }
- else if(wei==5)
- {
- san=san;si=si;wu=wu;liu=liu;qi=qi;ba=temp;
- wei++;
- }
- }
- else if(num==-1)
- {
- san=san;si=si;wu=wu;liu=liu;qi=qi;ba=ba;
- }
-
- if(tuichu==1)
- {
- tuichu=0;
- num=-2;
- xincode=0;
- wei=0;
- shezhi=0;
- }
-
-
- if((wei==6)&&(queren==1))
- {
- queren=0;
- wei=0;
- num=-2;
- qian=san*10+si;zhong=wu*10+liu;hou=qi*10+ba;
- EEPROM_write(0x01,qian);delayms(5);
- EEPROM_write(0x02,zhong);delayms(5);
- EEPROM_write(0x03,hou);delayms(5);
-
- shezhi=0;
- xincode=0;
- }
- }
-
- if(fuwei==1)
- {
- fuwei=0;
- EEPROM_write(0x01,65);delayms(5);
- EEPROM_write(0x02,43);delayms(5);
- EEPROM_write(0x03,21);delayms(5);
- }
-
-
-
-
-
-
- if(beeflag==0) {P2=0XA0;P0=0X00;}
- display1(yi,er);
- display2(san,si);
- display3(wu,liu);
- display4(qi,ba);
- }
- }
- void CS_get()
- {
- if(t_flag==1)
- {
- send_wave();
- TR1 = 1;
- while((RX==1)&&(TF1==0));
- TR1 = 0;
-
- if(TF1==1)
- {
- distance=9999;
- TF1=0;
- }
- else
- {
- t = TH1;
- t <<= 8;
- t |= TL1;
- distance = (uint)(t*0.017);
- distance = distance/12;
-
- }
-
- TH1=0;
- TL1=0;
-
-
-
- }
- }
- void send_wave()
- {
- uchar i=8;
-
- do
- {
- TX=1;
- somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
- TX=0;
- somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
- }while(i--);
- }
- void Timer0Init(void) //2毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定時器時鐘1T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0x9A; //設置定時初值
- TH0 = 0xA9; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- }
- void Timer1Init(void) //2毫秒@11.0592MHz
- {
- AUXR |= 0x40; //定時器時鐘1T模式
- TMOD &= 0x0F; //設置定時器模式
- }
- void Timer0() interrupt 1
- {
- tt++;
- if(tt==100)
- {
- t_flag=1;
- tt=0;
- }
- if(flag==1)
- {
- ttt++;
- P2=0XA0;
- P0=0X10;
- if(ttt==500)
- {
- ttt=0;
- n++;
- if(n==5) {n=0;P2=0XA0;P0=0X00;flag=0;}
- }
- }
- if(beeflag==1)
- {
- tttt++;
- P2=0XA0;
- P0=0X40;
- if(tttt==500)
- {
- tttt=0;
- nn++;
- if(nn==3) {nn=0;P2=0XA0;P0=0X00;beeflag=0;}
- }
-
- }
- }
- void allinit()
- {
- P2=0X80;
- P0=0XFF;
-
- P2=0XA0;
- P0=0X00;
-
- P2=0XC0;
- P0=0XFF;
- P2=0XFF;
- P0=0XFF;
- }
- void keyscan16()
- {
- //first
- P44=0;P42=1;P3=0X7F;
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- delayms(5);
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- temp=P3;
- switch(temp)
- {
- case 0x7e: num=0; break;
- case 0x7d: num=4; break;
- case 0x7b: num=8; break;
- }
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp&0x0f;
- }
- }
- }
-
- //Second
- P44=1;P42=0;P3=0XbF;
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- delayms(5);
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- temp=P3;
- switch(temp)
- {
- case 0xbe: num=1; break;
- case 0xbd: num=5; break;
- case 0xbb: num=9; break;
- }
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp&0x0f;
- }
- }
- }
-
- //third
- P44=1;P42=1;P3=0XdF;
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- delayms(5);
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- temp=P3;
- switch(temp)
- {
- case 0xde: num=2; break;
- case 0xdd: num=6; break;
- case 0xdb: shezhi=1; break;
- case 0xd7: queren=1; break;
- }
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp&0x0f;
- }
- }
- }
-
- //fourth
- P44=1;P42=1;P3=0XEF;
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- delayms(5);
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- temp=P3;
- switch(temp)
- {
- case 0xee: num=3; break;
- case 0xed: num=7; break;
- case 0xeb: fuwei=1; break;
- case 0xe7: tuichu=1; break;
- }
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp&0x0f;
- }
- }
- }
-
-
-
- }
- void display1(uchar yi,uchar er)
- {
- P2=0XC0;
- P0=0X01;
- P2=0XFF;
- P0=tab[yi];
- delayms(1);
-
- P2=0XC0;
- P0=0X02;
- P2=0XFF;
- P0=tab[er];
- delayms(1);
- }
- void display2(uchar san,uchar si)
- {
- P2=0XC0;
- P0=0X04;
- P2=0XFF;
- P0=tab[san];
- delayms(1);
-
- P2=0XC0;
- P0=0X08;
- P2=0XFF;
- P0=tab[si];
- delayms(1);
- }
- void display3(uchar wu,uchar liu)
- {
- P2=0XC0;
- P0=0X10;
- P2=0XFF;
- P0=tab[wu];
- delayms(1);
-
- P2=0XC0;
- P0=0X20;
- P2=0XFF;
- P0=tab[liu];
- delayms(1);
- }
- void display4(uchar qi,uchar ba)
- {
- P2=0XC0;
- P0=0X40;
- P2=0XFF;
- P0=tab[qi];
- delayms(1);
-
- P2=0XC0;
- P0=0X80;
- P2=0XFF;
- P0=tab[ba];
- delayms(1);
- }
- void delayms(int ms)
- {
- int i,j;
- for(i=ms;i>0;i--)
- for(j=845;j>0;j--);
- }
- /**************iic***************************/
- void EEPROM_write(add,dat)
- {
- IIC_Start();
- IIC_SendByte(0xa0);
- IIC_WaitAck();
- IIC_SendByte(add);
- IIC_WaitAck();
- IIC_SendByte(dat);
- IIC_WaitAck();
- IIC_Stop();
- }
- uchar EEPROM_read(add)
- {
- uchar temp1;
- IIC_Start();
- IIC_SendByte(0xa0);
- IIC_WaitAck();
- IIC_SendByte(add);
- IIC_WaitAck();
- IIC_Stop();
-
- IIC_Start();
- IIC_SendByte(0xa1);
- IIC_WaitAck();
- temp1=IIC_RecByte();
- IIC_Stop();
-
- return temp1;
-
- }
- void IIC_Delay(unsigned char i)
- {
- do{_nop_();}
- while(i--);
- }
- //×ü?????ˉì??t
- void IIC_Start(void)
- {
- SD = 1;
- SCL = 1;
- IIC_Delay(DELAY_TIME);
- SD = 0;
- IIC_Delay(DELAY_TIME);
- SCL = 0;
- }
- //×ü??í£?1ì??t
- void IIC_Stop(void)
- {
- SD = 0;
- SCL = 1;
- IIC_Delay(DELAY_TIME);
- SD = 1;
- IIC_Delay(DELAY_TIME);
- }
- //·¢?íó|′e
- void IIC_SendAck(bit ackbit)
- {
- SCL = 0;
- SD = ackbit; // 0£oó|′e£?1£o·?ó|′e
- IIC_Delay(DELAY_TIME);
- SCL = 1;
- IIC_Delay(DELAY_TIME);
- SCL = 0;
- SD = 1;
- IIC_Delay(DELAY_TIME);
- }
- //μè′yó|′e
- bit IIC_WaitAck(void)
- {
- bit ackbit;
-
- SCL = 1;
- IIC_Delay(DELAY_TIME);
- ackbit = SD;
- SCL = 0;
- IIC_Delay(DELAY_TIME);
- return ackbit;
- }
- //í¨1yI2C×ü??·¢?íêy?Y
- void IIC_SendByte(unsigned char byt)
- {
- unsigned char i;
- for(i=0; i<8; i++)
- {
- SCL = 0;
- IIC_Delay(DELAY_TIME);
- if(byt & 0x80) SD = 1;
- else SD = 0;
- IIC_Delay(DELAY_TIME);
- SCL = 1;
- byt <<= 1;
- IIC_Delay(DELAY_TIME);
- }
- SCL = 0;
- }
- //′óI2C×ü??é??óê?êy?Y
- unsigned char IIC_RecByte(void)
- {
- unsigned char i, da;
- for(i=0; i<8; i++)
- {
- SCL = 1;
- IIC_Delay(DELAY_TIME);
- da <<= 1;
- if(SD) da |= 1;
- SCL = 0;
- IIC_Delay(DELAY_TIME);
- }
- return da;
- }
- /******************DS1302*********************/
- void DS_init()
- {
- uchar i,add;
- add=0x80;
- Write_Ds1302_Byte( 0x8e,0x00 );
- for(i=0;i<7;i++)
- {
- Write_Ds1302_Byte( add,shijian[i] );
- add=add+2;
- }
- Write_Ds1302_Byte( 0x8e,0x80 );
- }
- void DS_get()
- {
- uchar i,add;
- add=0x81;
- for(i=0;i<7;i++)
- {
- shijian[i]=Read_Ds1302_Byte ( add );
- add=add+2;
- }
- Write_Ds1302_Byte( 0x8e,0x80 );
- }
-
- 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/10<<4)|dat%10);
- RST=0;
- }
- unsigned char Read_Ds1302_Byte ( unsigned char address )
- {
- unsigned char i,temp=0x00,dat1,dat2;
- 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_();
-
- dat1=temp/16;
- dat2=temp%16;
- temp=dat1*10+dat2;
- return (temp);
- }
復制代碼
所有資料51hei提供下載:
3:藍橋杯單片機第三屆決賽試題-門禁系統.pdf
(1.77 MB, 下載次數: 18)
2019-8-1 14:09 上傳
點擊文件名下載附件
3jiemain.zip
(3.28 KB, 下載次數: 27)
2019-8-1 14:11 上傳
點擊文件名下載附件
主函數(所有程序)
|