找回密码
 立即注册

QQ登录

只需一步,快速开始

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

哪个大佬能给看看我这单片机热电偶测温程序哪里有问题吗?

[复制链接]
跳转到指定楼层
楼主
ID:522478 发表于 2020-5-6 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是个52单片机热电偶测温的程序,通过MAX6675转换温度数据的。
写到Proteus仿真里面数码管就从由往左闪烁,不能稳定显示,然后读的数据也不对。求大佬帮忙看看是程序哪里有问题吗 万分感谢!
#include "reg52.h"
#include "absacc.h"
#include "math.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^0;   //数码管段选
sbit wei=P2^1;    //数码管位选
sbit S0=P1^0;    //MAX6675位定义
sbit SCK=P1^1;  //
sbit CS=P1^2;   //
sbit beep=P1^3;  //蜂鸣器位定义
sbit Work=P1^4;  //工作LED灯位定义
uint Re_Convert (void);    //热电偶温度转换
void Disp_temp();           //数码管显示
void Baojing();              //蜂鸣器报警
void delay(uchar);    ///延时
uint P_Temp;  
uint wendu,t1;
uint ge,shi,bai,qian;
uchar code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
uchar code tab2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

void main(void)  //主函数
{
beep=0;
  while(1)
  {
  Disp_temp();
  delay(500);
  Baojing();
  P_Temp=0;
  }   
}

void delay(uchar t)   //延时函数
{
uchar x;
uchar y;
for(x=0;x<t;x++)
for(y=0;y<110;y++);
}

uint Re_Convert()    //热电偶温度读取
{
  uchar i;
  unsigned long P_Temp2;
  CS=1;       //MAX6675温度转换
  delay(10);    //
  CS=0;       //MAX6675使能
  delay(1);
  SCK=1;    //
  P_Temp2=0;

  for(i=0;i<16;i++)
  {
  SCK =0;    //拉低电平 给一个时钟信号
  P_Temp2=P_Temp2<<1;
  if(S0==1)   
   P_Temp2|=0x0001;
  else  
   P_Temp2&=0xffff;
  SCK=1;
  delay(10);
}   
  CS =1;
  return(P_Temp2);  
}
void Baojing(void)   //报警函数
{
  if(t1<=100&&t1>=400)   //温度小于100大于400报警
  {
   delay(20);
   beep=1;
  }
}
void Disp_temp()   //显示函数
{
   
  P_Temp=Re_Convert();
  P_Temp=P_Temp<<1;   
  P_Temp=P_Temp>>4;
  t1=P_Temp/4;//P_Temp =(1024*P_Temp)/4096

t1=t1*10;
ge=t1%10;
t1=t1/10;
shi=t1%10;
t1=t1/10;
bai=t1%10;
qian=t1/10;

P0=tab1[ge];  
dula=1;
dula=0;
P0=0x08;
wei=1;
wei=0;
delay(10);

P0=tab2[shi];  
dula=1;
dula=0;
P0=0x04;
wei=1;
wei=0;
delay(10);

P0=tab1[bai];
dula=1;
dula=0;
P0=0x02; //0000 0010
  wei=1;
wei=0;
delay(10);

  P0=tab1[qian];  
  dula=1;
dula=0;
P0=0x01;
  wei=1;
wei=0;
delay(10);
}

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

使用道具 举报

沙发
ID:213173 发表于 2020-5-7 10:41 | 只看该作者
主要是显示程序有毛病,扫描周期太长,也没有消隐。改这样试试。
  1. #include "reg52.h"
  2. #include "absacc.h"
  3. #include "math.h"
  4. #include <intrins.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. sbit dula=P2^0;   //数码管段选
  8. sbit wei=P2^1;    //数码管位选
  9. sbit SO=P1^0;    //MAX6675位定义
  10. sbit SCK=P1^1;  //
  11. sbit CS=P1^2;   //
  12. sbit beep=P1^3;  //蜂鸣器位定义
  13. sbit Work=P1^4;  //工作LED灯位定义
  14. uint Re_Convert (void);    //热电偶温度转换
  15. void Disp_temp();           //数码管显示
  16. void Baojing();              //蜂鸣器报警
  17. void delay(uchar);    ///延时
  18. uint P_Temp;  
  19. uint wendu,t1;
  20. uint ge,shi,bai,qian;
  21. uchar code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};//段码
  22. uchar code tab2[]={0x08,0x04,0x02,0x01};//位码
  23. uchar tab3[4];//显示缓存
  24. void main(void)  //主函数
  25. {
  26.         beep=0;
  27.         while(1)
  28.         {
  29.                 Disp_temp();
  30.                 Baojing();
  31.                 P_Temp=0;
  32.         }   
  33. }

  34. void delay(uchar t)   //延时函数
  35. {
  36. uchar x;
  37. uchar y;
  38. for(x=0;x<t;x++)
  39. for(y=0;y<110;y++);
  40. }

  41. uint Re_Convert()    //热电偶温度读取
  42. {
  43.         uchar i;
  44.         unsigned long P_Temp2;
  45.         CS=1;       //MAX6675温度转换
  46.         _nop_();    //_nop_();
  47.         CS=0;       //MAX6675使能
  48.         _nop_();
  49.         SCK=1;    //
  50.         P_Temp2=0;
  51.        
  52.         for(i=0;i<16;i++)
  53.         {
  54.                 SCK =0;    //拉低电平 给一个时钟信号
  55.                 P_Temp2=P_Temp2<<1;
  56.                 if(SO==1)   
  57.                         P_Temp2|=0x0001;
  58.                 else  
  59.                         P_Temp2&=0xffff;
  60.                 SCK=1;
  61.                 _nop_();
  62.         }   
  63.         CS =1;
  64.         return(P_Temp2);  
  65. }
  66. void Baojing(void)   //报警函数
  67. {
  68.   if(t1<=100&&t1>=400)   //温度小于100大于400报警
  69.   {
  70.    delay(20);
  71.    beep=1;
  72.   }
  73. }
  74. void Disp_temp()   //显示函数
  75. {
  76.         static uchar i=0;
  77.         P_Temp=Re_Convert();
  78.         P_Temp=P_Temp<<1;   
  79.         P_Temp=P_Temp>>4;
  80.         t1=P_Temp/4;                //P_Temp =(1024*P_Temp)/4096       
  81.         t1=t1*10;
  82.         tab3[0]=t1%10;
  83.         tab3[1]=t1/10%10;
  84.         tab3[2]=t1/100%10;
  85.         tab3[3]=t1/1000%10;
  86.        
  87.         P0=0xff;//消隐  
  88.         dula=1;
  89.         dula=0;
  90.         P0=tab2[i];
  91.         wei=1;
  92.         wei=0;
  93.         if(i==1)
  94.                 P0=tab1[tab3[i]]&0x7f; //加小数点
  95.         else
  96.                 P0=tab1[tab3[i]];  
  97.         dula=1;
  98.         dula=0;
  99.         i++;
  100.         i%=4;
  101. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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