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

📄 main.c

📁 nokia3310多功能温度计设计
💻 C
字号:
/*这是一个温度计的源代码,它能实时测量当前温度,并可以根据需要将一段时间的温度
数值保存下来温度数值通过LCD屏幕显示。它还包括一个时钟。用它可以定时测量温度值,
本温度计可用于大篷蔬菜的温度控制中,系统还可以通过需要可以扩展.下面位这一温度计
的源代码。*/

#include <config.h>

//外部函数
//-------------------delay.c--------------------------------
extern void delay(unsigned int delay_time);   //延时子程序
//------------------LPH7366.c--------------------------------
#define COM  0  //指令
#define DAT  1  //数据
#define STR  1  //字符
extern void LPH7366_init();  //LPH7366初始化
extern void LPH7366_flash(unsigned int delay_time);  //LPH7366闪屏函数
extern void LPH7366_write(unsigned char type,unsigned char in_data);  //LPH7366写函数
extern void LPH7366_clr();  //显示屏幕清屏
extern void LPH7366_write_str(unsigned char line,unsigned char row,unsigned char str); //LPH7366任意写入字符函数
extern void LPH7366_write_han(unsigned char symbol_line,unsigned char symbol_row,unsigned char han);  //任意写入汉字函数
extern void LPH7366_write_doc(unsigned char symbol_line,unsigned char symbol_row,unsigned char doc);  //任意写入一个字节函数
extern void data_tick(unsigned char i_data);  //数据拆分函数
extern unsigned char row(unsigned char stye,unsigned char i);  //计算屏幕的列地址   类型 
extern unsigned char ge,shi;  //数据拆分
extern bit data_flag;  //是否动态显示数据标志位 0:不动态  1:动态
//------------------------time.c--------------------------------
extern void time_init();  //时间初始化
extern struct time
{ 
  unsigned char hour;
  unsigned char minute;
  unsigned char second;
}local_time,alarm_time,temp_time;
extern bit second_flag;   //秒信号标志
//------------------------温度图.c------------------------------
extern void pic_temp();    //温度主画面
extern void pic_temp_face_move();  //脸部表情选择
extern unsigned char face_flag;  //人脸表情标志位 1:笑脸 2:闭嘴 3:苦恼 4:讲话 5:伤心 6:惊讶 7:沉默
//-------------DS18B20.C-------------------
extern void DS18B20_init();  //DS18B20初始化
extern void DS18B20_send(unsigned char in_data); //DS18B20发送数据
extern void ReadTemperature();  //DS18B20读取温度转换好的数据
extern void temp_data_turn(float in_data); //DS18B20读取温度转换
extern bit T_sign;   //温度正负符号
extern float temp;  //转换好的温度数值
extern unsigned char t_bai,t_shi,t_ge,t_feng; //温度转换好的各个位
extern signed char temp_TH,temp_TL;  //温度上下限
//------------DS18B20控制命令-----------------------------
#define T_CONVER 0x44  //开始温度转换
#define T_CONFIG 0x5f  //11位转换
#define T_READ 0xbe    //读暂存器
#define T_WRITE 0x4e   //写暂存器
#define T_ROM_JMP 0xcc  //忽略64ROM地址
#define T_COPY_E2 0x48  //将温度上下限数值写到E2ROM
#define T_RECALL_E2 0xb8  //将E2中存储的温度上下限数值复制到上下限寄存器中。
#define T_cont  0.0625  //温度转换常数
//---------------keyB.c---------------------------
extern key_main();  //主键盘
//------------------------------------------------
//内部函数
void time_move(); //时间部分动画
void temp_move(); //温度部分动画 
void temp_display(); //温度显示
void temp_bar_move(); //温度条部分动画
void data_clr();  //行33-58清零函数
void tick_time_temp();  //检查设置参数
bit sign_cross=0; //正负符号交叉标志位
bit ring_flag=1;  //闹铃
unsigned char alarm_tick_time=0;  //警报对比次数
sbit LED=P1^5;
sbit SPK=P1^6;
unsigned char temp_bar[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};  //温度条显示


