DS18B20数码管显示程序
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void LED7_Init()
{
DDRA|=(1<<3)|(1<<4);
DDRB=0xff;
DDRA=0x18;
DDRB=0xff;
}
void Number_Show(unsigned int num)
{
PORTB=Number[num/1000%10];
PORTA|=(1<<3); //PA3=1;
PORTA|=BIT(DQ); //释放总线
_delay_us(1); //稍微延迟
Data>>=1;
}
}
//DS1302读字节函数
unsigned char DS1302_Read()
{
unsigned char i,Temp=0;
for(i=0;i<8;i++)
PORTA&=~BIT(DQ); //输出低电平
_delay_us(500); //延迟500微妙
PORTA|=BIT(DQ); //示范总线
_delay_us(60); //延迟60微妙
DDRA&=~BIT(DQ); //DQ位输出状态
while(PINA&BIT(DQ)); //等待从机DS18B20应答(低电平有效)
PORTA&=~(1<<3); //PA3=0;
PORTB=0xf7;
PORTA|=(1<<4); //PA3=1;
PORTA&=~(1<<4)//DS1302复位函数
void DS1302_Reset()
{
DDRA|=BIT(DQ); //DQ为输出状态
PORTA&=~(1<<3); //PA3=0;
PORTB=0xfe;
PORTA|=(1<<4); //PA3=1;
PORTA&=~(1<<4); //PA3=0;
_delay_ms(5);
PORTB=table[num/100%10];
PORTA|=(1<<3); //PA3=1;
DS1302_Write(0xbe); //读取RAM
Temp1=DS1302_Read(); //读低八位,LS Byte, RAM0
Temp2=DS1302_Read(); //读高八位,MS Byte, RAM1
DS1302_Reset(); //DS1302复位,表示读取结束
{
Temp>>=1; //数据右移
DDRA|=BIT(DQ); //DQ为输出状态
PORTA&=~BIT(DQ); //拉低总线,启动输入
PORTA|=BIT(DQ); //释放总线
DDRA&=~BIT(DQ); //DQ为输入状态
if(PINA&BIT(DQ)) Temp|=0x80;
_delay_us(45); //延迟45微妙(最大45微妙)
}
return Temp;
}
//读温度函数
unsigned int Read_Temperature()
{
unsigned int Temp1,Temp2;
#include <avr/io.h>
#define F_CPU 11059200UL
#include <util/delay.h>
#define DQ PA5
#define BIT(X) (1<<X)
unsigned char const Number[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
return (((Temp2<<8)|Temp1)*6.25); //0.0625=xx, 0.625=xx.x, 6.25=xx.xx
}
int main(void)
{
unsigned int Temp;
LED7_Init(); //初始化数码管引脚
while(1)
{
PORTA&=~(1<<3); //PA3=0;
PORTB=0xfd;
PORTA|=(1<<4); //PA3=1;
PORTA&=~(1<<4); //PA3=0;
_delay_ms(5);
PORTB=Number[num%100/10];
PORTA|=(1<<3); //PA3=1;
PORTA&=~(1<<3); //PA3=0;
PORTB=0xfb;
PORTA|=(1<<4); //PA3=1;
PORTA&=~(1<<4); //PA3=0;
_delay_ms(5);
PORTB=Number[num%10];
PORTA|=(1<<3); //PA3=1;
{
PORTA&=~BIT(DQ); //拉低总线
_delay_us(10); //延迟10微妙(最大15微妙)
if(Data&0x01) PORTA|=BIT(DQ);
else PORTA&=~BIT(DQ);
_delay_us(40); //延迟40微妙(最大45微妙)
0x77,0x7C,0x39,0x5E,0x79,0x71,0x76,0x38,0x37,0x3E,
0x73,0x5C,0x40,0x00,0x00};//共阴
unsigned char table[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00};//共阴极带小数点
while(!(PINA&BIT(DQ))); //等待从机DS18B20释放总线
}
//DS1302写字节函数
void DS1302_Write(unsigned char Data)
{
unsigned char i;
DDRA|=BIT(DQ); //DQ为输出
for(i=0;i<8;i++)
Temp=Read_Temperature(); //调用读取温度函数
Number_Show(Temp); //显示温度
_delay_us(100); //稍微延迟
}
}
DS1302_Reset(); //DS1302复位
DS1302_Write(0xCC); //跳过ROM
DS1302_Write(0x44); //温度转换
DS1302_Reset(); //DS1302复位
DS1302_Write(0xCC); //跳过ROM