找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4247|回复: 4
收起左侧

蓝桥杯单片机第七届真题电风扇控制 含源码,原理图全套软件硬件资料

[复制链接]
ID:428027 发表于 2018-11-27 19:52 | 显示全部楼层 |阅读模式
这是我上个月做的蓝桥杯第六届的真题
用了2个小时左右的时间
附件里面包含蓝桥杯单片机第七届真题   含源码,原理图
整个程序是基于蓝桥杯考试的板子CT107D来编写的
现在又到了报名蓝桥杯的日子,论坛里大一大二的朋友可以报名参加一下
高手请不要浪费时间于此
难度不大,省赛一等奖可以北京三日游,现在还可以报名参加
内容是结合自己的想法和学习前辈的编程经验
请大家多多指教

TIM图片20181127194732.png


CT107D原理图

CT107D原理图


单片机源程序如下:
  1. #include "stc15f2k60s2.h"
  2. #include "onewire.h"
  3. sbit buzzer=P0^6;
  4. unsigned char smg_d[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0-9
  5. unsigned char smg_w[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  6. unsigned char menu_index=1;//界面切换索引
  7. unsigned char menu1[8];//界面1显示
  8. unsigned char mode=1; //三种模式,睡眠风,1,自然风,2,常风,3
  9. unsigned char remain_time=0; //倒计时显示时间
  10. unsigned char menu2[8];//界面2 显示,按下S7后出现
  11. unsigned char temp;//界面2显示温度
  12. //sbit pwm_output = P3^4 ; //pwm输出
  13. bit key_flag=0;//按键按下的标志位
  14.                                    
  15. //矩阵键盘
  16. #define KEYPORT P3
  17. #define key_state_0 0
  18. #define key_state_1 1
  19. #define key_state_2 2

  20. char key_read()
  21. {        
  22.         static char key_state=0;
  23.         unsigned char k1,k2,key_press;
  24.         unsigned char key_return=0;

  25.         KEYPORT=0xf0;
  26.         k1=KEYPORT&0xf0;
  27.         KEYPORT=0x0f;
  28.         k2=KEYPORT&0x0f;

  29.         P44=1;P42=1;P35=1;P34=1;P33=0;P32=0;P31=0;P30=0;
  30.         if(P44==0)        k1=0x70;
  31.         if(P42==0)        k1=0xb0;
  32.         if(P35==0)        k1=0xd0;
  33.         if(P34==0)        k1=0xe0;
  34.         if((P44==1)&(P42==1)&(P35==1)&(P34==1))  k1        = 0xf0;

  35.         P44=0;P42=0;P35=0;P34=0;P33=1;P32=1;P31=1;P30=1;
  36.         if(P33==0)        k2=0x07;
  37.         if(P32==0)        k2=0x0b;
  38.         if(P31==0)        k2=0x0d;
  39.         if(P30==0)        k2=0x0e;
  40.         if((P33==1)&(P32==1)&(P31==1)&(P30==1))  k2        = 0x0f;
  41.         key_press=k1|k2;

  42.         switch(key_state)
  43.         {
  44.                 case key_state_0:
  45.                 if(key_press!=0xff)  key_state=key_state_1;
  46.                 break;

  47.                 case key_state_1:
  48.                 if(key_press!=0xff)
  49.                 {        
  50.                         if(key_press==0xee) key_return=19;
  51.                         if(key_press==0xed) key_return=18;
  52.                         if(key_press==0xeb) key_return=17;
  53.                         if(key_press==0xe7) key_return=16;

  54.                         if(key_press==0xde) key_return=15;
  55.                         if(key_press==0xdd) key_return=14;
  56.                         if(key_press==0xdb) key_return=13;
  57.                         if(key_press==0xd7) key_return=12;

  58.                         if(key_press==0xbe) key_return=11;
  59.                         if(key_press==0xbd) key_return=10;
  60.                         if(key_press==0xbb) key_return=9;
  61.                         if(key_press==0xb7) key_return=8;

  62.                         if(key_press==0x7e) key_return=7;
  63.                         if(key_press==0x7d) key_return=6;
  64.                         if(key_press==0x7b) key_return=5;
  65.                         if(key_press==0x77) key_return=4;
  66.                         
  67.                         key_state=key_state_2;
  68.                 }
  69.                 else
  70.                 key_state=key_state_0;
  71.                 break;
  72.                
  73.                 case key_state_2:
  74.                 if(key_press==0xff)key_state=key_state_0;
  75.                 break;

  76.         }
  77.         return key_return;
  78. }




  79. void Timer0Init(void)                //100微秒  @11.0592MHz
  80. {
  81.                 AUXR |= 0x80;                //定时器时钟1T模式
  82.                 TMOD &= 0xF0;                //设置定时器模式
  83.                 TL0 = 0xAE;                        //设置定时初值
  84.                 TH0 = 0xFB;                        //设置定时初值
  85.                 TF0 = 0;                        //清除TF0标志
  86.                 TR0 = 1;                        //定时器0开始计        ?        
  87.                 ET0 = 1;
  88.                 EA=1;

  89. }

  90. main()
  91. {
  92.         unsigned char key_val;
  93.         P2=0XA0;buzzer=0;P2=0X00;
  94.         Timer0Init();

  95.         while(1)
  96.         {
  97.                 if(menu_index==2)
  98.                 {
  99.                         temp=read_temperature();        
  100.                 }

  101.                 menu1[0]=0x40;menu1[1]=smg_d[mode];
  102.                 menu1[2]=0x40;menu1[3]=0x00;
  103.                 menu1[4]=smg_d[remain_time/1000];menu1[5]=smg_d[remain_time/100%10];
  104.                 menu1[6]=smg_d[remain_time%100/10];menu1[7]=smg_d[remain_time%10];

  105.                 menu2[0]=0x40;menu2[1]=0x66;menu2[2]=0x40;
  106.                 menu2[3]=0x00;menu2[4]=0x00;
  107.                 menu2[5]=smg_d[temp/10];menu2[6]=smg_d[temp%10];
  108.                 menu2[7]=0x39;

  109.                 if(key_flag)
  110.                 {
  111.                         key_flag=0;
  112.                         key_val=key_read();
  113.                         switch(key_val)
  114.                         {
  115.                                 case 4 :        if(menu_index==1)
  116.                                                         {
  117.                                                                 mode++;
  118.                                                                 if(mode==4)
  119.                                                                 mode=1;
  120.                                                         }break;        
  121.                                 case 5 :        if(menu_index==1)
  122.                                                         {
  123.                                                                 if(remain_time<60)
  124.                                                                 remain_time+=60;
  125.                                                                 else remain_time=0;
  126.                                                         }break;
  127.                                 case 6 :          if(menu_index==1)
  128.                                                         {
  129.                                                                 remain_time=0;
  130.                                                         }break;
  131.                                 case 7 :    if(menu_index==1)
  132.                                                         {
  133.                                                                 menu_index=2;
  134.                                                     }
  135.                                                         else
  136.                                                         menu_index=1;
  137.                                                         break;
  138.                         }
  139.                 }
  140.         }
  141. }

  142. void tm0_isr() interrupt 1
  143. {
  144.         static char i;
  145.         static unsigned int sec_count=0,key_count=0,smg_count=0,pwm_count=0;
  146.         sec_count++;key_count++;smg_count++;pwm_count++;
  147.         
  148.         if(remain_time>0)
  149.         {
  150.                 if(mode==1)                   //模式1:睡眠风状态下的PWM,20%占空比
  151.                 {
  152.                         P2=0X80;P0=0XFE;P2=0X00;
  153.                         if(pwm_count==8)  //1ms输出一次PWM
  154.                         {
  155.                                 P34=1;
  156.                         }
  157.                         if(pwm_count==10)
  158.                         {
  159.                                 P34=0;
  160.                                 pwm_count=0;
  161.                         }
  162.                 }
  163.                
  164.                 if(mode==2)                   //模式2:自然风状态下的PWM,30%占空比
  165.                 {
  166.                         P2=0X80;P0=0XFD;P2=0X00;                        
  167.                         if(pwm_count==7)  //1ms输出一次PWM
  168.                         {
  169.                                 P34=1;
  170.                         }
  171.                         if(pwm_count==10)
  172.                         {
  173.                                 P34=0;
  174.                                 pwm_count=0;
  175.                         }
  176.                 }
  177.         
  178.                 if(mode==3)                   //模式3:常风状态下的PWM,70%占空比
  179.                 {
  180.                         P2=0X80;P0=0XFB;P2=0X00;
  181.                         if(pwm_count==3)  //1ms输出一次PWM
  182.                         {
  183.                                 P34=1;
  184.                         }
  185.                         if(pwm_count==10)
  186.                         {
  187.                                 P34=0;
  188.                                 pwm_count=0;
  189.                         }
  190.                 }

  191.         }
  192.         else
  193.         {
  194.                 P34=0;
  195.                 pwm_count=0;
  196.                 P2=0X80;P0=0XFF;P2=0X00;
  197.         }
  198.         
  199.         if(smg_count==30) //3ms扫描显示一次数码管
  200.         {
  201.                 smg_count=0;
  202. ……………………

  203. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
TIM图片20181127194456.png

所有资料51hei提供下载:
7.电风扇.zip (14.53 MB, 下载次数: 87)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:446580 发表于 2018-12-14 22:42 | 显示全部楼层
可以帮我改进哈吗,有偿,比这个简单
回复

使用道具 举报

ID:428027 发表于 2018-12-21 18:12 | 显示全部楼层
Ac007 发表于 2018-12-14 22:42
可以帮我改进哈吗,有偿,比这个简单

改进啥?
回复

使用道具 举报

ID:484402 发表于 2019-3-5 21:34 | 显示全部楼层
数码管那只打开了段选   并没有打开位选
回复

使用道具 举报

ID:493120 发表于 2019-3-18 13:25 | 显示全部楼层
感谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表