基于PIC16F877A单片机的温度时间显示.docx
- 文档编号:8044999
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:31
- 大小:291.63KB
基于PIC16F877A单片机的温度时间显示.docx
《基于PIC16F877A单片机的温度时间显示.docx》由会员分享,可在线阅读,更多相关《基于PIC16F877A单片机的温度时间显示.docx(31页珍藏版)》请在冰豆网上搜索。
基于PIC16F877A单片机的温度时间显示
基于PIC16F877A单片机的温度,时间显示以及闹钟设置,硬件和软件配备
一,硬件图
#include
__CONFIG(0x3B31);
#definersRD0
#definerwRD1
#defineenRD2
#defineBEEPRD3
#defines1RA0
#defines2RA1
#defines3RA2
#defines4RA3
#defineuintunsignedint
#defineucharunsignedchar
signedcharset_time[7]={0,58,23,6,1,5,12};//秒分时星期日月年
signedcharread_time[7]={0,0,0,0,0,0,0};
signedcharshi=7,fen=15,alarm_time=1,reapeat_fen=2,cent;//闹钟时,闹钟分,闹铃响分钟,闹铃响间隔
uchars1_num,s2_num;
constucharalarm[]={"ALARMTIME:
"};
constucharmode[]={"MODE:
"};
constucharrpt[]={"RPT:
"};
constucharmin[]={"min"};
voidPORT_INIT()
{
TRISA=0xff;//A口设置为输入
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>0;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;NOP();//写指令的低4位
en=1;delayus(20);en=0;
}
voidlcd_write(uchardat,ucharflag1)//写指令/数据到1602
{
uchardat_high,dat_low;
dat_high=dat>>4;
write_byte_low(dat_high,flag1);
dat_low=dat&0x0f;
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);
write_byte_low(0b0011,0);
delayus(10);
write_byte_low(0b0011,0);
delayus(10);
write_byte_low(0b0010,0);
delayms
(1);
lcd_write(0x28,0);
delayms(5);
lcd_write(0x0c,0);
delayms(5);
lcd_write(0x01,0);
delayms(5);
lcd_write(0x06,0);
delayms(5);
}
voidnaoling()
{
uchari;
for(i=0;i<20;i++)
{
BEEP=1;
delayus(5);
BEEP=0;
delayus(5);
}
}
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;
for(i=0;i<7;i++)
{
temp1=set_time[i]/10;
temp2=set_time[i]%10;
set_time[i]=temp1*16+temp2;
}
}
voidtime_csh()//时间初始化
{
uchari;
dispose();
for(i=0;i<7;i++)
{
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++)
{
SEN=1;//起始信号
while(SEN==1);
IIC_SEND(0xd0);
IIC_SEND(k);
PEN=1;//停止信号
while(PEN==1);
RSEN=1;//重新启动
while(RSEN==1);
IIC_SEND(0xd1);
SSPIF=0;
RCEN=1;
while(SSPIF==0);//等待接收结束
read_time[k-1]=SSPBUF;
NOP();
NOP();
PEN=1;//停止信号
while(PEN==1);
}
}
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('-',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',1);lcd_write('O',1);lcd_write('N',1);break;
case2:
lcd_write('T',1);lcd_write('U',1);lcd_write('E',1);break;
case3:
lcd_write('W',1);lcd_write('E',1);lcd_write('D',1);break;
case4:
lcd_write('T',1);lcd_write('H',1);lcd_write('U',1);break;
case5:
lcd_write('F',1);lcd_write('R',1);lcd_write('I',1);break;
case6:
lcd_write('S',1);lcd_write('A',1);lcd_write('T',1);break;
case7:
lcd_write('S',1);lcd_write('U',1);lcd_write('N',1);break;
}
lcd_write(0x80+0x40,0);
lcd_write(0x30+read_time[2]/16,1);//时
lcd_write(0x30+read_time[2]%16,1);
lcd_write(':
',1);
lcd_write(0x30+read_time[1]/16,1);//分
lcd_write(0x30+read_time[1]%16,1);
lcd_write(':
',1);
lcd_write(0x30+read_time[0]/16,1);//秒
lcd_write(0x30+read_time[0]%16,1);
NOP();
NOP();
cent=read_temp();
lcd_write(0x80+0x4b,0);
lcd_write(0x30+cent/10,1);
lcd_write(0x30+cent%10,1);
lcd_write(0xdf,1);
lcd_write('C',1);
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();
}
if((shi==(read_time[2]/16*10+read_time[2]%16))&&(fen+reapeat_fen<=(read_time[1]/16*10+read_time[1]%16))&&((read_time[1]/16*10+read_time[1]%16)<(fen+alarm_time+reapeat_fen)))
{
naoling();
}
if((shi==(read_time[2]/16*10+read_time[2]%16))&&(fen+2*reapeat_fen<=(read_time[1]/16*10+read_time[1]%16))&&((read_time[1]/16*10+read_time[1]%16)<(fen+alarm_time+2*reapeat_fen)))
{
naoling();
}
if((shi==(read_time[2]/16*10+read_time[2]%16))&&(fen+3*reapeat_fen<=(read_time[1]/16*10+read_time[1]%16))&&((read_time[1]/16*10+read_time[1]%16)<(fen+alarm_time+3*reapeat_fen)))
{
naoling();
}
if((shi==(read_time[2]/16*10+read_time[2]%16))&&(fen+4*reapeat_fen<=(read_time[1]/16*10+read_time[1]%16))&&((read_time[1]/16*10+read_time[1]%16)<(fen+alarm_time+4*reapeat_fen)))
{
naoling();
}
}
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<7;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)
{
delayms(5);
if(s4==0)
{
set_time[6]--;
if(set_time[6]==-1)
{
set_time[6]=99;
}
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(s4==0);
}
}
}
if(s2_value==2)
{
lcd_write(0x86,0);//指向月份
if(s3==0)
{
delayms(5);
if(s3==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);//指向月份
while(s3==0);
}
}
if(s4==0)
{
delayms(5);
if(s4==0)
{
set_time[5]--;
if(set_time[5]==0)
{
set_time[5]=12;
}
lcd_write(0x85,0);
lcd_write(0x30+set_time[5]/10,1);
lcd_write(0x30+set_time[5]%10,1);
lcd_write(0x86,0);//指向月份
while(s4==0);
}
}
}
if(s2_value==3)
{
lcd_write(0x89,0);//指向日
if(s3==0)
{
delayms(5);
if(s3==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);//指向日
while(s3==0);
}
}
if(s4==0)
{
delayms(5);
if(s4==0)
{
set_time[4]--;
if(set_time[4]==0)
{
set_time[4]=31;
}
lcd_write(0x88,0);
lcd_write(0x30+set_time[4]/10,1);
lcd_write(0x30+set_time[4]%10,1);
lcd_write(0x89,0);//指向日
while(s4==0);
}
}
}
if(s2_value==4)
{
lcd_write(0x8f,0);//指向星期
if(s3==0)
{
delayms(5);
if(s3==0)
{
set_time[3]++;
if(set_time[3]==8)
{
set_time[3]=1;
}
switch(set_time[3])
{
case1:
lcd_write(0x8d,0);lcd_write('M',1);lcd_write('O',1);lcd_write('N',1);break;
case2:
lcd_write(0x8d,0);lcd_write('T',1);lcd_write('U',1);lcd_write('E',1);break;
case3:
lcd_write(0x8d,0);lcd_write('W',1);lcd_write('E',1);lcd_write('D',1);break;
case4:
lcd_write(0x8d,0);lcd_write('T',1);lcd_write('H',1);lcd_write('U',1);break;
case5:
lcd_write(0x8d,0);lcd_write('F',1);lcd_write('R',1);lcd_write('I',1);break;
case6:
lcd_write(0x8d,0);lcd_write('S',1);lcd_write('A',1);lcd_write('T',1);break;
case7:
lcd_write(0x8d,0);lcd_write('S',1);lcd_write('U',1);lcd_write('N',1);break;
}
lcd_write(0x8f,0);//指向星期
while(s3==0);
}
}
if(s4==0)
{
delayms(5);
if(s4==0)
{
set_time[3]--;
if(set_time[3]==0)
{
set_time[3]=7;
}
switch(set_time[3])
{
case1:
lcd_write(0x8d,0);lcd_write('M',1);lcd_write('O',1);lcd_write('N',1);break;
case2:
lcd_write(0x8d,0);lcd_write('T',1);lcd_write('U',1);lcd_write('E',1);break;
case3:
lcd_write(0x8d,0);lcd_write('W',1);lcd_write('E',1);lcd_write('D',1);break;
case4:
lcd_write(0x8d,0);lcd_write('T',1);lcd_write('H',1);lcd_write('U',1);break;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 PIC16F877A 单片机 温度 时间 显示