资源简介

选用PIC16F877做为核心芯片,与DS18B20通讯读取温度,并由LCD1602显示

资源截图

代码片段和文件信息

#include 

#define DQ RC1       //DQ端与RC相连接

#define RS  RA5     //  LCD控制线宏定义    RS=1数据 RS=0指令操作
#define RW  RA4     //   R/W读写选择端
#define E   RA3     //   E使能端

#define Resistor_pullup() TRISC1=1
#define Bus_master_pulling_low() TRISC1=0;RC1=0

float temperature;          //存放16位的温度值
unsigned char sign=1;    //用来确定最高位的符号  正温度(+)还是负温度(-)

unsigned char bai=1;                             //整数百位              由于显示的分开显示
unsigned char shi=1;                             //整数十位
unsigned char ge=2;                              //整数个位
unsigned char shifen=0;                          //十分位
unsigned char baifen=0;                          //百分位

__CONFIG(0x1832);      // 芯片配置字 


void delayus(unsigned char x) //延时us级的程序,延时时间为:3*x+9=?
{
unsigned char d;
d=x;
while(--d);                                        //        DECFSZ   COUNTER1
asm(“nop“);
}
/********************************************      LCD相关读写及专用的函数     ****************************************/

void delay_lcd()                               //LCD用的延时
{
unsigned char x=0x06y=0x80z;
do
{
z=y;
while(--z);
}while(--x);
asm(“nop“);
}
void write_lcd_code(char code)  //   给LCD设置 命令 地址  屏幕信息   的函数
{
PORTD=code;      
RS=0;           //RS 端低电平为命令
RW=0;       
E=1;              
E=0;              
delay_lcd();
}
void write_lcd_char(char data) 
{
PORTD=data;
RS = 1;                     
RW = 0;                      
E = 1;                       
E = 0;                       
delay_lcd(); 
}
void write_lcd_string(char *point)
{
     while(*point)
          write_lcd_char(*point++);
}

/****************************************************************************************************/

void init()                                 //初始化函数,包括所用的3个I/O口定义RSR/WE
{
TRISC=0xFF;                         //  hight  idle  state  设置为输入

ADCON1 = 0x06;                //设置A口为普通I/O口                     /***注意当需要用A/D时改动***/
TRISA = 0b11000111;           //设置A口的 RA5 RA4 RA3为输出控制LCD的
TRISD = 0X00;                 //设置D口为输出(8位全部输出数据)

write_lcd_code(0x01);               //清屏
write_lcd_code(0x38);               //设置16*2显示,8位数据接口
write_lcd_code(0b00001100);         //D=1开显示    C=0不显示光标   B=0光标不闪烁
write_lcd_code(0b00000110);         //N=1 读或写一个字符后指针加1 光标加1
write_lcd_code(0x80);               //起始地址
write_lcd_code(0x01);
}


/*************************************        DS18B20  通讯函数    **************************************/       

void reset_presence()
{
unsigned char presence;
do{
Resistor_pullup();           //保证是在高电平
asm(“nop“);asm(“nop“);
                                 //时序开始
Bus_master_pulling_low();
delayus(164); // 501us  最少延时480us       
Resistor_pullup();
delayus(20); // 69us     调用函数存在  程序指针转移 等时间 (理论时间要求15-60us)   

if(0==DQ) presence=0;   //
else      presence=1; 
delayus(146);          //447us   MASTER   Rx  最少时间480
}while(pre

评论

共有 条评论