找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机K型热电偶+MAX1241高温环境温度检测与报警系统设计

[复制链接]
跳转到指定楼层
楼主
这是刚做好的设计 包括源代码和仿真图 暂时还没有文档

简单粗暴点吧:
主要实现的功能:

1、AT89C51单片机+LCD1602液晶+K型热电偶+MAX1241+按键+蜂鸣器

2、测量温度范围:-52至890摄氏度 主要用于高温环境的测量,我们题目是高温烘烤箱。

3、设置按键:共三个按键,上下限值选择按键、加1按键、减1按键。

4、测量温度大于上限报警温度蜂鸣器报警提示,测量温度小于下限报警温度蜂鸣器报警提示。

5、按键设置上下限报警值


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):


(已经亲测一切成功毫无问题)


大致程序代码(不完整 1、源程序.zip (49.33 KB, 下载次数: 101) 2、仿真图 (1).zip (83.01 KB, 下载次数: 103) ):

#include<reg51.h>
#include<intrins.h> //包含_nop_()函数定义的头文件
#include<absacc.h>
#define uchar unsigned char
#define uint  unsigned int
#define LCD1602_DW XBYTE[65023]
#define LCD1602_CW XBYTE[64767]
#define LCD1602_CR XBYTE[65279]
sbit DOUT=P1^5;
sbit SCLK=P1^6;
sbit CS=P1^7;
uint aaaa,aa,cc;//储存A/D转换后的值
uchar num;
uint a,b,c;
sbit p10=P1^0;//按键端口
sbit p11=P1^1;//按键端口
sbit p12=P1^2;//按键端口
sbit p30=P3^0;//蜂鸣器接口
uint code table1[]={        





                                                                                };
uint code table2[]={        
                                



        
                                        };
