- /******************************************************
- //文件名称:ATmega16--DS18B20--数码管显示
- //作 者:LXE
- //版 本:
- //日 期:2014.7.28
- //说 明:
- //修改记录:
- *******************************************************/
- #include <iom161v.h>
- #include <macros.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define CLK_H() PORTA |= BIT(1) //74HC595时钟线
- #define CLK_L() PORTA &= ~BIT(1) //
- #define RCK_H() PORTA |= BIT(2) //74HC595锁存线
- #define RCK_L() PORTA &= ~BIT(2) //
- #define DATA_H() PORTA |= BIT(3) //74HC595数据线
- #define DATA_L() PORTA &= ~BIT(3) //
- #define DQ_OUT() DDRA |= BIT(7) //设置PA7为输出
- #define DQ_IN() DDRA &= ~BIT(7) //设置PA7为输入
- #define DQ_H() PORTA |= BIT(7) //PA7输出高电平
- #define DQ_L() PORTA &= ~BIT(7) //PA7输出低电平
- #define DQ PINA & BIT(7) //PA7数据读取
- uchar seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //断码表
- uchar table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码表
- uchar buf[]={0,0,0,0,0,0,0,0}; //数据缓存区
- uint Temp = 20;
- uchar Temp_Value[] = {0x00,0x00};
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- void delay(void)
- {
- asm("nop");
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- void delay_us(uint t)
- {
- while(t--)
- delay();
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- void DS18B20_Init(void)
- {
- DQ_OUT();
- DQ_H();
- DQ_L();
- delay_us(500);
- DQ_H();
- DQ_IN();
- delay_us(40);
- DQ_IN();
- while(DQ);
- DQ_OUT();
- DQ_H();
- delay_us(140);
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- uchar Read_Byte(void)
- {
- uchar i,dat = 0;
- for(i = 0;i < 8;i++)
- {
- DQ_OUT(); DQ_L();
- dat >>= 1;
- DQ_H();
- DQ_IN();
- if(DQ) dat |= 0x80;
- delay_us(50);
- DQ_OUT();DQ_H();
- }
- return dat;
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- void Write_Byte(uchar dat)
- {
- uchar i;
- for(i = 0;i < 8;i++)
- {
- DQ_OUT(); DQ_L();
- if((dat & 0x01) == 0x01)DQ_H();
- if((dat & 0x01) == 0x00)DQ_L();
- delay_us(40);
- DQ_H();
- dat >>= 1;
- }
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- void Read_Temperature(void)
- {
- DS18B20_Init(); //DS18B20初始化
- Write_Byte(0xcc);
- Write_Byte(0x44);
- delay_us(600);
- DS18B20_Init(); //DS18B20初始化
- Write_Byte(0xcc);
- Write_Byte(0xbe);
- Temp_Value[0] = Read_Byte(); //第一次读取数据放入低位
- Temp_Value[1] = Read_Byte(); //第二次读取数据放入高位
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- void Sent_col_data(uchar dat)
- {
- uchar i;
- for(i = 0;i < 8;i++)
- {
- CLK_L();
- if((dat & 0x80) == 0x80) DATA_H();
- if((dat & 0x80) == 0x00) DATA_L();
- CLK_H();
- dat <<= 1 ;
- }
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- void Sent_col(uchar dat1,uchar dat2)
- {
- Sent_col_data(dat1);
- Sent_col_data(dat2);
- RCK_L();
- RCK_H();
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- void display(void)
- {
- uchar i;
- Read_Temperature(); //启动DS18B20
- Temp = ((Temp_Value[1] << 8) | Temp_Value[0])*6.25; //两位小数
- /* 分辨率 */
- /* 数据转换16进制转换为10进制 *0.0625则为整数xx *0.625则有一位小数xx.x *6.25则有两位小数xx.xx */
- //温度范围0~125
- buf[6] = Temp / 10000;
- buf[5] = Temp % 10000 / 1000;
- buf[4] = Temp % 1000 / 100;
- buf[3] = Temp % 100 / 10;
- buf[2] = Temp % 10;
- //数据发送显示
- for(i = 0;i < 8;i++)
- {
- if(i == 0) Sent_col(~table[i],0x58); //数码管最后一个显示c
- else if(i == 1||i ==7||(i == 6&& buf[6]==0))
- Sent_col(~table[i],0x00); //无用位不显示
- else if(i == 4) Sent_col(~table[i],seg[buf[i]]|0x80); //在温度的个位上加上点
- else Sent_col(~table[i],seg[buf[i]]);
- delay_us(400);
- }
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- int main(void)
- {
- DDRA = 0x0F; //设置PA口为输出方式
- PORTA = 0xFF; //设置PA口为上拉模式
- DS18B20_Init();
- while(1)
- {
- display(); //数码管显示
- }
- return 0;
- }
复制代码 。。。这个程序时序非常重要,,因为只有一根数据线。。既要作输出又要作输入,时序不对则无法读取数据。
|