基于PIC16F877A单片机的温度时间显示Word格式文档下载.docx
- 文档编号:21181272
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:31
- 大小:291.63KB
基于PIC16F877A单片机的温度时间显示Word格式文档下载.docx
《基于PIC16F877A单片机的温度时间显示Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于PIC16F877A单片机的温度时间显示Word格式文档下载.docx(31页珍藏版)》请在冰豆网上搜索。
ADCON1=0x06;
//RA口上电复位为模拟输入口
TRISC3=1;
//SCL和SDA设置为输入
TRISC4=1;
TRISD=0x00;
//D口设置为输出
}
voidIIC_INIT()
SSPCON=0x28;
STAT_SMP=0;
SSPADD=4;
voiddelayms(uintz)//延时函数
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
voiddelayus(uintk)
while(k--);
voidwrite_byte_low(ucharR1,ucharflag0)//写一个字节的低4位,flag0为指令/数据选择位
{//,0为写指令,1为写数据
ucharlow;
rs=flag0;
low=R1&
0x0f;
low=low<
<
4;
PORTD&
=0x0f;
NOP();
PORTD|=low;
//写指令的低4位
en=1;
delayus(20);
en=0;
voidlcd_write(uchardat,ucharflag1)//写指令/数据到1602
uchardat_high,dat_low;
dat_high=dat>
>
write_byte_low(dat_high,flag1);
dat_low=dat&
write_byte_low(dat_low,flag1);
NOP();
voidwrite_string(ucharaddress,ucharconst*str)//往指定的地址写字符串
{
uchari=0;
lcd_write(address,0);
while(str[i]!
='
\0'
)
{
lcd_write(str[i],1);
delayus(5);
i++;
}
voidLCD_INIT()//初始化函数
rw=0;
en=0;
delayms(20);
write_byte_low(0b0011,0);
delayms
(1);
delayus(10);
write_byte_low(0b0010,0);
lcd_write(0x28,0);
delayms(5);
lcd_write(0x0c,0);
lcd_write(0x01,0);
lcd_write(0x06,0);
voidnaoling()
uchari;
for(i=0;
i<
20;
i++)
BEEP=1;
BEEP=0;
}
voidIIC_SEND(ucharnum)
SSPBUF=num;
while(STAT_RW==1);
//等待发送结束
while(SSPIF==0);
while(ACKSTAT==1);
//等待应答
signedcharread_temp()//读温度
signedchartemp;
SEN=1;
while(SEN==1);
IIC_SEND(0b10011010);
IIC_SEND(0);
RSEN=1;
while(RSEN==1);
IIC_SEND(0b10011011);
RCEN=1;
while(RCEN==1);
//SSPIF=0;
//while(SSPIF==0);
//等待接收结束
temp=SSPBUF;
PEN=1;
while(PEN==1);
returntemp;
voiddispose()//BCD数据处理
uchari,temp1,temp2;
7;
temp1=set_time[i]/10;
temp2=set_time[i]%10;
set_time[i]=temp1*16+temp2;
voidtime_csh()//时间初始化
dispose();
{
SEN=1;
//起始信号
while(SEN==1);
//检测起始信号是否已完成
IIC_SEND(0xd0);
IIC_SEND(i);
IIC_SEND(set_time[i]);
PEN=1;
//停止信号
while(PEN==1);
}
voidread_ds1307()//读时间
uchark;
for(k=0;
k<
8;
k++)
IIC_SEND(k);
RSEN=1;
//重新启动
while(RSEN==1);
IIC_SEND(0xd1);
SSPIF=0;
RCEN=1;
while(SSPIF==0);
read_time[k-1]=SSPBUF;
NOP();
}
voiddisplay_time()
lcd_write(0x80,0);
lcd_write(0x32,1);
lcd_write(0x30,1);
lcd_write(0x30+read_time[6]/16,1);
//年
lcd_write(0x30+read_time[6]%16,1);
lcd_write('
-'
1);
lcd_write(0x30+read_time[5]/16,1);
//月
lcd_write(0x30+read_time[5]%16,1);
lcd_write(0x30+read_time[4]/16,1);
//日
lcd_write(0x30+read_time[4]%16,1);
lcd_write(0x80+0x0d,0);
switch(read_time[3])
case1:
lcd_write('
M'
O'
N'
break;
case2:
T'
U'
E'
case3:
W'
D'
case4:
H'
case5:
F'
R'
I'
case6:
S'
A'
case7:
lcd_write(0x80+0x40,0);
lcd_write(0x30+read_time[2]/16,1);
//时
lcd_write(0x30+read_time[2]%16,1);
:
'
lcd_write(0x30+read_time[1]/16,1);
//分
lcd_write(0x30+read_time[1]%16,1);
lcd_write(0x30+read_time[0]/16,1);
//秒
lcd_write(0x30+read_time[0]%16,1);
cent=read_temp();
lcd_write(0x80+0x4b,0);
lcd_write(0x30+cent/10,1);
lcd_write(0x30+cent%10,1);
lcd_write(0xdf,1);
C'
if((shi==(read_time[2]/16*10+read_time[2]%16))&
&
(fen<
=(read_time[1]/16*10+read_time[1]%16))&
((read_time[1]/16*10+read_time[1]%16)<
(fen+alarm_time)))
naoling();
(fen+reapeat_fen<
(fen+alarm_time+reapeat_fen)))
(fen+2*reapeat_fen<
(fen+alarm_time+2*reapeat_fen)))
(fen+3*reapeat_fen<
(fen+alarm_time+3*reapeat_fen)))
(fen+4*reapeat_fen<
(fen+alarm_time+4*reapeat_fen)))
voidsetting_time()
ucharl,s2_value,setting_flag;
if(s2==0)
delayms(10);
if(s2==0)
{
s2_value++;
setting_flag=1;
while(s2==0);
//松手检测
for(l=0;
l<
l++)//存储当前时间数据//年星期月日时分秒
{
set_time[l]=read_time[l]/16*10+read_time[l]%16;
}
while(setting_flag)
if(s2==0)
{
delayms(5);
if(s2==0)
{
s2_value++;
while(s2==0);
//松手检测
}
}
if(s2_value==1)
lcd_write(0x83,0);
//指向年份
lcd_write(0x0f,0);
//显示游标并闪烁
if(s3==0)
delayms(5);
if(s3==0)
{
set_time[6]++;
if(set_time[6]==100)
{
set_time[6]=0;
}
lcd_write(0x82,0);
lcd_write(0x30+set_time[6]/10,1);
lcd_write(0x30+set_time[6]%10,1);
lcd_write(0x83,0);
while(s3==0);
}
if(s4==0)
if(s4==0)
set_time[6]--;
if(set_time[6]==-1)
set_time[6]=99;
while(s4==0);
}
if(s2_value==2)
lcd_write(0x86,0);
//指向月份
set_time[5]++;
if(set_time[5]==13)
set_time[5]=1;
lcd_write(0x85,0);
lcd_write(0x30+set_time[5]/10,1);
lcd_write(0x30+set_time[5]%10,1);
lcd_write(0x86,0);
set_time[5]--;
if(set_time[5]==0)
set_time[5]=12;
if(s2_value==3)
lcd_write(0x89,0);
//指向日
set_time[4]++;
if(set_time[4]==32)
set_time[4]=1;
lcd_write(0x88,0);
lcd_write(0x30+set_time[4]/10,1);
lcd_write(0x30+set_time[4]%10,1);
lcd_write(0x89,0);
set_time[4]--;
if(set_time[4]==0)
set_time[4]=31;
if(s2_value==4)
lcd_write(0x8f,0);
//指向星期
set_time[3]++;
if(set_time[3]==8)
set_time[3]=1;
switch(set_time[3])
case1:
lcd_write(0x8d,0);
case2:
case3:
case4:
case5:
case6:
case7:
lcd_write(0x8f,0);
//指向星期
set_time[3]--;
if(set_time[3]==0)
set_time[3]=7;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 PIC16F877A 单片机 温度 时间 显示