这是刚做好的设计 包括源代码和仿真图 暂时还没有文档
简单粗暴点吧:
主要实现的功能:
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转换
}
}
|