⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wkq.c

📁 at89c51单片机为控制核心
💻 C
字号:
#include <AT89X51.H>    //器件配置文件
#include <intrins.h>
sbit LCM_RS=P3^3;      //引脚定义
sbit LCM_RW=P3^4;     //引脚定义
sbit LCM_EN=P3^5;      //引脚定义
sbit OUT=P3^6;			//控制继电器
sbit TSOR=P3^7;			//温度测试端
#define Busy 0x80        //常量定义
#define uchar unsigned char
#define uint unsigned int
#define DATAPORT P1 
#define reset() {WDT=0x1e;WDT=0xe1;}// 看门狗启动/复位宏定义
sfr WDT=0xa6;//看门狗寄存器定义
bit ON_OFF;
bit outflag;
//==============================================
uchar temp1,temp2;
uchar cnt;
uchar deda,sec;		//时间变量
char min,hour;
char set,T;
uchar ReadStatusLCM(void);//读数据到MCU子函数声明
uchar code str0[]={"---  :  :  ---  "};//待显字符串
uchar code str1[]={"SET:  C SA:  . C"};
uchar code str2[]={"                "};//待显空字符串
//====================函数声明=======================
void fun0(void);
void fun1(void);
void fun2(void);
void fun3(void);
void set_adj(void);
void inc_key(void);
void dec_key(void);
void key(void);
void gettempTS(void);
void initTS(void);
uchar readBTS(void);
void writeBTS(uchar byte);
void resetTS(void);
bit readTS(void);
void write1TS(void);
void write0TS(void);
void delay15us(void);
void delay60us(void);

//********延时K*1mS,12.000MHz*********
void delay(uint k)//函数名为delay的延时子函数。定义k为无符号整型变量
{                 //delay函数开始
uint i,j;        //定义i、j为无符号整型变量
for(i=0;i<k;i++)
{       //for循环语句开始
for(j=0;j<60;j++)      // for循环语句开始
{;}
reset()}             //两个for循环体
}                   //delay函数结束
/*-----------------------------写指令到LCM子函数-------------------------------*/
void WriteCommandLCM(uchar WCLCM, uchar BusyC) /*函数名为WriteCommandLCM 的写指令到LCM子函数。定义WCLCM、BusyC 为无符号字符型变量*/
{                       //WriteCommandLCM函数开始
if(BusyC)ReadStatusLCM();     /*若BusyC为"1",则调用ReadStatusLCM子函数进行忙检测*/
DATAPORT=WCLCM;        //将变量WCLCM中的指令传送至P1口
LCM_RS=0;             //选中指令寄存器
LCM_RW=0;            //写模式
LCM_EN=0;             //置LCM_EN端为低电平
LCM_EN=0;             //置LCM_EN端为低电平,延时一会儿
LCM_EN=1;             //置LCM_EN端为高电平,写入使能
}                       // WriteCommandLCM函数结束
/*----------------------------写数据到LCM子函数-------------------------------*/
void WriteDataLCM(uchar WDLCM)  /*函数名为WriteDataLCM 的写数据到LCM子函数。定义WDLCM 为无符号字符型变量*/
{                        // WriteDataLCM函数开始
ReadStatusLCM();         //调用ReadStatusLCM子函数检测忙信号
DATAPORT=WDLCM;          //将变量WDLCM中数据传送至P1口
LCM_RS=1;              //选中数据寄存器
LCM_RW=0;              //写模式
LCM_EN=0;              //置LCM_EN端为低电平
LCM_EN=0;              //置LCM_EN端为低电平,延时一会儿
LCM_EN=1;              //置LCM_EN端为高电平,写入使能
}                        // WriteDataLCM函数结束
/*--------------------------------读数据到MCU子函数---------------------------*/
/*uchar ReadDataLCM(void) //函数名为ReadDataLCM的读数据到MCU子函数
{                        // ReadDataLCM函数开始
LCM_RS=1;              //选中数据寄存器
LCM_RW=1;              //读模式
LCM_EN=0;              //置LCM_EN端为低电平
LCM_EN=0;              //置LCM_EN端为低电平,延时一会儿
LCM_EN=1;              //置LCM_EN端为高电平,读使能
return(DATAPORT);                //返回P1口的内容
}*/                      // ReadDataLCM函数结束

