這是剛做好的設計 包括源代碼和仿真圖 暫時還沒有文檔
簡單粗暴點吧:
主要實現(xiàn)的功能:
1、AT89C51單片機+LCD1602液晶+K型熱電偶+MAX1241+按鍵+蜂鳴器
2、測量溫度范圍:-52至890攝氏度 主要用于高溫環(huán)境的測量,我們題目是高溫烘烤箱。
3、設置按鍵:共三個按鍵,上下限值選擇按鍵、加1按鍵、減1按鍵。
4、測量溫度大于上限報警溫度蜂鳴器報警提示,測量溫度小于下限報警溫度蜂鳴器報警提示。
5、按鍵設置上下限報警值
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載):
(已經(jīng)親測一切成功毫無問題)
大致程序代碼(不完整
1、源程序.zip
(49.33 KB, 下載次數(shù): 103)
2019-3-24 12:40 上傳
點擊文件名下載附件
2、仿真圖 (1).zip
(83.01 KB, 下載次數(shù): 105)
2019-3-24 12:40 上傳
點擊文件名下載附件
):
#include<reg51.h>
#include<intrins.h> //包含_nop_()函數(shù)定義的頭文件
#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_();
}
//判忙函數(shù)
void WHILE_BUSY()
{
while((bit)(LCD1602_CR&128));//讀回DB7的值,為DB7=1時則等待 。
}
void LCD1602_init()
{
WHILE_BUSY();//判忙,不忙繼續(xù)寫指令
LCD1602_CW=56;//寫指令,8位接口,雙行顯示,5*7字符
WHILE_BUSY();//判忙,不忙繼續(xù)寫指令
LCD1602_CW=1;//清屏
WHILE_BUSY();//判忙,不忙繼續(xù)寫指令
LCD1602_CW=6;//地址計數(shù)自動加一
WHILE_BUSY();//判忙,不忙繼續(xù)寫指令
LCD1602_CW=12;//開顯示
}
uint read_max1241()
{
uint voltage=0; //存放12位數(shù)字量
uchar cont12=12; //12位
CS=1;
SCLK=0;
CS=0;
while(DOUT==0); //轉換結束
SCLK=1;
SCLK=0;
while(cont12--)
{
SCLK=1; //SCLK上升沿數(shù)據(jù)穩(wěn)定并讀出
voltage<<=1;
if(DOUT==1)
voltage+=1;
SCLK=0;
}
CS=1;
return voltage;
}
//按鍵掃描子函數(shù)
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');
}
}
}
}
//主函數(shù)
void main()
{
LCD1602_init(); //將液晶初始化
TMOD=51;//定時器0和定時器1都是用于定時,工作方式3(8位計數(shù)器)
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中斷子函數(shù)
void t0() interrupt 1
{
TL0=56;//定時200微秒
aa++;//每200微秒aa值加1
if(aa==10000)//1秒時間定時時間到
{
aa=0;//aa值清0
aaaa=read_max1241(); //進行A/D轉換
}
}
|