⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 senandco.c

📁 参加一竞赛的程序(我负责的部分)
💻 C
字号:
#include<reg51.h>
#include <intrins.h>                    /*Keil library 包含延时程序_nop_()*/

#define TEMP 0
#define HUMI 1

#define ACK 1
#define NACK 0
#define MEASURE_TEMP 0X03
#define MEASURE_HUMI 0X05
#define RESET 0X1E

sbit DAT=P0^6;
sbit SCK=P0^7;

unsigned char temperature[20],humidity[20];
unsigned char temp_address=0,humi_address=0;

//--------------------------------------------------------------------
//--------------------------------------------------------------------
sbit  CS=P2^7;                                 /*CO 转换所需*/
sbit  DOUT=P1^4;
sbit  CLK=P1^5;

unsigned char co_value[10],co_address;
//-------------------------------------------------------------------
unsigned char Ledbuf[6];
delay(unsigned int t)
{
	unsigned char i;
	while(t--!=0)
	for(i=2;i!=0;i--);
 }
code unsigned char Ledmap[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void DisplayLed()
{
     unsigned char i;
     unsigned char Ledlen=6;
     P1=0x01;
     for(i=0;i<Ledlen;i++)
     {

                P2=Ledbuf[i];
                delay(6000);
                if(i<(Ledlen-1))
                P1<<=1;
     }
}
//------------------------------------------------------------------------------
//--------------------------------------------------------------------
//-------------------------------------------------------------------
unsigned char ad_convert()                      /*CO模拟浓度量的AD转换*/
{
    unsigned char co=0;
    unsigned char j;
    char i;
    for (j=0;j<2;j++)
    {
            co=0;
            DOUT=1;
            CS=1;
            CLK=0;
            CS=0;
            _nop_();
            _nop_();_nop_();
            CLK=1;

        i=0x80;
        if (DOUT)
        {
           co=(co|i);
        }
        for (i=0x40;i>0;i>>=1)
        {
            CLK=0;
            _nop_();
            _nop_();
            CLK=1;
            _nop_();
            _nop_();
            if (DOUT)
                co=(co|i);
        }
        CLK=0;
        _nop_();
        _nop_();
        CLK=1;
        _nop_();
        _nop_();
        CLK=0;
        CS=1;
        delay(2);
    }
    return co;                        /*返回八位AD转换器的输出结果*/
}

//-------------------------------------------------------------------
//-------------------------------------------------------------------
char s_write_byte(unsigned char value) /*对传感器写一个字节(命令字节)*/
{
    unsigned char i,error=0;
    for (i=0x80;i>0;i>>=1)
    {
       if (i&value)
       {
          DAT=1;
       }
       else
       {
          DAT=0;
       }
       SCK=1;
       _nop_();
       _nop_();
       _nop_();
       SCK=0;

   }
   DAT=1;                     /*对P口读时,应先赋1。*/
   SCK=1;
   error=DAT;                 /*若写正常,传感器会自动将DAT拉低一个SCK周期*/
   SCK=0;
   DAT=1;
 return error;
}

//--------------------------------------------------------------------------
unsigned char s_read_byte(unsigned char ack) /*读传感器的测量值*/
{ unsigned char i, val=0;
  DAT=1;                      /*读之前要对P口赋1   */
  for(i=0x80;i>0;i>>=1)
  {
      SCK=1;                 /*在SCK上升沿读数据  */
      if(DAT)
      {
        val=(val|i);
      }
        SCK=0;
        _nop_();
  }
  DAT=!ack;               /*第九个下降沿后,给传感器一个应答 */
  _nop_();
  SCK=1;
  _nop_();
  SCK=0;

  return val;
}

//-----------------------------------------------------------------------
void s_transstart(void)                     /*通讯开始*/
{
   DAT=1;
   SCK=0;
   _nop_();

   SCK=1;
   _nop_();

   DAT=0;
   _nop_();

   SCK=0;
   _nop_();
   _nop_();
   _nop_();

   SCK=1;
   _nop_();

   DAT=1;
   _nop_();

   SCK=0;
   _nop_();
}

//---------------------------------------------------------------------------
void s_connectionreset(void)                            /*建立通讯连接*/
{  unsigned char i;
   DAT=1;
   SCK=0;
   for(i=0;i<0xa;i++)
   {
       SCK=0;
       _nop_();
       SCK=1;
   }
   s_transstart();
}

//-----------------------------------------------------------------------------
char s_measure(unsigned char mode)    /*进行一次测量*/

{
   unsigned char error=0;
   unsigned int i;
   s_transstart();
   switch(mode)
   {
       case TEMP :
            error=s_write_byte(MEASURE_TEMP);
	    break;
       case HUMI :
            error=s_write_byte(MEASURE_HUMI);
	    break;
       default:
            break;
   }
   for(i=0;i<65535;i++)
   {
       if(DAT==0) break;
   }
   if(mode==TEMP)
   {
       temperature[temp_address]=s_read_byte(ACK);
	   temp_address+=1;
       temperature[temp_address]=s_read_byte(NACK);
	   temp_address+=1;
   }
   if(mode==HUMI)
   {
       humidity[humi_address]=s_read_byte(ACK);
 	   humi_address+=1;
	   humidity[humi_address]=s_read_byte(NACK);
       humi_address+=1;
   }
   return error;
}
//-----------------------------------------------------------------------------
void main()
{
   unsigned char error=0;
   unsigned int i=0;                     /*延时用*/
   s_connectionreset();                   /*传感器与单片机建立连接*/

   while (1)
   {
       error=s_measure(HUMI);    /*测量湿度*/
       error=s_measure(TEMP); /*测量温度*/
       if(error==1)
       {
          s_connectionreset();
       }
       else
       {
           if (humi_address>=20)  humi_address=0;
           if (temp_address>=20)  temp_address=0;
       }
       
       co_value[co_address++]=ad_convert();    /*CO 的AD转换值,与温湿度同步,约一次每秒*/
       if(co_address>=10)
       {
           co_address=0;
       }

       for(i=0;i<50000;i++)                    /*延时约1秒 */
       {
           ;
       }       
    /*   if (temp_address>=8)
       {
	   	   temp_address=0;
           while(1)
           {    */
               Ledbuf[0]=Ledmap[temperature[temp_address]/100];
               Ledbuf[1]=Ledmap[temperature[temp_address]%100/10];
               Ledbuf[2]=Ledmap[temperature[temp_address]%100%10];
               Ledbuf[3]=Ledmap[temperature[temp_address+1]/100];
               Ledbuf[4]=Ledmap[temperature[temp_address+1]%100/10];
               Ledbuf[5]=Ledmap[temperature[temp_address+1]%100%10];
               DisplayLed();
     //     }
    //  }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -