找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1763|回复: 1
收起左侧

蓝桥杯单片机大赛第六届温度记录器源程序及赛题

[复制链接]
ID:609573 发表于 2020-8-7 22:07 | 显示全部楼层 |阅读模式
自己写的代码 打算分享出来 虽然不是最精简算法,但是能基本实现赛题要求的功能,仅供参考。和大家一起交流

单片机源程序如下:
  1. #include <stc15f2k60s2.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. sbit S4=P3^3;
  6. sbit S5=P3^2;
  7. sbit S6=P3^1;
  8. sbit S7=P3^0;
  9. sbit DQ = P1^4;  //单总线接口
  10. uchar SMG_duanma[12]={0XC0,0XF9,0XA4,0XB0,
  11.                                         0X99,0X92,0X82,0XF8,
  12.                                         0X80,0X90,0XFF,0XBF};
  13. uchar SMG_pianxuan[8]={0X01,0X02,0X04,0X08,
  14.                                            0X10,0X20,0X40,0X80};
  15. uchar SMG_huanchong[8]={10,10,10,10,10,11,0,1};
  16. uchar SMGTIME_huanchong[8]={2,3,11,5,9,11,5,0};
  17. uchar SMGWD_huanchong[8]={11,0,0,10,10,11,2,4};
  18. uchar DS18B20[10]={0};
  19. int flag,jiange_flag=1,jiange=1,qiehuan=0,cishu;
  20. int miao=50,fen=59,xiaoshi=23,shanshuo,miao_flag,xuhao_flag;
  21. void Delay1ms(int time)                //@12.000MHz
  22. {
  23.         unsigned char i, j;
  24.         while(time--)
  25.         {
  26.                 i = 12;
  27.                 j = 169;
  28.                 do
  29.                 {
  30.                         while (--j);
  31.                 } while (--i);
  32.         }
  33. }
  34. void Delay500us()                //@12.000MHz
  35. {
  36.         unsigned char i, j;

  37.         i = 6;
  38.         j = 211;
  39.         do
  40.         {
  41.                 while (--j);
  42.         } while (--i);
  43. }
  44. void Delay80us()                //@12.000MHz
  45. {
  46.         unsigned char i, j;

  47.         i = 1;
  48.         j = 236;
  49.         do
  50.         {
  51.                 while (--j);
  52.         } while (--i);
  53. }
  54. //通过单总线向DS18B20写一个字节
  55. void Write_DS18B20(uchar dat)
  56. {
  57.         uchar i;
  58.         for(i=0;i<8;i++)
  59.         {
  60.                 DQ = 0;
  61.                 DQ = dat&0x01;
  62.                 Delay80us();
  63.                 DQ = 1;
  64.                 dat >>= 1;
  65.         }
  66.         Delay80us();
  67. }

  68. //从DS18B20读取一个字节
  69. uchar Read_DS18B20()
  70. {
  71.         uchar i;
  72.         uchar dat;
  73.         for(i=0;i<8;i++)
  74.         {
  75.                 DQ = 0;
  76.                 dat >>= 1;
  77.                 DQ = 1;
  78.                 if(DQ)
  79.                 {
  80.                         dat |= 0x80;
  81.                 }            
  82.                 Delay80us();
  83.         }
  84.         return dat;
  85. }

  86. //DS18B20设备初始化
  87. void init_ds18b20()
  88. {
  89.           DQ = 0;
  90.           Delay500us();
  91.           DQ = 1;
  92.           Delay500us();
  93. }
  94. uchar DS18B20_qudong()
  95. {
  96.         uchar low;
  97.         uchar high;
  98.         long temp;
  99.         init_ds18b20();
  100.         Write_DS18B20(0XCC); //忽略rom指令
  101.         Write_DS18B20(0X44); //温度转换
  102.         init_ds18b20();
  103.         Write_DS18B20(0XCC);
  104.         Write_DS18B20(0XBE);  //读暂存器
  105.         low=Read_DS18B20();
  106.         high=Read_DS18B20();
  107.         temp=low>>4;
  108.         temp=temp|(high<<4);
  109.         return temp;
  110. }
  111. void AllInit()
  112. {
  113.         P2=0XA0;
  114.         P0=0;
  115.         P2=0X80;
  116.         P0=0XFF;
  117. }
  118. void SEY_SCAN()  //flag相应数字对应键盘标号
  119. {
  120.         if(S4==0)
  121.         {
  122.                 Delay1ms(3);
  123.                 if(S4==0)
  124.                 {
  125.                         flag=4;
  126.                 }
  127.                 while(S4==0);
  128.         }
  129.         if(S5==0)
  130.         {
  131.                 Delay1ms(3);
  132.                 if(S5==0)
  133.                 {
  134.                         flag=5;
  135.                 }
  136.                 while(S5==0);
  137.         }
  138.         if(S6==0)
  139.         {
  140.                 Delay1ms(3);
  141.                 if(S6==0)
  142.                 {
  143.                         flag=6;
  144.                 }
  145.                 while(S6==0);
  146.         }
  147.         if(S7==0)
  148.         {
  149.                 Delay1ms(3);
  150.                 if(S7==0)
  151.                 {
  152.                         flag=7;
  153.                 }
  154.                 while(S7==0);
  155.         }
  156. }
  157. void zhixing()  //执行键盘的操作
  158. {
  159.         if(flag==4)  //当s4被摁下
  160.         {
  161.                 flag=0;
  162.                 jiange_flag++;
  163.                 if(jiange_flag==2)jiange=5;
  164.                 if(jiange_flag==3)jiange=10;
  165.                 if(jiange_flag==4)jiange=30;
  166.                 if(jiange_flag==5)jiange=60;
  167.                 if(jiange_flag==6){jiange_flag=1;jiange=1;}
  168.                 SMG_huanchong[6]=jiange/10;
  169.                 SMG_huanchong[7]=jiange%10;
  170.         }
  171.         if(flag==5)  //当s5被摁下
  172.         {
  173.                 flag=0;
  174.                 qiehuan=1;
  175.                 ET0=1;
  176.         }
  177.         if(flag==6)
  178.         {
  179.                 flag=0;
  180.                 if(cishu==10) //只有采集完十次之后 才有效
  181.                 {
  182.                         cishu=0;
  183.                         ET1=1; //开始显示温度
  184.                 }
  185.         }
  186.         if(xuhao_flag==9)  //摁键无效
  187.         {
  188.                 if(flag==7)  //初始化 还原所有参数
  189.                 {
  190.                         flag=0;
  191.                         miao=50;
  192.                         fen=59;
  193.                         xiaoshi=23;
  194.                         qiehuan=0;
  195.                         miao_flag=0;
  196.                         xuhao_flag=0;
  197.                         jiange=1;
  198.                         ET0=0;
  199.                         ET1=0;
  200.                         SMGWD_huanchong[2]=0;
  201.                 }
  202.         }
  203. }
  204. void JanGe_Display()  //开机默认显示 调整间隔页面 1 5 10 30s
  205. {
  206.         int i;
  207.         for(i=0;i<8;i++)
  208.         {
  209.                 P2=0XC0;
  210.                 P0=SMG_pianxuan[i];
  211.                 P2=0XE0;
  212.                 P0=SMG_duanma[SMG_huanchong[i]];
  213.                 Delay1ms(3);
  214.         }
  215. }
  216. void TIME_Display()
  217. {
  218.         int i;
  219.         shanshuo++;
  220.         if(shanshuo==41)shanshuo=0;
  221.         for(i=0;i<8;i++)
  222.         {
  223.                 if(i==2 | i==5)
  224.                 {
  225.                         if(shanshuo<20) //控制两个 - 闪烁
  226.                         {
  227.                                 P2=0XC0;
  228.                                 P0=SMG_pianxuan[i];
  229.                                 P2=0XE0;
  230.                                 P0=SMG_duanma[10];
  231.                         }
  232.                
  233.                         else
  234.                         {
  235.                                 P2=0XC0;
  236.                                 P0=SMG_pianxuan[i];
  237.                                 P2=0XE0;
  238.                                 P0=SMG_duanma[11];
  239.                         }
  240.                 }
  241.                 else
  242.                 {
  243.                         P2=0XC0;
  244.                         P0=SMG_pianxuan[i];
  245.                         P2=0XE0;
  246.                         P0=SMG_duanma[SMGTIME_huanchong[i]];
  247.                 }
  248.                 Delay1ms(3);
  249.         }
  250. }
  251. void WenDu_Display()
  252. {
  253.         int i;
  254.         shanshuo++;
  255.         if(shanshuo==41)shanshuo=0;
  256.         if(ET1==0&&xuhao_flag!=9)
  257.         {
  258.                 if(shanshuo<20)
  259.                 {
  260.                         P2=0X80;
  261.                         P0=0XFE;
  262.                 }
  263.                 else
  264.                 {
  265.                         P2=0X80;
  266.                         P0=0XFF;
  267.                 }
  268.         }
  269.         else
  270.         {
  271.                 P2=0X80;
  272.                 P0=0XFF;
  273.         }
  274.         for(i=0;i<8;i++)
  275.         {
  276.                 P2=0XC0;
  277.                 P0=SMG_pianxuan[i];
  278.                 P2=0XE0;
  279.                 P0=SMG_duanma[SMGWD_huanchong[i]];
  280.                 Delay1ms(3);
  281.         }
  282. }
  283. void CaiJi()
  284. {
  285.         if(miao_flag==jiange)  //求余,到达一次设定时间 记录一次
  286.         {
  287.                 miao_flag=0;
  288.                 DS18B20[cishu]=DS18B20_qudong();
  289.                 cishu++;
  290.                 if(cishu==10)  //当温度记录到10次停止切换到温度显示界面
  291.                 {
  292.                         qiehuan=2;
  293.                         //cishu=0;
  294.                         ET0=0;
  295.                 }
  296.         }
  297.        
  298. }
  299. void Timer0Init()                //5毫秒@12.000MHz
  300. {
  301.         AUXR |= 0xC0;                //定时器时钟1T模式
  302.         TMOD &= 0xFF;                //设置定时器模式
  303.         TL0 = 0xA0;                //设置定时初值
  304.         TH0 = 0x15;                //设置定时初值
  305.         TF0 = 0;                //清除TF0标志
  306.         TR0 = 1;                //定时器0开始计时
  307.         EA=1;
  308.         ET0=0;
  309. }
  310. void Timer1Init()                //5毫秒@12.000MHz
  311. {
  312.         TL1 = 0xA0;                //设置定时初值
  313.         TH1 = 0x15;                //设置定时初值
  314.         TF1 = 0;                //清除TF1标志
  315.         TR1 = 1;                //定时器1开始计时
  316.         ET1=0;
  317. }
  318. void main()
  319. {
  320.         AllInit();
  321.         Timer0Init();
  322.         Timer1Init();
  323.         while(1)
  324.         {
  325.                 SEY_SCAN();
  326.                 zhixing();
  327.                 CaiJi();
  328.                 if(qiehuan==0)
  329.                 JanGe_Display();
  330.                 if(qiehuan==1)
  331.                 TIME_Display();
  332.                 if(qiehuan==2)
  333.                 WenDu_Display();       
  334.         }
  335. }
  336. void Timer0() interrupt 1
  337. {
  338.         uint num;
  339.         num++;
  340.         if(num==200)
  341. ……………………

  342. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


6:2015蓝桥杯单片机第六届省赛试题(第七届模拟题)-温度记录器.pdf

868.21 KB, 下载次数: 14, 下载积分: 黑币 -5

6届温度记录器.zip

76.4 KB, 下载次数: 20, 下载积分: 黑币 -5

回复

使用道具 举报

ID:284488 发表于 2020-8-8 07:27 | 显示全部楼层
感谢楼主分享,不知可否再分享下电路图。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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