久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2322|回復: 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, 下載次數: 21, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:284488 發表于 2020-8-8 07:27 | 只看該作者
感謝樓主分享,不知可否再分享下電路圖。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 永久免费av | 日韩在线中文 | 欧美一区二区在线观看 | 一级免费毛片 | 精品视频免费 | 久久乐国产精品 | 日本不卡高字幕在线2019 | 九九九久久国产免费 | 亚洲午夜av久久乱码 | 国产精品美女www爽爽爽视频 | 国产日韩免费观看 | 国产精品欧美一区二区 | 99精品欧美一区二区蜜桃免费 | 精品1区 | 精品欧美一区二区三区久久久 | 久久久久久久久久久91 | 国产在线精品一区二区 | 精品视频一区二区三区在线观看 | 91福利在线导航 | 国产99视频精品免费视频7 | 美女国产精品 | 国产高清免费在线 | 国产精品久久久久久久久久三级 | 午夜精品一区二区三区在线观看 | 国产人成精品一区二区三 | 激情黄色在线观看 | 国产日韩欧美激情 | 午夜免费网 | av一级久久 | 精品久久国产 | 欧美精品久久久久久久久老牛影院 | 色888www视频在线观看 | 午夜精品一区二区三区在线观看 | 激情在线视频网站 | 久久久久久久久久影视 | 国产精品国产a级 | 久久久久国色av免费观看性色 | 亚洲美女视频 | 亚洲a在线观看 | 中文字幕高清在线 | 免费观看黄色片视频 |