欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 誰幫我改一下這個程序啊 改成12864顯示 [打印本頁]

作者: 1678    時間: 2015-8-7 17:43
標(biāo)題: 誰幫我改一下這個程序啊 改成12864顯示
#include<reg51.h>
//#include<temp.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;
sbit rw=P1^1;
sbit lcden=P2^5;
sbit jidianqi=P2^7;
sbit s1=P3^4;//功能鍵
sbit s2=P3^5;//增加鍵
sbit s3=P3^6;//減小鍵
sbit beep=P2^3;//蜂鳴器
sbit led1=P1^3;
sbit led2=P1^4;
sbit ds=P2^2; //溫度傳感器
uint warnl=20;           //下限溫度
uint warnh=40;           //上限溫度
uint temp;                        //整形溫度數(shù)據(jù)
float f_temp;                //浮點(diǎn)型溫度數(shù)據(jù)
uchar count,stop,s1num,s2num;//其它變量定義
char miao,shi,fen;
uchar code table[]="   :  :   T:    ";//液晶固定顯示內(nèi)容
uchar code table1[]=" L:      H:     ";

void delay(uint z)//延時函數(shù)
{
uint x,y;
for(x=z;x>0;x--)
for(y=124;y>0;y--)
;
}
void di() //蜂鳴器報警聲音
{
beep=0;
delay(100);
beep=1;                           
}
/*================液晶操作============*/
void write_com(uchar com)
{//寫液晶命令函數(shù)
rs=0;
lcden=0;
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;       
}
void write_date(uchar date)
{//寫液晶數(shù)據(jù)函數(shù)
rs=1;
lcden=0;
P0=date;
delay(3);
lcden=1;
delay(3);
lcden=0;       
}
void write_sfm(uchar add,char date)                //1602液晶刷新時分秒函數(shù)1為時,4為分,7為秒
{                                       
char shiwei,gewei;
shiwei=date/10;
gewei=date%10;
write_com(0x80+add);
write_date(0x30+shiwei);
write_date(0x30+gewei);
}
void write_nyr(uchar add,char date)
{//1602液晶刷新年月日函數(shù)3為年,6為分,9為秒
char shiwei,gewei;
shiwei=date/10;
gewei=date%10;
write_com(0xc0+add);
write_date(0x30+shiwei);
write_date(0x30+gewei);
}
/*==================================================*/
/*==============ds18B20程序=========================*/
void dsreset(void)    //18B20復(fù)位,初始化函數(shù)
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void)   //讀1位函數(shù)
{
uint i;
bit dat;
ds=0;i++;          //i++ 起延時作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return (dat);
}
uchar tempread(void)   //讀1個字節(jié)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);   //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在DAT里
}
return(dat);
}
void tempwritebyte(uchar dat)   //向18B20寫一個字節(jié)數(shù)據(jù)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)     //寫 1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;       //寫 0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void)  //DS18B20 開始獲取溫度并轉(zhuǎn)換
{
dsreset();
delay(1);
tempwritebyte(0xcc);  // 寫跳過讀ROM指令
tempwritebyte(0x44);  // 寫溫度轉(zhuǎn)換指令
}
uint get_temp()         //讀取寄存器中存儲的溫度數(shù)據(jù)
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();         //讀低8位
b=tempread();         //讀高8位
temp=b;
temp<<=8;            //兩個字節(jié)組合為1個字
temp=temp|a;
f_temp=temp*0.0625;      //溫度在寄存器中為12位 分辨率位0.0625°
temp=f_temp+0.5;    //加0.5是四舍五入
return temp;         //temp是浮點(diǎn)型
}
/*=========================================================================*/
/*========================溫度處理========================*/
void deal(uint t)
{
if (t>warnh)
{
jidianqi=0;
TR0=0;
led1=0;
di();
delay(200);
di();
delay(100);
}
if (t>warnl&&t<=warnh)
{
led2=0;
di();
delay(400);
di();
delay(100);
}
}
/*=========================液晶處理=============*/  
void init()
{//初始化函數(shù)
uchar num;
s1num=0;
count=0;
fen=0;
miao=0;
shi=0;
lcden=0;
jidianqi=1;
led1=1;
led2=1;
write_com(0x38);//1602液晶初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)//寫入液晶固定部分顯示
{
write_date(table[num]);
delay(1);
}
write_sfm(7,miao);//分別送去液晶顯示
write_sfm(4,fen);
write_sfm(1,shi);
write_com(0x8e);
write_date(0xdf);
write_date(0x43);
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(table1[num]);
delay(1);
}
write_com(0xc5);
write_date(0xdf);
write_date(0x43);
write_com(0xcd);
write_date(0xdf);
write_date(0x43);
TMOD=0x01;//設(shè)置定時器0工作模式1
TH0=(65536-50000)/256;//定時器裝初值
TL0=(65536-50000)%256;
EA=1;        //開總中斷
ET0=1;        //開定時器0中斷
TR0=1;        //啟動定時器0
}
/*==================按鍵處理=============*/
void keyscan()//按鍵掃描函數(shù)
{
if(s1==0)       
{
delay(5);
if(s1==0)//確認(rèn)功能鍵被按下
{        s1num++;//功能鍵按下次數(shù)記錄
while(!s1);//釋放確認(rèn)
di();//每當(dāng)有按鍵釋放蜂鳴器發(fā)出滴聲
if(s1num==1)//第一次被按下時
{
TR0=0;  //關(guān)閉定時器
write_com(0x80+7);//光標(biāo)定位到秒位置
write_com(0x0f); //光標(biāo)開始閃爍
}
if(s1num==2)//第二次按下光標(biāo)閃爍定位到分鐘位置
{
write_com(0x80+4);
}
if(s1num==3)//第三次按下光標(biāo)閃爍定位到小時位置
{
write_com(0x80+1);

}
if(s1num==4)
{

write_com(0xc0+3);
}
if(s1num==5)
{
write_com(0xc0+11);
}                                               
if(s1num==6)//第四次按下
{
s1num=0;//記錄按鍵數(shù)清零
write_com(0x0c);//取消光標(biāo)閃爍
TR0=1;        //啟動定時器使時鐘開始走
}               
}
}
if(s1num!=0)//只有功能鍵被按下后,增加和減小鍵才有效
{
if(s2==0)
{
delay(5);
if(s2==0)//增加鍵確認(rèn)被按下
{
while(!s2);//按鍵釋放
di();//每當(dāng)有按鍵釋放蜂鳴器發(fā)出滴聲
if(s1num==1)//若功能鍵第一次按下
{
miao++; //則調(diào)整秒加1
if(miao==60)//若滿60后將清零
miao=0;
write_sfm(7,miao);//每調(diào)節(jié)一次送液晶顯示一下
write_com(0x80+7);//顯示位置重新回到調(diào)節(jié)處
}
if(s1num==2)//若功能鍵第二次按下
{
fen++;//則調(diào)整分鐘加1
if(fen==60)//若滿60后將清零
fen=0;
write_sfm(4,fen);//每調(diào)節(jié)一次送液晶顯示一下
write_com(0x80+4);//顯示位置重新回到調(diào)節(jié)處
}
if(s1num==3)//若功能鍵第三次按下
{
shi++;//則調(diào)整小時加1
if(shi==24)//若滿24后將清零
shi=0;
write_sfm(1,shi);;//每調(diào)節(jié)一次送液晶顯示一下
write_com(0x80+1);//顯示位置重新回到調(diào)節(jié)處
}
if(s1num==4)
{
warnl++;
write_nyr(3,warnl);
write_com(0xc0+3);
}
if(s1num==5)
{
warnh++;
write_nyr(11,warnh);
write_com(0xc0+11);
}                                                       
}
}
if(s3==0)
{
delay(5);
if(s3==0)//確認(rèn)減小鍵被按下
{
while(!s3);//按鍵釋放
di();//每當(dāng)有按鍵釋放蜂鳴器發(fā)出滴聲
if(s1num==1)//若功能鍵第一次按下
{
miao--;//則調(diào)整秒減1
if(miao==-1)//若減到負(fù)數(shù)則將其重新設(shè)置為59
miao=59;
write_sfm(7,miao);//每調(diào)節(jié)一次送液晶顯示一下
write_com(0x80+7);//顯示位置重新回到調(diào)節(jié)處
}
if(s1num==2)//若功能鍵第二次按下
{
fen--;//則調(diào)整分鐘減1
if(fen==-1)//若減到負(fù)數(shù)則將其重新設(shè)置為59
fen=59;
write_sfm(4,fen);//每調(diào)節(jié)一次送液晶顯示一下
write_com(0x80+4);//顯示位置重新回到調(diào)節(jié)處
}
if(s1num==3)//若功能鍵第二次按下
{
shi--;//則調(diào)整小時減1
if(shi==-1)//若減到負(fù)數(shù)則將其重新設(shè)置為23
shi=23;
write_sfm(1,shi);//每調(diào)節(jié)一次送液晶顯示一下
write_com(0x80+1);//顯示位置重新回到調(diào)節(jié)處
}
if(s1num==4)
{
warnl--;
write_nyr(3,warnl);
write_com(0xc0+3);
}
if(s1num==5)
{
warnh--;
write_nyr(11,warnh);
write_com(0xc0+11);
}                                       
}
}
}
}
/*=====================主函數(shù)=================*/
void main()
{         
init();//調(diào)用初始化函數(shù)
while(1)
{       
if (stop>=60)
deal(temp);       
keyscan();//按鍵掃描                                                       
}
}
void timer0() interrupt 1//定時器0中斷服務(wù)程序
{
TH0=(65536-50000)/256;//再次裝定時器初值
TL0=(65536-50000)%256;
stop++;
if(stop>=100)
stop--;
count++;                //中斷次數(shù)累加
if(count==20) //20次50毫秒為1秒
{
count=0;
miao++;
if(miao==60)//秒加到60則進(jìn)位分鐘
{
miao=0;//同時秒數(shù)清零
fen++;
if(fen==60)//分鐘加到60則進(jìn)位小時
{
fen=0;//同時分鐘數(shù)清零
shi++;
if(shi==24)//小時加到24則小時清零
{
shi=0;
}
write_sfm(1,shi);//小時若變化則重新寫入
}
write_sfm(4,fen);//分鐘若變化則重新寫入
}
write_sfm(7,miao);//秒若變化則重新寫入
tempchange();
write_sfm(12,get_temp());
write_nyr(3,warnl);
write_nyr(11,warnh);       
}       
}


作者: 阿凡提    時間: 2017-11-19 08:33
這個比較麻煩哦。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1