这个程序是我自己写的并且下载到板子上验证过的
但是一些基本知识还得看书啊
也可以这样。我的QQ768644622视频语音一条一条告诉你
/*****************************************
DS18B20测温 LCD显示正负小数点后两位 USART发送PC机
******************************************/
/****定义****/
#include
#include
#define uint unsigned int
#define uchar unsigned char
/****晶振****/
#define xtal 8 //8MHz
/****DS18B20定义****/
uchar error_flag;//DS18B20好坏标志
uchar teml,temh;//DS18B20温度数据低8位高8位
uchar zf;//温度正负标志 0负 1正
uint temp;//温度数值
/****USART定义****/
#define UDRE 5//UCSRA--UDRE数据空
#define dataport PORTC//LCD1602数据口
uchar usart_temp;//USART接收到的数据
uchar flag;//接收中断
uchar cnt=0;//接收计数
uchar receive_flag;//接受正确标志 0不正确 1正确
uchar start_device;//接收到正确指令启动标志
uchar c[1];//
/****LCD1602定义****/
/****控制电平****/
/*RS*/
#define LCD_RS_1 PORTA|=1
#define LCD_RS_0 PORTA&=~1
/*RW*/
#define LCD_RW_1 PORTA|=2
#define LCD_RW_0 PORTA&=~2
/*EN*/
#define LCD_EN_1 PORTA|=4
#define LCD_EN_0 PORTA&=~4
/****LCD忙****/
#define Busy 0x80
uchar a[6]; //1602显示数组
uchar b[7];//PC显示用
uchar str1[]={"DS18B20:"};
/****函数声明****/
void LCD_mang(void);
/***********************************************/
/***********************************************/
/****延时****/
/****延时nms****/
void delay_1ms(void)
{
uint i;
for(i=1;i<(uint)(xtal*143-2);i++)
;
}
void delay_nms(uint n)
{
uint i=0;
while(i
delay_1ms();
i++;
}
}
/****延时5us****/
void delay_5us(void)
{
uchar x=7;
while(x)
{
x--;
}
}
/****延时15us****/
void delay_15us(void)
{
uchar x=27;
while(x)
{
x--;
}
}
/****延时60us****/
void delay_60us(void)
{
uchar x=117;
while(x)
{
x--;
}
}
/***********************************************/
/***********************************************/
/****端口初始化****/
void port_init(void)
{
PORTA=0x00;DDRA=0xff;
PORTB=0xff;DDRB=0xff;
PORTC=0x00;DDRC=0xff;
PORTD=0x7f;DDRD=0x82;//电平0111,1111 方向1000,0010
/*OC2-PD7 RXD-PD0 TXD-PD1*/
}
/***********************************************/
/***********************************************/
/****USART****/
/****USART初始化****/
void usart_init(void)
{
UCSRB=0x00;//
UCSRA=0x82;//1000,0010 有未读出数据 倍速
UCSRC=0x06;//0000,0110 长度8位
UBRRL=0x67;//波特率9600
UBRRH=0x00;//
UCSRB=0x98;//1001,1000 接受中断使能 发送接收使能
}
/****发送一个字符****/
void uart_send(uchar i)
{
while(!(UCSRA&(1<
}
/****发送一串字符****/
void uart_str_send(uchar *s)
{
while(*s)
{
uart_send(*s);//发送一个指针s指向的数据
s++;
}
}
/****接收中断****/
#pragma vector=USART_RXC_vect
__interrupt void uart_rx_isr(void)
{
usart_temp=UDR;
flag=1;
}
/***********************************************/
/***********************************************/
/****以下是1602****/
/****写命令****/
void LCD_ml(uchar CMD,uchar attribc)//CND命令 attribc忙
{
if(attribc)LCD_mang();//如果标志attribc为真进行忙检测
LCD_RS_0;//指令寄存器
LCD_RW_0;//写
__no_operation();
dataport=CMD;//将指令赋予数据口
__no_operation();
LCD_EN_1;//使能
__no_operation();
__no_operation();
LCD_EN_0;
}
/****************************************/
/****************************************/
/****写数据****/
void LCD_data(uchar dataw)
{
LCD_mang();//忙检测
LCD_RS_1;//数据寄存器
LCD_RW_0;//写
__no_operation();
dataport=dataw;//将数据赋予数据口
__no_operation();
LCD_EN_1;//使能
__no_operation();
__no_operation();
LCD_EN_0;
}
/***************************************/
/***************************************/
/****LCD忙****/
void LCD_mang(void)
{
uchar val;
dataport=0xff;//
LCD_RS_0;//指令寄存器
__no_operation();
__no_operation();
LCD_RW_1;//读
__no_operation();
__no_operation();
LCD_EN_1;//使能
__no_operation();
__no_operation();
DDRC=0x00;//数据口输入
__no_operation();
__no_operation();
val=PINC;//将数据口数据赋予val
__no_operation();
__no_operation();
while(val&Busy)//val&0x80是否为真
{ //如果为真 为0退出
val=PINC;//读取PINC
__no_operation();
__no_operation();
}
__no_operation();
__no_operation();
LCD_EN_0;
__no_operation();
__no_operation();
DDRC=0xff;//PC口输出
}
/******************************************/
/******************************************/
/****显示定位****/
void LCD_xy(char posx,char posy)
{
uchar temp=0x00; //
temp&=0x7f; //0111,1111
temp=posx&0x0f; //posy&0000,1111 屏蔽高4位
posy&=0x01; //y变化范围0-1
if(posy==1)temp|=0x40;//如果y=1显示第二行地址码+0x40
temp|=0x80; //指令码为地址码+0x80
LCD_ml(temp,1); //
}
/*************************************/
/*************************************/
/****显示一个字符****/
void LCD_display_char(uchar x,uchar y,uchar wdata)
{ //x第几个 y行
LCD_xy(x,y);
LCD_data(wdata);
}
/*******************************************/
/*******************************************/
/****显示一串字符****/
void LCD_display_zfc(uchar x,uchar y,uchar *ptr)
{
uchar i,l=0;
while(ptr[l]>31){l++;}
for(i=0;i
LCD_display_char(x++,y,ptr[i]);
if(x==16)
{
x=0;
y^=1;
}
}
}
/*********************************************/
/*********************************************/
/****LCD初始化****/
void LCD_init(void)
{
LCD_ml(0x38,0);//0011,1000
delay_nms(5);
LCD_ml(0x38,0);
delay_nms(5);
LCD_ml(0x38,0);
delay_nms(5);
LCD_ml(0x38,1);
LCD_ml(0x08,1);//0000,1000
LCD_ml(0x01,1);//0000,0001
LCD_ml(0x06,1);//0000,0110
LCD_ml(0x0c,1);//0000,1100
}
/***********************************************/
/***********************************************/
/****DS18B20****/
/****DS18B20初始化****/
void DS18B20_init(void)
{
uchar i;
uint j=0;
PORTB|=(1<<0); //总线置(1)
PORTB&=~(1<<0); //总线置(0)
for(i=0;i<8;i++)delay_60us(); //等待480us
PORTB|=(1<<0); //总线置(1)
DDRB&=~(1<<0); //PB_7方向设置输入
delay_15us(); //等待30us
delay_15us();
error_flag=0; //DS18B20损坏标志置零(没坏)
while(PINC&(1<<0)) //等待PINB_7为低电平
{ //为低电平说明DS18B20没坏
delay_60us(); //60*18000=1080000=1.08s
j++;
if(j>=18000) //如果1.08s后没反应说明已坏
{
error_flag=1; //DS18B20(已坏)
break;
}
}
DDRB|=(1<<0); //PB_7方向输出
PORTB|=(1<<0); //总线置(1)
for(i=0;i<4;i++)//等待240us
{
delay_60us();
}
}
/****写数据****/
void DS18B20_write(uchar x) //要写入一个字节数据x
{
uchar m;
for(m=0;m<8;m++) //依次输入8位数据
{
if(x&(1<
PORTB&=~(1<<0); //拉低电平
delay_5us(); //等待5us
PORTB|=(1<<0); //写入1
delay_15us(); //等待45us
delay_15us();
delay_15us();
}
else
{
PORTB&=~(1<<0); //拉低电平 写入0
delay_15us(); //等待45us
delay_15us();
delay_15us();
PORTB|=(1<<0); //总线置(1)
}
}
PORTC|=(1<<0);
}
/****************************************************/
/****读数据****/
uchar DS18B20_read(void)
{
uchar temp,k,n;
temp=0;
for(n=0;n<8;n++)
{
PORTB&=~(1<<0); //总线置(0)
delay_5us(); //等待5us
PORTB|=(1<<0); //总线置(1)
delay_5us(); //等待5us
DDRB&=~(1<<0); //PC_7方向输入
k=(PINB&(1<<0)); //将PC_7的数据赋予k
if(k) //判断k是1,0
temp|=(1<
temp&=~(1<
delay_15us();
delay_15us();
DDRB|=(1<<0);
}
return (temp); //返回temp
}
/*****************************************************/
/****读DS18B20测的温度****/
void DS18B20_read_data(void)
{
float temp2;
DS18B20_init(); //DS18B20初始化
DS18B20_write(0xcc); //写命令0xcc忽略ROM匹配
DS18B20_write(0x44); //写命令0x44温度转换命令
delay_nms(100); //等待100ms
DS18B20_init(); //初始化DS18B20
DS18B20_write(0xcc); //写命令0xcc忽略ROM匹配
DS18B20_write(0xbe); //写命令0xbe读取内部数据
teml=DS18B20_read(); //读DS18B20数据赋予teml
temh=DS18B20_read(); //读DS18B20数据赋予temh
if(temh>7)//0000,0111 大于7说明是负值
{
zf=0;//zf=0是负值
temp=temh;//将高位赋予temp
temp=temp<<8;//
temp=temp|teml;
temp=~temp;
temp=temp|0x01;
temp2=temp*0.0625;
temp=temp2*100+0.5;
}
else//否则是正值
{
zf=1;//1正值
temp=temh;
temp=temp<<8;
temp=temp|teml;
temp2=temp*0.0625;
temp=temp2*100+0.5;
}
}
/****温度转换****/
void wendu(void)
{
if(zf==1)//1温度是正值
{
/*1602显示用*/
a[0]=temp/1000;
a[1]=temp%1000/100;
a[2]='.';
a[3]=temp%1000%100/10;
a[4]=temp%10;
/*PC显示用*/
b[0]=temp/1000+0x30;
b[1]=temp%1000/100+0x30;
b[2]='.';
b[3]=temp%1000%100/10+0x30;
b[4]=temp%10+0x30;
b[5]=' ';
}
if(zf==0)
{
/*1602显示用*/
a[0]='-';
a[1]=temp/1000;
a[2]=temp%1000/100;
a[3]='.';
a[4]=temp%1000%100/10;
a[5]=temp%10;
/*PC显示用*/
b[0]='-';
b[1]=temp/1000+0x30;
b[2]=temp%1000/100+0x30;
b[3]='.';
b[4]=temp%1000%100/10+0x30;
b[5]=temp%10+0x30;
b[6]=' ';
}
}
/***********************************************/
/***********************************************/
/****显示****/
/****1602显示****/
void display_1602(void)
{
if(zf==1)//正值
{
/**1602显示**/
LCD_display_char(8,0,a[0]+0x30);
LCD_display_char(9,0,a[1]+0x30);
LCD_display_char(10,0,a[2]); //显示小数点
LCD_display_char(11,0,a[3]+0x30);
LCD_display_char(12,0,a[4]+0x30);
LCD_display_char(13,0,' ');
}
if(zf==0)//负值
{
LCD_display_char(8,0,a[0]);
LCD_display_char(9,0,a[1]+0x30);
LCD_display_char(10,0,a[2]+0x30);
LCD_display_char(11,0,a[3]); //显示小数点
LCD_display_char(12,0,a[4]+0x30);
LCD_display_char(13,0,a[5]+0x30);
}
}
/****PC机显示****/
void display_usart(void)
{
uchar j=0;
uart_str_send("DS18B20:");
while(j<6)
{
uart_send(b[j]);
j++;
}
}
/***********************************************/
/***********************************************/
/****主程序****/
void main(void)
{
uint flag1;
SREG_I=1;
port_init();//端口初始化
usart_init();//USART初始化
LCD_init();//LCD1602初始化
DS18B20_init();//DS18B20初始化
delay_nms(400);
LCD_display_zfc(0,0,str1);
while(1)
{
if(flag==1)
{
uart_send(usart_temp);
SREG_I=0;
switch(cnt)
{
case 0:if(usart_temp=='(')cnt=1;
else receive_flag=0;break;
case 1:if((usart_temp>=0x30)&&(usart_temp<=0x39)){c[0]=usart_temp-0x30;cnt=2;}
else receive_flag=0;break;
case 2:if(usart_temp==')'){cnt=0;receive_flag=1;}
else receive_flag=0;break;
}//switch(cnt)
SREG_I=1;
flag=0;
}//flag==1
LCD_display_char(0,1,c[0]+0x30);
if(receive_flag==1)//接到正确的指令
{
if(c[0]==1)//c[0]中存放指令 如果指令是1
{
DS18B20_read_data();
wendu();
display_1602();
flag1=1;//1602显示是否启动
}//if(c[0]==1)
else flag1=0;
}//接到正确的指令
LCD_display_char(2,1,flag1+0x30);//1602显示是否启动DS18B20 1启动 0停止
}//while(1)
}
看书才能沉得住气~~C Primer plus这些看好了,就没什么话可说了(当然还有C++ Primer plus)。实例找度娘
其实百度知道就可以实例你先设置一下你关注的分类为c/c++ 然后回答问题