找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5077|回复: 3
收起左侧

基于单片机的温度测量系统(毕业设计软件程序)

[复制链接]
ID:71259 发表于 2014-12-30 23:18 | 显示全部楼层 |阅读模式
  1. 用Keil写的。温度传感器用DS18B20,单片机AT89C51.

  2. /*温度范围-55.0度~+99.9度,用四个七段LED显示出来*/
  3. #include <reg51.h>
  4. #include <intrins.h>
  5. #include <math.h>  //要用到取绝对值函数
  6. sbit DQ=P3^7;//DS18B20的数据线和单片机的P3.7口相接,且定义DQ为变量名
  7. sbit led3_g=P2^4;//单片机的P2.4口定义为LED1的g段,表示温度的正负
  8. sbit led0_off=P3^3;//led0熄灭信号接到P3.3口
  9. sbit led1_off=P3^4;//led0熄灭信号接到P3.4口
  10. sbit led2_off=P3^5;//led0熄灭信号接到P3.5口
  11. float low_limitedTmp,high_limitedTmp;
  12.                                     //设置的报警最低温度和最高温度,因为要在几个函数中用,故为全局变量
  13. int Final_tmpvalue;  //存放最终得到的十进制有符号并放大10倍的温度值
  14. unsigned char key_value;//存放键值
  15. unsigned char sys_state;//存放系统状态,共有3态
  16.                                             //正常测温状态sys_state=0、调最低温度状态sys_state=1、
  17.                                              //调最高温度状态sys_state=2
  18. unsigned char led_pst;//存放正在设置的led位置值
  19.                                            //led_pst=0表示正在设置最右边的LED,加1依次往左表示


  20. /*****************延时函数**************
  21. *************功能:延时Nx15us***********/
  22. void  delay_multi_15us(unsigned int N)
  23. {
  24.       do{
  25.         _nop_();//1
  26.         _nop_();//2
  27.         _nop_();//3
  28.         _nop_();//4
  29.         _nop_();//5
  30.         _nop_();//6
  31.         _nop_();//7
  32.         _nop_();//8
  33.         _nop_();//9
  34.         _nop_();//10
  35.         _nop_();//11
  36.         _nop_();//12
  37.         _nop_();//13
  38.         N--;//计满15us后N减1
  39.       }while(N);
  40. }

  41. /*********************初始化函数******************************
  42. ***********功能:初始化DS18B20,以便能进行后续读写操作********/
  43. bit  Init_DS18B20(void)//返回为位的函数,以便检测是否成功启动
  44. {
  45.    DQ=0;//先拉低延时一段时间
  46.    delay_multi_15us(50);//延时750us,协议要求480us~980us,满足要求
  47.    DQ=1;//再拉高延时
  48.    delay_multi_15us(6);//延时等待返回低电平
  49.    return(DQ);
  50.    delay_multi_15us(26);//再延时一段时间
  51. }

  52. /****************** 写一字节数据函数*********************
  53. ************功能:向DS18B20写一个字节的数据内容**********/
  54. void  WritetoDS_onebyte(char command)
  55. {
  56.    unsigned char i; //8位数据记位,为了节约资源定义为8位
  57.    bit temp;
  58.    for(i=0;i<8;i++)
  59.    {
  60.      temp=command&0x01;//将最低位提取出来
  61.      command>>1;//将其右移一位
  62.      if(temp)//如果写入的是1,则按1的操作:先置DQ=0,延时15us,再置DQ=1,延时45us
  63.      {
  64.     DQ=0;
  65.     delay_multi_15us(1);//延时15us
  66.     DQ=1;
  67.     delay_multi_15us(3);//延时45us
  68.      }
  69.   else //如果写入的是0,则按0的操作:先置DQ=0,延时60us,再置DQ=1
  70.   {
  71.     DQ=0;
  72.     delay_multi_15us(4);//延时60us
  73.     DQ=1;
  74.   }
  75.    }
  76. }

  77. /****************** 读一字节数据函数*********************
  78. ************功能:从DS18B20读一个字节的数据内容**********/
  79. unsigned char  ReadfromDS_onebyte()//char类型函数,最后要返回一个字节数据
  80. {
  81.    unsigned char i,dat;
  82.    dat=0;//初始化存放读取内容的变量
  83.    for(i=0;i<8;i++)
  84.    {
  85.       DQ=0;    //先拉低约4us,符合至少1us的要求
  86.    _nop_();
  87.    _nop_();
  88.    _nop_();
  89.    _nop_();
  90.    DQ=1;  //再拉高延时
  91.    delay_multi_15us(1);//延时15us
  92.    _nop_();//为了保证大于15us再延时几us
  93.    _nop_();
  94.    _nop_();
  95.    if(DQ) //如果读出为1,按1读:
  96.    {
  97.       dat=dat|0x80;//存进最高位,待会右移
  98.    }
  99.    else
  100.    {
  101.       dat=dat|0x00;//存进最高位,待会右移
  102.    }
  103.    dat=dat>>1;
  104.    delay_multi_15us(4);//延时60us
  105.    }
  106.    return(dat);
  107. }      

  108. /************************发送温度转换命令函数 ****************************
  109. **************功能:发送温度转换命令到DS18B20,启动温度转换功能************/
  110. void   SendCommand_TmpConvert(void)
  111. {
  112.    while(Init_DS18B20());//初始化DS18B20,等待返回低电平信号
  113.    WritetoDS_onebyte(0xcc);//写入跳过序列号命令字 Skip Rom
  114.    WritetoDS_onebyte(0x44);//写入温度转换命令字 Convert T,启动温度转换功能
  115. }

  116. /************************发送读取温度命令函数 ****************************
  117. **************功能:发送温度读取命令到DS18B20,读取DS18B20中的温度值************/
  118. void   SendCommand_TmpRead(void)
  119. {
  120.    while(Init_DS18B20());//初始化DS18B20,等待返回低电平信号
  121.    WritetoDS_onebyte(0xcc);//写入跳过序列号命令字 Skip Rom
  122.    WritetoDS_onebyte(0xbe);//写入温度读取命令字 ,以便后续读取温度值
  123. }

  124. /******************************温度值获取和计算函数***********************
  125. ***************功能:获得温度值并进行计算,得到最终十进制温度值***********/
  126. int  Get_TmpValue(void)//返回温度最终十进制值
  127. {
  128.    unsigned  int Temp_tmpvalue;//存放中间温度变量
  129.    float temp;//存放中间的浮点数,因为分辨率为0.0625,故先算出来的应该为浮点数
  130.    unsigned char low,high;//存放读取出来的温度低、高字节
  131.    SendCommand_TmpRead();//送读取温度命令
  132.    low=ReadfromDS_onebyte();//读取两个字节的数据,先送入低字节
  133.    high=ReadfromDS_onebyte();//再送入高字节
  134.    Temp_tmpvalue=high;//数据处理,将两个字节合并
  135.    Temp_tmpvalue<<=8;
  136.    Temp_tmpvalue|=low;
  137.    Final_tmpvalue=Temp_tmpvalue;//直接将无符号数变为有符号数
  138.                                 //因为计算机中对于负数是利用补码来表示的
  139.                     //若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的Final_tmpvalue
  140.    temp=Final_tmpvalue*0.0625; //使用DS18B20的默认分辨率12位, 精确度为0.0625度,
  141.                                                          //即读回数据的最低位代表0.0625度
  142.    Final_tmpvalue=temp*10+(Final_tmpvalue>0?0.5:-0.5); //将它放大10倍,
  143.                                                         //使显示时可显示小数点后1位, 并对小数点后第二进行4舍5入
  144.                                                        //如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度
  145.                                                        //如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度
  146.                                                        //大于0加0.5, 小于0减0.5
  147.    return(Final_tmpvalue);//最终返回放大10倍的十进制有符号温度值
  148. }

  149. /**************************温度LED显示函数*****************************
  150. *******************功能:将温度值显示在LED数码管上*********************/
  151. void  Display_TmpValue(int tmp)//参数将引用函数Get_TmpValue(),
  152.                                                         //或者直接引用全局变量Final_tmpvalue
  153.                                //或者显示设置的最高或者最低温度high_limitedTmp*10、low_limitedTmp*10
  154. {
  155.    unsigned char dat[3]={0,0,0};//定义分别存温度的十、个、小数三位值
  156.    unsigned char temp;
  157.    unsigned int v;
  158.    LED1_g=tmp>0?0:1;//确定负号显示与否:温度为正不点亮LED1_g,
  159.                                           //为负则置P2.4=1,即点亮LED1_g,显示为一个“-”号
  160.    v=abs(tmp); //取温度的绝对值
  161.    dat[0]=v%100; //计算十位数值
  162.    dat[1]=(v-(dat[0]*100))%10; //计算个位数值
  163.    dat[2]=v-(dat[0]*100)-(dat[1]*10);//计算小数位数值
  164.    temp=dat[0];//将十位和个位合并送到P0口显示
  165.    temp<<=4;
  166.    temp|=dat[1];
  167.    P0=temp;//已包含reg51.h头文件,可以直接用P口
  168.    P2&=0x10;//先将P2口低4位清0,高4位不改变
  169.    P2|=dat[2];//将小数位送到P2口低4位显示:不改变高4位,把低4位送入P2口低4位
  170. }

  171. /************************************报警函数**************************************
  172. **************功能:当温度超过设置的最高值或者低于最低值时系统报警*****************/
  173. void  Alarm_tmp(int tmp)   //参数将引用函数Get_TmpValue()
  174.                                                 //得出的温度值全局变量Final_tmpvalue
  175. {
  176.    sbit  BUZZER=P2^5; //定义蜂鸣器口为P2.5口
  177.    sbit  LED_R=P2^6; //定义红灯为P2.6口
  178.    sbit  LED_G=P2^7; //定义绿灯为P2.7口
  179.    float temp;
  180.    temp=tmp/10.0; //因为tmp为放大10倍的温度值,要再缩小10倍
  181.    if((temp>=high_limitedTmp)||(temp<=low_limitedTmp))  //高于设置最高温或者低于最低温
  182.    {
  183.        BUZZER=1;  //蜂鸣器响
  184.     LED_R=1;   //红灯亮
  185.     LED_G=0;   //绿灯灭
  186.    }
  187.    else      //正常
  188.    {
  189.     BUZZER=0;  //蜂鸣器停
  190.     LED_R=0;   //红灯灭
  191.     LED_G=1;   //绿灯亮
  192.    }
  193. }

  194. /**********************************键盘扫描函数************************************
  195. ***************功能:当有键盘中断时,进入键盘查询键值,得出按下的键值**************/
  196. void Int0_key_Calculate()  interrupt 0  //中断程序,用外部中断0
  197. {
  198.     unsigned char row,col;//分别存放键盘为0的行和列号
  199. int temp;
  200. sbit P1_4=P1^4;
  201. sbit P1_5=P1^5;
  202. sbit P1_6=P1^6;
  203. sbit P1_7=P1^7;
  204. EA=0;//关cpu中断,在完成一个键的过程中不能有中断产生
  205. delay_multi_15us(800);//进入中断,说明有键按下,先延时12ms去抖
  206. if((P1|0x10)!=1)//有键按下,进入查询程序
  207. {
  208.      switch(P1)//根据P1口来查哪一行为低电平,P1=1111xxxx,其中xxxx中只有一个为0
  209.   {
  210.     case 0x0FE:row=0;break;  //如果P1=1111 1110,则置row=0
  211.     case 0x0FD:row=1;break;  //如果P1=1111 1101,则置row=1
  212.     case 0x0FB:row=2;break;
  213.     case 0x0F7:row=3;break;
  214.     default:break;
  215.   }
  216.   P1_5=1;//先置P0.4口为0,P0.5~P0.7为1
  217.   P1_6=1;
  218.   P1_7=1;
  219.   if((P1|0x10)!=1) //如果P0.0~P0.3中有0,则列号为P0.4,置col=0标志
  220.      col=0;
  221.   else  //否则继续查P0.5
  222.   {
  223.      P1_4=1;//置P0.5口为0
  224.      P1_5=0;
  225.      P1_6=1;
  226.      P1_7=1;
  227.      if((P1|0x10)!=1) //如果P0.0~P0.3中有0,则列号为P0.5,置col=1标志
  228.         col=1;
  229.      else  //否则继续查P0.6
  230.     {
  231.        P1_4=1;//再置P0.6口为0
  232.        P1_5=1;
  233.        P1_6=0;
  234.        P1_7=1;
  235.        if((P1|0x10)!=1) //如果P0.0~P0.3中有0,则列号为P0.6,置col=2标志
  236.           col=2;
  237.     else  //否则继续查P0.7
  238.       {
  239.          P1_4=1;//再置P0.5口为0
  240.          P1_5=1;
  241.          P1_6=1;
  242.          P1_7=0;
  243.          if((P1|0x10)!=1) //如果P0.0~P0.3中有0,则列号为P0.7,置col=3标志
  244.              col=3;
  245.       }
  246.     }
  247.   }
  248.   temp=row;//将row和col合并,以便查键值
  249.   temp<<=8;
  250.   temp|=col;
  251.   switch(temp)//键值查询赋值
  252.   {
  253.      case 0x0000:key_value=1;break;//第0行第0列,键值为1
  254.      case 0x0001:key_value=2;break;//第0行第1列,键值为2
  255.      case 0x0002:key_value=3;break;
  256.      case 0x0003:key_value=4;break;
  257.      case 0x0100:key_value=5;break;//第1行第0列,键值为5
  258.      case 0x0101:key_value=6;break;//第1行第1列,键值为6
  259.      case 0x0102:key_value=7;break;
  260.      case 0x0103:key_value=8;break;
  261.      case 0x0200:key_value=9;break;
  262.      case 0x0201:key_value=0;break;
  263.      case 0x0202:key_value='L';break;//表示要设置最低温度
  264.      case 0x0203:key_value='H';break;//表示要设置最高温度
  265.      case 0x0300:key_value='l';break;//表示按下向左键
  266.      case 0x0301:key_value'r';break;//表示按下向右键
  267.      case 0x0302:key_value='F';break;//表示改变正负号的标志flag
  268.      case 0x0303:key_value='E';break;//表示按下了确认键
  269.      default:key_value=FALSE;break;//无按键按下
  270.   }
  271. }
  272.   else
  273.       key_value=FALSE; //无键按下,将键值置为FALSE
  274.       
  275.   if(key_value!=FALSE)
  276.       Tmp_Setting();//每一次有键按下进行一次状态查询和温度设置
  277.   
  278.   EA=1;//开cpu中断,准备下次中断
  279.   P1=0x01;//将键盘扫描口低4位写入全1,高四位写入全0,以查下次中断
  280. }

  281. /***************************************单LED跳动显示函数***************************************
  282. ***功能:根据LED的位置参数led_pos跳动此位置的单个LED,其他的静止显示************/
  283. void Single_LED_twinkle(void)
  284. {
  285.    unsigned char i;
  286.    
  287.       switch(led_pst)
  288.    {
  289.      case 0:for(i=0;i<2;i++) //正在设置小数位led0,闪2次
  290.          {
  291.          led0_off=0;//将led0熄灭
  292.       delay_multi_15us(20000);//延时300ms,大于人视觉暂留时间
  293.       led0_off=1;//将led0点亮
  294.       delay_multi_15us(20000);//延时300ms,大于人视觉暂留时间
  295.       }  
  296.       break;
  297.   case 1:for(i=0;i<2;i++) //正在设置个位led1,闪2次
  298.          {
  299.          led1_off=0;//将led1熄灭
  300.       delay_multi_15us(20000);//延时300ms,大于人视觉暂留时间
  301.       led1_off=1;//将led1点亮
  302.       delay_multi_15us(20000);//延时300ms,大于人视觉暂留时间
  303.       }
  304.       break;
  305.   case 2:for(i=0;i<2;i++) //正在设置十位led2,闪2次
  306.          {
  307.          led2_off=0;//将led2熄灭
  308.       delay_multi_15us(20000);//延时300ms,大于人视觉暂留时间
  309.       led2_off=1;//将led2点亮
  310.       delay_multi_15us(20000);//延时300ms,大于人视觉暂留时间
  311.       }
  312.       break;
  313.   case 3:for(i=0;i<2;i++) //正在设置符号位led3,闪2次
  314.          {
  315.          led3_g=0;//将led0熄灭
  316.       delay_multi_15us(20000);//延时300ms,大于人视觉暂留时间
  317.       led3_g=1;//将led0熄灭
  318.       delay_multi_15us(20000);//延时300ms,大于人视觉暂留时间
  319.       }
  320.       break;
  321.    }
  322. }

  323. /******************全4个LED跳动显示函数*************************************
  324. *功能:在进入最低极限温度或者最高极限温度设置的初始时将4个LED全部跳动闪烁几下***/
  325. void All_LED_twinkle(int lmt_tmp)//参数将引用low_limitedTmp或者high_limitedTmp
  326. {
  327.    unsigned char i;
  328.    Display_TmpValue(lmt_tmp*10);//先显示上次设置的极限温度
  329.    for(i=0;i<3;i++)//跳动3次
  330.    {
  331.    delay_multi_15us(40000);//延时延时600ms
  332.    led0_off=0;//将led0熄灭
  333.    led1_off=0;//将led1熄灭
  334.    led2_off=0;//将led2熄灭
  335.    led3_g=0;//将led0熄灭
  336.    delay_multi_15us(40000);//延时延时600ms
  337.    led0_off=1;//将led0点亮
  338.    led1_off=1;//将led1点亮
  339.    led2_off=1;//将led2点亮
  340.    led3_g=1;//将led0点亮
  341.    }
  342. }

  343. /******************************************温度设置函数*****************************************
  344. ************功能:根据键盘扫描值设置报警的最低温度和最高温度*************************/
  345. void Tmp_Setting(void)
  346. {
  347. unsigned char lmt_low_tmp[3];//lmt_low_tmp[0]、lmt_low_tmp[1]、
  348.                                                      //lmt_low_tmp[2]、lmt_low_tmp[3]分别表示
  349.                                  //调节中的小数位数字、个位数字、十位数字、正负号(正用0,负用1表示)
  350. unsigned char lmt_high_tmp[3];//lmt_high_tmp[0]、lmt_high_tmp[1]、
  351.                                                       //lmt_high_tmp[2]、lmt_high_tmp[3]分别表示
  352.                                 //调节中的小数位数字、个位数字、十位数字、正负号(正用0,负用1表示)
  353. unsigned int tmp[2];//存放low_limitedTmp、 high_limitedTmp的绝对值放大10倍的值
  354.    tmp[0]=abs(low_limitedTmp*10);
  355. tmp[1]=abs(high_limitedTmp*10);
  356. unsigned int tmp;
  357.    if(sys_state==0)//查状态为状态0:正常测温状态
  358. {
  359.     switch(key_value)//查此时按下的键值
  360.     {
  361.       case 1:
  362.    case 2:
  363.    case 3:
  364.    case 4:
  365.    case 5:
  366.    case 6:
  367.    case 7:
  368.    case 8:
  369.    case 9:
  370.    case 0:
  371.    case 'l':
  372.    case 'r':
  373.    case 'F':
  374.    case 'E':break; //在sys_state=0正常测温下,按以上键均无效
  375.    case 'L':sys_state=1;//按“VL”,则转换为设置温度下限状态
  376.             led_pst=0;//默认为最右边的led0设置
  377.             
  378.       lmt_low_tmp[3]=(low_limitedTmp>0?0:1);//提取分离极限最低温度的每一位数值
  379.       lmt_low_tmp[2]=tmp[0]%100;
  380.       lmt_low_tmp[1]=(tmp[0]-lmt_tmp[2]*100)%10;
  381.       lmt_low_tmp[0]=tmp[0]-lmt_tmp[2]*100-lmt_tmp[1]*10;
  382.    
  383.       All_LED_twinkle(low_limitedTmp);//全部闪烁3次
  384.       Single_LED_twinkle(led_pst);//再默认为最右边的led闪烁设置
  385.       break;
  386.    case 'H':sys_state=2;//按“VH”,则转换为设置温度下限状态
  387.             led_pst=0; //默认为最右边的led0设置
  388.             lmt_high_tmp[3]=(high_limitedTmp>0?0:1);//提取分离极限最高温度的每一位数值
  389.       lmt_high_tmp[2]=tmp[1]%100;
  390.       lmt_high_tmp[1]=(tmp[1]-lmt_tmp[2]*100)%10;
  391.       lmt_high_tmp[0]=tmp[1]-lmt_tmp[2]*100-lmt_tmp[1]*10;
  392.       All_LED_twinkle(low_limitedTmp);//全部闪烁3次
  393.       Single_LED_twinkle(led_pst);//再默认为最右边的led闪烁设置
  394.       break;
  395.     }
  396. }

  397. if(sys_state==1)//查状态为状态1:设置最低极限温度状态
  398. {
  399.     switch(key_value)//查此时按下的键值
  400.     {
  401.       case 1:switch(led_pst)
  402.           {
  403.       case 0:lmt_low_tmp[0]=1;//小数位为1
  404.              Single_LED_twinkle(led_pst);//相应led闪烁
  405.              break;
  406.       case 1:lmt_low_tmp[1]=1;//个位为1
  407.              Single_LED_twinkle(led_pst);//相应led闪烁
  408.              break;
  409.       case 2:lmt_low_tmp[2]=1;//十位为1
  410.              Single_LED_twinkle(led_pst);//相应led闪烁
  411.              break;
  412.       case 3:Single_LED_twinkle(led_pst);//相应led闪烁
  413.              break;//无效
  414.     }break;
  415.    case 2:switch(led_pst)
  416.           {
  417.       case 0:lmt_low_tmp[0]=2;//小数位为2
  418.              Single_LED_twinkle(led_pst);//相应led闪烁
  419.              break;
  420.       case 1:lmt_low_tmp[1]=2;//个位为2
  421.              Single_LED_twinkle(led_pst);//相应led闪烁
  422.              break;
  423.       case 2:lmt_low_tmp[2]=2;//十位为2
  424.              Single_LED_twinkle(led_pst);//相应led闪烁
  425.              break;
  426.       case 3:Single_LED_twinkle(led_pst);//相应led闪烁
  427.              break;//无效
  428.     }break;

  429.    case 3:switch(led_pst)
  430.           {
  431.       case 0:lmt_low_tmp[0]=3;
  432.              Single_LED_twinkle(led_pst);
  433.              break;
  434.       case 1:lmt_low_tmp[1]=3;
  435.              Single_LED_twinkle(led_pst);
  436.              break;
  437.       case 2:lmt_low_tmp[2]=3;
  438.              Single_LED_twinkle(led_pst);
  439.              break;
  440.       case 3:Single_LED_twinkle(led_pst);
  441.              break;
  442.     }break;

  443.    case 4:switch(led_pst)
  444.           {
  445.       case 0:lmt_low_tmp[0]=4;
  446.              Single_LED_twinkle(led_pst);
  447.              break;
  448.       case 1:lmt_low_tmp[1]=4;
  449.              Single_LED_twinkle(led_pst);
  450.              break;
  451.       case 2:lmt_low_tmp[2]=4;
  452.              Single_LED_twinkle(led_pst);
  453.              break;
  454.       case 3:Single_LED_twinkle(led_pst);
  455.              break;
  456.     }break;
  457.   
  458.    case 5:switch(led_pst)
  459.           {
  460.       case 0:lmt_low_tmp[0]=5;
  461.              Single_LED_twinkle(led_pst);
  462.              break;
  463.       case 1:lmt_low_tmp[1]=5;
  464.              Single_LED_twinkle(led_pst);
  465.              break;
  466.       case 2:lmt_low_tmp[2]=5;
  467.              Single_LED_twinkle(led_pst);
  468.              break;
  469.       case 3:Single_LED_twinkle(led_pst);
  470.              break;
  471.     }break;

  472.    case 6:switch(led_pst)
  473.           {
  474.       case 0:lmt_low_tmp[0]=6;
  475.              Single_LED_twinkle(led_pst);
  476.              break;
  477.       case 1:lmt_low_tmp[1]=6;
  478.              Single_LED_twinkle(led_pst);
  479.              break;
  480.       case 2:lmt_low_tmp[2]=6;
  481.              Single_LED_twinkle(led_pst);
  482.              break;
  483.       case 3:Single_LED_twinkle(led_pst);
  484.              break;
  485.     }break;
  486.    case 7:switch(led_pst)
  487.           {
  488.       case 0:lmt_low_tmp[0]=7;
  489.              Single_LED_twinkle(led_pst);
  490.              break;
  491.       case 1:lmt_low_tmp[1]=7;
  492.              Single_LED_twinkle(led_pst);
  493.              break;
  494.       case 2:lmt_low_tmp[2]=7;
  495.              Single_LED_twinkle(led_pst);
  496.              break;
  497.       case 3:Single_LED_twinkle(led_pst);
  498.              break;
  499.     }break;

  500.    case 8:switch(led_pst)
  501.           {
  502.       case 0:lmt_low_tmp[0]=8;
  503.              Single_LED_twinkle(led_pst);
  504.              break;
  505.       case 1:lmt_low_tmp[1]=8;
  506.              Single_LED_twinkle(led_pst);
  507.              break;
  508.       case 2:lmt_low_tmp[2]=8;
  509.              Single_LED_twinkle(led_pst);
  510.              break;
  511.       case 3:Single_LED_twinkle(led_pst);
  512.              break;
  513.     }break;

  514.    case 9:switch(led_pst)
  515.           {
  516.       case 0:lmt_low_tmp[0]=9;
  517.              Single_LED_twinkle(led_pst);
  518.              break;
  519.       case 1:lmt_low_tmp[1]=9;
  520.              Single_LED_twinkle(led_pst);
  521.              break;
  522.       case 2:lmt_low_tmp[2]=9;
  523.              Single_LED_twinkle(led_pst);
  524.              break;
  525.       case 3:Single_LED_twinkle(led_pst);
  526.              break;
  527.     }break;

  528.    case 0:switch(led_pst)
  529.           {
  530.       case 0:lmt_low_tmp[0]=0;
  531.              Single_LED_twinkle(led_pst);
  532.              break;
  533.       case 1:lmt_low_tmp[1]=0;
  534.              Single_LED_twinkle(led_pst);
  535.              break;
  536.       case 2:lmt_low_tmp[2]=0;
  537.              Single_LED_twinkle(led_pst);
  538.              break;
  539.       case 3:Single_LED_twinkle(led_pst);
  540.              break;
  541.     }break;

  542.    case 'l':switch(led_pst)
  543.            {
  544.       case 0:led_pst=1;//按一次向左键led向左移一次,改变设置的位数
  545.              Single_LED_twinkle(led_pst);//换闪烁的led
  546.              break;
  547.       case 1:led_pst=2;
  548.              Single_LED_twinkle(led_pst);
  549.              break;
  550.       case 2:led_pst=3;
  551.              Single_LED_twinkle(led_pst);
  552.              break;
  553.       case 3:led_pst=0;//到最左边的led再按向左回到最右边的led0
  554.              Single_LED_twinkle(led_pst);
  555.              break;
  556.      }break;

  557.    case 'r':switch(led_pst)
  558.            {
  559.       case 0:led_pst=3;//按一次向右键led向右移一次,改变设置的位数
  560.              Single_LED_twinkle(led_pst);//换闪烁的led
  561.              break;
  562.       case 1:led_pst=0;
  563.              Single_LED_twinkle(led_pst);
  564.              break;
  565.       case 2:led_pst=1;
  566.              Single_LED_twinkle(led_pst);
  567.              break;
  568.       case 3:led_pst=2;//到最左边的led再按向左回到最右边的led0
  569.              Single_LED_twinkle(led_pst);
  570.              break;
  571.      }break;
  572.    case 'F':switch(led_pst)
  573.            {
  574.       case 0:Single_LED_twinkle(led_pst);//设置符号正负的键,对小数位、个位、十位不起作用
  575.              break;
  576.       case 1:Single_LED_twinkle(led_pst);
  577.              break;
  578.       case 2:Single_LED_twinkle(led_pst);
  579.              break;
  580.       case 3:if(lmt_low_tmp[3]==0) lmt_low_tmp[3]=1;
  581.                                                                         //对符号位取反,如果以前是正,则按下后变为负
  582.              else  lmt_low_tmp[3]=0;
  583.              Single_LED_twinkle(led_pst);
  584.              break;
  585.      }break;
  586.    case 'E':sys_state=0;//系统设置温度完成,回到正常测温时候
  587.             if(lmt_low_tmp[3]==0)//最低温度是正温度时
  588.       {
  589.         low_limitedTmp=(lmt_low_tmp[2]*100+lmt_low_tmp[1]*10+lmt_low_tmp[0])/10.0;
  590.                                                                                                   //计算并确认设置后的最低温度
  591.       }
  592.       else   //最低温度是负温度时
  593.       {
  594.         low_limitedTmp=-(lmt_low_tmp[2]*100+lmt_low_tmp[1]*10+lmt_low_tmp[0])/10.0;
  595.       }
  596.       break;
  597.    case 'L':Single_LED_twinkle(led_pst);//正在设置报警低温,不起作用,相应led闪烁
  598.       break;
  599.    case 'H':sys_state=2;//按“VH”,则转换为设置温度上限状态
  600.             led_pst=0;
  601.       lmt_high_tmp[3]=(high_limitedTmp>0?0:1);//提取分离极限最高温度的每一位数值
  602.       lmt_high_tmp[2]=tmp[1]%100;
  603.       lmt_high_tmp[1]=(tmp[1]-lmt_tmp[2]*100)%10;
  604.       lmt_high_tmp[0]=tmp[1]-lmt_tmp[2]*100-lmt_tmp[1]*10;
  605.       All_LED_twinkle(high_limitedTmp);//全部闪烁3次
  606.       Single_LED_twinkle(led_pst);//再默认为最右边的led闪烁设置
  607.       break;
  608.     }
  609. }
  610. if(sys_state==2)//查状态为状态2:设置最高极限温度状态
  611. {
  612.     switch(key_value)//查此时按下的键值
  613.     {
  614.       case 1:switch(led_pst)
  615.           {
  616.       case 0:lmt_high_tmp[0]=1;//小数位为1
  617.              Single_LED_twinkle(led_pst);//相应led闪烁
  618.              break;
  619.       case 1:lmt_high_tmp[1]=1;//个位为1
  620.              Single_LED_twinkle(led_pst);//相应led闪烁
  621.              break;
  622.       case 2:lmt_high_tmp[2]=1;//十位为1
  623.              Single_LED_twinkle(led_pst);//相应led闪烁
  624.              break;
  625.       case 3:Single_LED_twinkle(led_pst);//相应led闪烁
  626.              break;//无效
  627.     }break;
  628.    case 2:switch(led_pst)
  629.           {
  630.       case 0:lmt_high_tmp[0]=2;//小数位为2
  631.              Single_LED_twinkle(led_pst);//相应led闪烁
  632.              break;
  633.       case 1:lmt_high_tmp[1]=2;//个位为2
  634.              Single_LED_twinkle(led_pst);//相应led闪烁
  635.              break;
  636.       case 2:lmt_high_tmp[2]=2;//十位为2
  637.              Single_LED_twinkle(led_pst);//相应led闪烁
  638.              break;
  639.       case 3:Single_LED_twinkle(led_pst);//相应led闪烁
  640.              break;//无效
  641.     }break;

  642.    case 3:switch(led_pst)
  643.           {
  644.       case 0:lmt_high_tmp[0]=3;
  645.              Single_LED_twinkle(led_pst);
  646.              break;
  647.       case 1:lmt_high_tmp[1]=3;
  648.              Single_LED_twinkle(led_pst);
  649.              break;
  650.       case 2:lmt_high_tmp[2]=3;
  651.              Single_LED_twinkle(led_pst);
  652.              break;
  653.       case 3:Single_LED_twinkle(led_pst);
  654.              break;
  655.     }break;

  656.    case 4:switch(led_pst)
  657.           {
  658.       case 0:lmt_high_tmp[0]=4;
  659.              Single_LED_twinkle(led_pst);
  660.              break;
  661.       case 1:lmt_high_tmp[1]=4;
  662.              Single_LED_twinkle(led_pst);
  663.              break;
  664.       case 2:lmt_high_tmp[2]=4;
  665.              Single_LED_twinkle(led_pst);
  666.              break;
  667.       case 3:Single_LED_twinkle(led_pst);
  668.              break;
  669.     }break;
  670.   
  671.    case 5:switch(led_pst)
  672.           {
  673.       case 0:lmt_high_tmp[0]=5;
  674.              Single_LED_twinkle(led_pst);
  675.              break;
  676.       case 1:lmt_high_tmp[1]=5;
  677.              Single_LED_twinkle(led_pst);
  678.              break;
  679.       case 2:lmt_high_tmp[2]=5;
  680.              Single_LED_twinkle(led_pst);
  681.              break;
  682.       case 3:Single_LED_twinkle(led_pst);
  683.              break;
  684.     }break;

  685.    case 6:switch(led_pst)
  686.           {
  687.       case 0:lmt_high_tmp[0]=6;
  688.              Single_LED_twinkle(led_pst);
  689.              break;
  690.       case 1:lmt_high_tmp[1]=6;
  691.              Single_LED_twinkle(led_pst);
  692.              break;
  693.       case 2:lmt_high_tmp[2]=6;
  694.              Single_LED_twinkle(led_pst);
  695.              break;
  696.       case 3:Single_LED_twinkle(led_pst);
  697.              break;
  698.     }break;
  699.    case 7:switch(led_pst)
  700.           {
  701.       case 0:lmt_high_tmp[0]=7;
  702.              Single_LED_twinkle(led_pst);
  703.              break;
  704.       case 1:lmt_high_tmp[1]=7;
  705.              Single_LED_twinkle(led_pst);
  706.              break;
  707.       case 2:lmt_high_tmp[2]=7;
  708.              Single_LED_twinkle(led_pst);
  709.              break;
  710.       case 3:Single_LED_twinkle(led_pst);
  711.              break;
  712.     }break;

  713.    case 8:switch(led_pst)
  714.           {
  715.       case 0:lmt_high_tmp[0]=8;
  716.              Single_LED_twinkle(led_pst);
  717.              break;
  718.       case 1:lmt_high_tmp[1]=8;
  719.              Single_LED_twinkle(led_pst);
  720.              break;
  721.       case 2:lmt_high_tmp[2]=8;
  722.              Single_LED_twinkle(led_pst);
  723.              break;
  724.       case 3:Single_LED_twinkle(led_pst);
  725.              break;
  726.     }break;

  727.    case 9:switch(led_pst)
  728.           {
  729.       case 0:lmt_high_tmp[0]=9;
  730.              Single_LED_twinkle(led_pst);
  731.              break;
  732.       case 1:lmt_high_tmp[1]=9;
  733.              Single_LED_twinkle(led_pst);
  734.              break;
  735.       case 2:lmt_high_tmp[2]=9;
  736.              Single_LED_twinkle(led_pst);
  737.              break;
  738.       case 3:Single_LED_twinkle(led_pst);
  739.              break;
  740.     }break;

  741.    case 0:switch(led_pst)
  742.           {
  743.       case 0:lmt_high_tmp[0]=0;
  744.              Single_LED_twinkle(led_pst);
  745.              break;
  746.       case 1:lmt_high_tmp[1]=0;
  747.              Single_LED_twinkle(led_pst);
  748.              break;
  749.       case 2:lmt_high_tmp[2]=0;
  750.              Single_LED_twinkle(led_pst);
  751.              break;
  752.       case 3:Single_LED_twinkle(led_pst);
  753.              break;
  754.     }break;

  755.    case 'l':switch(led_pst)
  756.            {
  757.       case 0:led_pst=1;//按一次向左键led向左移一次,改变设置的位数
  758.              Single_LED_twinkle(led_pst);//换闪烁的led
  759.              break;
  760.       case 1:led_pst=2;
  761.              Single_LED_twinkle(led_pst);
  762.              break;
  763.       case 2:led_pst=3;
  764.              Single_LED_twinkle(led_pst);
  765.              break;
  766.       case 3:led_pst=0;//到最左边的led再按向左回到最右边的led0
  767.              Single_LED_twinkle(led_pst);
  768.              break;
  769.      }break;

  770.    case 'r':switch(led_pst)
  771.            {
  772.       case 0:led_pst=3;//按一次向右键led向右移一次,改变设置的位数
  773.              Single_LED_twinkle(led_pst);//换闪烁的led
  774.              break;
  775.       case 1:led_pst=0;
  776.              Single_LED_twinkle(led_pst);
  777.              break;
  778.       case 2:led_pst=1;
  779.              Single_LED_twinkle(led_pst);
  780.              break;
  781.       case 3:led_pst=2;//到最左边的led再按向左回到最右边的led0
  782.              Single_LED_twinkle(led_pst);
  783.              break;
  784.      }break;
  785.    case 'F':switch(led_pst)
  786.            {
  787.       case 0:Single_LED_twinkle(led_pst);//设置符号正负的键,对小数位、个位、十位不起作用
  788.              break;
  789.       case 1:Single_LED_twinkle(led_pst);
  790.              break;
  791.       case 2:Single_LED_twinkle(led_pst);
  792.              break;
  793.       case 3:if(lmt_high_tmp[3]==0)
  794.                 lmt_high_tmp[3]=1;//对符号位取反,如果以前是正,则按下后变为负
  795.              else  
  796.           lmt_high_tmp[3]=0;
  797.              Single_LED_twinkle(led_pst);
  798.              break;
  799.      }break;
  800.    case 'E':sys_state=0;//系统设置温度完成,回到正常测温时候
  801.             if(lmt_high_tmp[3]==0)//最低温度是正温度时
  802.       {
  803.         high_limitedTmp=(lmt_high_tmp[2]*100+lmt_high_tmp[1]*10+lmt_high_tmp[0])/10.0;
  804.                                                                                       //计算并确认设置后的最低温度
  805.       }
  806.       else   //最低温度是负温度时
  807.       {
  808.         high_limitedTmp=-(lmt_high_tmp[2]*100+lmt_high_tmp[1]*10+lmt_high_tmp[0])/10.0;
  809.       }
  810.       break;
  811.    case 'L':sys_state=1;//按“VL”,则转换为设置温度下限状态
  812.             led_pst=0;
  813.       lmt_low_tmp[3]=(low_limitedTmp>0?0:1);//提取分离极限最低温度的每一位数值
  814.       lmt_low_tmp[2]=tmp[0]%100;
  815.       lmt_low_tmp[1]=(tmp[0]-lmt_tmp[2]*100)%10;
  816.       lmt_low_tmp[0]=tmp[0]-lmt_tmp[2]*100-lmt_tmp[1]*10;
  817.       All_LED_twinkle(low_limitedTmp);//全部闪烁3次
  818.       Single_LED_twinkle(led_pst);//再默认为最右边的led闪烁设置
  819.       break;
  820.    case 'H':Single_LED_twinkle(led_pst);//正在设置报警高温,不起作用,相应led闪烁
  821.       break;
  822.     }
  823. }
  824. }

  825. /***********************************主程序***************************************/
  826. void main()
  827. {
  828.    EA=1;//开cpu中断和INT0中断
  829.    EX0=1;
  830.    P1=0x01;//将键盘扫描口低4位写入全1,高四位写入全0
  831.    sys_state=0;//初始化系统状态为测温状态0
  832.    led0_off=1;//把led全部点亮
  833.    led1_off=1;
  834.    led2_off=1;
  835.    low_limitedTmp=-40.0;//设置初始报警温度下限
  836.    high_limitedTmp=50.0;//设置初始报警温度下限
  837.    Final_tmpvalue=100;//设置初始10倍放大温度以便灭报警器和红灯
  838.    Alarm_tmp(Final_tmpvalue);//初始化报警设备
  839.    
  840.    while(1)   //实时显示温度值
  841.    {
  842.        SendCommand_TmpConvert();//启动温度转换
  843.     Display_TmpValue(Get_TmpValue());//显示温度值
  844.     Alarm_tmp(Final_tmpvalue);//调用报警函数
  845.    
  846.    }
  847. }
复制代码



回复

使用道具 举报

ID:75749 发表于 2015-3-30 23:55 | 显示全部楼层
支持一下
回复

使用道具 举报

ID:44267 发表于 2015-11-16 11:41 | 显示全部楼层
diy的精神让人钦佩
回复

使用道具 举报

ID:789913 发表于 2020-6-26 03:00 来自手机 | 显示全部楼层
我想找基于stm32的温度测量系统课程设计
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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