找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3018|回复: 1
打印 上一主题 下一主题
收起左侧

第十一届蓝桥杯单片机省赛一等奖题目+源码

[复制链接]
跳转到指定楼层
楼主

  1. #include"stc15f2k60s2.h"
  2. #include"iic.h"
  3. #include"onewire.h"

  4. #define u8 unsigned char
  5. #define u16 unsigned int

  6. code u8 dx[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
  7. code u8 wx[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

  8. void init_ct107d();
  9. void Timer0Init();
  10. void dig_display();
  11. void key_deal();
  12. void dig_deal();
  13. void led_deal();

  14. u8 sj[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

  15. u8 read_key_val();

  16. u8 show_number=0;
  17. u8 dig_count=0;
  18. u8 key_read;
  19. u8 key_lock_20ms=0;
  20. u8 t_max=30;t_min=20;
  21. u8 change_tmax,change_tmin;
  22. u8 temp=88;


  23. u16 ds18b20_ds400ms=0;
  24. u16 da_ds200ms=0;

  25. bit key_lock = 1;
  26. bit smg_show_mode = 0;
  27. bit ds18b20_key = 1;
  28. bit change_on = 0;
  29. bit da_key = 1;
  30. bit error_state = 0;
  31. bit change_sign = 1;


  32. void main()
  33. {
  34.         init_ct107d();
  35.         Timer0Init();
  36.         while(temp>80)temp = rd_temperature();
  37.         while(1)
  38.         {
  39.                 //按键
  40.                 if(key_lock==1)
  41.                 {
  42.                         key_lock = 0;
  43.                         key_read = read_key_val();
  44.                         if(key_read!=0)
  45.                         {
  46.                                 key_deal();
  47.                         }
  48.                 }
  49.                 //温度
  50.                 if(ds18b20_key==1)
  51.                 {
  52.                         temp = rd_temperature();
  53.                         change_sign=1;
  54.                         ds18b20_key=0;
  55.                 }
  56.                 if(da_key==1)
  57.                 {
  58.                         //DA
  59.                         if(temp>t_max)
  60.                         {
  61.                                 pcf8591_dac(209);//4.0v
  62.                         }
  63.                         else
  64.                         {
  65.                                 if(temp>=t_min)
  66.                                 {
  67.                                         pcf8591_dac(157);//3.0v        
  68.                                 }
  69.                                 else
  70.                                 {
  71.                                         pcf8591_dac(105);//2.0v        
  72.                                 }
  73.                         }
  74.                         da_key=0;
  75.                 }
  76.                 if(change_sign==1)
  77.                 {
  78.                         led_deal();
  79.                         change_sign=0;
  80.                 }
  81.                 dig_deal();
  82.         }
  83. }



  84. void init_ct107d()
  85. {
  86.         P0=0;
  87.         P2=(P2&0X1F)|0XC0;         //数码管
  88.         P2=(P2&0X1F)|0XA0;         //外设
  89.         P2=0;
  90.         P0=0XFF;
  91.         P2=(P2&0X1F)|0X80;                //led
  92.         P2=0;
  93. }

  94. void Timer0Init(void)                //1毫秒@12.000MHz
  95. {
  96.         AUXR &= 0x7F;                //定时器时钟12T模式
  97.         TMOD &= 0xF0;                //设置定时器模式
  98.         TMOD |= 0x01;                //设置定时器模式
  99.         TL0 = 0x18;                //设置定时初值
  100.         TH0 = 0xFC;                //设置定时初值
  101.         TF0 = 0;                //清除TF0标志
  102.         TR0 = 1;                //定时器0开始计时
  103.         ET0=1;
  104.         EA=1;
  105. }

  106. void time0() interrupt 1
  107. {
  108.         TL0 = 0x18;                //设置定时初值
  109.         TH0 = 0xFC;                //设置定时初值
  110.         dig_display();
  111.         //按键读取定时
  112.         key_lock_20ms++;
  113.         if(key_lock_20ms>=20)
  114.         {
  115.                 key_lock_20ms=0;
  116.                 key_lock=1;
  117.         }
  118.         //温度读取定时
  119.         if(ds18b20_key==0)
  120.         {
  121.                 ds18b20_ds400ms++;
  122.                 if(ds18b20_ds400ms>=400)
  123.                 {
  124.                         ds18b20_ds400ms=0;
  125.                         ds18b20_key=1;
  126.                 }        
  127.         }
  128.         //da响应时间
  129.         if(da_key==0)
  130.         {
  131.                 da_ds200ms++;
  132.                 if(da_ds200ms>=200)
  133.                 {
  134.                         da_ds200ms=0;
  135.                         da_key=1;
  136.                 }
  137.         }
  138. }

  139. void dig_display()
  140. {
  141.         P0=0xff;P2=(P2&0X1F)|0XE0;P2=0;
  142.         P0=wx[dig_count];P2=(P2&0X1F)|0XC0;P2=0;
  143.         P0=sj[dig_count];P2=(P2&0X1F)|0XE0;P2=0;
  144.         dig_count++;
  145.         if(dig_count>7)dig_count=0;        
  146. }

  147. u8 read_key_val()
  148. {
  149.         static u8 key_state=0;
  150.         u8 key_new;
  151.         u8 key_val=0;
  152.         key_new=P3&0X0F;
  153.         switch(key_state)
  154.         {
  155.                 case(0):if(key_new!=0x0f){key_state=1;}break;
  156.                 case(1):
  157.                         if(key_new==0x0f){key_state=0;}
  158.                         else
  159.                         {
  160.                                 switch(key_new)
  161.                                 {
  162.                                         case(0x07):key_val=4;break;         //s4
  163.                                         case(0x0b):key_val=5;break;   //s5
  164.                                         case(0x0d):key_val=6;break;   //s6
  165.                                         case(0x0e):key_val=7;break;   //s7
  166.                                         default:key_val=0;break;
  167.                                 }           
  168.                                 key_state=2;
  169.                         }break;
  170.                 case(2):if(key_new==0x0f){key_state=0;}break;
  171.         }
  172.         return key_val;
  173. }

  174. void key_deal()
  175. {
  176.         switch(key_read)
  177.         {
  178.                 case(4):
  179.                         if(smg_show_mode==0)
  180.                         {
  181.                                 smg_show_mode = 1;
  182.                                 change_tmax = t_max;
  183.                                 change_tmin = t_min;
  184.                                 change_on = 0;
  185.                         }
  186.                         else
  187.                         {
  188.                                 if(change_tmax>=change_tmin)
  189.                                 {
  190.                                         t_max = change_tmax;
  191.                                         t_min = change_tmin;
  192.                                         change_sign=1;
  193.                                         if(error_state==1)error_state=0;
  194.                                 }
  195.                                 else
  196.                                 {
  197.                                         error_state=1;
  198.                                 }
  199.                                 smg_show_mode = 0;        
  200.                         }
  201.                         break;
  202.                 case(5):
  203.                         if(smg_show_mode==1)
  204.                         {
  205.                                 change_on=~change_on;
  206.                         }
  207.                         break;
  208.                 case(6):
  209.                         if(smg_show_mode==1)
  210.                         {
  211.                                 if(change_on==1)
  212.                                 {
  213.                                         change_tmax++;
  214.                                         if(change_tmax>99)change_tmax=0;
  215.                                 }
  216.                                 else
  217.                                 {
  218.                                         change_tmin++;
  219.                                         if(change_tmin>99)change_tmin=0;
  220.                                 }
  221.                         }
  222.                         break;
  223.                 case(7):
  224.                         if(smg_show_mode==1)
  225.                         {
  226.                                 if(change_on==1)
  227.                                 {
  228.                                         if(change_tmax==0)
  229.                                         {
  230.                                                 change_tmax=99;
  231.                                         }
  232.                                         else change_tmax--;
  233.                                 }
  234.                                 else
  235.                                 {
  236.                                         if(change_tmin==0)
  237.                                         {
  238.                                                 change_tmin=99;
  239.                                         }
  240.                                         else change_tmin--;
  241.                                 }
  242.                         }
  243.                         break;
  244.         }
  245. }

  246. void dig_deal()
  247. {
  248.         u8 i;
  249.         if(smg_show_mode==0)
  250.         {
  251.                 sj[0]=0xc6;
  252.                 for(i=1;i<6;i++)sj[i]=0xff;
  253.                 sj[6]=dx[temp/10];
  254.                 sj[7]=dx[temp%10];        
  255.         }
  256.         else
  257.         {
  258.                 sj[0]=0x8c;sj[1]=0xff;sj[2]=0xff;sj[5]=0xff;
  259.                 sj[3]=dx[change_tmax/10];sj[4]=dx[change_tmax%10];        
  260.                 sj[6]=dx[change_tmin/10];sj[7]=dx[change_tmin%10];
  261.         }
  262. }

  263. void led_deal()
  264. {
  265.         if(temp>t_max)
  266.         {
  267.                 if(error_state==1)
  268.                 {
  269.                         P0=0XF6;        
  270.                 }
  271.                 else{P0=0XFe;}
  272.         }
  273.         else
  274.         {
  275.                 if(temp>=t_min)
  276.                 {
  277.                         if(error_state==1)
  278.                         {
  279.                                 P0=0XF5;
  280.                         }
  281.                         else{P0=0XFD;}
  282.                 }
  283.                 else
  284.                 {
  285.                         if(error_state==1)
  286.                         {
  287.                                 P0=0XF3;
  288.                         }
  289.                         else{P0=0XFB;}
  290.                 }
  291.         }
  292.         P2=(P2&0X1F)|0X80;P2=0;               
  293. }
复制代码

1.png (116.69 KB, 下载次数: 52)

1.png

省赛.zip

815.66 KB, 下载次数: 57, 下载积分: 黑币 -5

题目+源码

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:739707 发表于 2021-1-13 21:19 | 只看该作者
备赛十二届
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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