这也是我们为什么之前早早的就讲解串口通信的原因。在单片机的学习过程中,串口通信是一个很好的辅助调试手段,我们可以在程序的不同位置放置串口数据发送程序,从而实现程序调试功能,这样调试比直接用仿真器调试来的快捷方便,另外LED发光二极管,蜂鸣器等都可以作为辅助调试工具,我们可以在程序容易出现问题的地方防止一些指示(如发光二极管的亮灭,蜂鸣器的鸣叫,串口发送相应信息),通过这些指示我们可以很方便的判断程序执行结果是否正确。
//××××××××××××引脚宏定义×××××××××××××
//18B20定义
#define SET_DQ (PORTE) |= (1 << (PE7))
// 18b20 高电平
#define CLR_DQ (PORTE) &=~(1 << (PE7))
// 18b20 低电平
#define DQ_IN (PINE) &
(1<<(PE7))
// 18b20信号输入
//18B20定义
#define SET_DQ (PORTE) |= (1 << (PE7))
#define CLR_DQ (PORTE) &=~(1 << (PE7))
#define DQ_IN
#define SET_OUT (DDRE) |=
(1<<(PE7))
//PA2定义成输出
#define SET_IN (DDRE)
&=~(1<<(PE7))
//PA2定义成输入
#define SET_IN
//函数声明
void Delayus(unsigned int lus);
//us延时函数
void Delayms(unsigned int lms);
//ms延时函数
void Port_DS18b20(void);
//DS18B20端口配置
void Port_Init(void);
//端口初始化配置
void Usart_Init(void); //USART寄存器设置
void Usart_PutChar(unsigned char cTXData);
//字节发送函数
void Usart_PutString(unsigned char *pcString); //字符串发送函数
void Delayus(unsigned int lus);
void Delayms(unsigned int lms);
void Port_DS18b20(void);
void Port_Init(void);
void Usart_Init(void);
void Usart_PutChar(unsigned char cTXData);
void Usart_PutString(unsigned char *pcString); //字符串发送函数
int
main(void)
{
unsigned char i;
unsigned int
tempint,tempint1,tempint2,tempint3,tempint4;
//分别存储温度整数值,整数值的千,百,十,个位
unsigned int
temppoint,temppoint1,temppoint2,temppoint3,temppoint4;
//分别存储温度小数值,小数值的千,百,十,个位
Port_Init();
//端口初始化
Usart_Init();
//串口初始化
Port_DS18b20();
//DS18B20端口初始化
tempint = 0;
//变量初始化
temppoint=0;
Temp_H = 0;
Temp_L = 0;
OK_Flag = 0;
Usart_PutString("DS18B20 温度测量实验");
Usart_PutChar(0x0D);
Usart_PutChar(0x0A);
//结尾发送回车换行
sei();
//使能全局中断
while(1)
{
cli();
//关中断
DS18B20_Init();
//初始化DS18B20
Write_18b20(0Xcc);
//发送ROM指令,跳过ROM匹配
Write_18b20(0X44);
// 发送温度转换命令
for(i=0;i<50;i++)
//延时1S,等转换完成
{
Delayms(20);
}
DS18B20_Init();
//初始化DS18B20
Write_18b20(0Xcc);
//发送ROM指令,跳过ROM匹配
Write_18b20(0Xbe);
//发送读取暂存器指令
Temp_L = Read_18b20();
//获得温度的低位
Temp_H = Read_18b20();
//获得温度的高位
if(Temp_H &
0x08) //判断温度的正负
{
Temp_H =
~Temp_H; //负温度。取反加1
Temp_L =
~Temp_L; //
SREG |= ~(1
<< SREG_C);
//清零进位位标志
Temp_L++;
//温度低字节加1
if(SREG
& (1 <<
SREG_C)) //有进位吗?
{
Temp_H++;
//有进位,则温度高字节加1
}
{