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

📄 text1.c

📁 DS12C887+LCD128*64液晶电子显示万年历程序
💻 C
字号:
#include "reg52.h"	                   //头文件
#include "absacc.h"
#define TM_SEC    XBYTE[0xFF00]        //ds18b20的为外部存储器地址
#define TM_MIN    XBYTE[0xFF02] 
#define TM_HOU    XBYTE[0xFF04] 
#define DAY       XBYTE[0xFF06] 
#define DATE      XBYTE[0xFF07] 
#define MONTH     XBYTE[0xFF08] 
#define YEAR      XBYTE[0xFF09] 
#define AM_SEC    XBYTE[0xFF01] 
#define AM_MIN    XBYTE[0xFF03] 
#define AM_HOU    XBYTE[0xFF05] 
#define REG_A     XBYTE[0xFF0a] 
#define REG_B     XBYTE[0xFF0b]
#define REG_C     XBYTE[0xFF0c]
#define REG_D     XBYTE[0xFF0d]
 
char  calendar_time[7]={8,04,03,12,23,10,4}; /*设置初始时间 08/4/3 12:23:10 星期4*/            
unsigned char code at[7]={9,8,7,4,2,0,6};   /* 存放年、月、日、时、分、秒 、星期的数组*/
unsigned char xdata *calendar_address=0xff00; //外部存储器的首地址



/********************************************************************/
typedef unsigned char uchar;         //宏定义:将unsigned char定义为 uchar
typedef unsigned int uint;
typedef unsigned long ulong;
#define lcddata P1                   //定义液晶数据口为变量lcddata
#define cls Writecommand(0x01)       //定义清屏为变量cls
sbit lcdrs=P2^7;                     //液晶硬件控制接口
sbit lcdrw=P2^6;
sbit lcdcs=P2^5;
sbit DQ=P2^4;                        //定义温度传感器数据接口为变量DQ

/***********************函数声明*************************************/
void Set_calendar(void);              //设置初始时间子函数
void Read_calendar(void);             //读取时间子函数
void Start_calendar(void);            //启动时钟子函数             
void delay1ms(uint time);             //液晶调用延时1ms的延时函数
void Writecommand(uchar c);           //液晶写指令子函数
void Writedata(uchar Wdata);          //液晶写数据子函数
unsigned char Readstate();            //液晶读状态子函数
void Initialize();                    //液晶初始化子函数
void delay(unsigned int i);           //ds18b20调用延时函数
void Init_DS18B20(void);              //ds18b20调用初始化函数
WriteOneChar(unsigned char dat);      //向DS18b20写一字节数据函数
ReadOneChar(void);                    //向DS18b20读一字节数据函数
unsigned char Readstate(void);        //向DS18b20读温度值子函数


/***************************da12c887设置子函数*********************************/
void Set_calendar(void) //设置系统时间
{
 unsigned char i;
 REG_B=0x80; 
 for(i=0;i<9;i++)
 *(calendar_address+at[i])=calendar_time[i];
}

void Read_calendar(void) //读取系统时间
{
 unsigned char  temp,i;  
 REG_B=0x06;
 do{ temp=REG_A;} 
  while(temp&0x80);
 for(i=0;i<7;i++)
  calendar_time[i]=*(calendar_address+at[i]);    
 }

void Start_calendar(void) //启动时钟
{
 REG_A=0x20;
 REG_B=0x06;
}

/**********************************延时函数**************************************/
void delay1ms(uint time)//延迟1ms*time,这不是一个精确值
{
	uint i;
	uint j;
	for (i=0;i<time;i++)
	{
		for(j=0;j<300;j++);
	}
}

/**********************************写指令****************************************/
void Writecommand(uchar c)//给lcd送命令
{
	lcdrs=0;
	lcdrw=0;
	lcddata=c;	
	lcdcs=1;
	lcdcs=0;
}