/*--------------------------------读状态到MCU子函数-----------------------------*/
uchar ReadStatusLCM(void) //函数名为ReadStatusLCM的读状态到MCU子函数
{                        //ReadStatusLCM函数开始
DATAPORT=0xFF;           //置P1口为全1
LCM_RS=0;               //选中指令寄存器
LCM_RW=1;              //读模式
LCM_EN=0;               //置LCM_EN端为低电平
LCM_EN=0;              //置LCM_EN端为低电平,延时一会儿
LCM_EN=1;              //置LCM_EN端为高电平,读使能
while(P1&Busy);       /*检测忙信号。当P1口内容与Busy(80H)相与后不为零时,程序原地踏步*/
return(DATAPORT);                //返回P1口的内容
}                        // ReadStatusLCM函数结束

/*--------------------------LCM初始化子函数----------------------------*/
void InitLcd()             //函数名为InitLcd 的LCM初始化子函数
{                       // InitLcd函数开始
WriteCommandLCM(0x38,1);//8位数据传送,2行显示,5*7字形,检测忙信号
WriteCommandLCM(0x08,1);//关闭显示,检测忙信号
WriteCommandLCM(0x01,1);//清屏,检测忙信号
WriteCommandLCM(0x06,1);//显示光标右移设置,检测忙信号
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号
}                       // InitLcd函数结束

/*-------------------显示指定座标的一个字符子函数---------------------------*/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{                       
Y&=1;                  
X&=15;                 
if(Y)X|=0x40;            
X|=0x80;                
WriteCommandLCM(X,0);  
WriteDataLCM(DData);    
}                      

/*--------------------显示指定座标的一串字符子函数----------------------*/
void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{                       
uchar ListLength=0; 
Y&=0x1;                
X&=0xF;               
while(X<=15)            
{                      
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;            
X++;                  
}                     
}                     
//=================================================
void init_timer0(void)		//定时器T0初始化
{
TMOD=0x01;
TH0=-(50235/256);
TL0=-(50235%256);
TR0=1;
ET0=1;EA=1;
}
//==================================================
void time_zd0(void) interrupt 1 using 1		//定时器T0中断子函数
{
TH0=-(50235/256);
TL0=-(50235%256);
deda++;cnt++;
if(deda>=20){sec++;deda=0;}
if(sec>=60){min++;sec=0;}
if(min>=60){hour++;min=0;}
if(hour>=24){hour=0;}
if(cnt>=6)cnt=0;
key();						//扫描键盘
}

