📄 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 + -