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

📄 1602液晶显示ds1302+s51时钟+温度显示 源程序.txt

📁 1602液晶显示DS1302+S51时钟+温度显示 源程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
//声明:在“苹果”兄的程序的基础上增加温度控制功能2005/6/6
//更新历史:
//     增加温度显示,调整时闪动。12/1
//     增加零下温度显示     12/15

/*============================================================
使用1602液晶显示DS1302+S51时钟+温度显示   2004/12/01
============================================================== 
声明:1. 1602驱动程序照搬 明皓 的,非常好用
   2. DS1302驱动程序是参考网友修改而来   

SMC1602A(16*2)模拟口线接线方式
连接线图: 
---------------------------------------------------
|LCM-----51  | LCM-----51  | LCM------51 |
---------------------------------------------|
|DB0-----P1.0 | DB4-----P1.4 | RS-------P2.0 |
|DB1-----P1.1 | DB5-----P1.5 | RW-------P2.1 |
|DB2-----P1.2 | DB6-----P1.6 | E--------P2.2 |
|DB3-----P1.3 | DB7-----P1.7 | VLCD接1K电阻到GND|
---------------------------------------------------
DS1302 接线图

     Vcc2 CLK I/O /RST 
      
      |  |  |  |
      --------------
     | 8  7  6  5|
     |  DS1302   |
     |       |
     | 1  2  3  4|
      --------------
      |  |  |  |
     VCC1      GND

1 脚接+5V  2,3脚32768HZ晶振 4脚接地 5脚接S51的P02 6脚接S51的P01 7接S51的P00
8脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容
电压在2.5V以上即可维持

按键说明:1. 共三个键,低电平有效
     2. P04 和 P05 同时按:初始化
     3. P06 端口按键:选择要调整的项目
     4. P05 端口按键:增加;P04端口按键:减少
     5. P03 端口按键:选择显示模式;新增按键


[注:AT89S51使用12M晶振]
=============================================================*/
#include <AT89x51.h>
#include <string.h>
#include<intrins.h>

#define LCM_RS P2_0 //定义引脚
#define LCM_RW P2_1
#define LCM_E P2_2
#define LCM_Data P1
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
#define uchar unsigned char

uchar id,timecount,dipsmodid;
bit lmcinit_or_not; //是否需要清屏标志位“1”为需要“0”为不需要
bit flag,sflag; //flag是时钟冒号闪烁标志,sflag是温度负号显示标志
void Disp_line1(void); //显示屏幕第一行 
void Disp_line2(void); //显示屏幕第二行
void id_case1_key();
//void Dispmod_id_case_key(void);//选择显示模式
void Disp_mod0(void);//显示模式0
void Disp_mod1(void);//显示模式


//*********** DS1302 时间显示定义部分
sbit T_CLK=P0^0;
sbit T_IO =P0^1;
sbit T_RST=P0^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
void Set(uchar,uchar);   //根据选择调整相应项目
void  RTInputByte(uchar);    /* 输入 1Byte */
uchar RTOutputByte(void);    /* 输出 1Byte */
void  W1302(uchar, uchar);  // 向DS1302写入一个字节
uchar R1302(uchar);     // 从DS1302读出一个字节
void  Set1302(unsigned char * ); // 设置时间 
bit sec,min,hour,year,mon,day,weekk; //闪烁标志位
//初始化后设置为:04年12月2日星期4 0点0分0秒
unsigned char inittime[7]={0x00,0x00,0x00,0x02,0x12,0x04,0x04};
//             秒 分钟 小时 日  月  年 星期

//***** 18B20温度显示定义部
sbit DQ=P0^7; //18B20 接P07口
typedef unsigned char byte;
typedef unsigned int word;
Read_Temperature(char,char);
void mychar(void);
byte ow_reset(void);
byte read_byte(void);
void write_byte(char val);
void adjust_res(char res); //res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
              //       0.5, 0.25, 0.125  

//*******温度控制部分*********
bit tl_flash_flag;    //下限闪烁标志
bit th_flash_flag;    //上限闪烁标志
bit tl_flag;        //下限越限标志 
bit th_flag;        //上限越限标志 
bit tl_sign,th_sign; //温度零下标志 0:零上,1:零下
char tempid;
void Disp_Temp(void);  //显示上下限温度
void Set_TH_Temp(void); //设置温度上限
void Set_TL_Temp(void); //设置温度下限
signed char tl=20,th=45;
void Compare_Temp(signed char l,signed char h);   //比较温度
void Tl_Al(void);     //下限越限报警
void Th_Al(void);     //上限越限报警



//******* 1602LCD驱动 **********************************************************
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
unsigned char code week[]={"Week."};