/**********************************初始化****************************************/
void Initialize()
  { 
    delay1ms(100);    //初始化延时
    lcdcs=0;          
	lcdrs=1;
	lcdrw=1;
	delay1ms(30);
	Writecommand(0x38);//8位,16*2行,5*7字体
	delay1ms(100);
	Writecommand(0x0c);//显示开,光标关;不闪
	delay1ms(100);
	Writecommand(0x06);//增量方式,现不移动
	delay1ms(100);
	Writecommand(0x01);//清屏
	delay1ms(100);
  }

/**********************************读状态****************************************/
unsigned char Readstate(void)
  { 
   
    lcddata=0xff;
    lcdrs=0;
	lcdrw=1;
	lcdcs=0;
	lcdcs=1;
	while(lcddata&0x80);//确定最高位为一
	return(lcddata);
  }	
	
/**********************************写数据****************************************/

void Writedata(uchar Wdata)
  { 
    Readstate();
	lcddata=Wdata;
	lcdrs=1;
	lcdrw=0;
    lcddata=Wdata;	
	lcdcs=0;
	lcdcs=1;
  }


/***************************************************
功能函数:延时
入口参数:time
****************************************************/
//延时函数

void delay(unsigned int i)
{
 while(i--);
}

/****************************************************
功能函数:DS18b20初始化
入口参数:
 ****************************************************/
void Init_DS18B20(void)
{
 unsigned char x=0;
 DQ = 1;    //DQ复位
 delay(8);  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 delay(80); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 delay(14);
 x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 delay(20);
}

/******************************************************
功能函数:向DS18b20读一字节数据
入口参数:
******************************************************/
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0;         // 给脉冲信号
  dat>>=1;
  DQ = 1;         // 给脉冲信号
  if(DQ)
   dat|=0x80;
  delay(4);
 }
 return(dat);
}

/******************************************************
功能函数:向DS18b20写一字节数据
入口参数:
******************************************************/
WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  delay(5);
  DQ = 1;
  dat>>=1;
 }

}

/******************************************************
功能函数:向DS18b20读温度值
入口参数:
出口参数:t
******************************************************/
unsigned  ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);    // 跳过读序号列号的操作
WriteOneChar(0x44);    // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);    //跳过读序号列号的操作
WriteOneChar(0xBE);    //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5;          //放大10倍输出并四舍五入
return(t);
}

/*************************显示函数**********************************/