/****************************主函数**************************/
/*函数原型:void main()
/*函数功能:程序起始
/*输入参数:无
/*输出参数:无
/*调用模块:LPH7366_init(),LPH7366_clr(),time_init(),pic_temp(),LPH7366_write_str(),LPH7366_write_han(),LPH7366_write_doc()
pic_temp_face_move(),time_move(),temp_bar_move(),key_main()
/************************************************************/
void main()
{
   LPH7366_init();  //显示屏幕初始化
   LPH7366_clr();  //屏幕白屏
   time_init();   //定时器0初始化
  
    pic_temp();    //温度主画面
    
    LPH7366_write_str(1,4,'D');  //设计标题 DX Temp
    LPH7366_write_str(1,5,'X');
    LPH7366_write_str(1,6,' ');
    LPH7366_write_str(1,7,'T');
    LPH7366_write_str(1,8,'e');
    LPH7366_write_str(1,9,'m');
    LPH7366_write_str(1,10,'p');

    LPH7366_write_han(2,1,0);   //显示 气温:    C
    LPH7366_write_han(2,2,1);
    LPH7366_write_doc(4,25,0x36);  //:
    LPH7366_write_doc(4,26,0x36);

    time_init();  //定时器0初始化
		
    while(1)  //温度图动画部分
   { 
     data_flag=1;  //动画显示  影响LPH7366_write_str()函数

	 pic_temp_face_move();  //人脸表情
     
	 time_move();  //时间部分动画

	 temp_move();  //温度部分动画

	 temp_bar_move();  //温度条部分动画

	 key_main();  //主键盘

	 tick_time_temp();  //查询各个参数是否到了设定数值
     
	 if(temp_TL<temp&&temp<temp_TH)  //室温在正常范围内
	{ 
	  LED=1;
      face_flag=1;  //笑脸
	}
   }
}

/***********************时间部分动画函数*********************/
/*函数原型:void time_move()
/*函数功能:时间部分动画
/*输入参数:无
/*输出参数:无
/*调用模块:data_tick(),LPH7366_write_str()

/************************************************************/
void time_move()
{
     data_tick(local_time.hour);
     LPH7366_write_str(6,1,(shi+16));
	 LPH7366_write_str(6,2,(ge+16));

     if(second_flag==1)
     LPH7366_write_str(6,3,26);  //:
	 else
     LPH7366_write_str(6,3,0);  // 

     data_tick(local_time.minute);
     LPH7366_write_str(6,4,(shi+16));
	 LPH7366_write_str(6,5,(ge+16));

     if(second_flag==1)
     LPH7366_write_str(6,6,26);  //:
	 else
     LPH7366_write_str(6,6,0);  // 

	 data_tick(local_time.second);
     LPH7366_write_str(6,7,(shi+16));
	 LPH7366_write_str(6,8,(ge+16));

     if(ring_flag==1)
	 {
	  LPH7366_write_str(6,9,0x00);  //显示空格
      LPH7366_write_str(6,10,10);  //显示*  闹铃标志
	 }
     else
	 {
	  LPH7366_write_str(6,9,0x00);  //显示空格
      LPH7366_write_str(6,10,0);  //显示空格 
	 }

}

/****************************温度部分动画函数*****************/
/*函数原型:void temp_move()
/*函数功能:温度部分动画
/*输入参数:无
/*输出参数:无
/*调用模块:ReadTemperature(),temp_data_turn(),temp_display()

/************************************************************/
void temp_move()  
{
  data_flag=1;  //动态显示

  ReadTemperature();  //读温度	   	 

  temp_data_turn(temp); //转换温度数值

  temp_display();
} 

