📄 text1.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 + -