久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3134|回復: 1
打印 上一主題 下一主題
收起左側

51單片機的溫度檢測程序源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:184796 發表于 2017-3-30 16:12 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
      #include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a,b,c,d;
uchar p;
uint k=0;
uint j=0;
uchar i;
uint num;
uint shi,ge,xiaoshu;
uint sign;    //報警標識位
uchar R_data[14]="TempXX.XAlarmX";  //串口接收
uchar Byte[6]="xxtoxx";  //串口發送 數組內可以不寫內容
int count=1;  //初始串口接收為1個周期
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2; //LCD液晶屏
sbit beep=P2^5;  //蜂鳴器
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;  //四個按鍵

uchar code t0[]="Current T       ";
uchar code t1[]="low      high   ";
uchar code wendu[]="0123456789"; //利用一個溫度表解決溫度顯示亂碼
sbit DS=P2^6;
sbit D=P2^3;  //繼電器

void Uart_Init(void)
{
     TMOD = 0x20;   //定時器工作在定時器1的方式2
     PCON = 0x00;   //不倍頻
     SCON = 0x50; //串口工作在方式1,并且啟動串行接收
     TH1 = 0xFd;    //設置波特率 9600
     TL1 = 0xFd;
     TR1 = 1;  //啟動定時器1
  ES = 1;  //開串口中斷
  EA = 1;  //開總中斷  
}
void Uart_Send()
{
for(i=0;i<14;i++)
  {
if(i==4) R_data[i]=shi+0x30;
if(i==5) R_data[i]=ge+0x30;
if(i==7) R_data[i]=xiaoshu+0x30;
if(i==13) R_data[i]=sign+0x30;  //串口接收中第5,6,8,14個字符改為相應的數字
  SBUF=R_data[i];
  while(!TI);
  TI=0;
}
}  

void delay(uint z)
{
uchar x,y;
for(x=2000;x>1;x--)
for(y=z;y>1;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x01);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for(i=0;i<20;i++)
{
write_date(t0[i]);
delay(0);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(t1[i]);  //初始化中顯示
delay(0);
}
}
void tmpDelay(int num)
{
while(num--) ;
}
void Init_DS18B20()
{
unsigned char x=0;
DS=1;
tmpDelay(8);
DS=0;
tmpDelay(80);
DS=1;
tmpDelay(14);
x=DS;
tmpDelay(20);
}
unsigned char ReadOneChar()
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DS=0;
dat>>=1;
DS=1;
if(DS)
dat|=0x80;
tmpDelay(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DS=0;
DS=dat&0x01;
tmpDelay(5);
DS=1;
dat>>=1;
}
}
unsigned int Readtemp()
{
unsigned char a=0; //溫度高8位
unsigned char b=0; //溫度低8位
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
a=ReadOneChar();
b=ReadOneChar();
t=b; //讀溫度低8位
t<<=8;
t=t|a; //讀溫度高8位
tt=t*0.0625; //DS18B20精度
t=tt*10+0.5;  //溫度取十倍以便四舍五入
return(t);
}
void display()
{
uint tempmin[6]={15,16,17,18,19,20}; //設置溫度下限域
uint tempmax[6]={25,26,27,28,29,30}; //設置溫度上限域
uint tempra; //讀取當前溫度

if(P3_2==0)    //最小值減
{
delay(5);
if(P3_2==0)
{
if(k<=1) k=1;   k--;
while(!P3_2);
}
}
if(P3_3==0)    //最小值加
{
delay(5);
if(P3_3==0)
{
k++; if(k>=5) k=5;
while(!P3_3);
}
}
if(P3_4==0)    //最大值減
{
delay(5);
if(P3_4==0)
{
if(j<=1) j=1;  j--;
while(!P3_4);
}
}
if(P3_5==0)    //最大值加
{
delay(5);
if(P3_5==0)
{
j++; if(j>=5) j=5;
while(!P3_5);
}
}
if(p!=1)
{a=tempmin[k]/10%10+0x30; //顯示溫度下限值的十位,加0x30可以把數值型轉換成字符型來顯示在液晶屏上
b=tempmin[k]%10+0x30; //顯示溫度下限值個位
c=tempmax[j]/10%10+0x30;  //顯示溫度上限值十位
d=tempmin[j]%10+0x30;}  //顯示溫度上限值個位
write_com(0x80+0x40+5);  
write_date(a);
write_com(0x80+0x40+6);
write_date(b);
write_com(0x80+10);//6
write_date(wendu[shi]);
write_com(0x80+11);   //7
write_date(wendu[ge]);
write_com(0x80+12);   //8
write_date(0x2e);
write_com(0x80+13);
write_date(wendu[xiaoshu]);
write_com(0x80+14);
write_date(0xdf);
write_com(0x80+15);
write_date(0x43);
write_com(0x80+0x40+14);
write_date(c);
write_com(0x80+0x40+15); //按位分為顯示下限值 當前溫度值℃ 上限值
write_date(d);

tempra=shi*10+ge;
if(tempra<tempmin[k] || tempra>=tempmax[j]) {D=0;sign=1;} else {D=1;sign=0;}//若在報警范圍內,繼電器燈亮,蜂鳴器響
}
void main()
{
beep=1;
init_lcd();
Uart_Init();
while(1)
{
num=Readtemp();
shi=num/100; //讀取溫度為十倍,所以取百位即為溫度的十位
ge=num/10%10;
xiaoshu=num%10;
display();
if(sign)
beep=0;
else
beep=1;
delay(1);
Uart_Send();
delay(20*count);
}
}
void Com_Int() interrupt 4
{
static uchar g=0;
EA=0;
   
if(RI==1)
{ p=1  ;
Byte[g]=SBUF;
RI=0;
g++;
if(g==8) g=0;
}
a=(Byte[1]);
b=(Byte[2]);
c=(Byte[5]);
d=(Byte[6]);
//讀取周期數
EA=1;
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:503018 發表于 2019-5-8 17:33 | 只看該作者
幫助非常大,,感謝
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品91视频 | 日韩一区和二区 | 国产精品久久久 | 色男人的天堂 | 高清视频一区 | 精品亚洲永久免费精品 | 五十女人一级毛片 | 国产在线激情视频 | 蜜桃视频在线观看免费视频网站www | 成人欧美一区二区三区在线播放 | 国产精品成人在线播放 | 成人午夜在线 | 亚洲在线一区二区 | 免费国产一区二区 | 中文字幕日韩欧美 | 九色.com| 在线免费观看黄a | 欧美日韩中文在线 | 成人欧美一区二区三区在线播放 | 久久国产亚洲精品 | 亚洲精品久久区二区三区蜜桃臀 | 国产精品99 | 国产亚洲一区二区三区在线 | 久久久蜜桃 | 国产精品一二三区在线观看 | 国产精品一区二区三区99 | 91网站视频在线观看 | 亚洲一区在线播放 | 国产91在线观看 | 日韩免费av网站 | 欧美日韩在线观看视频 | 特级毛片爽www免费版 | 日本免费一区二区三区四区 | 亚洲成人精品久久久 | 久久精品高清视频 | 色婷婷精品国产一区二区三区 | 免费观看的黄色网址 | 日本一二三区在线观看 | 亚洲视频在线看 | 日本 欧美 三级 高清 视频 | 日韩毛片 |