好文档 - 专业文书写作范文服务资料分享网站

基于at89s52单片机用12864液晶lcd显示带ds18b20测温的万年历电子时钟

天下 分享 时间: 加入收藏 我要投稿 点赞

sbit cs1 = P2^5; // 片选1 sbit cs2 = P2^2; // 片选2 sbit RST = P2^6;

#define uchar unsigned char #define uint unsigned int

/*-----定义LCD大小-----*/

#define LCD_X_MAX 128 // 定义液晶x轴的像素数 #define LCD_Y_MAX 64 // 定义液晶y轴的像素数

//ASCII 字模宽度及高度 #define ASC_CHR_WIDTH 8 #define ASC_CHR_HEIGHT 16 #define HZ_CHR_WIDTH 16 #define HZ_CHR_HEIGHT 16

//函数原形

void LCD_Init(void); //初始化函数

void LCD_Clr(uchar screen); //清屏函数

void Out_Char(uchar x, uchar y, bit mode, char *fmt); // 在指定位置显示字符

#endif

/**********************#include #include #include #include \#include \

unsigned tem_flag=0; int temp;

sbit DS18B20=P1^7; unsigned char i[2]={0};

void delayb(unsigned int count) //delay {

unsigned char i; while(count) {

i=200; while(i>0) i--; count--;

} }

void DS18B20Init(void) //DS18B20初始化

temp.c

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

{

unsigned int i; DS18B20=0; i=103;

while(i>0)i--; DS18B20=1; i=4; while(i>0)i--; }

bit TempReadBit(void) // 读一位 {

unsigned int i; bit dat;

DS18B20=0;i++; //延时 DS18B20=1;i++;i++; dat=DS18B20; i=8;while(i>0)i--; return (dat); }

unsigned char TempRead(void) //读字节 {

unsigned char i,j,dat; dat=0;

for(i=1;i<=8;i++) {

j=TempReadBit();

dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里 }

return(dat); //将一个字节数据返回 }

void TempWriteByte(unsigned char dat)

{ //写一个字节到DS18B20里 unsigned int i; unsigned char j; bit testb;

for(j=1;j<=8;j++) {

testb=dat&0x01;

dat=dat>>1;

if(testb) // 写1部分 {

DS18B20=0; i++;i++; DS18B20=1; i=8;while(i>0)i--; } else

{

DS18B20=0; //写0部分 i=8;while(i>0)i--; DS18B20=1; i++;i++; } } }

void TempChange(void) //发送温度转换命令 {

DS18B20Init(); //初始化DS18B20 delayb(1); //延时

TempWriteByte(0xcc); // 跳过序列号命令 TempWriteByte(0x44); //发送温度转换命令 }

int GetTemp() //获得温度 {

float tt;

unsigned char a,b;

DS18B20Init(); delayb(1);

TempWriteByte(0xcc);

TempWriteByte(0xbe); //发送读取数据命令 a=TempRead(); //低位温度数据

//高位温度数据 //如果温度为负

b=TempRead(); if(b&0x80)

tem_flag=1; else

tem_flag=0;

temp=b; temp<<=8;

temp=temp|a; //两字节合成一个整型变量。 if(tem_flag) //如果温度为负转换为正

temp=~temp+1; tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20 可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度。

temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位 也转换为可显示数字,同时进行一个四舍五入操作。 return temp; //返回温度值 }

void DisplayTemp(void) {

unsigned int temp; unsigned char a,b,c; TempChange(); temp=GetTemp(); a=temp/100; i[0]=a+0x30; b=temp/10-a*10; i[1]=b+0x30; Out_Char(45, 6, 1,i); }

/***********************#include #include #include #include \

//#include \#include \

sbit KEY1=P1^0; //定义端口参数 sbit KEY2=P1^1; sbit KEY3=P1^2; sbit KEY4=P1^3; sbit KEY5=P1^4; sbit KEY6=P1^5; sbit LED=P1^6; //int m,w=0; int flag,next;

unsigned char time1,time=0; unsigned char second=0; unsigned char minute=18; unsigned char hour=12; unsigned char day=23; unsigned char month=8; unsigned char year=12; unsigned char cent=20;

main.c

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

基于at89s52单片机用12864液晶lcd显示带ds18b20测温的万年历电子时钟

sbitcs1=P2^5;//片选1sbitcs2=P2^2;//片选2sbitRST=P2^6;#defineucharunsignedchar#defineuintunsignedint/*-----定义LCD大小-----*/
推荐度:
点击下载文档文档为doc格式
64mmi7ndpe3h0qq03o65
领取福利

微信扫码领取福利

微信扫码分享