找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1842|回复: 0
打印 上一主题 下一主题
收起左侧

温湿度的一个主程序

[复制链接]
跳转到指定楼层
楼主
ID:114795 发表于 2016-4-17 19:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//----------------IO口定义区--------------------//
sbit  P2_0  = P1^0 ;
//----------------定义区--------------------//
uchar  U8FLAG,k;
uchar  U8count,U8temp;
uchar  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
uchar  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
uchar  U8comdata;
uchar  outdata[5];  //定义发送的字节数     
uchar  indata[5];
uchar  count, count_r=0;
uchar  str[5]={"RS232"};
uint U16temp1,U16temp2;
SendData(uchar *a)
{
    outdata[0] = a[0];
    outdata[1] = a[1];
    outdata[2] = a[2];
    outdata[3] = a[3];
    outdata[4] = a[4];
    count = 1;
    SBUF=outdata[0];
    while(!TI);
    TI = 0;
    SBUF=outdata[1];
    while(!TI);
    TI = 0;
    SBUF=outdata[2];
    while(!TI);
    TI = 0;
    SBUF=outdata[3];
    while(!TI);
    TI = 0;
    SBUF=outdata[4];
    while(!TI);
    TI = 0;
}
void Delay(uint j)
{   uchar i;
    for(;j>0;j--)
  {     
    for(i=0;i<27;i++);
  }
}
void  Delay_10us(void)
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=2;a>0;a--);
}
     
void COM(void)
{   
    uchar i;   
    for(i=0;i<8;i++)   
    {
     
        U8FLAG=2;   
    while((!P2_0)&&U8FLAG++);
        Delay_10us();
        Delay_10us();
        Delay_10us();
        U8temp=0;
     if(P2_0)U8temp=1;
        U8FLAG=2;
     while((P2_0)&&U8FLAG++);
    //超时则跳出for循环         
     if(U8FLAG==1)break;
    //判断数据位是0还是1     
        
    // 如果高电平高过预定0高电平值则数据位为 1     
       U8comdata<<=1;
       U8comdata|=U8temp;        //0
     }//rof
}
void RH(void)
{
    //主机拉低18ms
    P2_0=0;
    Delay(180);
    P2_0=1;
    //总线由上拉电阻拉高 主机延时20us
    Delay_10us();
    Delay_10us();
    Delay_10us();
    Delay_10us();
    //主机设为输入 判断从机响应信号
    P2_0=1;
    //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行      
    if(!P2_0)        //T !   
    {
    U8FLAG=2;
    //判断从机是否发出 80us 的低电平响应信号是否结束     
    while((!P2_0)&&U8FLAG++);
    U8FLAG=2;
    //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
    while((P2_0)&&U8FLAG++);
    //数据接收状态         
    COM();
    U8RH_data_H_temp=U8comdata;
    COM();
    U8RH_data_L_temp=U8comdata;
    COM();
    U8T_data_H_temp=U8comdata;
    COM();
    U8T_data_L_temp=U8comdata;
    COM();
    U8checkdata_temp=U8comdata;
    P2_0=1;
    //数据校验
    U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
        if(U8temp==U8checkdata_temp)
        {
          U8RH_data_H=U8RH_data_H_temp;
          U8RH_data_L=U8RH_data_L_temp;
          U8T_data_H=U8T_data_H_temp;
          U8T_data_L=U8T_data_L_temp;
          U8checkdata=U8checkdata_temp;
        }//fi
    }//fi
}
     
//----------------------------------------------
//main()功能描述:  AT89C51  11.0592MHz  串口发
//送温湿度数据,波特率 9600
//----------------------------------------------
void main()
{
    /* 系统初始化 */
    TMOD = 0x20;      //定时器T1使用工作方式2
    TH1 = 253;        // 设置初值
    TL1 = 253;
    TR1 = 1;          // 开始计时
    SCON = 0x50;      //工作方式1,波特率9600bps,允许接收   
    ES = 1;
    EA = 1;           // 打开所以中断   
    TI = 0;
    RI = 0;
    SendData(str) ;   //发送到串口
    Delay(1);         //延时100US12M晶振)
    while(1)
    {  
       //------------------------
       //调用温湿度读取子程序
       RH();
       //串口显示程序
       //--------------------------
       str[0]=U8RH_data_H;
       str[1]=U8RH_data_L;
       str[2]=U8T_data_H;
       str[3]=U8T_data_L;
       str[4]=U8checkdata;
       SendData(str) ;  //发送到串口  
       //读取模块数据周期不易小于 2S
       Delay(20000);
    }//elihw   
}// main
void RSINTR() interrupt 4 using 2
{
    //if(TI==1) //发送中断   
    //{
    //  TI = 0;
    //}
    if(RI==1)    //接收中断      
    {   
        RI = 0;
    }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表