#include
#define uint unsigned int #define uchar unsigned char
/****************12864液晶接口定义********************/ sbit rs = P2^5; sbit std = P2^6; sbit sclk = P2^7; sbit psb = P2^4; sbit rst = P2^2;
sbit D1820 = P3^7; /*************定义18b20总线**********************/ uchar code tab0[]=\ 当前温度 %uchar code tab1[]=\ %uchar code tab2[]=\ ℃ %uchar code tab3[]=\ %uint i,j,s1num,num2; void delay(uint z) {
uint x,y;
for(x=z;x>0;x--) for(y=110;y>0;y--); }
void wr_date(uchar date)//写数据 {
uchar a,p; delay(10); a=date;
rs=1; //数据命令选择=1时读取数据 sclk=0; //串口时钟,未开 std=1; //选择串口方式 for(i=0;i<5;i++) //开启字节 {
sclk=1; sclk=0;
}
std=0; // 写 sclk=1; //开启时钟脉冲 sclk=0;
std=1; //选择数据 sclk=1; sclk=0;
std=0; sclk=1;
sclk=0;
for(p=0;p<2;p++) {
for(i=0;i<4;i++) {
a=a<<1; //左移目的是为了将溢出数据(即0或1)赋予std std=CY; //单片机特殊功能寄存器,“CY”用于存放字符串溢出字符 sclk=1; //一开一锁将数据显示 sclk=0; }
std=0; for(i=0;i<4;i++) {
sclk=1; sclk=0; } } }
void wr_com(uchar com) //写命令 {
uchar a,p; delay(10); a=com;
rs=1; //数据命令选择=1时读取数据 sclk=0; //串口时钟,未开 std=1; //选择串口方式 for(i=0;i<5;i++) //开启字节 {
sclk=1; sclk=0; }
std=0;
sclk=1; //开启时钟脉冲 sclk=0;
std=0; sclk=1; sclk=0;
std=0; sclk=1; sclk=0;
for(p=0;p<2;p++) {
for(i=0;i<4;i++)
{
a=a<<1;//左移目的是为了将溢出数据(即0或1)赋予std
std=CY;//单片机特殊功能寄存器,“CY”用于存放字符串溢出字符 sclk=1;//一开一锁将数据显示 sclk=0; }
std=0;
for(i=0;i<4;i++)//延时一下为下一数据到来做准备 { sclk=1; sclk=0; } } }
void write_lcd() //向液晶写入显示内容 {
uchar num;
wr_com(0x80);
for(num=0;num<16;num++) {
wr_date(tab0[num]); delay(1); }
wr_com(0x90);
for(num=0;num<16;num++) {
wr_date(tab1[num]); delay(1); }
wr_com(0x88);
for(num=0;num<16;num++) {
wr_date(tab2[num]); delay(1); }
wr_com(0x98);
for(num=0;num<16;num++) {
wr_date(tab3[num]); delay(1); } }
void init_lcd()
{
rst=1;
psb=0; //选串口
wr_com(0x30); //30---基本指令动作 wr_com(0x01); //清屏,地址指针指向00H delay(1);
wr_com(0x06); //光标的移动方向即读入或写入数据后指针加一 wr_com(0x0c); //开显示,关游标类似1602 return; } void init() {
init_lcd(); write_lcd(); }
void Delay_xus(uint i)//(16+9*i)us(51) {
while(i--); }
void Delay_100us(uchar j)//(16+9*i)us(51) {
uchar i = 15; i = i*j; while(i--); }
void init_18b20() //18b20初始化 {
uchar i,count=5; D1820 = 1; D1820 = 0;
Delay_100us(5); //500us D1820 = 1;
Delay_xus(2); //35us
i = D1820; //i为0则18b20初始化成功
while(i&&count--); //检测i为0,若为1,count=0后退出循环 D1820 = 1;
Delay_xus(10); //拉高电平,完成初始化
}
void write_18b20(uchar data_1820)//********************写数据********************* {
uchar i=0; D1820 = 1; for(i=0;i<8;i++) {
D1820 = 0; //产生下降沿,进入写时序(15us内送上数据) D1820 = data_1820&0x01; //从低位开始送数
Delay_xus(3); //延时45us,保证18b20采样到数据 D1820 = 1; //拉高电平完成送数
Delay_xus(1); //连续送数要间隔至少1us(这里25us) data_1820>>=1; //移位 } }
uchar read_18b20() //********************读数据***********************
{
uchar i=0 ; uchar temp =0;
D1820 = 1; for(i=0;i<8;i++)
{
D1820 = 0; //拉低电平准备产生读时序
temp>>=1; //先移位,方便i=7时接到最后移位 D1820 = 1; //拉高电平进入读时序
if(D1820) //取18b20传送的数据(先送低位) {
temp|=0x80; }
Delay_xus(1);
D1820 = 1; //拉高电平完成读时序 Delay_xus(1);//与下一位读取间隔一下 }
return(temp); }
uint read_temper() //*******************读取温度值***************************