📄 senandco.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 + -