//==================================
void fun0(void)			//液晶显示子函数0
{
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,min/10+0x30); // 液晶上显示分
DisplayOneChar(7,0,min%10+0x30);
//==============================
DisplayOneChar(9,0,sec/10+0x30); // 液晶上显示秒
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30); // 液晶上显示设定的温度值
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp1/10+0x30); // 液晶上显示测得的温度值
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2+0x30);
//================================
	if(ON_OFF==0)// 若控温标志为0
	{
	DisplayOneChar(14,0,0x4f);// 液晶上显示不控温的图标
	DisplayOneChar(15,0,0x46);
	}
	else
	{
	DisplayOneChar(14,0,0x4f); // 否则液晶上显示控温的图标
	DisplayOneChar(15,0,0x4e);
	if(outflag==1)DisplayOneChar(0,0,0x7c);
	else DisplayOneChar(0,0,0xef);
	}
	//============================
	
}
/*******************************************/
void fun1(void)				//液晶显示子函数1
{
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//=========================
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
//==============================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2+0x30);
//=================================
WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
}
/********************************************/
void fun2(void)			//液晶显示子函数2
{
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,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2+0x30);
//===================================
WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
}
/***************************************/
void fun3(void)			//液晶显示子函数3
{
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,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
//=================================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2+0x30);
//=================================
WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
}
/************************************/
void key(void)						//扫描键盘
{uchar xx;// 局部变量
P2=0xff;
	if(P2!=0xff)
	{delay(10);
		if(P2!=0xff)
		{xx=P2;
			switch(xx)// 根据按键状态,调用不同的子函数
			{
			case 0xfe:set_adj();break; //"MS"键按下,调用set_adj()子函数
			case 0xfd:inc_key();break; //"+"键按下,调用inc_key()子函数
			case 0xfb:dec_key();break; //"-"键按下,调用dec_key()子函数
			case 0xf7:ON_OFF=!ON_OFF;break;// "ON/OFF"键按下,ON_OFF标志取反
			default:break;
			}
		}
	}
}
/************************************/
void set_adj(void)					//设定工作模式子函数
{
	if(cnt==5)
	{set++;
	if(set>=4)set=0;
	}
}
/***************************************/
void inc_key(void)					//按键加法子函数
{
	if(cnt==5)
	{
		switch(set)
		{
		case 0:if(P2==0xf7)ON_OFF=!ON_OFF;break;
		case 1:hour++;if(hour>=23)hour=23;break;
		case 2:min++;if(min>=59)min=59;break;
		case 3:T++;if(T>=99)T=99;	break;
		default:break;
		}
	}
}
/***************************************/
void dec_key(void)						//按键减法子函数
{
	if(cnt==5)
	{
		switch(set)
		{
		case 0:if(P2==0xf7)ON_OFF=!ON_OFF;break;
		case 1:hour--;if(hour<=0)hour=0;break;
		case 2:min--;if(min<=0)min=0;break;
		case 3:T--;if(T<=1)T=1;break;
		default:break;
		}
	}
}
/***************************************/
/*****************************************/
void delay15us(void)						//延时15微秒子函数
{
uchar i;
for(i=0;i<4;i++);
}
//*************************************************
void delay60us(void)						//延时60微秒子函数
{
uchar i;
for(i=0;i<15;i++);
}
//***************************************************
void write0TS(void)						//写DS18B20数据位0
{
TSOR=1;
TSOR=0;
delay15us();delay15us();delay15us();delay15us();
TSOR=1;
_nop_();
_nop_();
}
//********************************************************
void write1TS(void)					//写DS18B20数据位1
{
TSOR=1;
TSOR=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
TSOR=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
delay15us();delay15us();delay15us();
}
//******************************
bit readTS(void)						//读DS18B20数据位
{
bit b;
TSOR=1;
TSOR=0;
_nop_();_nop_();_nop_();_nop_();
TSOR=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
b=TSOR;
delay15us();delay15us();delay15us();
_nop_();_nop_();
return b;
}
//*************************************
void resetTS(void)						//复位DS18B20
{uchar i;
TSOR=1;
TSOR=0;
for(i=0;i<8;i++)delay60us();
TSOR=1;
while(TSOR);
for(i=0;i<8;i++)delay60us();
}
//***************************************
void writeBTS(uchar byte)				//写1字节
{uchar i;
for(i=0;i<8;i++)
{
if(byte&0x01)
write1TS();
else
write0TS();
byte=byte>>1;
}
}
//****************************************
uchar readBTS(void)						//读1字节
{uchar i,j;
bit b;
j=0;
for(i=0;i<8;i++)
{
b=readTS();
if(b)j+=1;
j=_cror_(j,1);
}
return j;
}
//************************************************
void initTS(void)					//初始化DS18B20
{
resetTS();
writeBTS(0xcc);
writeBTS(0x4e);
writeBTS(0x64);
writeBTS(0x8a);
writeBTS(0x1f);
}
//******************************************************
void gettempTS(void)					//读取测得的环境温度
{
resetTS();
writeBTS(0xcc);
writeBTS(0x44);
delay(200);
resetTS();
writeBTS(0xcc);
writeBTS(0xbe);
temp2=readBTS();
temp1=readBTS();
readBTS();readBTS();readBTS();readBTS();
readBTS();readBTS();readBTS();
temp1=temp1<<4;
temp1+=(temp2&0xf0)>>4;
temp2=(temp2&0x0f)?5:0;
}

//********主函数*********
void main(void)
{
delay(500);                      //延时500ms,等电源稳定
InitLcd();                        //LCM初始化
init_timer0();//初始化定时器T0
DisplayListChar(0,0,str0);// 显示预定行
DisplayListChar(0,1,str1);
initTS();//初始化DS18B20
reset()
for(;;)
{
//========================
switch(set)				//LCD根据工作模式进行显示
{
case 0:fun0();break;// 正常工作显示
case 1:fun1();break; //调整时显示
case 2:fun2();break;// 调整分显示
case 3:fun3();break; //设置控温值显示
default:break;
}
delay(300);
gettempTS();			//读取测得的环境温度
if(ON_OFF==1)			// 若控温标志为1,控制压缩机动作
{
	if(temp1>=T+1){delay(1000);//
		 	if(temp1>=T+1){outflag=1;OUT=0;}//测得的温度大于等于控温值+1度时,
//压缩机启动致冷
				}
	if(temp1<T){delay(1000);
			if(temp1<T){outflag=0;OUT=1;} //测得的温度小于控温值时,
//压缩机停止工作
				}
}
else // 否则控温标志为0,压缩机停止工作
{outflag=0;OUT=1;}
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -