找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+MAX6675上位机控制温度报警程序

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int  
#define uchar unsigned char
        

unsigned char rs,set[]={0,0,0,0,0,0};
unsigned int data a;         
int maxtemp,mintemp,ctemp;
double  aa=0;

         uint j;
//MAX6675引脚定义         
sbit SO=P1^5;
sbit SCK=P1^6;
sbit CS=P1^7;
//函数名定义
uint min=0;              //软件初始下限阈值(低温提示预警)
uint max=1023;             //软件初始上限阈值(高温提示预警)
uint MAX6675_ReadData(void);
void mDelay(unsigned int DelayTime);
void Display(uint i);

void Display(uint i)
{
uchar dis[4]={0,0,0,0};
uint m,n;
uint LED[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};      //0-9显示码 共阳极数码管
n=0x08;                           
dis[3]=i/1000;                 
dis[2]=i%1000/100;
dis[1]=i%100/10;
dis[0]=i%10;
for(m=0;m<4;m++)                               //动态扫描
{
P0=0xff;
P2=0xf0|n;                                     //指定位给1  
P0=LED[dis[m]];
mDelay(3);
n=_cror_(n,1);
}
}

uint  MAX6675_ReadData(void)
{
int k,i;        
        long int dat;
int n;
i=0;
dat=0;//初始化时间大于Tcss即>100ns
CS=0;
SCK=0;                 
for(i=0;i<16;i++)        //16个脉冲采集信号
        {
        SCK=1;                 //拉高     
        dat<<=1;
        if(SO==1)
        dat=dat|0x01;
        SCK=0;                 //拉低
        }
        CS=1;                  //拉高
        dat>>=3;               //D3-D14有效  温度值
        dat&=0x0fff;
        k=(dat*0.25); //乘分辨率0.25 就是摄氏度
        

        if((0<k&&k<=161)||(406<=k&&k<=440)) //误差处理  冷端温度为0℃  
        {k+=1;}
        if((162<=k&&k<=195)||(367<=k&&k<=405))  
        {k+=2;}
        if((196<=k&&k<=240)||(305<=k&&k<=366))
  {k+=3;}
        if(241<=k&&k<=304)
  {k+=4;}
  if(471<=k&&k<=499)        
        {k-=1;}
        if(500<=k&&k<=526)        
        {k-=2;}
  if(527<=k&&k<=555)        
        {k-=3;}
  if(556<=k&&k<=584)        
  {k-=4;}
  if(585<=k&&k<=610)        
        {k-=5;}
  if(441<=k&&k<=470)        
        {k=k;}

        return k;//函数返回值  返回温度
}

void time0() interrupt 1 using 0   
{
        long int temp=1;
        unsigned int cctemp;
        ET0=0;  //定时器0关
        TH0=(65535-250)/256;   //50000/250=200  
        TL0=(65535-250)%256;  
         a++;
        if(a==3000)//a每加到3000  进行处理  1秒
        {
          a=0;
          aa= MAX6675_ReadData();//调用读取温度函数
                temp=aa*10;//读取温度按照上位机要求乘10处理
               
          TI=0;SBUF='h';while(!TI);//通信协议  先发‘h’
          TI=0;SBUF=temp/256;while(!TI);//乘10后先发高八位
          TI=0;SBUF='l';while(!TI);//通信协议 在发‘l’
          TI=0;SBUF=temp%256;while(!TI);//发温度的第八位
        }

        
                if(RI)
                {RI=0;set[rs]=SBUF;rs++;if(rs==2)
                        {        
                                ctemp = set[0];
                                ctemp = ctemp<<8;
                                ctemp = ctemp|set[1]; rs=0;
                        }
                }


        Display(ctemp/10);
        
        ET0=1;//定位器开
}

void mDelay(unsigned int DelayTime)//软件延时1ms
{
unsigned char j=0;
        while(DelayTime--);
        
}
        
void main()
{

        TMOD=0X21;//定时器初始化模式设置
        SCON=0X50;
        PCON=0X80;
        TH1=0XFA;
        TL1=0XFA;
        TH0=(65535-250)/256;          //50000/250=200  
        TL0=(65535-250)%256;
        TR1=1;
        ET0=1;IT0=1;TR0=1;EX0=1;EA=1; //允许外部中断0产生中断

        while(1);
        
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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