找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于第七届蓝桥杯单片机温度记录器程序问题

[复制链接]
跳转到指定楼层
楼主
最近我在蓝桥杯第七届温度记录器的程序时,到最后一步是采集温度,程序出现问题调试不了。温度值一直显示为0,我想把读到的十个温度数据放到一个数组内,然后要用时从数组内调出来,但是貌似数据没录入数组内,跪求各位大神帮忙看看程序。我是用郭天祥的开发板调的程序,跟大赛的板子稍微不一样。

我用郭天祥单片机开发板写的温度记录器程序,发现程序前两个功能可以实现。但是到最后温度采集上一直采集不了温度数据,我是将十个温度数据放到一个数组内,然后在从数组内调用出来给显示函数的。但是发现温度显示一直为00,再者就是8.5的显示异常现象。之前我单独测试温度程序时是单个温度值采集发现程序可行,然后我就直接加下去大程序里,发现功能不能实现。多个温度值采集如何实现呢?跪求各位大佬解答


单片机源码:
  1. #include<reg52.h>
  2. #include <stdio.h>
  3. #define uchar unsigned char
  4. #define unit unsigned int
  5. #define key_input P3
  6. sbit ds=P2^2;     //温度传感器信号线
  7. sbit wela=P2^7;
  8. sbit dula=P2^6;
  9. sbit dscs=P1^4;
  10. sbit dsas=P1^5;
  11. sbit dsrw=P1^6;
  12. sbit dsrd=P1^7;
  13. sbit beep=P2^3;
  14. bit flag;
  15. unit temp;

  16. float f_temp;
  17. uchar jiange[]={1,5,30,60};
  18. uchar code table_wela1[]={0xf7,0xef,0xdf};
  19. uchar code table_wela[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  20. unsigned char code smg[]={
  21. 0x3f,0x06,0x5b,0x4f,
  22. 0x66,0x6d,0x7d,0x07,
  23. 0x7f,0x6f};
  24. uchar key1,key2,key_press,key_number,addr,i;

  25. uchar key_scan(key_number)
  26. {
  27.         static uchar key_state=0;
  28.         key_input=0xf0;
  29.         key1=key_input&0xf0;
  30.         key_input=0x0f;
  31.         key2=key_input&0x0f;
  32.         key_press=key1|key2;
  33.         switch(key_state)
  34.         {
  35.                 case 0:
  36.                                 if(key_press!=0xff)
  37.                                 {
  38.                                         key_state=1;
  39.                                 }
  40.                                 break;
  41.                                 
  42.                 case 1:
  43.                                 if(key_press!=0xff)
  44.                                 {
  45.                                         switch(key_press)
  46.                                         {
  47.                                                 case 0x77:  key_number=2;
  48.                                                                         break;
  49.                                                 case 0x7b:  key_number=3;
  50.                                                                         break;
  51.                                                 case 0x7d:  key_number=4;
  52.                                                                         break;
  53.                                                 case 0x7e:  key_number=5;
  54.                                                                         break;
  55.                                         }
  56.                                         key_state=2;
  57.                                 }
  58.                                 else
  59.                                 {
  60.                                         key_state=0;
  61.                                 }
  62.                                 break;
  63.                 case 2:
  64.                                 if(key_press==0xff)
  65.                                 {
  66.                                         key_state=0;
  67.                                 }
  68.                                 break;        
  69.         }
  70.         return key_number;
  71. }



  72. void Timer1Init(void)                //1毫秒@11.0592MHz
  73. {
  74.         /*AUXR |= 0x40;        */        //定时器时钟1T模式
  75.         TMOD &= 0x0F;                //设置定时器模式
  76.         TMOD |= 0x10;                //设置定时器模式
  77.         TL1 = 0xCD;                //设置定时初值
  78.         TH1 = 0xD4;                //设置定时初值
  79.         TF1 = 0;                //清除TF1标志
  80.         TR1 = 1;                //定时器1开始计时
  81.         EA=1;
  82.         ET1=1;
  83. }






  84. ////////////
  85. //DS18B20函数//
  86. /////////
  87. void delay(unit z)//延时函数
  88. {
  89.         unit x,y;
  90.         for(x=z;x>0;x--)
  91.                 for(y=110;y>0;y--);
  92. }



  93. void dsreset(void)    //18B20复位,初始化函数
  94. {
  95.   unit i;
  96.   ds=0;
  97.   i=103;
  98.   while(i>0)i--;
  99.   ds=1;
  100.   i=4;
  101.   while(i>0)i--;
  102. }

  103. bit tempreadbit(void)   //读1位函数
  104. {
  105.    unit i;
  106.    bit dat;
  107.    ds=0;i++;          //i++ 起延时作用
  108.    ds=1;i++;i++;
  109.    dat=ds;
  110.    i=8;while(i>0)i--;
  111.    return (dat);
  112. }

  113. uchar tempread(void)   //读1个字节
  114. {
  115.   uchar i,j,dat;
  116.   dat=0;
  117.   for(i=1;i<=8;i++)
  118.   {
  119.     j=tempreadbit();
  120.     dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  121.   }
  122.   return(dat);
  123. }

  124. void tempwritebyte(uchar dat)   //向18B20写一个字节数据
  125. {
  126.   unit i;
  127.   uchar j;
  128.   bit testb;
  129.   for(j=1;j<=8;j++)
  130.   {
  131.     testb=dat&0x01;
  132.     dat=dat>>1;
  133.     if(testb)     //写 1
  134.     {
  135.       ds=0;
  136.       i++;i++;
  137.       ds=1;
  138.       i=8;while(i>0)i--;
  139.     }
  140.     else
  141.     {
  142.       ds=0;       //写 0
  143.       i=8;while(i>0)i--;
  144.       ds=1;
  145.       i++;i++;
  146.     }

  147.   }
  148. }

  149. void tempchange(void)  //DS18B20 开始获取温度并转换
  150. {
  151.   dsreset();
  152.   delay(1);
  153.   tempwritebyte(0xcc);  // 写跳过读ROM指令
  154.   tempwritebyte(0x44);  // 写温度转换指令
  155. }

  156. unit get_temp()         //读取寄存器中存储的温度数据
  157. {
  158.   uchar a,b;

  159.   dsreset();
  160.   delay(1);
  161.   tempwritebyte(0xcc);
  162.   tempwritebyte(0xbe);
  163.   a=tempread();         //读低8位
  164.   b=tempread();         //读高8位
  165.   temp=b;
  166.   temp<<=8;            //两个字节组合为1个字
  167.   temp=temp|a;
  168.   f_temp=temp*0.0625;      //温度在寄存器中为12位 分辨率位0.0625°
  169.   temp=f_temp*10+0.5;    //乘以10表示小数点后面只取1位,加0.5是四舍五入
  170.   f_temp=f_temp+0.05;
  171.   return temp;         //temp是整型
  172. }

  173. /////////////
  174. //DS18B20函数//
  175. //////////


  176. /////////
  177. //DS12C887函数//
  178. ////////
  179. void write_ds(uchar addr,uchar date)
  180. {
  181.         P0=0xff;
  182.         dsas=1;
  183.         dsrd=1;
  184.         dsrw=1;
  185.         dscs=0;
  186.         P0=addr;
  187.         dsas=0;
  188.         dsrw=0;
  189.         P0=date;
  190.         dsas=1;
  191.         dsrw=1;
  192.         dscs=1;
  193. }

  194. uchar read_ds(uchar addr)
  195. {
  196.         uchar ds_date;
  197.         P0=0xff;
  198.         dscs=0;
  199.         dsas=1;
  200.         dsrd=1;
  201.         dsrw=1;
  202.         P0=addr;
  203.         dsas=0;
  204.         dsrd=0;
  205.         P0=0xff;
  206.         ds_date=P0;
  207.         dsas=1;
  208.         dsrd=1;
  209.         dscs=1;
  210.         return ds_date;
  211. }
  212. ///////////
  213. //DS12C887函数//
  214. //////////

  215. unit cishu,wenshi,wenge;
  216. unit caiyang_time;
  217. bit temp_flag;

  218. uchar wendu[2];
  219. char miaoshi,miaoge,fenshi,fenge,shishi,shige,shi,fen,miao,realjiange;
  220. uchar munu;
  221. uchar munu1[8];
  222. uchar munu2[6];
  223. uchar munu3[6];
  224. unit temperature[10];
  225. void main()
  226. {        
  227.         uchar display_cishu=0;
  228.         uchar temp,jiange_count;
  229.         Timer1Init();
  230.         while(1)
  231.         {
  232.                 miao=read_ds(0);
  233.                 miaoshi=miao/10;
  234.                 miaoge=miao%10;
  235.                 munu2[4]=smg[miaoshi];
  236.                 munu2[5]=smg[miaoge];        
  237.                 fen=read_ds(2);
  238.                 fenshi=fen/10;
  239.                 fenge=fen%10;
  240.                 munu2[2]=smg[fenshi];
  241.                 munu2[3]=smg[fenge];
  242.                 shi=read_ds(4);
  243.                 shishi=shi/10;
  244.                 shige=shi%10;
  245.                 munu2[0]=smg[shishi];
  246.                 munu2[1]=smg[shige];


  247.                 munu1[0]=0x40;
  248.                 munu1[1]=smg[jiange[jiange_count]/10];
  249.                 munu1[2]=smg[jiange[jiange_count]%10];

  250.                
  251.                 if(flag==1)
  252.                 {
  253.                         temp=key_scan(key_number);
  254.                         flag=0;
  255.                         switch(temp)
  256.                         {
  257.                                 case 2:        
  258.                                                 jiange_count++;
  259.                                                 i=0;
  260.                                                 if(jiange_count==4)
  261.                                                 {
  262.                                                         jiange_count=0;
  263.                                                 }
  264.                                                 break;

  265.                                 case 3:        
  266.                                                 munu=1;
  267.                                                 i=0;
  268.                                                 write_ds(0,55);
  269.                                                 write_ds(2,59);
  270.                                                 write_ds(4,23);
  271.                                                 realjiange=jiange[jiange_count];
  272.                                                 break;

  273.                                 case 4:        
  274.                                                 display_cishu++;
  275.                                                 if(display_cishu==10)
  276.                                                 {
  277.                                                         display_cishu=0;
  278.                                                 }
  279.                                                 break;               
  280.                                 case 5:                        break;
  281.                         }
  282.                 }

  283.                
  284.                 if(temp_flag==1)
  285.                 {
  286.                
  287.                         temp_flag=0;
  288.                         if(caiyang_time<<10)
  289.                         {
  290.                                 EA=0;
  291.                                 switch(caiyang_time)
  292.                                 {
  293.                                         case 0:
  294.                                                         tempchange();
  295.                                                     temperature[0]=get_temp();
  296.                                                         break;

  297.                                         case 1:        tempchange();
  298.                                                     temperature[1]=get_temp();
  299.                                                         break;

  300.                                         case 2:        tempchange();
  301.                                                     temperature[2]=get_temp();
  302.                                                         break;

  303.                                         case 3:        tempchange();
  304.                                                     temperature[3]=get_temp();
  305.                                                         break;

  306.                                         case 4:        tempchange();
  307.                                                     temperature[4]=get_temp();
  308.                                                         break;

  309.                                         case 5:        tempchange();
  310.                                                     temperature[5]=get_temp();
  311.                                                         break;

  312.                                         case 6:        tempchange();
  313.                                                     temperature[6]=get_temp();
  314.                                                         break;

  315.                                         case 7:        tempchange();
  316.                                                     temperature[7]=get_temp();
  317.                                                         break;

  318.                                         case 8:        tempchange();
  319.                                                     temperature[8]=get_temp();
  320.                                                         break;

  321.                                         case 9:        tempchange();
  322.                                                     temperature[9]=get_temp();
  323.                                                         break;
  324.                                 }
  325.                                 delay(1);
  326.                                 EA=1;
  327.                                 caiyang_time++;
  328.                         }
  329.                         else
  330.                         {
  331.                                 munu++;
  332.                         }
  333.                 }
  334.                
  335.                 if(munu==2)
  336.                 {
  337.                         switch(display_cishu)
  338.                         {
  339.                                 case 0:        munu3[0]=0x40;
  340.                                                 munu3[1]=smg[0/10];
  341.                                                 munu3[2]=smg[0%10];
  342.                                                 munu3[3]=0x40;
  343.                                                 wenshi=temperature[0]/10;
  344.                                                 wenge=temperature[0]%10;
  345.                                                 munu3[4]=smg[wenshi];
  346.                                                 munu3[5]=smg[wenge];
  347.                                                 break;

  348.                                 case 1:        munu3[0]=0x40;
  349.                                                 munu3[1]=smg[1/10];
  350.                                                 munu3[2]=smg[1%10];
  351.                                                 munu3[3]=0x40;
  352.                                                 wenshi=temperature[1]/10;
  353.                                                 wenge=temperature[1]%10;
  354.                                                 munu3[4]=smg[wenshi];
  355.                                                 munu3[5]=smg[wenge];
  356.                                                 break;

  357.                                 case 2:        munu3[0]=0x40;
  358.                                                 munu3[1]=smg[2/10];
  359.                                                 munu3[2]=smg[2%10];
  360.                                                 munu3[3]=0x40;
  361.                                                 wenshi=temperature[2]/10;
  362.                                                 wenge=temperature[2]%10;
  363.                                                 munu3[4]=smg[wenshi];
  364.                                                 munu3[5]=smg[wenge];
  365.                                                 break;

  366.                                 case 3:munu3[0]=0x40;
  367.                                                 munu3[1]=smg[3/10];
  368.                                                 munu3[2]=smg[3%10];
  369.                                                 munu3[3]=0x40;
  370.                                                 wenshi=temperature[3]/10;
  371.                                                 wenge=temperature[3]%10;
  372.                                                 munu3[4]=smg[wenshi];
  373.                                                 munu3[5]=smg[wenge];
  374.                                                 break;

  375.                                 case 4:        munu3[0]=0x40;
  376.                                                 munu3[1]=smg[4/10];
  377.                                                 munu3[2]=smg[4%10];
  378.                                                 munu3[3]=0x40;
  379.                                                 wenshi=temperature[4]/10;
  380.                                                 wenge=temperature[4]%10;
  381.                                                 munu3[4]=smg[wenshi];
  382.                                                 munu3[5]=smg[wenge];
  383.                                                 break;

  384.                                 case 5:        munu3[0]=0x40;
  385.                                                 munu3[1]=smg[5/10];
  386.                                                 munu3[2]=smg[5%10];
  387.                                                 munu3[3]=0x40;
  388.                                                 wenshi=temperature[5]/10;
  389.                                                 wenge=temperature[5]%10;
  390.                                                 munu3[4]=smg[wenshi];
  391.                                                 munu3[5]=smg[wenge];
  392.                                                 break;

  393.                                 case 6:        munu3[0]=0x40;
  394.                                                 munu3[1]=smg[6/10];
  395.                                                 munu3[2]=smg[6%10];
  396.                                                 munu3[3]=0x40;
  397.                                                 wenshi=temperature[6]/10;
  398.                                                 wenge=temperature[6]%10;
  399.                                                 munu3[4]=smg[wenshi];
  400.                                                 munu3[5]=smg[wenge];
  401.                                                 break;

  402.                                 case 7:        munu3[0]=0x40;
  403.                                                 munu3[1]=smg[7/10];
  404.                                                 munu3[2]=smg[7%10];
  405.                                                 munu3[3]=0x40;
  406.                                                 wenshi=temperature[7]/10;
  407.                                                 wenge=temperature[7]%10;
  408.                                                 munu3[4]=smg[wenshi];
  409.                                                 munu3[5]=smg[wenge];
  410.                                                 break;

  411.                                 case 8:        munu3[0]=0x40;
  412.                                                 munu3[1]=smg[8/10];
  413.                                                 munu3[2]=smg[8%10];
  414.                                                 munu3[3]=0x40;
  415.                                                 wenshi=temperature[8]/10;
  416.                                                 wenge=temperature[8]%10;
  417.                                                 munu3[4]=smg[wenshi];
  418.                                                 munu3[5]=smg[wenge];
  419.                                                 break;

  420.                                 case 9:        munu3[0]=0x40;
  421.                                                 munu3[1]=smg[9/10];
  422.                                                 munu3[2]=smg[9%10];
  423.                                                 munu3[3]=0x40;
  424.                                                 wenshi=temperature[9]/10;
  425.                                                 wenge=temperature[9]%10;
  426.                                                 munu3[4]=smg[wenshi];
  427.                                                 munu3[5]=smg[wenge];
  428.                                                 break;
  429.                         }
  430.                 }

  431.                
  432.         }
  433. }


  434. void timer1() interrupt 3
  435. {
  436.         static uchar key_count=0,smg_count=0;
  437.         static unit caiyang_time=0;
  438.         TL1 = 0xCD;                //设置定时初值
  439.         TH1 = 0xD4;                //设置定时初值
  440.         smg_count++;
  441.         key_count++;
  442.         if(key_count==1)
  443.         {
  444.                 key_count=0;
  445.                 flag=1;
  446.         }
  447.         if(smg_count==1)
  448.         {
  449.                 smg_count=0;
  450.                 P0=0XFF;

  451.                 if(munu==0)
  452.                 {
  453.                         P0=0XFF;
  454.                         dula=1;
  455.                         P0=munu1[i];
  456.                         dula=0;
  457.                         P0=0xff;
  458.                         P0=0XFF;
  459.                         wela=1;
  460.                         P0=table_wela1[i];
  461.                         wela=0;
  462.                         P0=0XFF;
  463.                         
  464.                         i++;
  465.                         if(i==3)
  466.                         {
  467.                                 i=0;
  468.                         }                        
  469.                 }
  470.                
  471.                 if(munu==1)
  472.                 {
  473.                         P0=0XFF;
  474.                         dula=0;
  475.                         dula=1;
  476.                         P0=munu2[i];
  477.                         dula=0;
  478.                         P0=0xff;
  479.                         wela=0;
  480.                         P0=0XFF;
  481.                         wela=1;
  482.                         P0=table_wela[i];
  483.                         wela=0;
  484.                         P0=0XFF;
  485.                         
  486.                         i++;
  487.                         if(i==6)
  488.                         {
  489.                                 i=0;
  490.                         }               
  491.                 }
  492.         
  493.                 if(munu==2)
  494.                 {
  495.                         P0=0XFF;
  496.                         dula=0;
  497.                           P0=munu3[i];
  498.                           dula=1;
  499.                           dula=0;
  500.                         P0=0xff;
  501.                           wela=0;
  502.                           P0=table_wela[i];
  503.                           wela=1;
  504.                           wela=0;
  505.                         i++;
  506.                         if(i==6)
  507.                         {
  508.                                 i=0;
  509.                         }         
  510.                 }

  511.                
  512.         }
  513.         if(munu==1)
  514.         {        
  515.                 caiyang_time++;
  516.                 if(caiyang_time==(realjiange*4000))//1s
  517.                 {
  518.                         caiyang_time=0;
  519.                         temp_flag=1;        
  520.                 }
  521.         }
  522. }
复制代码

全部资料51hei下载地址:
蓝桥杯实验-温度记录器.zip (2.7 KB, 下载次数: 49)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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