?? hjmcu.c
字號(hào):
}
void Port_DS18B20()
{
DDRC &= ~(1 << PC2); // 輸入模式(上電時(shí)為高電平)
PORTC &= ~(1 << PC2); // 輸出鎖存器寫(xiě)0,以后不再更改
}
//USART寄存器配置函數(shù)
void Usart_Init()
{
UCSRA = 0X00;
UCSRC |= (1<<URSEL) | (1 << UCSZ1) | (1 << UCSZ0); //異步,數(shù)據(jù)格式8,N,1
//UCSRC寄存器與UBRRH寄存器共用相同的I/O地址,寫(xiě) UCSRC 時(shí), URSEL 應(yīng)設(shè)置為 1。
UBRRL = (F_CPU / BAUD / 16 - 1) % 256; //波特率設(shè)置
UBRRH = (F_CPU / BAUD / 16 - 1) / 256;
UCSRB |= (1 << RXCIE) | (1 << RXEN) | (1 << TXEN); //發(fā)送使能
}
//字節(jié)發(fā)送函數(shù)
void Usart_PutChar(unsigned char cTXData)
{
while( !(UCSRA & (1 << UDRE)) ); //只有數(shù)據(jù)寄存器為空時(shí)才能發(fā)送數(shù)據(jù)
UDR = cTXData; //發(fā)送數(shù)據(jù)送USART I/O數(shù)據(jù)寄存器-UDR
}
//接收中斷函數(shù)
ISR(USART_RXC_vect )
{
unsigned char Rev;
Rev = UDR; //從USART I/O數(shù)據(jù)寄存器-UDR中讀出數(shù)據(jù)
Usart_PutChar(Rev); //將接收到的數(shù)據(jù)發(fā)送
}
void Usart_PutString(unsigned char *pcString)
{
while (*pcString)
{
Usart_PutChar(*pcString++);
}
}
//DS18B20初始化
unsigned char DS18B20_Init()
{
SET_OUT; //PA2設(shè)置為輸出口(相當(dāng)于拉低數(shù)據(jù)線上的電平)
Delayus(490); //延時(shí)大于480us
SET_IN; //輸入 釋放數(shù)據(jù)線(相當(dāng)于拉高數(shù)據(jù)線上的電平)
Delayus(68); //延時(shí)大于60US,
//while(DQ_IN); //可以用兩個(gè)while()死循環(huán)來(lái)判斷復(fù)位是否成功,當(dāng)數(shù)據(jù)線被拉低,說(shuō)明
//while(!(DQ_IN)); //DS18B20開(kāi)始復(fù)位應(yīng)答,當(dāng)數(shù)據(jù)線變高,說(shuō)明應(yīng)答完畢
if(DQ_IN) //判斷DSDS18B20是否拉低數(shù)據(jù)線
{
OK_Flag = 0; // 數(shù)據(jù)線是高?復(fù)位失敗
}
else
{
OK_Flag = 1; // 數(shù)據(jù)線是低?復(fù)位成功
}
Delayus(422); //有復(fù)位應(yīng)答信號(hào)后,應(yīng)當(dāng)再延時(shí)一段時(shí)間(480-68),以等待應(yīng)答完畢
return OK_Flag; //返回復(fù)位標(biāo)志
}
//從DSDS18B20讀取一個(gè)字節(jié)數(shù)據(jù)
unsigned char Read_DS18B20()
{
unsigned char i;
unsigned char dat = 0; // dat用于存儲(chǔ)讀到的數(shù)據(jù),先清零
for(i = 0;i < 8;i++) //共讀8位數(shù)據(jù),構(gòu)成一個(gè)字節(jié)
{
SET_OUT; //定義為輸出(拉低數(shù)據(jù)線)
Delayus(2); //拉低2微秒
SET_IN; //定義成輸入,讀入數(shù)據(jù)(同時(shí)也相當(dāng)于拉高數(shù)據(jù)線)
Delayus(4); //延時(shí)
dat = dat >> 1; //數(shù)據(jù)右移,讀順序:先低后高
if(DQ_IN) //讀數(shù)據(jù),
{
dat |= 0x80; //如果是高,置1,右移數(shù)據(jù)
}
Delayus(62); //延時(shí)大于60us
}
return dat; //返回讀到的1字節(jié)數(shù)據(jù)
}
//向DSDS18B20寫(xiě)1字節(jié)數(shù)據(jù)
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i = 0;i < 8;i++) //寫(xiě)8次,一次寫(xiě)1位,先寫(xiě)低字節(jié)
{
SET_OUT; //拉低數(shù)據(jù)線2us,開(kāi)始寫(xiě)數(shù)據(jù)
Delayus(2); //
if(dat & 0x01) //寫(xiě)數(shù)據(jù)
{
SET_IN; //寫(xiě)1
}
else
{
SET_OUT; //寫(xiě)0
}
dat >>= 1; //數(shù)據(jù)右移1位,先寫(xiě)低位
Delayus(62); //延時(shí)大于60us
SET_IN; //拉高數(shù)據(jù)線
Delayus(2); //寫(xiě)兩位數(shù)據(jù)的時(shí)間間隔
}
}
//us級(jí)別的延時(shí)函數(shù)
void Delayus(unsigned int lus)
{
while(lus--)
{
_delay_loop_2(3); //_delay_loop_2(1)是延時(shí)4個(gè)時(shí)鐘周期,參數(shù)為3則延時(shí)12
//個(gè)時(shí)鐘周期,本實(shí)驗(yàn)用12M晶體,則12個(gè)時(shí)鐘周期為12/12=1us
}
}
//ms級(jí)別的延時(shí)函數(shù)
void Delayms(unsigned int lms)
{
while(lms--)
{
Delayus(1000); //延時(shí)1ms
}
}
//啟動(dòng)溫度轉(zhuǎn)換
void DS18B20_StartConvert(void)
{
unsigned char i;
DS18B20_Init(); //初始化DS18B20
Write_DS18B20(DS18B20_SKIP_ROM); //發(fā)送ROM指令,跳過(guò)ROM匹配
Write_DS18B20(DS18B20_CONVERT_RAM); // 發(fā)送溫度轉(zhuǎn)換命令
for(i=0;i<50;i++) //延時(shí)1S,等轉(zhuǎn)換完成
{
Delayms(20);
}
}
//獲得溫度轉(zhuǎn)換結(jié)果
void DS18B20_GetConvert(void)
{
DS18B20_Init(); //初始化DSDS18B20
Write_DS18B20(DS18B20_SKIP_ROM); //發(fā)送ROM指令,跳過(guò)ROM匹配
Write_DS18B20(DS18B20_READ_RAM); //發(fā)送讀取暫存器指令
Temp_L = Read_DS18B20(); //獲得溫度的低位
Temp_H = Read_DS18B20(); //獲得溫度的高位
}
// 讀取RAM內(nèi)容
void DS18B20_ReadRAM(void)
{
unsigned char i;
DS18B20_Init(); //初始化DSDS18B20
Write_DS18B20(DS18B20_SKIP_ROM); //發(fā)送ROM指令,跳過(guò)ROM匹配
Write_DS18B20(DS18B20_READ_RAM); //發(fā)送讀取暫存器指令
for(i = 0;i < 9;i++)
{
ReadRAM_Buff[i] = Read_DS18B20();
}
}
//寫(xiě)溫度上下限和配置寄存器到RAM
void DS18B20_WriteRAM(void)
{
DS18B20_Init(); //初始化DSDS18B20
Write_DS18B20(DS18B20_SKIP_ROM); //發(fā)送ROM指令,跳過(guò)ROM匹配
Write_DS18B20(DS18B20_WRITE_RAM); // 發(fā)送寫(xiě)RAM命令
Write_DS18B20(ThrH); //寫(xiě)溫度報(bào)警上限值
Write_DS18B20(ThrL); //寫(xiě)溫度報(bào)警下限值
Write_DS18B20(CFG); //寫(xiě)配置寄存器
}
//復(fù)制RAM中的溫度上下線和配置寄存器到EEPROM
void DS18B20_CopyEEPROM(void)
{
DS18B20_Init(); //初始化DSDS18B20
Write_DS18B20(DS18B20_SKIP_ROM); //發(fā)送ROM指令,跳過(guò)ROM匹配
Write_DS18B20(DS18B20_COPY_RAM); // 發(fā)送復(fù)制命令
Delayms(20); // 等待復(fù)制完成
}
//把EEPROM中的溫度上下線和配置寄存器恢復(fù)到RAM
void DS18B20_RecallRAM(void)
{
DS18B20_Init(); //初始化DSDS18B20
Write_DS18B20(DS18B20_SKIP_ROM); //發(fā)送ROM指令,跳過(guò)ROM匹配
Write_DS18B20(DS18B20_RECALL_EEPROM); // 發(fā)送溫度轉(zhuǎn)換命令
Delayms(20);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -