?? fyd.c
字號:
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS = P2^0;//指令數據控制端
sbit SID = P2^1;//R/W讀寫控制端
sbit CLK = P2^2;//使能端
//sbit DQ = P3^7;//DS18B20數據總線
sbit DQ = P3^0;//DS18B20數據總線
sbit buzzer= P1^5;//報警器接口
sbit set = P2^3;//時間調整鍵
sbit ret = P2^4;//定時按鍵
sbit add = P2^5;//加一鍵
sbit dec = P2^6;//減一鍵
sbit led1 = P1^2;//指示燈
uchar ms50=0,second=0,minite=0,hour=12;//實際時間存放變量
uchar hh =0,ff=0,KT=0;//設定時間變量
uint tvalue;//溫度值
bit tflag;//溫度正負標志
uint n=0;
uchar T[8]={0x3a,0,0,0,0,0x2e,0,0x43};//溫度存放緩沖區
uchar sheding[8]={0x3a,0,0,0x3a,0,0,0x20,0x20};//設定時間存放數組
/*************************************************************************************************/
/*****************************初始化子程序******************************/
uchar code huanyinghuamian[]={"歡迎來到誠信院@"};
uchar code word[] ={"時鐘溫度顯示系統"};
uchar code guanggao[] ={"嵌入式愛好者協會"};
uchar code tegong[] ={"嵌協特工隊制作!!"};
//uchar code huanyinghuamian2[]={"Welcome to here!"};
//uchar code huanyinghuamian3[]={"We'll be friend!"};
/***********************************************************************/
uchar code numble[16]={"當前時間 "};
uchar code name[16] ={"當前溫度 "};
//uchar code zhifu[]={"女人只能呵護與愛"};
uchar code zhifu[] ={"設定時間 "};
/************************溫度測試模塊***********************/
/***********ds18b20延遲子函數(晶振12MHz )*******/
/******************************ds1820程序***************************************/
void delay_18B20(unsigned int i)//延時1微秒
{
while(i--);
}
void ds1820rst()/*ds1820復位*/
{ unsigned char x=0;
DQ = 1; //DQ復位
delay_18B20(4); //延時
DQ = 0; //DQ拉低
delay_18B20(100); //精確延時大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*讀數據*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{ DQ = 0; //給脈沖信號
dat>>=1;
DQ = 1; //給脈沖信號
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*寫數據*/
{
unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
read_temp()/*讀取溫度值并轉換*/
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳過讀序列號*/
ds1820wr(0x44);//*啟動溫度轉換*/
ds1820rst();
ds1820wr(0xcc);//*跳過讀序列號*/
ds1820wr(0xbe);//*讀取溫度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;}
tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數
return(tvalue);
}
/*****************************************************************/
/***************************液晶顯示模塊**************************/
/*****************************延時子程序**************************/
void delay( uint t )
{
uint i;
while( t-- )
for(i=0;i<120;i++);
}
/*****************************寫液晶子程序******************************/
/************************************************************************
說明:word:要寫的內容 dat:1為數據 0為指令
*************************************************************************/
void Writelcd(uchar word,uchar dat)
{
uchar lcddat[3];
uchar i,j,k;
lcddat[0] = ( 0xf8+(dat<<1) );//第一個字節
lcddat[1] = ( word&0xf0 ) ; //第二個字節 內容的高四位+0000
lcddat[2] = ( (word<<4)&0xf0 ) ;//第三個字節 內容的第四位+0000
CS = 0;
CS = 1;
CLK = 0;
for(i=0;i<3;i++)
{
j = lcddat[i];
for(k=0;k<8;k++)
{
if( (j<<k)&0x80 )
SID = 1;
else
SID = 0;
/**時鐘下降沿寫入數據**/
CLK = 1;
CLK = 0;
}
}
}
void Serial_int(void)
{
CS =1;
SID =0;
CLK =0;
Writelcd( 0x30,0 );//功能設置,一次送8位數據,基本指令集
// delay( 50 );
Writelcd( 0x30,0 );//功能設置,一次送8位數據,基本指令集
// delay( 40 );
Writelcd( 0x0c,0 );//0000,1100 整體顯示,游標off,游標位置off
// delay( 50 );
Writelcd( 0x01,0 );//0000,0001 清DDRAM
// delay( 10000 );
Writelcd( 0x02,0 );//0000,0010 DDRAM地址歸位
// delay( 50 );
// delay( 50 );
Writelcd( 0x80,0 );//1000,0000 設定DDRAM 7位地址000,0000到地址計數器AC//
// delay( 150 );
Writelcd( 0x06,0 );
}
/***********************按鍵處理程序模塊****************************/
void key_set()
{
if(set==0)
{
delay(10);
if(set==0)
n++;
if(n>=6)
n=0;
}
while(set==0);
if((n>=1)&&(n<=5))
KT=1;
else
KT=0;
}
void key_ret()
{
if(ret==0)
{
hh=0;
ff=0;
//ss=0;
}
while(ret==0);
}
void key_add()
{
if(add==0)
{
delay(10);
switch(n)
{
//case 0:break;
case 1:hour++;if(hour>=24)hour=0;break;
case 2:minite++;if(minite>=60)minite=0;break;
case 3:second++;if(second>=60)second=0;break;
case 4:hh++;if(hh>=24)hh=0;break;
case 5:ff++;if(ff>=60)ff=0;break;
//case 6:ss++;if(ss>=60)ss=0;break;
default:break;
}
}
while(add==0);
}
void key_dec()
{
if(dec==0)
{
delay(10);
switch(n)
{
//case 0:break;
case 1:hour--; if(hour<=0) hour=23;break;
case 2:minite--;if(minite<=0)minite=59;break;
case 3:second--;if(second<=0)second=59;break;
case 4:hh--; if(hh<=0) hh=23;break;
case 5:ff--;if(ff<=0) ff=59;break;
//case 6:ss--;if(ss<=0) ss=59;break;
default:break;
}
}
while(dec==0);
}
void key_scan()
{
if(set==0)
{
delay(10);
if(set==0)
key_set();
}
else if(ret==0)
{
delay(10);
if(ret==0)
key_ret();
}
else if(add==0)
{
delay(10);
if(add==0)
key_add();
}
else
{
delay(10);
if(dec==0)
key_dec();
}
}
/*******************************************************************/
/****************************************************/
/*******************************顯示函數*******************************/
void display(void)
{
uint i;
T[2]=tvalue/1000+0x30; T[3]=tvalue%1000/100+0x30;
T[4]=tvalue%100/10+0x30; T[6]=tvalue%10+0x30;
sheding[1]=hh/10+0x30; sheding[2]=hh%10+0x30;
sheding[4]=ff/10+0x30; sheding[5]=ff%10+0x30;
if(tflag==0)
T[1]=0x20;//正溫度不顯示符號
else
T[1]=0x2d;//負溫度顯示負號:-
if(T[2]==0x30)
{
T[2]=0x20;//如果百位為0,不顯示
if(T[3]==0x30)
{
T[3]=0x20;//如果百位為0,十位為0也不顯示
}
}
if(KT==0)
sheding[7]=0x01;
else
sheding[7]=0x1d;
Writelcd( 0x8c,0 );
for(i=0;i<8;i++)
{
Writelcd( T[i],1 );
}
Writelcd( 0x94,0 ); //時顯示
{
Writelcd( (hour/10)+0x30,1 );
Writelcd( (hour%10)+0x30,1 );
}
Writelcd( 0x95,0 );// 冒號和分十位
{
Writelcd( 0x3a,1 );
Writelcd( (minite/10)+0x30,1 );
}
Writelcd( 0x96,0 ); //分個位和冒號
{
Writelcd( (minite%10)+0x30,1 );
Writelcd( 0x3a,1 );
}
Writelcd( 0x97,0 );//秒顯示
{
Writelcd( (second/10)+0x30,1 );
Writelcd( (second%10)+0x30,1 );
}
Writelcd( 0x9c,0 );
for(i=0;i<8;i++)
{
Writelcd( sheding[i],1 );
}
}
/***************************************************************/
void initdisplay(void) //開機畫面
{ unsigned char xxx=2,i;
for(;xxx>0;xxx--)
{
Writelcd( 0x80,0 );
for(i=0;i<16;i++)
Writelcd( huanyinghuamian[i],1 ); //開機畫面
Writelcd( 0x90,0 ); //說明:word:要寫的內容 dat:1為數據 0為指令
for(i=0;i<16;i++)
Writelcd( word[i],1 );
Writelcd( 0x88,0 );
for(i=0;i<16;i++)
Writelcd( guanggao[i],1 );
Writelcd( 0x98,0 );
for(i=0;i<16;i++)
Writelcd( tegong[i],1 );
}
}
void initdisplay1(void) //開機畫面
{
//uchar i,j;
uchar i;
//Serial_int();// 液晶初始化
//for(j=1;j<10;j++) //不停的顯示,這個參數需要修改
// {
Writelcd( 0x80,0 );
for(i=0;i<16;i++)
Writelcd( tegong[i],1 );
Writelcd( 0x90,0 ); //說明:word:要寫的內容 dat:1為數據 0為指令
for(i=0;i<16;i++)
Writelcd( numble[i],1 );
Writelcd( 0x88,0 );
for(i=0;i<8;i++)
Writelcd( name[i],1 );
Writelcd( 0x98,0 );
for(i=0;i<8;i++)
Writelcd( zhifu[i],1 );
// }
}
/***************************************************/
void B_J()
{
if(((hour==hh)&&(minite==ff)&&(second<=30))||(tvalue>=350)||(tvalue<=150))
{
led1=0;buzzer=1;
}
else
{led1=1;buzzer=0;}
}
/****************************************************/
/********************主程序***************************/
void main()
{
set=1;ret=1;add=1;dec=1;buzzer=0;led1=1;
TMOD=0X01;
TH0=0X3C;
TL0=0Xb0;
EA=1;
ET0=1;
TR0=1;
Serial_int();
initdisplay();
delay(5000);
initdisplay1();
while(1)
{
read_temp();
display();
key_scan();
B_J();
}
}
/*********************定時中斷服務程序**********************/
void time(void) interrupt 1 using 1
{
//ET0=0;TR0=1;
TH0=0X3C;
TL0=0Xb0;
//TR0=1;
ms50++;
if(ms50==20)
{
ms50=0;
second++;
if(second==60)
{
second=0;minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
hour=0;
}
}
}
//ET0=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -