/*************************************************************************
程序: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如何采样
推荐阅读
史海拾趣
在电子行业的早期,DUBILIER公司以其卓越的技术创新能力脱颖而出。当时,市场上对高可靠性电子元件的需求日益增长,而DUBILIER公司凭借其独特的生产工艺和材料科学,成功研发出了一系列高性能的电阻器和电容器。这些产品不仅满足了市场的需求,还为公司赢得了良好的声誉。通过不断的技术创新,DUBILIER公司逐渐在电子行业中确立了其领导地位。
在XXXX年,Everspin的股票开始在纳斯达克全球市场交易,股票代码为MRAM。这一上市动作不仅为Everspin提供了更多的资金支持,也进一步提升了其在行业中的知名度和影响力。此外,兆易创新旗下的GigaDevice半导体(香港)有限公司还斥资500万美元购买了Everspin约5%的股份,显示出市场对Everspin技术和发展前景的认可。
在XXXX年,Everspin的股票开始在纳斯达克全球市场交易,股票代码为MRAM。这一上市动作不仅为Everspin提供了更多的资金支持,也进一步提升了其在行业中的知名度和影响力。此外,兆易创新旗下的GigaDevice半导体(香港)有限公司还斥资500万美元购买了Everspin约5%的股份,显示出市场对Everspin技术和发展前景的认可。
在2017年,诚芯微被认定为国家高新技术企业,这是对公司技术实力和创新能力的高度肯定。获得这一荣誉后,诚芯微进一步加大了研发投入,加强了与高校和科研机构的合作,推动了公司技术的持续创新。同时,公司还扩大了产能,优化了供应链管理,提升了市场竞争力。
并购完成后,GainSpan的技术与Telit的物联网平台实现了深度融合。Telit利用GainSpan的低功耗WiFi模组技术,推出了更加高效、节能的物联网解决方案。这些方案不仅降低了物联网设备的能耗,还延长了设备的使用寿命,提高了整体系统的稳定性和可靠性。同时,GainSpan的技术也为Telit的物联网平台带来了更多创新应用的可能性。
面对数字化浪潮和智能制造的兴起,DESCO公司积极拥抱变革。公司投入大量资金引进先进的自动化设备和智能化生产线,提高生产效率和产品质量。同时,DESCO还加强了数字化营销和客户服务体系建设,提升了客户体验和市场响应速度。这些举措使公司在激烈的市场竞争中保持了领先地位。
REACH法规下,中国产品又遭召回近日,欧盟RAPEX通报,希腊召回中国生产的Jumbo Bookie牌带橡皮擦的铅笔,其型号为ZDT93D-2,条码为0 249360 000033。一套共2支铅笔,每支铅笔上有4个橙色的西瓜状或草莓状的橡皮擦。据悉,通报的理由为该铅笔不符合 ...… 查看全部问答∨ |
|
最近刚开始在研究rfid,就是想试着做一个简单的应用,用的是复旦的FM1715,对于datasheet里面有些描述看不是很懂,上来向大家请教下:对于Read指令, READ 控制单元 --> 射频卡 command:0x30 Len : 1 Data[0] : _Adr 块地址 (0~ ...… 查看全部问答∨ |
|
小弟现在在开发上位机程序 用到USB 通讯 ,但是驱动资料上只给除了两个管道名 由于种种原因 这两个都不符合要求 我该怎么样得到管道名 (用一个共享软件 人家都可以得到的) 请高手指点!!… 查看全部问答∨ |
|
前段时间加了5V左右的电压吧(手贱了,不作死就不会死啊。。。辛亏是学校送的。。。),导致过一会儿板上的lED就灭了,用万用表测了,发现电源芯片坏了,于是向TI申请了launchpad上面的芯片组件。后来把电源芯片换上去了,MSP430G2553照样运行,LED ...… 查看全部问答∨ |
本帖最后由 jameswangsynnex 于 2015-3-3 19:53 编辑 Google 是个名副其实的收购狂,在05年收购android之前它主要还是围绕广告技术、搜素、图像识别等业务的拓展收购技术和团队,后开始在硬件以及相关技术上收了不少团队。看完这些公司的背景,下 ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况