/**************************温度显示函数**********************/
/*函数原型:void temp_move()
/*函数功能:温度显示
/*输入参数:无
/*输出参数:无
/*调用模块:data_clr(),LPH7366_write_str(),LPH7366_write_doc()

/************************************************************/
void temp_display()
{
   if(T_sign==0)   //正数
 {  
    if(sign_cross==1)
	{
	 data_clr();
	 sign_cross=0;
	}
    if(t_bai!=0)
  { 
	  LPH7366_write_str(4,5,(t_bai+16));
	  LPH7366_write_str(4,6,(t_shi+16));
	  LPH7366_write_str(4,7,(t_ge+16));
	
	LPH7366_write_doc(4,46,0x01);  //C
    LPH7366_write_doc(4,47,0x3c);
    LPH7366_write_doc(4,48,0x42);
    LPH7366_write_doc(4,49,0x42);
    LPH7366_write_doc(4,50,0x42);
  }
 
    else
  { 
    LPH7366_write_str(4,5,(t_shi+16));
    LPH7366_write_str(4,6,(t_ge+16));
  	LPH7366_write_doc(4,39,0x80);  //小数点
    LPH7366_write_str(4,7,(t_feng+16));

	LPH7366_write_doc(4,46,0x01);  //C
    LPH7366_write_doc(4,47,0x3c);
    LPH7366_write_doc(4,48,0x42);
    LPH7366_write_doc(4,49,0x42);
    LPH7366_write_doc(4,50,0x42);
  }
 }

   else    //是负数
 {  
   if(sign_cross==0)
	{
	 data_clr();
	 sign_cross=1;
	}
   if(t_bai!=0)
  { 

	  LPH7366_write_str(4,5,13); //负号
      LPH7366_write_str(4,6,(t_bai+16));
      LPH7366_write_str(4,7,(t_shi+16));
      LPH7366_write_str(4,8,(t_ge+16));


	LPH7366_write_doc(4,52,0x01);  //C
    LPH7366_write_doc(4,53,0x3c);
    LPH7366_write_doc(4,54,0x42);
    LPH7366_write_doc(4,55,0x42);
    LPH7366_write_doc(4,56,0x42);
  }
 
    else
  {  
	 
     LPH7366_write_str(4,5,13);  //负号
     LPH7366_write_str(4,6,(t_shi+16));
     LPH7366_write_str(4,7,(t_ge+16));
 	 LPH7366_write_doc(4,45,0x80);  //小数点
     LPH7366_write_str(4,8,(t_feng+16));   

	LPH7366_write_doc(4,52,0x01);  //C
    LPH7366_write_doc(4,53,0x3c);
    LPH7366_write_doc(4,54,0x42);
    LPH7366_write_doc(4,55,0x42);
    LPH7366_write_doc(4,56,0x42);
  }
 }
}

/***********************温度条部分动画函数*******************/
/*函数原型:void temp_bar_move()
/*函数功能:温度部分动画
/*输入参数:无
/*输出参数:无
/*调用模块:LPH7366_write_doc()

/************************************************************/
void temp_bar_move()
{
  unsigned char k,i,n,j,l;
  k=(unsigned char)temp;
  i=k/8;  //几行
  n=k%8;  //几小行

   if(i>=0&&i<=5)
  { if(i>0)
   {for(j=5;j>(5-i);j--)
    {
    LPH7366_write_doc(j,80,temp_bar[7]);  //正行全显
	for(l=1;l<=(5-i);l++)  //清除上面不显示的,主要是为了清楚以前残留显示
	LPH7366_write_doc(l,80,0x00);
    }
   }
   if(n>0)   //一行显示都不到
   LPH7366_write_doc((5-i),80,temp_bar[n-1]);
  }

   LPH7366_write_doc(1,80,0x04);  //确保温度条图形完整
}

/***********************行33-58清零函数**********************/
/*函数原型:void data_clr()
/*函数功能:行33-58清零函数
/*输入参数:无
/*输出参数:无
/*调用模块:LPH7366_write_doc()

/************************************************************/
void data_clr()
{
 unsigned char i;
 for(i=33;i<59;i++)
 {
  LPH7366_write_doc(4,i,0x00);
 }
}

/***********************检查设置参数函数**********************/
/*函数原型:void tick_time_temp()
/*函数功能:检查设置参数
/*输入参数:无
/*输出参数:无
/*调用模块:delay()

/************************************************************/
void tick_time_temp()
{
  if(ring_flag==1)
 { if(alarm_time.hour==local_time.hour)  //定时时间到
  {
    if(alarm_time.minute==local_time.minute)
	{
	  if(local_time.second<30)
	  {
	   SPK=~SPK;
	   face_flag=4;  //讲话
	  }
	  else
	  SPK=0;
	}
  }
 }

  if(temp_time.hour==local_time.hour) //定时采集温度数值
  {
    if(temp_time.minute==local_time.minute)
	{
	  temp_move();  //温度部分动画
	  face_flag=7;  //沉默
	}
  }

  if(temp>(temp_TH+0.5))  //超过温度上限数值
  {
    alarm_tick_time++;
	if(alarm_tick_time==10)  //如果连续10次都检测到同一报警值,则动作.
    {
	 alarm_tick_time=0;
	 LED=0;
	 face_flag=6;  //惊讶
	}
  }

  if(temp<(temp_TL-0.5)) //超过温度下限数值
  { 
    alarm_tick_time++;
	if(alarm_tick_time==10)
    {
	 alarm_tick_time=0;
     LED=~LED;
	 face_flag=3;  //苦恼
     delay(2000);
	}
  }

}


⌨️ 快捷键说明

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