void main(void)
{ 
 Delay400Ms(); //启动等待,等LCM讲入工作状态
 LCMInit(); //LCM初始化
 Delay5Ms(); //延时片刻(可不要)
 mychar();
 TMOD=0x01;
 TH0=(65535-50000)/256;
 TL0=(65535-50000)%256;
 EA=1;
 TR0=1;
 ET0=1; 
 W1302(0x90,0xa5);//打开充电二级管 一个二级管串联一个2K电阻 
 W1302(0x8e,0x80);//写保护,禁止写操作 
 adjust_res(0x1f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125
 while(1)
  {       
if (P0_3==0)
   {dipsmodid++;
  lmcinit_or_not=1;
    if(dipsmodid>2) dipsmodid=0;
    while(P0_3==0);
   }
   switch(dipsmodid)
   {
    case 0:
    Disp_mod0();
    break;
    case 1:
    Disp_mod1();
    break;
   }
  }
}
/*//选择显示模?
void Dispmod_id_case_key()
{
if (P0_3==0)
 {dipsmodid++;
  if(dipsmodid>1) dipsmodid=0;
 }
}*/
//显示模式0
void Disp_mod0(void)
{
if(lmcinit_or_not==1)
 {LCMInit();
  lmcinit_or_not=0;
 }
if ((P0_4|P0_5)==0) //初始化
 {
  Delay5Ms();
  if ((P0_4|P0_5)==0) Set1302(inittime);
 }
//mychar(); //显示自定义字符
if (P0_6==0) // 设置和选择项目键
   {
    Delay5Ms();
    if(P0_6==0){id++;if(id>7) id=0;}
    while(P0_6==0);  
   }
   switch(id)
   {
    case 0:
     sec=0;
     Disp_line1(); Disp_line2();
     break;
    case 1://年
     year=1;
     Disp_line1(); Disp_line2();         
     id_case1_key();
     break;
    case 2://月
     year=0;mon=1;
     Disp_line1(); Disp_line2();         
     id_case1_key();
     break;
    case 3://日
     mon=0;day=1;
     Disp_line1(); Disp_line2();
     id_case1_key();
     break;       
    case 4://星期
     day=0;weekk=1;
     Disp_line1(); Disp_line2();     
     id_case1_key();
     break;
    case 5://小时
     weekk=0;hour=1;
     Disp_line1(); Disp_line2(); 
     id_case1_key();   
     break;    
    case 6://分钟
     hour=0;min=1;
     Disp_line1(); Disp_line2(); 
     id_case1_key();
     break;
    case 7://秒
     min=0;sec=1;
     Disp_line1(); Disp_line2();       
     id_case1_key();
     break;       
   }
}
//显示模式1
void Disp_mod1(void)
{
if(lmcinit_or_not==1)
 {LCMInit();
  lmcinit_or_not=0;
 }
Read_Temperature(1,0);
DisplayOneChar(0,1,'T');
DisplayOneChar(1,1,'L');
DisplayOneChar(2,1,':');
DisplayOneChar(7,1,'T');
DisplayOneChar(8,1,'H');
DisplayOneChar(9,1,':');
if(P0_6==0)
 { 
  if(P0_6==0)
   {
   tempid++;
   if(tempid>2) tempid=0;
   while(P0_6==0);
   }
 }
switch(tempid)
 {
  case 0:
  tl_flash_flag=0;
  th_flash_flag=0;
  Disp_Temp();
  break;
  case 1:
  tl_flash_flag=1;
  th_flash_flag=0;
  Disp_Temp();
Set_TL_Temp(); 
  break;
  case 2:
  tl_flash_flag=0;
  th_flash_flag=1;
  Disp_Temp();
  Set_TH_Temp();
  break;
 }
Compare_Temp(tl,th);
Tl_Al();
Th_Al();
}

//显示上下限温度
void Disp_Temp(void)
{

unsigned char tl_gw,tl_sw,tl_bw; //下限温度的个位,十位,百位
unsigned char th_gw,th_sw,th_bw; //上限温度的个位,十位,百位

tl_sign=tl>>7;
if(tl_sign)
 {
  tl_bw=(~(tl-1))/100; //计算百位
  tl_sw=((~(tl-1))-tl_bw*100)/10; //计算十位
  tl_gw=(~(tl-1))-tl_bw*100-tl_sw*10; //计算个位
 }
else
 {
  tl_bw=(tl)/100;     
  tl_sw=(tl-tl_bw*100)/10;
  tl_gw=tl-tl_bw*100-tl_sw*10;
 }

if(tl_flash_flag==1)
 {
  if(flag==1)
  {if(tl_sign)
 {
  DisplayOneChar(3,1,0x2d);
    DisplayOneChar(4,1,tl_sw+0x30); 
    DisplayOneChar(5,1,tl_gw+0x30);
 }
else
 {
  DisplayOneChar(3,1,tl_bw+0x30);
    DisplayOneChar(4,1,tl_sw+0x30); //显示下限温度
    DisplayOneChar(5,1,tl_gw+0x30);
   } 
  }
  else
  {DisplayOneChar(3,1,0x20);
   DisplayOneChar(4,1,0x20); //显示下限温度
   DisplayOneChar(5,1,0x20);  
  }
 }
else
 {
  DisplayOneChar(3,1,tl_bw+0x30);
  DisplayOneChar(4,1,tl_sw+0x30); //显示下限温度
  DisplayOneChar(5,1,tl_gw+0x30);
 }

 
 th_sign=th>>7;
 if(th_sign)
  {
  th_bw=(~(th-1))/100; //计算百位
  th_sw=((~(th-1))-th_bw*100)/10; //计算十位
  th_gw=(~(th-1))-th_bw*100-th_sw*10; //计算个位
  }
 else
  {
  th_bw=(th)/100;     
  th_sw=(th-th_bw*100)/10;
  th_gw=th-th_bw*100-th_sw*10;
  }


if(th_flash_flag==1)
 {
  if(flag==1)
  {if(th_sign)
 {
    DisplayOneChar(10,1,0x2d);
    DisplayOneChar(11,1,th_sw+0x30); //显示下限温度
    DisplayOneChar(12,1,th_gw+0x30); 
 }
else
 {
    DisplayOneChar(10,1,th_bw+0x30);
    DisplayOneChar(11,1,th_sw+0x30); //显示下限温度
    DisplayOneChar(12,1,th_gw+0x30); 
   }
  }
  else
  {
DisplayOneChar(10,1,0x20);
   DisplayOneChar(11,1,0x20); //显示下限温度
   DisplayOneChar(12,1,0x20);  
  }
 }
else
 {
  DisplayOneChar(10,1,th_bw+0x30);
  DisplayOneChar(11,1,th_sw+0x30); //显示下限温度
  DisplayOneChar(12,1,th_gw+0x30);   
 }
}

//设置温度下限
void Set_TL_Temp(void)
{
if(P0_5==0)
 {
  Delay5Ms();
  if(P0_5==0)
  {
tl++;
if(tl>125) tl=-55;
//if(tl<-55) tl=155;
}
  while(P0_5==0);
 }
if(P0_4==0)
 {
  Delay5Ms();
  if(P0_4==0)
  {
tl--;
if(tl<-55) tl=125;
}
 }
}

//设置温度上限
void Set_TH_Temp(void)
{
if(P0_5==0)
 {
  Delay5Ms();
  if(P0_5==0)
  {
th++;
if(th>125) th=-55;
//if(tl<-55) tl=155;
}
  while(P0_5==0);
 }
if(P0_4==0)
 {
  Delay5Ms();
  if(P0_4==0)
  {
th--;
if(th<-55) th=125;
}
 }
}

void Compare_Temp(signed char l,signed char h)   //比较温度
{
 unsigned char tl_temp;
 unsigned char y,s;
 //unsigned int x;
 //unsigned char ct[8];
 union{byte c[2]; int x;}temp;
 
 ow_reset();
 write_byte(0xCC); // Skip ROM
 write_byte(0x44); // 转换温度
 ow_reset();
 write_byte(0xCC); //Skip ROM
 write_byte(0xbe); // 读取寄存器
 temp.c[1]=read_byte();//读出温度低8位
 temp.c[0]=read_byte();//读出温度高8位

 // 零下温度判断
 sflag=0; //温度零下标志 0:零上,1:零下
 if((temp.c[0]&0xf8)!=0x00)
  {
  sflag=1; //零下标志位置1
  temp.c[1]=~temp.c[1]; //低8位取反
  temp.c[0]=~temp.c[0]; //高8位取反
  tl_temp=temp.c[1]+1; //低8位加1 
  temp.c[1]=tl_temp;  //计算后重新存入数组
  if(tl_temp>255) temp.c[0]++; //如果低8位大于255,向高8位进1
  }
 y=0;
 s=0;
 y=temp.c[0]<<4; 
 s=temp.c[1]>>4;
 y=s|y;
 //x=((temp.c[0]&0x07)*256+temp.c[1])*.625;
 if(y<l)
  
  tl_flag=1;
  
 else
  
  tl_flag=0;
  
 if(y>h)
  
  th_flag=1;
  
 else
  
  th_flag=0;
  
}

void Tl_Al(void)     //下限越限报?
{
if(tl_flag==1)
 {
  if(flag==1)
  {  
   DisplayOneChar(9,0,'A'); 
   DisplayOneChar(10,0,'L');    
  }
  else
  {
   DisplayOneChar(9,0,0x20); 
   DisplayOneChar(10,0,0x20);  
  }
 } 
else
 {
  DisplayOneChar(9,0,0x20); 
  DisplayOneChar(10,0,0x20);     
 }
}

void Th_Al(void)     //上限越限报警
{
if(th_flag==1)
 {
  if(flag==1)
  {  
   DisplayOneChar(13,0,'A'); 
   DisplayOneChar(14,0,'H');    
  }
  else
  {
   DisplayOneChar(13,0,0x20); 
   DisplayOneChar(14,0,0x20);  
  }
 } 
else
 {
  DisplayOneChar(13,0,0x20); 
  DisplayOneChar(14,0,0x20);     
 }
}



//中断入口,冒号闪烁
void t0(void) interrupt 1 using 0
{
 TH0=(65535-50000)/256; //50ms定时
 TL0=(65535-50000)%256; 
 timecount++;
 if(timecount>9)
  {

⌨️ 快捷键说明

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