本帖最后由 lxe 于 2014-7-31 11:18 编辑
程序调试了好久,昨天终于发现了一个关键点。。多了一个分号。 细节决定成败! 大家懂的。。。结果虽然出来了,,但个人感觉偏差有点大,而且温度范围是0~55,但用一杯开水测试的时候超出了。。。怎么破?望大虾们指导指导。。- /******************************************************
- //文件名称:
- //作 者:LXE
- //版 本:
- //日 期:2017-7-31
- //说 明:
- //修改记录:
- //时钟频率:8M
- *******************************************************/
- #include <iom161v.h>
- #include <macros.h>
- #define CLK_H() PORTA |= BIT(1) //595时钟线拉高PA1
- #define CLK_L() PORTA &= ~BIT(1) //595时钟线拉低PA1
- #define RCK_H() PORTA |= BIT(2) //595锁存线拉高PA2
- #define RCK_L() PORTA &= ~BIT(2) //595锁存线拉低PA2
- #define DATA_H() PORTA |= BIT(3) //595时钟线拉高PA3
- #define DATA_L() PORTA &= ~BIT(3) //595数据线拉低PA3
- #define DHT_OUT() DDRA |= BIT(7) //DHT11数据线输出设置PA7
- #define DHT_IN() DDRA &= ~BIT(7) //DHT11数据线输入设置PA7
- #define DHT_H() PORTA |= BIT(7) //DHT11数据线拉高PA7
- #define DHT_L() PORTA &= ~BIT(7) //DHT11数据线拉低PA7
- #define DHT PINA &= BIT(7) //DHT11寄存器数据读取PA7
- #define uchar unsigned char
- #define uint unsigned int
- uchar RH=0,RL=0,TH=0,TL=0;
- uchar seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //断码表
- uchar table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码表
- uchar buf[]={0,0,0,0,0,0,0,0}; //数据缓存区
- /*******************************************************
- //函数名称:
- //函数功能:1ms延时子程序
- //输入参数:
- //返回参数:
- ********************************************************/
- void delay_ms(uint ms)
- {
- uint i ;
- while(ms--)
- {
- for(i = 0;i<990;i++) ;
- }
- }
- /*******************************************************
- //函数名称:
- //函数功能:10us延时子程序
- //输入参数:
- //返回参数:
- ********************************************************/
- void delay_us(uchar us)//10us延时子程序
- {
- uchar i;
- while(us--)
- {
- for(i = 0;i < 11;i++);
- }
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- void Sent_col_data(uchar dat)
- {
- uchar i;
- for(i = 0;i < 8;i++)
- {
- CLK_L();
- if((dat & 0x80) == 0x80) DATA_H();
- if((dat & 0x80) == 0x00) DATA_L();
- CLK_H();
- dat <<= 1 ;
- }
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- void Sent_col(uchar dat1,uchar dat2)
- {
- Sent_col_data(dat1);
- Sent_col_data(dat2);
- RCK_L();
- RCK_H();
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- uchar receive_byte(void) //接收一个字节
- {
- uchar i,data=0;
- uchar flag = 0; //超时标志
- for(i = 0;i < 8;i++)
- {
- data <<= 1; //将数据左移
- flag = 2;
- while((!(DHT))&&(flag++)); //等待低电平结束
- if(flag == 1) {break;} //超时跳出
- delay_us(3); //延时30us
- if(DHT) {data |= 0x01;} //判断高低数据
- flag = 2;
- while((DHT)&&(flag++)); //等待高电平结束
- //if(flag == 1) {break;} //超时跳出
- }
- return data;
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- void receive(void)//接收数据
- {
- uchar T_H,T_L,R_H,R_L,R_T;
- uchar i;
- uchar flag = 0;
- /*************起始信号************/
- DHT_OUT();DHT_L(); //
- delay_ms(20); //>18ms
- DHT_OUT();DHT_H(); //
- delay_us(2); //延时20us
- /*************读取数据************/
- DHT_IN();
- if(!(DHT)) //读取DHT11响应信号
- {
- flag = 2;
- while((!(DHT))&&(flag++)); //等待DHT11低电平结束
- flag = 2;
- while((DHT)&&(flag++)); //等待DHT11高电平结束
- R_H = receive_byte();
- R_L = receive_byte();
- T_H = receive_byte();
- T_L = receive_byte();
- R_T = receive_byte();
- DHT_OUT(); //拉高释放总线
- DHT_H();
- if((R_H+T_H) == R_T)
- {
- RH = R_H;
- TH = T_H;
- }
- }
- /*******数据转换***********/
- buf[7] = RH / 10;
- buf[6] = RH % 10;
- buf[3] = TH / 10;
- buf[2] = TH % 10;
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- void timer0_Init(void)
- {
- TCNT0 = 0x4E; //赋初值2ms定时
- TCCR0 = 0x03; //设置TC0为CLK/256分频,启动TC0
- TIMSK = 0x01; //设置定时计数器的屏蔽寄存器
- SEI(); //使能全局中断
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- #pragma interrupt_handler timer0_ovf_isr:10 //定时器0溢出2ms中断
- void timer0_ovf_isr(void) //数码管显示
- {
- static uchar i = 0;
- if(i == 0) {Sent_col(~table[i],0x58);} //显示c
- else if(i == 4) {Sent_col(~table[i],0x50);} //显示r
- else if(i==1||i ==5){Sent_col(0x00,0x00);} //消去无用位
- else {Sent_col(~table[i],seg[buf[i]]);} //显示数据
- if(++i > 8)i = 0;
- }
- /*******************************************************
- //函数名称:
- //函数功能:
- //输入参数:
- //返回参数:
- ********************************************************/
- int main(void)
- {
- DDRA = 0x0F; //PA口初始化
- PORTA = 0xFF; //PA口上拉
- receive(); //接收数据
- timer0_Init(); //定时器初始化
- while(1)
- {
- receive(); //接收数据
- //delay_ms(500); //延时500ms再采集数据
- }
- return 0;
- }
复制代码
|