教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教学研究 >

基于PIC16F887单片机的温度、时钟显示以及闹钟功能(2)

来源:网络收集 时间:2026-04-03
导读: PORTD|=R1;NOP();NOP();//送4位 NOP();NOP(); //数据送入有效 LCD_E=0; LCD_RS=0;NOP(); PORTD=0XF0; //RD低4位清0 } //======写1B数R1,FLAG为写命令或数据选择,0为写命令,1为写数据 void LCD_WRITE(char R1,cha

PORTD|=R1;NOP();NOP();//送4位 NOP();NOP(); //数据送入有效 LCD_E=0;

LCD_RS=0;NOP();

PORTD&=0XF0; //RD低4位清0 }

//======写1B数R1,FLAG为写命令或数据选择,0为写命令,1为写数据 void LCD_WRITE(char R1,char FLAG) { char R2;

LCD_BUSY(); //检测忙否 R2=R1&0XF0; //低4位清0 R2=R2>>4; //取高4位

LCD_WRITE_4(R2,FLAG);//先写高4位

R2=R1&0X0F; //高4位清0,取低4位 LCD_WRITE_4(R2,FLAG);//再送低4位 DELAY_US(10); //延时100us }

//检测LCD是否忙 void LCD_BUSY() {

unsigned char R1; do{

R1=LCD_READ(); }while(R1&0X80);

}

//发送数R并等待发送完成,收到从机的应答信号208 void IIC_SEND(char R) { SSPBUF=R; //发送

while (RW==1); //在主动模式下,判断发送是否完成 while (SSPIF==0); //等待发送完成

while (ACKSTAT==1); //等待从机发送应答信号 }

//IIC初始化208 void IIC_CSH()

{ TRISC&=0b00011000; //SDA,SCL设置为输入!

SSPCON=0b00101000; //同步串口使能(SSPEN),主控方式 SMP=0; //使能高速模式(400 kHz) 的压摆率控制 SSPADD=4; //主控模式为波特率值,每位时间T=(SSPADD+1)/Tcy=5us

}

//IIC_READ读