void delay1(uint z)
{
        for(z=0;z<10;z++)
                _nop_();
}
//判忙函数
void WHILE_BUSY()                                                
{
        while((bit)(LCD1602_CR&128));//读回DB7的值,为DB7=1时则等待 。
}
void LCD1602_init()
{
          WHILE_BUSY();//判忙,不忙继续写指令
          LCD1602_CW=56;//写指令,8位接口,双行显示,5*7字符
          WHILE_BUSY();//判忙,不忙继续写指令
          LCD1602_CW=1;//清屏
          WHILE_BUSY();//判忙,不忙继续写指令
          LCD1602_CW=6;//地址计数自动加一
           WHILE_BUSY();//判忙,不忙继续写指令
          LCD1602_CW=12;//开显示
}
uint read_max1241()
{
        uint voltage=0;                 //存放12位数字量
        uchar cont12=12;             //12位
        CS=1;
        SCLK=0;
        CS=0;
        while(DOUT==0);       //转换结束
        SCLK=1;
        SCLK=0;
        while(cont12--)
        {
                SCLK=1;              //SCLK上升沿数据稳定并读出
                voltage<<=1;   
                if(DOUT==1)
                        voltage+=1;
                SCLK=0;
        }         
        CS=1;
        return voltage;
}
//按键扫描子函数
void key()
{
        if(p10==0)//判断p10按键是否按下
        {
                delay1(10);//延时消抖
                while(p10==0);//按键松手检测
                num++;
                if(num==1)
                {
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_CW=(132);
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_CW=(15);        
                }
                if(num==2)
                {
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_CW=(141);        
                }
                if(num==3)
                {
                        num=0;
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_CW=(12);
                }
        }
        if(num!=0)
        {
                if(p11==0)//判断p11按键是否按下
                {
                        delay1(10);//延时消抖
                        while(p11==0);//按键松手检测
                        if(num==1)
                        {
                                a++;
                                if(a>=909)
                                        a=b+5;
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_CW=(130);
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_DW=(a/100+'0');
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_CW=(132);
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_DW=(a%10+'0');
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_CW=(131);
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_DW=(a%100/10+'0');
                        }
                        if(num==2)
                        {
                                if((b+1)<a)
                                        b++;
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_CW=(139);
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_DW=(b/100+'0');
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_CW=(141);
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_DW=(b%10+'0');
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_CW=(140);
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_DW=(b%100/10+'0');
                        }
                }
                if(p12==0)//判断p12按键是否按下
                {
                        delay1(10);//延时消抖
                        while(p12==0);//按键松手检测
                        if(num==1)
                        {
                                if(a>b+1)
                                        a--;
                                if(a==255)
                                        a=908;
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_CW=(130);
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_DW=(a/100+'0');
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_CW=(132);
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_DW=(a%10+'0');
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_CW=(131);
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_DW=(a%100/10+'0');
                        }
                        if(num==2)
                        {
                                b--;
                                if(b==255)
                                        b=a-5;
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_CW=(139);
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_DW=(b/100+'0');
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_CW=(141);
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_DW=(b%10+'0');
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_CW=(140);
                                WHILE_BUSY();
                                delay1(1);
                                LCD1602_DW=(b%100/10+'0');
                        }
                }
        }        
}
//主函数
void main()
{
        LCD1602_init(); //将液晶初始化
        TMOD=51;//定时器0和定时器1都是用于定时,工作方式3(8位计数器)
        TCON=16;//启动定时器0
        IE=130;//开总中断和定时器0中断
        TL0=56;//定时200微秒
        a=300;
        b=10;
        while(1)
        {
                key();
                if(num==0)
                {
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_CW=(128);
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=('H');
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=('=');
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=(a/100+'0');
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=(a%100/10+'0');
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=(a%10+'0');
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=(223);
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=(67);
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=(' ');
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=(' ');
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=('L');
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=('=');
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=(b/100+'0');
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=(b%100/10+'0');
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=(b%10+'0');
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=(223);
                        WHILE_BUSY();
                        delay1(1);
                        LCD1602_DW=(67);
                        
                        for(cc=0;cc<962;cc++)
                        {
                                if((aaaa>=table1[cc])&&(aaaa<table1[cc+1]))
                                {
                                        c=table2[cc];
                                        WHILE_BUSY();
                                        delay1(1);
                                        LCD1602_CW=196;
                                        WHILE_BUSY();
                                        delay1(1);
                                        LCD1602_DW='T';
                                        WHILE_BUSY();
                                        delay1(1);
                                        LCD1602_DW='=';
                                        if(aaaa<159)
                                        {
                                                WHILE_BUSY();
                                                delay1(1);
                                                LCD1602_DW='-';
                                                p30=0;
                                        }
                                        else
                                        {
                                                if((c>a)&&(c>b))
                                                {
                                                        p30=0;
                                                }
                                                if((c<a)&&(c<b))
                                                {
                                                        p30=0;
                                                }
                                                if((c<=a)&&(c>=b))
                                                {
                                                        p30=1;
                                                }
                                                WHILE_BUSY();
                                                delay1(1);
                                                LCD1602_DW='+';        
                                        }
                                        WHILE_BUSY();
                                        delay1(1);
                                        LCD1602_DW=(table2[cc]/100+48);
                                        WHILE_BUSY();
                                        delay1(1);
                                        LCD1602_DW=(table2[cc]%100/10+48);
                                        WHILE_BUSY();
                                        delay1(1);
                                        LCD1602_DW=(table2[cc]%10+48);        
                                        WHILE_BUSY();
                                        delay1(1);
                                        LCD1602_DW=(223);
                                        WHILE_BUSY();
                                        delay1(1);
                                        LCD1602_DW=(67);
                                }
                        }
                }        
        }
}
//定时器0中断子函数
void t0() interrupt 1
{
        TL0=56;//定时200微秒
        aa++;//每200微秒aa值加1
        if(aa==10000)//1秒时间定时时间到
        {
                aa=0;//aa值清0
                aaaa=read_max1241(); //进行A/D转换
        }               
}               


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:671252 发表于 2019-12-23 14:27 | 只看该作者
仿真图下载后怎么打开?
回复

使用道具 举报

板凳
ID:661845 发表于 2020-1-7 18:41 | 只看该作者
现在有word了吗
回复

使用道具 举报

地板
ID:560072 发表于 2020-3-7 19:21 | 只看该作者
请问仿真图中的51单片机的P3.6/WR和P3.7/RD是和什么相连接呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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