📄 复件 main.txt
字号:
//UCSRC寄存器与UBRRH寄存器共用相同的I/O地址,写 UCSRC 时, URSEL 应设置为 1。
UBRRL = (F_CPU / BAUD / 16 - 1) % 256; //波特率设置
UBRRH = (F_CPU / BAUD / 16 - 1) / 256;
UCSRB |= (1 << RXCIE) | (1 << RXEN) | (1 << TXEN); //发送使能
}
//字节发送函数
void Usart_PutChar(unsigned char cTXData)
{
while( !(UCSRA & (1 << UDRE)) ); //只有数据寄存器为空时才能发送数据
UDR = cTXData; //发送数据送USART I/O数据寄存器-UDR
}
//接收中断函数
ISR(USART_RXC_vect )
{
unsigned char Rev;
Rev = UDR; //从USART I/O数据寄存器-UDR中读出数据
Usart_PutChar(Rev); //将接收到的数据发送
}
void Usart_PutString(unsigned char *pcString)
{
while (*pcString)
{
Usart_PutChar(*pcString++);
}
}
//DS18B20初始化
unsigned char DS18B20_Init()
{
SET_OUT; //PA2设置为输出口(相当于拉低数据线上的电平)
Delayus(490); //延时大于480us
SET_IN; //输入 释放数据线(相当于拉高数据线上的电平)
Delayus(68); //延时大于60US,
//while(DQ_IN); //可以用两个while()死循环来判断复位是否成功,当数据线被拉低,说明
//while(!(DQ_IN)); //DS18B20开始复位应答,当数据线变高,说明应答完毕
if(DQ_IN) //判断DSDS18B20是否拉低数据线
{
OK_Flag = 0; // 数据线是高?复位失败
}
else
{
OK_Flag = 1; // 数据线是低?复位成功
}
Delayus(422); //有复位应答信号后,应当再延时一段时间(480-68),以等待应答完毕
return OK_Flag; //返回复位标志
}
//从DSDS18B20读取一个字节数据
unsigned char Read_DS18B20()
{
unsigned char i;
unsigned char dat = 0; // dat用于存储读到的数据,先清零
for(i = 0;i < 8;i++) //共读8位数据,构成一个字节
{
SET_OUT; //定义为输出(拉低数据线)
Delayus(2); //拉低2微秒
SET_IN; //定义成输入,读入数据(同时也相当于拉高数据线)
Delayus(4); //延时
dat = dat >> 1; //数据右移,读顺序:先低后高
if(DQ_IN) //读数据,
{
dat |= 0x80; //如果是高,置1,右移数据
}
Delayus(62); //延时大于60us
}
return dat; //返回读到的1字节数据
}
//向DSDS18B20写1字节数据
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i = 0;i < 8;i++) //写8次,一次写1位,先写低字节
{
SET_OUT; //拉低数据线2us,开始写数据
Delayus(2); //
if(dat & 0x01) //写数据
{
SET_IN; //写1
}
else
{
SET_OUT; //写0
}
dat >>= 1; //数据右移1位,先写低位
Delayus(62); //延时大于60us
SET_IN; //拉高数据线
Delayus(2); //写两位数据的时间间隔
}
}
//us级别的延时函数
void Delayus(unsigned int lus)
{
while(lus--)
{
_delay_loop_2(3); //_delay_loop_2(1)是延时4个时钟周期,参数为3则延时12
//个时钟周期,本实验用12M晶体,则12个时钟周期为12/12=1us
}
}
//ms级别的延时函数
void Delayms(unsigned int lms)
{
while(lms--)
{
Delayus(1000); //延时1ms
}
}
//启动温度转换
void DS18B20_StartConvert(void)
{
unsigned char i;
DS18B20_Init(); //初始化DS18B20
Write_DS18B20(DS18B20_SKIP_ROM); //发送ROM指令,跳过ROM匹配
Write_DS18B20(DS18B20_CONVERT_RAM); // 发送温度转换命令
for(i=0;i<50;i++) //延时1S,等转换完成
{
Delayms(20);
}
}
//获得温度转换结果
void DS18B20_GetConvert(void)
{
DS18B20_Init(); //初始化DSDS18B20
Write_DS18B20(DS18B20_SKIP_ROM); //发送ROM指令,跳过ROM匹配
Write_DS18B20(DS18B20_READ_RAM); //发送读取暂存器指令
Temp_L = Read_DS18B20(); //获得温度的低位
Temp_H = Read_DS18B20(); //获得温度的高位
}
//启动温度转换,带ROM匹配
void DS18B20_StartConvert1(void)
{
unsigned char i;
DS18B20_MatchROM();
Write_DS18B20(DS18B20_CONVERT_RAM); // 发送温度转换命令
for(i=0;i<50;i++) //延时1S,等转换完成
{
Delayms(20);
}
}
//获得温度转换结果,带ROM匹配
void DS18B20_GetConvert1(void)
{
DS18B20_MatchROM();
Write_DS18B20(DS18B20_READ_RAM); //发送读取暂存器指令
Temp_L = Read_DS18B20(); //获得温度的低位
Temp_H = Read_DS18B20(); //获得温度的高位
}
// 读取RAM内容
void DS18B20_ReadRAM(void)
{
unsigned char i;
DS18B20_Init(); //初始化DSDS18B20
Write_DS18B20(DS18B20_SKIP_ROM); //发送ROM指令,跳过ROM匹配
Write_DS18B20(DS18B20_READ_RAM); //发送读取暂存器指令
for(i = 0;i < 9;i++)
{
ReadRAM_Buff[i] = Read_DS18B20();
}
}
//写温度上下限和配置寄存器到RAM
void DS18B20_WriteRAM(void)
{
DS18B20_Init(); //初始化DSDS18B20
Write_DS18B20(DS18B20_SKIP_ROM); //发送ROM指令,跳过ROM匹配
Write_DS18B20(DS18B20_WRITE_RAM); // 发送写RAM命令
Write_DS18B20(ThrH); //写温度报警上限值
Write_DS18B20(ThrL); //写温度报警下限值
Write_DS18B20(CFG); //写配置寄存器
}
//复制RAM中的温度上下线和配置寄存器到EEPROM
void DS18B20_CopyEEPROM(void)
{
DS18B20_Init(); //初始化DSDS18B20
Write_DS18B20(DS18B20_SKIP_ROM); //发送ROM指令,跳过ROM匹配
Write_DS18B20(DS18B20_COPY_RAM); // 发送复制命令
Delayms(20); // 等待复制完成
}
//把EEPROM中的温度上下线和配置寄存器恢复到RAM
void DS18B20_RecallRAM(void)
{
DS18B20_Init(); //初始化DSDS18B20
Write_DS18B20(DS18B20_SKIP_ROM); //发送ROM指令,跳过ROM匹配
Write_DS18B20(DS18B20_RECALL_EEPROM); // 发送温度转换命令
Delayms(20);
}
//读ROM,当总线上只有一个节点时,可以执行此操作
void DS18B20_ReadROM(void)
{
unsigned char i;
DS18B20_Init(); //初始化DS18B20
Write_DS18B20(DS18B20_READ_ROM); //发送读ROM指令
for(i = 0;i < 8;i++)
{
ReadROM_Buff[i] = Read_DS18B20();
}
}
//搜索ROM,确定总线上的节点数目和ROM内容
void DS18B20_SearchROM(void)
{
DS18B20_Init(); //初始化DS18B20
Write_DS18B20(DS18B20_SEARCH_ROM); //发送搜索ROM指令
}
// 跳过ROM,当总线上只有一个节点时,可以执行此操作
void DS18B20_SkipROM(void)
{
DS18B20_Init(); //初始化DS18B20
Write_DS18B20(DS18B20_SKIP_ROM); //发送ROM指令,跳过ROM匹配
}
//匹配ROM,此命令后紧跟64位ROM序列号,匹配的节点可以读写
void DS18B20_MatchROM(void)
{
unsigned char i;
DS18B20_Init(); //初始化DS18B20
Write_DS18B20(DS18B20_MATCH_ROM); //发送匹配ROM指令
for(i = 0;i < 8;i++)
{
Write_DS18B20(ROM_Buff2[i]);
}
}
//报警搜索ROM,只有温度超过设定值的才能响应
void DS18B20_AlarmROM(void)
{
DS18B20_Init(); //初始化DS18B20
Write_DS18B20(DS18B20_ALARM_ROM); //发送报警搜索ROM指令
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -