这是我上个月做的蓝桥杯第六届的真题
用了2个小时左右的时间
附件里面包含蓝桥杯单片机第七届真题 含源码,原理图
整个程序是基于蓝桥杯考试的板子CT107D来编写的
现在又到了报名蓝桥杯的日子,论坛里大一大二的朋友可以报名参加一下
高手请不要浪费时间于此
难度不大,省赛一等奖可以北京三日游,现在还可以报名参加
内容是结合自己的想法和学习前辈的编程经验
请大家多多指教
单片机源程序如下:
- #include "stc15f2k60s2.h"
- #include "onewire.h"
- sbit buzzer=P0^6;
- unsigned char smg_d[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0-9
- unsigned char smg_w[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- unsigned char menu_index=1;//界面切换索引
- unsigned char menu1[8];//界面1显示
- unsigned char mode=1; //三种模式,睡眠风,1,自然风,2,常风,3
- unsigned char remain_time=0; //倒计时显示时间
- unsigned char menu2[8];//界面2 显示,按下S7后出现
- unsigned char temp;//界面2显示温度
- //sbit pwm_output = P3^4 ; //pwm输出
- bit key_flag=0;//按键按下的标志位
-
- //矩阵键盘
- #define KEYPORT P3
- #define key_state_0 0
- #define key_state_1 1
- #define key_state_2 2
- char key_read()
- {
- static char key_state=0;
- unsigned char k1,k2,key_press;
- unsigned char key_return=0;
- KEYPORT=0xf0;
- k1=KEYPORT&0xf0;
- KEYPORT=0x0f;
- k2=KEYPORT&0x0f;
- P44=1;P42=1;P35=1;P34=1;P33=0;P32=0;P31=0;P30=0;
- if(P44==0) k1=0x70;
- if(P42==0) k1=0xb0;
- if(P35==0) k1=0xd0;
- if(P34==0) k1=0xe0;
- if((P44==1)&(P42==1)&(P35==1)&(P34==1)) k1 = 0xf0;
- P44=0;P42=0;P35=0;P34=0;P33=1;P32=1;P31=1;P30=1;
- if(P33==0) k2=0x07;
- if(P32==0) k2=0x0b;
- if(P31==0) k2=0x0d;
- if(P30==0) k2=0x0e;
- if((P33==1)&(P32==1)&(P31==1)&(P30==1)) k2 = 0x0f;
- key_press=k1|k2;
- switch(key_state)
- {
- case key_state_0:
- if(key_press!=0xff) key_state=key_state_1;
- break;
- case key_state_1:
- if(key_press!=0xff)
- {
- if(key_press==0xee) key_return=19;
- if(key_press==0xed) key_return=18;
- if(key_press==0xeb) key_return=17;
- if(key_press==0xe7) key_return=16;
- if(key_press==0xde) key_return=15;
- if(key_press==0xdd) key_return=14;
- if(key_press==0xdb) key_return=13;
- if(key_press==0xd7) key_return=12;
- if(key_press==0xbe) key_return=11;
- if(key_press==0xbd) key_return=10;
- if(key_press==0xbb) key_return=9;
- if(key_press==0xb7) key_return=8;
- if(key_press==0x7e) key_return=7;
- if(key_press==0x7d) key_return=6;
- if(key_press==0x7b) key_return=5;
- if(key_press==0x77) key_return=4;
-
- key_state=key_state_2;
- }
- else
- key_state=key_state_0;
- break;
-
- case key_state_2:
- if(key_press==0xff)key_state=key_state_0;
- break;
- }
- return key_return;
- }
- void Timer0Init(void) //100微秒 @11.0592MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0xAE; //设置定时初值
- TH0 = 0xFB; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计 ?
- ET0 = 1;
- EA=1;
- }
- main()
- {
- unsigned char key_val;
- P2=0XA0;buzzer=0;P2=0X00;
- Timer0Init();
- while(1)
- {
- if(menu_index==2)
- {
- temp=read_temperature();
- }
- menu1[0]=0x40;menu1[1]=smg_d[mode];
- menu1[2]=0x40;menu1[3]=0x00;
- menu1[4]=smg_d[remain_time/1000];menu1[5]=smg_d[remain_time/100%10];
- menu1[6]=smg_d[remain_time%100/10];menu1[7]=smg_d[remain_time%10];
- menu2[0]=0x40;menu2[1]=0x66;menu2[2]=0x40;
- menu2[3]=0x00;menu2[4]=0x00;
- menu2[5]=smg_d[temp/10];menu2[6]=smg_d[temp%10];
- menu2[7]=0x39;
- if(key_flag)
- {
- key_flag=0;
- key_val=key_read();
- switch(key_val)
- {
- case 4 : if(menu_index==1)
- {
- mode++;
- if(mode==4)
- mode=1;
- }break;
- case 5 : if(menu_index==1)
- {
- if(remain_time<60)
- remain_time+=60;
- else remain_time=0;
- }break;
- case 6 : if(menu_index==1)
- {
- remain_time=0;
- }break;
- case 7 : if(menu_index==1)
- {
- menu_index=2;
- }
- else
- menu_index=1;
- break;
- }
- }
- }
- }
- void tm0_isr() interrupt 1
- {
- static char i;
- static unsigned int sec_count=0,key_count=0,smg_count=0,pwm_count=0;
- sec_count++;key_count++;smg_count++;pwm_count++;
-
- if(remain_time>0)
- {
- if(mode==1) //模式1:睡眠风状态下的PWM,20%占空比
- {
- P2=0X80;P0=0XFE;P2=0X00;
- if(pwm_count==8) //1ms输出一次PWM
- {
- P34=1;
- }
- if(pwm_count==10)
- {
- P34=0;
- pwm_count=0;
- }
- }
-
- if(mode==2) //模式2:自然风状态下的PWM,30%占空比
- {
- P2=0X80;P0=0XFD;P2=0X00;
- if(pwm_count==7) //1ms输出一次PWM
- {
- P34=1;
- }
- if(pwm_count==10)
- {
- P34=0;
- pwm_count=0;
- }
- }
-
- if(mode==3) //模式3:常风状态下的PWM,70%占空比
- {
- P2=0X80;P0=0XFB;P2=0X00;
- if(pwm_count==3) //1ms输出一次PWM
- {
- P34=1;
- }
- if(pwm_count==10)
- {
- P34=0;
- pwm_count=0;
- }
- }
- }
- else
- {
- P34=0;
- pwm_count=0;
- P2=0X80;P0=0XFF;P2=0X00;
- }
-
- if(smg_count==30) //3ms扫描显示一次数码管
- {
- smg_count=0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
7.电风扇.zip
(14.53 MB, 下载次数: 88)
|