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
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 \
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测温的万年历电子时钟