char IIC_READ(char addr) {

char iicr; SEN=1;

while(SEN==1); //发送起始位

IIC_SEND(0b11010000); //DS1307在总线上的地址:0b11010000 IIC_SEND(addr); //读取的首地址 RSEN=1;

while(RSEN==1); //发送重新起始位 IIC_SEND(0b11010001); //读数据 SSPIF=0; RCEN=1;

while(SSPIF==0); //等待读完成 iicr=SSPBUF; ACKDT=1; ACKEN=1;

while(ACKEN==1);

PEN=1; //发送停止位 while(PEN==0); return(iicr); }

//IIC_WRITE写

void IIC_WRITE(char addr,char data) {

SEN=1;

while(SEN==1);

IIC_SEND(0b11010000); IIC_SEND(addr); IIC_SEND(data); PEN=1;

while(PEN==1); }

//DS1307初始化时间并显示时间 void DS1307_CSH() {

IIC_WRITE(0,0x45); //00 IIC_WRITE(1,0x00); //00 IIC_WRITE(2,0x10); //00 IIC_WRITE(3,0x06); // IIC_WRITE(4,0x05); //1 IIC_WRITE(5,0x05); //1 IIC_WRITE(6,0x12); //12}

void READ() {

LCD_WRITE(SECOND,COM); shi=IIC_READ(0)>>4; ge=IIC_READ(0)&0x0f;

LCD_WRITE(0x30+shi,DAT); LCD_WRITE(0x30+ge,DAT); LCD_WRITE(MINUTE,COM); shi=IIC_READ(1)>>4; ge=IIC_READ(1)&0x0f;

LCD_WRITE(0x30+shi,DAT); LCD_WRITE(0x30+ge,DAT); LCD_WRITE(HOUR,COM); shi=IIC_READ(2)>>4; ge=IIC_READ(2)&0x0f;

LCD_WRITE(0x30+shi,DAT); LCD_WRITE(0x30+ge,DAT); LCD_WRITE(DAY,COM); shi=IIC_READ(4)>>4; ge=IIC_READ(4)&0x0f;

LCD_WRITE(0x30+shi,DAT); LCD_WRITE(0x30+ge,DAT); DSweek(IIC_READ(3)); LCD_WRITE(MONTH,COM); shi=IIC_READ(5)>>4; ge=IIC_READ(5)&0x0f;

秒 分 时 星期日日 月 年

LCD_WRITE(0x30+shi,DAT); LCD_WRITE(0x30+ge,DAT); LCD_WRITE(YEAR,COM); shi=IIC_READ(6)>>4; ge=IIC_READ(6)&0x0f;

LCD_WRITE(0x30+shi,DAT); LCD_WRITE(0x30+ge,DAT); DELAY(100);

DISP_T(T_READ()); if(A==1) {

LCD_WRITE(WEEK+4,COM); LCD_WRITE('A',DAT); }

if(A!=1) {

LCD_WRITE(WEEK+4,COM); LCD_WRITE(' ',DAT); } }

void DSweek(char num) {

LCD_WRITE(WEEK,COM); switch(num) {

case 1: LCD_WRITE('M',DAT); LCD_WRITE('0',DAT); LCD_WRITE('N',DAT); break;

case 2: LCD_WRITE('T',DAT); LCD_WRITE('U',DAT); LCD_WRITE('E',DAT); break;

case 3: LCD_WRITE('W',DAT); LCD_WRITE('E',DAT); LCD_WRITE('D',DAT); break;

case 4: LCD_WRITE('T',DAT); LCD_WRITE('H',DAT); LCD_WRITE('U',DAT); break;

case 5: LCD_WRITE('F',DAT); LCD_WRITE('R',DAT); LCD_WRITE('T',DAT);

break;

case 6: LCD_WRITE('S',DAT); LCD_WRITE('A',DAT); LCD_WRITE('T',DAT); break;

case 7: LCD_WRITE('S',DAT); LCD_WRITE('U',DAT); LCD_WRITE('N',DAT); break; } }

//**********温度模块************* //读温度值

signed char T_READ() {

signed char R1; SEN=1;

while(SEN==1); //发送起始位

IIC_SEND(0b10010000); //TC74在总线上的地址:0b10010000 IIC_SEND(RTR); RSEN=1;

while(RSEN==1); //发送重新起始位 IIC_SEND(0b10010001); //读数据 RCEN=1;

while(RCEN==1); //等待读完成 R1=SSPBUF;

PEN=1; //发送停止位 while(PEN==0); return(R1); }

//显示温度

void DISP_T(signed char R1) { char R2;

LCD_WRITE(0b00001100,COM); if(R1>=0) BCD(R1); else

{ R2=~R1+1; BCD(R2); }

LCD_WRITE(WENDU,COM); if(R1<0)

LCD_WRITE('-',DAT); if(R1>0)

LCD_WRITE(0x30+SW,DAT); LCD_WRITE(0x30+GW,DAT); LCD_WRITE(0xDF,DAT); LCD_WRITE('C',DAT); }

//闹钟

void ALARM_CLOCK() {

PR2=249;

CCPR2L=0x25;

CCP2CON=0B00001100; T2CON=0b00000101; }

//********按键******* //按键扫描

void KEYSCAN() {

if(S1==0) {

DELAY(20); if(S1==0)

while(!S1); {

num1++;

switch(num1) {

case 1: num2=0; //调闹钟,先读最初值为0

m=A_m; f=A_f; s=A_s; x=A_x;

LCD_CLR(); DISL5();

LCD_WRITE(SECOND,COM); LCD_WRITE(0x30+m/16,DAT); LCD_WRITE(0x30+m%16,DAT); LCD_WRITE(MINUTE,COM); LCD_WRITE(0x30+f/16,DAT); LCD_WRITE(0x30+f%16,DAT); LCD_WRITE(':',DAT); LCD_WRITE(HOUR,COM);

LCD_WRITE(0x30+s/16,DAT);

LCD_WRITE(0x30+s%16,DAT); …… 此处隐藏:3125字,全部文档内容请下载后查看。喜欢就下载吧 ……

基于PIC16F887单片机的温度、时钟显示以及闹钟功能(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/50073.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)