void display()
{
 int a0,a1,b0,b1,c0,c1,d0,d1,e0,e1,f0,f1;   /*定义存放年、月、日、时、分、秒、星期
                                              的变量存放的数组*/
 int shuju1[8];                             //显示年、月、日的数组
 int shuju2[8];                             //显示时、分、秒的数组
 a0=calendar_time[0]/10+48;
 a1=calendar_time[0]%10+48;
 b0=calendar_time[1]/10+48;
 b1=calendar_time[1]%10+48;
 c0=calendar_time[2]/10+48;
 c1=calendar_time[2]%10+48;
 d0=calendar_time[3]/10+48;
 d1=calendar_time[3]%10+48;
 e0=calendar_time[4]/10+48;
 e1=calendar_time[4]%10+48;
 f0=calendar_time[5]/10+48;
 f1=calendar_time[5]%10+48;

 shuju1[0]=a0;
 shuju1[1]=a1;
 shuju1[2]=47;
 shuju1[3]=b0;
 shuju1[4]=b1;
 shuju1[5]=47;
 shuju1[6]=c0;
 shuju1[7]=c1;

 shuju2[0]=d0;
 shuju2[1]=d1;
 shuju2[2]=47;
 shuju2[3]=e0;
 shuju2[4]=e1;
 shuju2[5]=47;
 shuju2[6]=f0;
 shuju2[7]=f1;

 Writecommand(0x80);           //从第一行第一位发送年、月、日
  Writedata(shuju1[0]);
  Writedata(shuju1[1]);
  Writedata(shuju1[2]);
  Writedata(shuju1[3]);
  Writedata(shuju1[4]);
  Writedata(shuju1[5]);
  Writedata(shuju1[6]);
  Writedata(shuju1[7]);

 if(calendar_time[6]==1)       //判断是否为星期一
  {
  delay1ms(10);
   Writecommand(0x8d);
   Writedata('M');
   Writedata('o');
   Writedata('n');
  }
 if(calendar_time[6]==2)       //判断是否为星期二
  {
  delay1ms(10);
   Writecommand(0x8d);
   Writedata('T');
   Writedata('u');
   Writedata('e');
  }
 if(calendar_time[6]==3)       //判断是否为星期三
  {
  delay1ms(10);
   Writecommand(0x8d);
   Writedata('W');
   Writedata('e');
   Writedata('n');
  }
 if(calendar_time[6]==4)       //判断是否为星期四
  {
  delay1ms(10);
   Writecommand(0x8d);
   Writedata('T');
   Writedata('h');
   Writedata('u');
  }
 if(calendar_time[6]==5)       //判断是否为星期五
  {
  delay1ms(10);
   Writecommand(0x8d);
   Writedata('F');
   Writedata('r');
   Writedata('i');
  }
 if(calendar_time[6]==6)       //判断是否为星期六
  {
  delay1ms(10);
   Writecommand(0x8d);
   Writedata('S');
   Writedata('a');
   Writedata('t');
  }
 if(calendar_time[6]==7)       //判断是否为星期天
  {
   delay1ms(10);
   Writecommand(0x8d);
   Writedata('S');
   Writedata('u');
   Writedata('n');
  }
  delay1ms(10);

 Writecommand(0xc8);          //从第二行第八位发送时、分、秒
  Writedata(shuju2[0]);
  Writedata(shuju2[1]);
  Writedata(shuju2[2]);
  Writedata(shuju2[3]);
  Writedata(shuju2[4]);
  Writedata(shuju2[5]);
  Writedata(shuju2[6]);
  Writedata(shuju2[7]);
  delay(30000);
}
 
display01(int k )             //显示温度界面子函数     
{
 int a,b,c,d;                 //定义存放温度数值的变量a,b,c,d
  a=k/1000;                   //将温度的最高位赋给a
  b=k%1000/100;               //将温度的次高位赋给b
  c=k%100/10;                 //将温度的次次高位赋给c
  d=k%10;                     //将温度的最低位赋给d

  Writecommand(0x90);         //从第二行第一位发送温度显示值
  Writedata('T');
  Writedata(':');
  if(a) Writedata(a+48);      //当百位数为1的时候,显示百位数值
  if(a||b) Writedata(b+48);   //当十位数为1的时候,显示十位数值
  Writedata(c+48);            
  Writedata(46);
  Writedata(d+48);
  Writedata(223);
  Writedata(67);
  delay(1000);
  
} 


unsigned int x=0;
/************************主函数********************************/
main()
{ 
 unsigned int m=0;
 TMOD=0x21;            //定时器0工作方式1,允许定时器中断
 TH0=0x4c;             
 TL0=0x00;	           //定时50毫秒
 TR0=1;                //打开定时器
 EA=1;                 //打开外部中断
 ET0=1;                
 Start_calendar();     //开启时钟
 //Set_calendar();
 Initialize();         //液晶初始化
   while(1)
    { 
	  m=ReadTemperature(); //把ds18b20读出的值赋给变量m
	  if(x<100)
	  {
        
       Read_calendar();    //读时钟芯片的值
	   display();          //万年历显示界面函数
	  } 
	  
	  else
	  {
	   cls;                 //将万年历显示界面清屏,因为在同一地址上要显示温度
	   display01(m);        //显示温度界面子函数
	  }
	  delay1ms(10);
     } 
     
 }

 void timer0_int(void) interrupt 1 using 1  //定时器中断函数
 {    
	 TF0=0;                 //中断溢出清零
	 TH0=0x4c;              //定时器重新装载初值           
     TL0=0x00;
	 x++;                   //变量自增(每增加20次为1秒钟)
     if(x==260) x=0;  	  
 }

⌨️ 快捷键说明

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