/*************************************************************************
程序:ICC-AVR
功能:波特率9600 串口發送溫濕度數據
數據格式:濕度 溫度 校驗和
例如串口發送數據 59 00 24 00 53 則濕度為59 溫度為24 校驗和為53
公司:DHT11
芯片:M8
晶振:外部 7.3728Mhz
**************************************************** **********************/
#include
#include
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 無符號8位整型變量 */
typedef signed char S8; /* defined for signed 8-bits integer variable 有符號8位整型變量 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 無符號16位整型變量 */
typedef signed int S16; /* defined for signed 16-bits integer variable 有符號16位整型變量 */
typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 無符號32位整型變量 */
typedef signed long S32; /* defined for signed 32-bits integer variable 有符號32位整型變量 */
typedef float F32; /* single precision floating point variable (32bits) 單精度浮點數(32位長度) */
typedef double F64; /* double precision floating point variable (64bits) 雙精度浮點數(64位長度) */
/**************************************************************************
I/O空間定義
***************************************************************************/
// B0_IN DDRB &= ~(1 << PB0) /*設置輸入*/
// B0_OUT DDRB |= (1 << PB0) /*設置輸出*/
// B0_CLR PORTB &= ~(1 << PB0) /*置低電平*/
// B0_SET PORTB |= (1 << PB0) /*置高電平*/
// B0_R PINB & (1 <
#define C4_OUT DDRC |= (1 << PC4) /*設置輸出*/
#define C4_CLR PORTC &= ~(1 << PC4) /*置低電平*/
#define C4_SET PORTC |= (1 << PC4) /*置高電平*/
#define C4_R PINC & (1 <
通訊I/O空間定義
***************************************************************************/
#define COM_IN C4_IN
#define COM_OUT C4_OUT
#define COM_CLR C4_CLR
#define COM_SET C4_SET
#define COM_R C4_R
/**************************************************************************
全局變量定義區
***************************************************************************/
U8 i;
U8 U8FLAG,k;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
U16 ReceiveHighByte;
U16 ReceiveLowByte;
/**************************************************************************
***************************************************************************/
void port_init(void)
{
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x03;
DDRC = 0x0C;
PORTD = 0x00;
DDRD = 0xF0;
}
void watchdog_init(void)
{
//WDR(); //this prevents a timout on enabling
//WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
}
void Delay(unsigned int i)
{
while(i--);
}
void DelaymS (U16 dly)
{
U16 i;
for ( ; dly>0; dly--)
{
WDR();
for (i=0; i<1032; i++);
}
}
void Delay_10us(void)
{
U8 i;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;
}
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!(COM_R))&&U8FLAG++);
if(U8FLAG==1)break;
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(COM_R)U8temp=1;
U8FLAG=2;
while((COM_R)&&U8FLAG++);
//超時則跳出for循環
if(U8FLAG==1)break;
//判斷數據位是0還是1
// 如果高電平高過預定0高電平值則數據位為 1
U8comdata<<=1;
U8comdata|=U8temp; //0
}//rof
}
//--------------------------------
//-----濕度讀取子程序 ------------
//--------------------------------
//----以下變量均為全局變量--------
//----溫度高8位== U8T_data_H------
//----溫度低8位== U8T_data_L------
//----濕度高8位== U8RH_data_H-----
//----濕度低8位== U8RH_data_L-----
//----校驗 8位 == U8checkdata-----
//----調用相關子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
void RH(void)
{
//主機拉低18ms
COM_OUT;
COM_CLR;
DelaymS(18);
COM_IN;
COM_SET;
//總線由上拉電阻拉高 主機延時20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主機設為輸入 判斷從機響應信號
//P2_0=1;
//判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
// if(!P2_0) //T !
if(COM_R)U8FLAG=1;
while(!(COM_R))
{
U8FLAG=2;
//判斷從機是否發出 80us 的低電平響應信號是否結束
//while((!P2_0)&&U8FLAG++);
while((!(COM_R))&&U8FLAG++);
if(U8FLAG==1)break;
U8FLAG=2;
//判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
//while((P2_0)&&U8FLAG++);
while((COM_R)&&U8FLAG++);
if(U8FLAG==1)break;
//數據接收狀態
COM();
if(U8FLAG==1)break;
U8T_data_H_temp=U8comdata;
COM();
if(U8FLAG==1)break;
U8T_data_L_temp=U8comdata;
COM();
if(U8FLAG==1)break;
U8RH_data_H_temp=U8comdata;
COM();
if(U8FLAG==1)break;
U8RH_data_L_temp=U8comdata;
COM();
if(U8FLAG==1)break;
U8checkdata_temp=U8comdata;
break;
}//while
//P2_0=1;
COM_IN;
COM_SET;
//數據校驗
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8T_data_H_temp;
U8RH_data_L=U8T_data_L_temp;
U8T_data_H=U8RH_data_H_temp;
U8T_data_L=U8RH_data_L_temp;
U8checkdata=U8checkdata_temp;
}//fi
COM_IN;
COM_SET;
}
/*
串口初始化函數
系統頻率:2MHz
停止位:1
波特率:9600
數據長度:8
*/
void Uart_Init(void) {
UCSRA = 0x02; /*2倍速 */
UCSRB = 0x18; /*允許接收和發送*/
UCSRC = 0x06; /*8位數據 */
UBRRH = 0x00;
//UBRRL = 47; /*9600 3.6864M */
UBRRL = 95; /*9600 7.3728M */
}
/*
串數據發送
查詢方式發送
*/
void Uart_Transmit(unsigned char i) {
/* 等待發送緩沖器為空*/
while (!(UCSRA & (1<
UDR = i;
}
/*
串數據接收
查詢方式接收
*/
unsigned char Uart_Receive( void ) {
/* 等待接收數據*/
while (!(UCSRA & (1<
// Uart_Transmit(UDR);
return UDR;
}
void init_devices(void)
{
unsigned char i;
CLI();
port_init();
watchdog_init();
Uart_Init();
MCUCR = 0x03;
GICR = 0x00; //關外部中斷0
TIMSK = 0x00; //關定時器1中斷
SEI(); //re-enable interrupts
}
/**************************************************************************
主函數
**************************************************************************/
void main(void)
{
init_devices() ;
COM_IN;
COM_SET;
while(1)
{
//讀DHT11
RH();
//把DHT11的十六進制數據轉換成10進制
//格式 濕度 溫度 校驗和
//例如串口發送數據 59 00 24 00 53 則濕度為59 溫度為24 校驗和為53
U8temp=U8RH_data_H/10;
U8temp<<=4;
U8temp|=U8RH_data_H%10;
U8RH_data_H=U8temp;
Uart_Transmit(U8RH_data_H);
Uart_Transmit(U8RH_data_L);
U8temp=U8T_data_H/10;
U8temp<<=4;
U8temp|=U8T_data_H%10;
U8T_data_H=U8temp;
Uart_Transmit(U8T_data_H);
Uart_Transmit(U8T_data_L);
Uart_Transmit(U8checkdata);
//延時2S
for(U8temp=0;U8temp<200;U8temp++)
{
DelaymS(10);
}//rof
}
}
上一篇:avr 12864 矩陣鍵盤
下一篇:AVR單片機8路AD如何采樣
推薦閱讀
史海拾趣
為了進一步提升公司的國際競爭力,順芯公司積極開展國際合作與全球布局。公司與國際知名半導體廠商建立了戰略合作關系,共同研發新產品、開拓新市場。同時,順芯公司還在海外設立了研發中心和銷售中心,以便更好地服務全球客戶。這些舉措使順芯公司的全球市場份額逐年提升,成為了國際半導體行業的重要力量。
浙江東亞電子自成立以來,一直致力于技術創新和研發。公司擁有一支由50余名技術研發人員組成的專業團隊,不斷開發新產品和解決方案,以滿足市場需求。這些創新產品不僅在國內外市場上獲得了廣泛認可,還為公司在新能源、通訊和軍工等領域樹立了良好的品牌形象。
ERGOBAHCO公司成立于20世紀90年代初,當時正值電子行業快速發展的黃金時期。公司創始人李明(化名)看準了市場對于高質量電子配件的需求,決定從電子連接器這一細分領域入手。然而,初創時期公司面臨著資金短缺、技術落后等諸多挑戰。李明憑借對市場敏銳的洞察力,成功爭取到了幾筆關鍵的投資,并帶領團隊攻克了一系列技術難關。通過不懈努力,ERGOBAHCO公司逐漸在電子連接器領域站穩了腳跟。
在十九世紀80年代,丹納赫集團面對日益嚴峻的市場競爭,開始推行以精益生產為核心的全新運營方式。這種管理方式不僅強化了其在行業中的領導地位,還逐漸形成了獨特的丹納赫商業系統(Danaher Business System,DBS)。DBS注重持續改進、客戶導向和團隊合作,成為丹納赫集團在電子行業取得成功的關鍵因素。
Dynawave Incorporated的創始人李明,是一位在電子行業有著豐富經驗的工程師。他深知隨著科技的發展,無線通信技術將成為未來發展的重要方向。因此,李明帶領一支技術團隊,夜以繼日地研發新型無線通信技術。經過數月的努力,他們成功開發出了一種具有高效能、低能耗特點的無線傳輸技術,這一技術為Dynawave在行業中贏得了初步聲譽。
隨著全球化趨勢的加劇,CCC意識到必須拓展國際市場才能保持競爭力。因此,公司制定了全球化戰略,積極開拓海外市場。通過與國外代理商合作、參加國際展會等方式,CCC的產品逐漸打入國際市場并獲得了良好的口碑。如今,CCC的產品已經出口到歐洲、亞洲等多個國家和地區。
設計資源 培訓 開發板 精華推薦
- 顛覆iToF技術,安森美如何突破30米深度感知極限?
- 利用驗證框架 JAIST揭示開源自動駕駛系統的安全漏洞
- 現代汽車集團擬采用VR模擬器替代道路測試 提升未來車型的競爭力
- 研究人員開發光驅動致動器 可用于驅動水下機器人
- 吉利將發射“千里浩瀚”衛星,實現輔助駕駛系統與衛星功能深度融合
- 以鴻道工業操作系統為核心 打造工業智能機器人新生態
- UNIST研發出新表面處理技術 延長下一代鋰金屬電池的壽命
- 車載SerDes芯片行業的"DeepSeek"時刻——瑞發科HSMT SerDes閃耀2025上海車展
- 豐田顛覆傳統,固態電池明年就能量產,最受傷的將是中國?
- 基于恩智浦與onsemi的駕駛員監控系統方案