?? hjmcu.c
字號(hào):
/**************************************************************************************************
*** 慧凈電子1天入門(mén)、10天學(xué)會(huì)、1年精通單片機(jī)與C語(yǔ)言視頻教程配套程序源碼 ***
*** 實(shí)驗(yàn)?zāi)康模篐J-1G 開(kāi)發(fā)板 AVR配套實(shí)驗(yàn)程序 ***
*** MCU: ATmega16 部分C源碼可以直接用于項(xiàng)目開(kāi)發(fā)、歡迎復(fù)制共享、功德無(wú)量、沒(méi)有版權(quán) ***
*** 作者:慧凈免費(fèi)助學(xué)會(huì)員
*** 部分源碼網(wǎng)上收集整理、如有傷害到你的利益、請(qǐng)來(lái)信,hjmcu@163.com 我們的免費(fèi)助學(xué)會(huì)員會(huì)定期幫你刪除掉 ***
*** 編譯器:GCC ***
*** 百度交流空間:http://hi.baidu.com/HJMCU WWW.HJMCU.COM ***
*** 論壇交流:http://bbs.hjmcu.com 歡迎來(lái)論壇一分錢(qián)不要下載配套的仿真電路 ***
*** 配套的硬件學(xué)習(xí)板網(wǎng)址:http://shop37031453.taobao.com/ ***
*** 日期:2008.8.8 ***
*** 目標(biāo):用C語(yǔ)言寫(xiě)程序就這么簡(jiǎn)單、慧爭(zhēng)祝你1天入門(mén)、10天學(xué)會(huì)、1年精通單片機(jī)與C語(yǔ)言、找個(gè)好工作 ***
***************************************************************************************************/
//慧凈電子大學(xué)生課程設(shè)計(jì)專(zhuān)用實(shí)驗(yàn)板《HJ-1G》、直接支持AT89S52 STC89C52單片機(jī)
//加轉(zhuǎn)接板后支持AVR ATmega16 32 系列單片機(jī)、是你學(xué)習(xí)單片機(jī)的得力助手 一板二用,學(xué)完51再學(xué)AVR
//HJ-1G 學(xué)習(xí)板加AVR轉(zhuǎn)接板后,裝上ATMETAM16 單片機(jī)實(shí)驗(yàn)
//HJ-1G 學(xué)習(xí)板AVR單片機(jī)實(shí)驗(yàn),F(xiàn)M報(bào)警實(shí)驗(yàn)
//注意要把JTAGEN 仿真熔絲位設(shè)置成1 才能完成本實(shí)驗(yàn),設(shè)置成1時(shí)不能用仿真口,只能用ISP下載接口下載程序
//第一排3、4個(gè)按鍵按下后,流水燈分別跳動(dòng)。
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> //中斷函數(shù)頭文件
//××××××××××××引腳宏定義×××××××××××××
//DS18B20定義
#define SET_DQ (PORTC) |= (1 << (PC2)) // DS18B20 高電平
#define CLR_DQ (PORTC) &=~(1 << (PC2)) // DS18B20 低電平
#define DQ_IN (PINC) & (1<<(PC2)) // DS18B20信號(hào)輸入
#define SET_OUT (DDRC)|= (1<<(PC2)) //PA2定義成輸出
#define SET_IN (DDRC)&=~(1<<(PC2)) //PA2定義成輸入
//常量聲明
#define BAUD 9600
//ROM操作指令碼
#define DS18B20_SKIP_ROM 0xCC //跳過(guò)ROM指令碼
#define DS18B20_SEARCH_ROM 0xF0 //搜索ROM指令碼
#define DS18B20_READ_ROM 0x33 //讀ROM指令碼
#define DS18B20_MATCH_ROM 0x55 //匹配ROM指令碼
#define DS18B20_ALARM_ROM 0xEC //報(bào)警搜索ROM指令碼
//RAM操作指令碼
#define DS18B20_CONVERT_RAM 0x44 //啟動(dòng)溫度轉(zhuǎn)換指令碼
#define DS18B20_READ_RAM 0xBE //讀RAM指令碼
#define DS18B20_WRITE_RAM 0x4E //寫(xiě)RAM指令碼
#define DS18B20_COPY_RAM 0x48 //把RAM的TH、TL、CFG中的內(nèi)容復(fù)制到EEPROM指令碼
#define DS18B20_RECALL_EEPROM 0xB8 //把EEPROM的TH、TL、CFG中的內(nèi)容恢復(fù)到RAM指令碼
//全局變量聲明
unsigned char Temp_H,Temp_L,OK_Flag,ThrH,ThrL,CFG;
//溫度高位,低位,復(fù)位成功標(biāo)志,報(bào)警上下限值,配置寄存器值
unsigned char ReadRAM_Buff[9],WriteRAM_Buff[3]; //讀RAM的9個(gè)字節(jié),寫(xiě)RAM的溫度上下
//限報(bào)警值和配置寄存器
//函數(shù)聲明
void Delayus(unsigned int lus); //us延時(shí)函數(shù)
void Delayms(unsigned int lms); //ms延時(shí)函數(shù)
void Port_DS18B20(void); //DSDS18B20端口配置
void Port_Init(void); //端口初始化配置
void Usart_Init(void); //USART寄存器設(shè)置
void Usart_PutChar(unsigned char cTXData); //字節(jié)發(fā)送函數(shù)
void Usart_PutString(unsigned char *pcString); //字符串發(fā)送函數(shù)
unsigned char DS18B20_Init(void); //DSDS18B20初始化
unsigned char Read_DS18B20(void); //讀DS18B20
void Write_DS18B20(unsigned char dat); //寫(xiě)DS18B20
void DS18B20_StartConvert(void); //啟動(dòng)溫度轉(zhuǎn)換
void DS18B20_GetConvert(void); //獲得溫度轉(zhuǎn)換結(jié)果
void DS18B20_ReadRAM(void); // 讀取RAM內(nèi)容
void DS18B20_WriteRAM(void); //寫(xiě)溫度上下限和配置寄存器到RAM
void DS18B20_CopyEEPROM(void); //復(fù)制RAM中的溫度上下線和配置寄存器到EEPROM
void DS18B20_RecallRAM(void); //把EEPROM中的溫度上下線和配置寄存器恢復(fù)到RAM
int main(void)
{
unsigned char i;
unsigned int tempint,tempint1,tempint2,tempint3,tempint4;
//分別存儲(chǔ)溫度整數(shù)值,整數(shù)值的千,百,十,個(gè)位
unsigned int temppoint,temppoint1,temppoint2,temppoint3,temppoint4;
//分別存儲(chǔ)溫度小數(shù)值,小數(shù)值的千,百,十,個(gè)位
Port_Init(); //端口初始化
Usart_Init(); //串口初始化
Port_DS18B20(); //DSDS18B20端口初始化
tempint = 0; //變量初始化
temppoint=0;
Temp_H = 0;
Temp_L = 0;
OK_Flag = 0;
Usart_PutString("DS18B20 溫度測(cè)量實(shí)驗(yàn)");
Usart_PutChar(0x0D);
Usart_PutChar(0x0A); //結(jié)尾發(fā)送回車(chē)換行
/*
//這段被屏蔽的程序演示了1、讀出RAM內(nèi)容,讀出的內(nèi)容發(fā)送到計(jì)算機(jī)2、寫(xiě)溫度上下限報(bào)警值和
//配置寄存器的值到RAM 3、將這3個(gè)值保存到EEPROM中,4、將EEPROM中的值恢復(fù)到RAM,5、再
//從RAM中讀取全部9個(gè)字節(jié),并發(fā)送到計(jì)算機(jī)。可以通過(guò)串口觀察兩次讀到的值,由于發(fā)送的是
//16進(jìn)制,所以在串口助手上要選擇“HEX”顯示(即16進(jìn)制顯示),才能進(jìn)行觀察
DS18B20_ReadRAM(); // 讀取RAM內(nèi)容
for(i = 0;i < 9;i++)
{
Usart_PutChar(ReadRAM_Buff[i]);
}
ThrH = 0x50;
ThrL = 0x10;
CFG = 0x7f;
DS18B20_WriteRAM(); //寫(xiě)溫度上下限和配置寄存器到RAM
DS18B20_CopyEEPROM(); //復(fù)制RAM中的溫度上下線和配置寄存器到EEPROM
DS18B20_RecallRAM(); //把EEPROM中的溫度上下線和配置寄存器恢復(fù)到RAM
DS18B20_ReadRAM(); // 讀取RAM內(nèi)容
for(i = 0;i < 9;i++)
{
Usart_PutChar(ReadRAM_Buff[i]);
}
for(i=0;i<200;i++) //延時(shí)4S,再進(jìn)行溫度轉(zhuǎn)換
{
Delayms(200);
}
*/
sei(); //使能全局中斷
while(1)
{
DS18B20_StartConvert(); //啟動(dòng)溫度轉(zhuǎn)換
DS18B20_GetConvert(); //獲得溫度轉(zhuǎn)換結(jié)果
if(Temp_H & 0x08) //判斷溫度的正負(fù)
{
Temp_H = ~Temp_H; //負(fù)溫度。取反加1
Temp_L = ~Temp_L; //
SREG |= ~(1 << SREG_C); //清零進(jìn)位位標(biāo)志
Temp_L++; //溫度低字節(jié)加1
if(SREG & (1 << SREG_C)) //有進(jìn)位嗎?
{
Temp_H++; //有進(jìn)位,則溫度高字節(jié)加1
}
}
tempint = ((Temp_H << 4) & 0x70) | (Temp_L >> 4); //獲得溫度的整數(shù)位
tempint1 = tempint / 1000; //千位
tempint2 = tempint % 1000 / 100; //百位
tempint3 = tempint % 100 / 10; //十位
tempint4 = tempint % 10; //個(gè)位
temppoint = Temp_L & 0x0f; //取出溫度的小數(shù)位
temppoint = (temppoint * 625); //小數(shù)位乘以0.625得出溫度的小數(shù)位值,在此擴(kuò)大1000
//倍,得出溫度的4位小數(shù)位,顯示的時(shí)候加小數(shù)點(diǎn)
temppoint1 = temppoint / 1000; //千位
temppoint2 = temppoint % 1000 / 100; //百位
temppoint3 = temppoint % 100 / 10; //十位
temppoint4 = temppoint % 10; //個(gè)位
Usart_PutString("當(dāng)前環(huán)境溫度為:"); //發(fā)送溫度值到上位機(jī)
if(!(tempint1)) //高位為零,則不顯示
{
Usart_PutChar(' ');
if(!(tempint2))
{
Usart_PutChar(' ');
}
else
{
Usart_PutChar(tempint2 + 0x30);
}
if(!(tempint3))
{
Usart_PutChar(' ');
}
else
{
Usart_PutChar(tempint3 + 0x30);
}
}
else
{
Usart_PutChar(tempint1 + 0x30);
Usart_PutChar(tempint2 + 0x30);
Usart_PutChar(tempint3 + 0x30);
}
Usart_PutChar(tempint4 + 0x30);
Usart_PutChar('.'); //顯示小數(shù)點(diǎn)
Usart_PutChar(temppoint1 + 0x30); //顯示小數(shù)位
Usart_PutChar(temppoint2 + 0x30);
Usart_PutChar(temppoint3 + 0x30);
Usart_PutChar(temppoint4 + 0x30);
Usart_PutChar(' '); //不顯示,空一格
Usart_PutChar('o'); //顯示溫度的符號(hào)。由于實(shí)在找不到溫度那個(gè)再上面的小o,
Usart_PutChar('C'); //只好用普通的小寫(xiě)o來(lái)代替了。
Usart_PutChar(0x0D);
Usart_PutChar(0x0A); //結(jié)尾發(fā)送回車(chē)換行
for(i=0;i<200;i++) //延時(shí)4S,再進(jìn)行溫度轉(zhuǎn)換
{
Delayms(20);
}
}
}
//端口狀態(tài)初始化設(shè)置函數(shù)
void Port_Init()
{
PORTD = 0X00; //USART的發(fā)送接收端口分別為PD0和PD1
DDRD |= (1 << PD1); //PD0為接收端口,置為輸入口;PD1為發(fā)送端口,置為輸出口
PORTB = 0x00;
DDRB = 0xff;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -