基于51单片机的空调温度控制器protues仿真

硬件设计

链接:https://pan.baidu.com/s/16tmc8y_PFl0aLpR7g9MFlA
提取码:w2ux
在这里插入图片描述

代码设计

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char//宏定义
#define uint unsigned int
全局变量/
float  TEMP_NOW=0.0;
float  TEMP_SET=21.0;
uint  T_Count=0;
uint  S_Count=0;
uint  P_Count=0;
uint  N_Count=0;
uint  M_Count=1;


#define		K_UP		    0X20//定义键值
#define		K_DOWN		 0X21
#define		K_CLEAR 	    0X24
#define		K_OK		    0X25
#define		K_ONE		    0X30
#define		K_FOUR		 0X31
#define		K_SEVEN	    0X32
#define		K_POINT		 0X33
#define		K_TWO		    0X34
#define		K_FIVE		    0X43
#define		K_EIGHT		0X36
#define		K_ZERO		0X37
#define		K_THREE		0X38
#define		K_SIX		    0X40
#define		K_NINE		0X41
#define		K_SET		   0X42
extern float TEMP_NOW;
extern float TEMP_SET;
extern uint  T_Count;
extern uint  S_Count;
extern uint  P_Count;
extern uint  N_Count;
extern uint  M_Count;
extern uchar Current_Temp_Display_Buffer[];
extern uchar set_Temp_Display_Buffer[];
extern int sel;
sbit  lcden=P2^7;//液晶使能
sbit  lcdrs=P2^6;//液晶数据/命令选择端
sbit  DQ   =P3^7;//DS18B20数据端
sbit  XX   =P2^5;//读写选择端
sbit  cold =P2^0;//输出信号
sbit  warm =P2^1;//输出信号
uchar Current_Temp_Display_Buffer[]={"   NOW: 00.0"};
uchar set_Temp_Display_Buffer[]=    {"   SET: 38.0"};
int sel=0;							

uchar code KeyCodeTable[]=
{
  	0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88
};


#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}

uchar code Temperature_Char[8] = {0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};
uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar CurrentT = 0;
uchar Temp_Value[]={0x00,0x00};
uchar Display_Digit[]={0,0,0,0};

bit DS18B20_IS_OK = 1;

void Read_Temperature();
void Display_Temperature();

void Comparison();
//定时///
void timer0_init(void)
{
	TMOD =	0x00  ; //设置定时器0的工作方式
	TH0 = (8192-5000)/32;//单片机晶振为12MHz,机器周期为1us,t=5ms,
                      //N=5000/1=5000
	TL0 = (8192-5000)%32;
	IE  =	0x82;
	TR0=1;			
}
void timer0() interrupt 1 
{	    				
	TH0 = (8192-5000)/32;
	TL0 = (8192-5000)%32; 
	if(++T_Count == 100)		   //100为0.5s	  
	{  	 
		TR0=0;				
		Read_Temperature();
		Display_Temperature() ;
		T_Count=0;
		if(++P_Count == 6)
		{
			 N_Count=1;
		}
	   	TR0=1;
	}
}
void delay1(uint z)	  //延时函数
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}
void write_com(uchar com)  //写命令函数
{
	lcdrs=0;  //选择写命令模式
	P0=com;	  //将要写的命令字送到数据总线上
	delay1(5); //稍作延时以待数据稳定
	lcden=1;  //使能端给一高脉冲,因为初始化函数中已经将lcden置零
	delay1(5); //稍作延时
	lcden=0;  //将使能端置0完成高脉冲
}
void write_date(uchar date)	 //写数据函数
{
	lcdrs=1;   //选择写数据模式
	P0=date;
	delay1(5);
	lcden=1;
	delay1(5);
	lcden=0;
}
void init_lcd()		   //初始化函数
{
	lcden=0;
	write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
	write_com(0x0c); //设置开显示,不显示光标
	write_com(0x06); //写一个字符后地址指针加1
	write_com(0x01); //显示清0,数据指针清0
}
void Print()
{
	uchar num;
	write_com(0x80);
	for(num=0;num<12;num++)
	{
		write_date(Current_Temp_Display_Buffer[num]);
	}
	write_date(0xdf);
	write_date('C');
	write_com(0x80+0x40);
	for(num=0;num<12;num++)
	{
	 	write_date(set_Temp_Display_Buffer[num]);
	}
	write_date(0xdf);
	write_date('C');
}


void Delay_INI(uint x)
{
 	while(--x);
}

void Delay(unsigned int n)	
{
	do
	{
		_nop_();_nop_();
		_nop_();_nop_();
		_nop_();_nop_();
		_nop_();_nop_();
		_nop_();
		n--;
	}while(n);
}


uchar Init_DS18B20()
  {
 	uchar status;
	DQ = 1;
	Delay_INI(8);
	DQ = 0;
	Delay_INI(90);
	DQ = 1;
	Delay_INI(8);
	status=DQ;
	Delay_INI(100);
	DQ = 1;
	return status;
}

uchar ReadOneByte()
{
 	uchar i,dat=0;
	DQ = 1;
	_nop_();
	for(i=0;i<8;i++)
	{
	 	DQ = 0;
		dat >>= 1;
		DQ = 1;
		_nop_();
		_nop_();
		if(DQ)
			dat |= 0X80;
		Delay(30);
		DQ = 1;
	}
	return dat;
}

void WriteOneByte(uchar dat)
{
 	uchar i;
	for(i=0;i<8;i++)
	{
	 	DQ = 0;
		DQ = dat& 0x01;
		Delay(5);
		DQ = 1;
		dat >>= 1;
	}
}
void Read_Temperature()
{
 	if(Init_DS18B20()==1)
		DS18B20_IS_OK=0;
	else
	{
		WriteOneByte(0xcc);
		WriteOneByte(0x44);
		Init_DS18B20();
		WriteOneByte(0xcc);
		WriteOneByte(0xbe);
		Temp_Value[0] = ReadOneByte(); 
		Temp_Value[1] = ReadOneByte();
		DS18B20_IS_OK=1;	
	}	
}
void Display_Temperature()
{
	uchar t = 150, ng = 0;
	if((Temp_Value[1]&0xf8)==0xf8)
	{
	 	Temp_Value[1] = ~Temp_Value[1];
		Temp_Value[0] = ~Temp_Value[0]+1;
		if(Temp_Value[0]==0x00)
			Temp_Value[1]++;
		ng = 1;	
	}
	Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];
	CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);
	Display_Digit[3] = CurrentT/100;
	Display_Digit[2] = CurrentT%100/10;
	Display_Digit[1] = CurrentT%10;
	Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';
	Current_Temp_Display_Buffer[10] = '.';
	Current_Temp_Display_Buffer[9]  = Display_Digit[1] + '0';
	Current_Temp_Display_Buffer[8]  = Display_Digit[2] + '0';
	Current_Temp_Display_Buffer[7]  = Display_Digit[3] + '0';

	TEMP_NOW=Display_Digit[2]*10+Display_Digit[1]+Display_Digit[0]*0.1	 ;

	if(Display_Digit[3] == 0)
		Current_Temp_Display_Buffer[7]  = ' ';
	if(Display_Digit[2] == 0&&Display_Digit[3]==0)
		Current_Temp_Display_Buffer[8]  = ' ';
	if(ng)
	{
		TEMP_NOW=-(Display_Digit[2]*10+Display_Digit[1]+Display_Digit[0]*0.1);

	 	if(Current_Temp_Display_Buffer[8]  == ' ')
			Current_Temp_Display_Buffer[8]  = '-';
		else if(Current_Temp_Display_Buffer[7]  == ' ')
			Current_Temp_Display_Buffer[7]  = '-';
		else 
			Current_Temp_Display_Buffer[6]  = '-';
	}  	
}
void Delay_key()
{
 	uchar i;
	for(i=0;i<200;i++);
}

uchar Keys_Scan()
{
 	uchar sCode,kCode,k;
	P1 = 0xf0;
	if((P1&0xf0)!=0xf0)
	{
	 	Delay_key();
		if((P1&0xf0)!=0xf0)
		{
		 	sCode = 0xfe;
			for(k=0;k<4;k++)
			{
			 	P1 = sCode;
				if((P1&0xf0)!=0xf0)
				{
				 	kCode = ~P1;
					if(kCode == KeyCodeTable[0]) return K_ONE; 
					else if(kCode == KeyCodeTable[1]) return K_TWO;
					else if(kCode == KeyCodeTable[2]) return K_THREE;
					else if(kCode == KeyCodeTable[3]) return K_FOUR;
					else if(kCode == KeyCodeTable[4]) return K_FIVE;
					else if(kCode == KeyCodeTable[5]) return K_SIX;
					else if(kCode == KeyCodeTable[6]) return K_SEVEN;
					else if(kCode == KeyCodeTable[7]) return K_EIGHT;
					else if(kCode == KeyCodeTable[8]) return K_NINE;
					else if(kCode == KeyCodeTable[9]) return K_UP;
					else if(kCode == KeyCodeTable[10]) return K_DOWN;
					else if(kCode == KeyCodeTable[11]) return K_CLEAR;
					else if(kCode == KeyCodeTable[12]) return K_OK;
					else if(kCode == KeyCodeTable[13]) return K_ZERO;
					else if(kCode == KeyCodeTable[14]) return K_POINT;
					else if(kCode == KeyCodeTable[15]) return K_SET;
				}
				else 
					sCode = _crol_(sCode,1);
			}
		}
	}
	return -1;
}
  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于51单片机的电子时钟项目需要通过Keil编写程序,并使用Proteus进行仿真电路搭建。该项目主要包括以下几个步骤: 1. 硬搭建:按照电子时钟的设计需求,连接51单片机和相关的电子元,如晶体振荡器、数码管、按键等。通过Proteus,可以将这些元连接起来,搭建出完整的电路。 2. Keil程序编写:使用Keil软,编写51单片机的C语言程序。该程序需要实现时钟的功能,包括时、分、秒的显示和计时、调整时间、闹钟功能等。通过编程,可以控制数码管的显示,以及对按键进行响应。 3. Proteus仿真:将编写好的程序通过Proteus连接至搭建好的电路。进行仿真测试时,可以通过模拟时钟的不同状态,调试和验证编写的程序的正确性和稳定性。仿真过程中,可以检查数码管的显示情况,以及程序对按键输入的响应。 4. 优化和调试:根据仿真过程中的结果,对程序进行优化和调试。可能需要根据具体的需求,修改程序中的一些逻辑或代码,确保电子时钟的功能正常运行,并符合设计要求。 总的来说,基于51单片机的电子时钟项目需要通过Keil编写程序,并结合Proteus进行仿真电路搭建和测试。通过这样的开发流程,可以实现一个功能完善、稳定可靠的电子时钟。 ### 回答2: 基于51单片机的电子时钟keil程序和protues仿真电路组成了一个完整的设计方案。 首先,keil程序是用于开发51单片机的集成开发环境,它提供了编译、调试和仿真等功能,能够帮助程序员快速开发出51单片机的应用程序。在电子时钟的设计中,我们可以使用keil来编写单片机的程序代码,实现时钟的各种功能。 其次,protues是一款电子设计自动化软,它提供了电子电路仿真和PCB布局设计等功能,能够帮助我们快速验证电路的正确性。在电子时钟的设计中,我们可以使用protues来建立电子时钟的仿真电路,验证单片机代码的正确性和稳定性。 基于51单片机的电子时钟设计,我们可以使用keil来编写单片机的程序代码,实现时钟的各种功能,包括时间显示、报时功能、闹钟功能等。通过keil的编译、调试和仿真功能,我们可以验证代码的正确性和稳定性。 在电路设计方面,我们可以使用protues来建立电子时钟的仿真电路,通过仿真可以验证电路的正确性和稳定性,包括时钟电路、数码管驱动电路、按钮输入电路等。通过protues的电路仿真功能,我们可以检查电路设计的错误和漏洞,提前解决电路问题。 基于51单片机电子时钟keil程序和protues仿真电路的组合,我们可以全面验证电子时钟的功能和性能,确保设计的准确性和可靠性,为最终实现一个完整的电子时钟设计提供了有力的支持。 ### 回答3: 基于51单片机的电子时钟keil程序和protues仿真电路可以实现以下功能: 1. 显示当前时间:我们可以使用数码管或LCD显示模块来显示当前的时、分和秒。通过编写相应的程序,我们可以从单片机的时钟源获取当前时间,并将其转换为可以在数码管或LCD上显示的格式。 2. 时间调整功能:可以通过按钮或旋钮等输入设备来调整电子时钟的时间。当用户按下或旋转输入设备时,我们可以响应用户的操作,并对时钟的时间进行相应的调整。 3. 闹钟功能:我们可以设置闹钟功能,让电子时钟在特定的时间点发出警报声。通过在程序中设置闹钟时间和警报声的播放方式,我们可以实现这一功能。 4. 温湿度监测:如果我们希望电子时钟能够同时监测室内的温度和湿度,我们可以连接温湿度传感器,并在程序中读取传感器的数据。然后,我们可以将这些数据显示在数码管或LCD上。 程序开发过程中,我们可以使用keil来编写51单片机的程序,通过keil提供的调试工具来测试和调试程序的正确性。同时,我们可以在protues中设计和仿真电子时钟的电路,包括单片机、显示模块、输入设备和传感器等所有的硬。这样,我们可以在protues中验证电路的功能和效果,并进行性能优化和调试。当电路和程序都满足我们的要求后,我们就可以将程序烧录到实际的硬上,并使用它作为一台完整的电子时钟了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值