📄 温度main.c
字号:
WriteCommandLCM(0x0f,1); //开显示,光标显示,光标闪烁,检测忙信号
DisplayOneChar(3,0,hour/10+0x30); //液晶上显示要设定的小时
DisplayOneChar(4,0,hour%10+0x30);
}
/**************液晶显示子函数3*****************/
void displayfun3(void)
{
WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
DisplayOneChar(9,0,seconde/10+0x30);
DisplayOneChar(10,0,seconde%10+0x30);
DisplayOneChar(3,1,K/10+0x30);
DisplayOneChar(4,1,K%10+0x30);
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30);
WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号
DisplayOneChar(6,0,minite/10+0x30); //液晶上显示要设定的分
DisplayOneChar(7,0,minite%10+0x30);
}
/**************液晶显示子函数4 *****************/
void displayfun4(void)
{
WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
DisplayOneChar(6,0,minite/10+0x30);
DisplayOneChar(7,0,minite%10+0x30);
DisplayOneChar(9,0,seconde/10+0x30);
DisplayOneChar(10,0,seconde%10+0x30);
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30);
WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号
DisplayOneChar(3,1,K/10+0x30); //液晶上显示要设定的温度
DisplayOneChar(4,1,K%10+0x30);
}
/**************键盘扫描子函数******************/
void keyscan(void)
{
uchar xx; //局部变量
P1=0xff; //为读数做准备
if(P1!=0xff) //有键被按下
{
delay_LCM(50); //去抖
if(P1!=0xff) //确认有键被按下
{
xx=P1;
switch(xx) // 根据按键状态,调用不同的子函数
{
case 0xfe:set_adj(); break; //P1.0则MS按下转set_adj();
case 0xfd:inc_key(); break; //"+"
case 0xfb:dec_key(); break; //"-"
case 0xf7:{delay_LCM(150); ON_OFF=!ON_OFF; while(!BLUE_ALARM);} break;
default:break;
}
}
}
}
/**************设定工作模式子函数****************/
void set_adj(void)
{
delay_LCM(100);
set++;
if(set>=4) set=0;
while(!RED_ALARM); //等待"MS"松开
}
/****************按键加法子函数******************/
void inc_key(void)
{
delay_LCM(150);
switch(set)
{
case 0:if(P1==0xf7){delay_LCM(150);ON_OFF=!ON_OFF;} break;
case 1:hour++; if(hour>=23) hour=23; break;
case 2:minite++; if(minite>=59) minite=59; break;
case 3:K++; if(K>=99) K=99; break;
default:break;
}
while(!WRITE_ALARM); ////等待"+"松开
}
/****************按键减法子函数*****************/
void dec_key(void)
{
delay_LCM(150);
switch(set)
{
case 0:if(P1==0xf7) {delay_LCM(150);ON_OFF=!ON_OFF;} break;
case 1:hour--; if(hour<=0) hour=0; break;
case 2:minite--; if(minite<=0) minite=0; break;
case 3:K--; if(K<=1) K=1; break;
default:break;
}
while(!GREEN_ALARM); //等待"-"松开
}
/////////24C02读写驱动程序////////////////////
void delay1(uchar x)
{
uint i;
for(i=0;i<x;i++);
}
void flash()
{ ; ; } //短暂的等待
void x24c02_init() //24c02初始化子程序,将两条数据线拉高
{
scl=1;
flash();
sda=1;
flash();
}
void start() //启动I2C总线
{
sda=1;
scl=1;
flash();
sda=0;
flash();
scl=0;
flash();
}
void stop() //停止I2C总线
{
sda=0;
flash();
scl=1;
flash();
sda=1;
flash();
}
void writex(uchar j) //写一个字节
{
uchar i,temp;
temp=j; //全局变量向局部变量传递
for (i=0;i<8;i++)
{
temp=temp<<1; //把最高位移入CY中
scl=0; //准备发送到24C02
flash();
sda=CY; //送数据,由高位到低位
flash();
scl=1; //时钟线挂起
flash();
}
scl=0;
flash();
sda=1;
flash();
}
uchar readx() //读一个字节
{
uchar i,j,k=0;
scl=0;
flash();
sda=1;
for (i=0;i<8;i++)
{
flash();
scl=1;
flash();
if (sda==1) j=1;
else j=0;
k=(k<<1)|j;
scl=0;
}
flash();
return(k);
}
void clock() //I2C总线时钟
{
uchar i=0;
scl=1;
flash();
while ((sda==1)&&(i<255))i++;
scl=0;
flash();
}
////////从24c02的地址address中读取一个字节数据/////
uchar x24c02_read(uchar address)
{
uchar i;
start();
writex(0xa0);
clock();
writex(address);
clock();
start();
writex(0xa1);
clock();
i=readx();
stop();
delay1(10);
return(i);
}
//////向24c02的address地址中写入一字节数据info/////
void x24c02_write(uchar address,uchar info)
{
EA=0;
start();
writex(0xa0);
clock();
writex(address);
clock();
writex(info);
clock();
stop();
EA=1;
delay1(50);
}
/***************定时器t0初始化*******************/
void init_timer0(void)
{
TMOD=0x01; //time0为定时器,方式1(2的16次方计数)
TH0=0x3c; //预置计数初值,使定时为50ms
TL0=0xb0;
EA=1; //开总中断
ET0=1; //开TO中断
TR0=1; //启动
}
/***********定时器t0中断子函数**************/
void timer0(void) interrupt 1 using 0 //定时器0溢出中断,方式1,50ms中断一次
{ //使用寄存器组0
TH0=0x3c; //出现中断则重置初值
TL0=0xb0; //预置计数初值,使定时为50ms
mstcnt++; //中断次数计数器
if(mstcnt>=20 ) {seconde++; write=1; mstcnt=0; } //中断20次则50ms*20=1s到,将mscnt置零
if(seconde>=60) {minite++; seconde=0;} //计满1分钟则minite加1,同时将second置零
if(minite>=60 ) {hour++; minite=0; } //计满1小时则hour加1,同时将minite置零
if(hour>=24 ) {hour=0; } //计满24小时则hour置零
keyscan( ); //按键扫描
}
/***********the main funtion*************/
void main(void)
{
P1=0xff; //初始化p1口,全设为1
P3=0x00;
x24c02_init(); //初始化24C02
K=x24c02_read(2); //读出保存的上限温度数据赋于K
seconde=x24c02_read(4); //读出保存的秒数据
minite=x24c02_read(6); //读出保存的分数据
hour=x24c02_read(8); //读出保存的时数据
delay_LCM(500); //延时500ms启动
initLCM( ); //LCD初始化
init_timer0( ); //时钟定时器0初始化
Init_DS18B20( ) ; //DS18B20初始化
DisplayListChar(0,0,str0); //第一行显示"--- : : --- "
DisplayListChar(0,1,str1); //第二行显示"SET: C SA: . C"
while (1) //死循环
{
keyscan(); //按键扫描
ReadTemperature(); //温度采集
switch(set) //LCD根据工作模式显示
{
case 0:displayfun1();delay_LCM(1000);break; //正常工作显示
case 1:displayfun2();delay_LCM(1000);break; //调整时显示
case 2:displayfun3();delay_LCM(1000);break; //调整分显示
case 3:displayfun4();delay_LCM(1000);break; //温度设定
default:break;
}
keyscan( ); //相当于延时
if(ON_OFF==1) //若温控标志位1, 控制LAMP动作
{
if(temp1>=K+1){outflag=1;OUT=1;}//若温度整数部分超过设定值,则将标志置1,以显示超限标志,同时执行继电器动作
if(temp1<K) //若温度没超限
{
delay_LCM(1000); //等待液晶稳定
if(temp1<K){outflag=0;OUT=0;}//若温度没超限,不显超限标志,继电器不动作
}
}
else{outflag=0;OUT=0;} //若温控标志位0, 关闭控制LAMP动作
if(write==1) //判断计时器是否计时一秒
{
write=0; //清零
x24c02_write(8,hour); //在24c02的地址2中写入数据hour
delay_LCM(11);
x24c02_write(6,minite); //在24c02的地址2中写入数据minite
delay_LCM(11);
x24c02_write(4,seconde); //在24c02的地址2中写入数据second
delay_LCM(11);
x24c02_write(2,K); //在24c02的地址2中写入数据K
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -