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

📄 main.c

📁 基于盛群单片机开发的 获得温湿传感器dht11和光敏电阻的数据 并且发送到1602显示屏的程序
💻 C
字号:

#include <ht46r232.h>
#pragma vector isr_4 @ 0x4
#pragma vector isr_8 @ 0x8
#pragma vector isr_c @ 0xc
#pragma vector isr_ad @ 0x10            //ad中断服务程序(r232地址是10)
//ISR for safequard
void isr_4(){} // external ISR
void isr_8(){} // timer/event 0
void isr_c(){} // timer/event 1


//initialize registers for safeguard
void safeguard_init(){
_intc0=0;
_intc1=0;	
_tmr0h=0;	
_tmr0l=0;	
_tmr0c=0;	
_tmr1h=0;	
_tmr1l=0;	
_tmr1c=0;
_pac=0xff;
_pbc =0xff;     //input mode
_pcc =0xff;
}

typedef unsigned char u8;
#define rs _pc2                  //屏幕的控制rs
#define ep _pc0                  //屏幕的控制rs
#define rw _pc1                  //屏幕的控制rs
#define dht _pb1
#define ko _pb2                  //外部按键定义
#define ky _pb3
#define LED_DATA_CRL _pac        //屏幕数据管脚的I/O控制
#define DHT_DATA_CRL _pbc        //dht数据管脚的I/O控制
#define LED_DATA_DATA _pa        //屏幕数据管脚的数据传递
#define LED_CRL_CRL  _pcc        //屏幕控制管脚的I/O控制
#define ad_start     _26_7       //定义ad转换的start位(r232的adcr寄存器地址是0x26h)


void busycheck(void);
void init(void);
void cmd(unsigned char);
void data(int);

signed char U8FLAG,U8temp,U8comdata;

int U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;/*中间数值,校对校验码后付给最终的结果*/
int  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;/*实际数值*/
int  k;                     //外部按键常量
unsigned int  light;                 //光强的数字值
int  light_b;               //百位
int  light_s;				//十位
int  light_g;				//个位
int count;



void ADtrans(){                         //ad转换开始

ad_start=0;
ad_start=1;
ad_start=0;

}
//--------------------------------------屏幕部分------------------------------



//********************************屏幕初始************************************
void init()
{

LED_DATA_CRL=0;
LED_CRL_CRL=0;
LED_DATA_DATA=0;
_pc=0;

_delay(5000);
_delay(5000);
_delay(5000);

cmd(0x38);
_delay(5000);

cmd(0x38);
_delay(5000);

cmd(0x38);
_delay(5000);
cmd(0x38);
busycheck();

cmd(0x08);
busycheck();

cmd(0x01);
busycheck();

cmd(0x06);
busycheck();

cmd(0x0c);
busycheck();

}
//****************************

//***********送指令函数********
void cmd(u8  mingling)
{
 //busycheck();

 rs= 0;
 rw = 0;
 ep = 0; 
LED_DATA_DATA=mingling;
_delay(100);
 ep=1;
_delay(100);
 ep=0;

}
//***************************



//*********送数据************
void data(int zimu)
{//busycheck();
rw=0;
 rs = 1;
 rw = 0;
 ep = 0;
LED_DATA_DATA= zimu;
_delay(100);
ep = 1;
_delay(100);
ep = 0; 

}

//***************************

//**********busycheck***********

void busycheck(void){
u8 val;

do{
ep=0;
LED_DATA_CRL=0xff;
rs=0;
rw=1;
ep=1;
_delay(100);
val=LED_DATA_DATA;
_delay(100);
ep=0;
  }while(val&(u8)0x80);
rw=0;
LED_DATA_CRL=0;

}

//*****************************************************
 

//******************写入地址***************************

void pos(u8 x)
{
cmd(x|0x80);
}
//*****************************************************
//-------------------dht21 部分------------------------

//**************获取8位二进制数************************

/*COM获取一个8位二进制数*/
 void  COM(void)
      {
     
	        u8 i;
       for(i=0;i<8;i++)	   
	    {
		
	   	    U8FLAG=2;
	   	while((!dht)&&U8FLAG++);
            _delay(35);
	  		U8temp=0;
	     if(dht)U8temp=1;
		    U8FLAG=2;
		 while((dht)&&U8FLAG++);
	   	//超时则跳出for循环		  
	   	 if(U8FLAG==1)break;
	   	//判断数据位是0还是1	 
	   	   
		// 如果高电平高过预定0高电平值则数据位为 1 
	   	 
		   U8comdata<<=1;
	   	   U8comdata|=U8temp; 
     
	     }//rof
	   
	}

//***********************************************************
	/*--------------------------------*/
	/*-----温湿度读取子程序 ----------*/
	/*--------------------------------*/
	/*-----以下变量均为全局变量-------*/
	/*----温度高8位== U8T_data_H------*/
	/*----温度低8位== U8T_data_L------*/
	/*----湿度高8位== U8RH_data_H-----*/
	/*----湿度低8位== U8RH_data_L-----*/
	/*----校验 8位 == U8checkdata-----*/
	

void RH(void)
	{ int c=0;
 
      DHT_DATA_CRL=0;
       dht=0;
      _delay(20000);	           //主机拉低500us

	  DHT_DATA_CRL=0xff;               //主机设为输入(电平由上拉电阻拉高) 在20~40us后判断从机响应信号 
	 	  
while((dht==1)&&(c++<100));	  //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
 if(!dht)	 
	   { 
	   U8FLAG=2;
	 
	   while((!dht)&&U8FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束	 
	   U8FLAG=2;
	
	   while((dht)&&U8FLAG++); //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
		 
	   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;
      

          //数据校验 
	   U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
	   if(U8temp==U8checkdata_temp)
          if(1)
	   {
	   	  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;                              
	   }
	   }

	}
//******************************************************************


//---------------------华丽的main函数分割线-------------------------
void main() 
{
//*********变量定义***********

u8  r='r';
u8  h='h';
u8  t='t';
u8  c='c';
u8  l='l';
u8  z=':';
u8  si='4';
u8  wu='5';
u8  liu='6';
u8  ling='0';



int rhdatas;                   //湿度数据十位
int rhdatag;                    // 湿度数据个位
int tdatas;
int tdatag;
int i=0;
//*****************************


//*********初始化**************
safeguard_init();
init();
DHT_DATA_CRL=0xff;      
_acsr=0x01;                  //ad转换8分频
_adcr=0x08;                  //设置通道  pb0  an0作为ad输入
ad_start=1;                  //设置分频和通道
ad_start=0;
_emi=0;                      //关总中断
_adf=0;                      //清除ad中断标志位
_eadi=1;					 // 开ad中断使能
_emi=1;                      //开总中断
//*******************************

while(1){ 

RH();
ADtrans();                      //ad转换开始

if(ko==0)k=1;                   //查询键盘
else if(ky==0)k=0;

//**把获得的数据转换成屏幕可以显示的数字(根据屏幕的编码表)**********

rhdatas=U8RH_data_H/10;
rhdatag=U8RH_data_H%10;
rhdatas=(rhdatas|0x30)&0x3f;
rhdatag=(rhdatag|0x30)&0x3f;

if(ko==0)k=1;								//查询键盘
else if(ky==0)k=0;

tdatas=U8T_data_H/10;
tdatag=U8T_data_H%10;
tdatas=(tdatas|0x30)&0x3f;
tdatag=(tdatag|0x30)&0x3f;

if(ko==0)k=1;                            //查询键盘
else if(ky==0)k=0;



light_b=light/100;
light_s=(light-light_b*100)/10;
light_g=light%10;
light_b=(light_b|0x30)&0x3f;
light_s=(light_s|0x30)&0x3f;
light_g=(light_g|0x30)&0x3f;


//***********************************



cmd(0x08);                       //先关显示屏!!!!!!
_delay(60000);
cmd(0x01);                       // 清屏!!!!!!!!!!
 _delay(60000);
 _delay(60000);  

if(ko==0)k=1;                   //查询键盘
else if(ky==0)k=0;

pos(0);                        //显示温度
data(h);
data(z);
data(rhdatas);
data(rhdatag);



if(ko==0)k=1;                    //查询键盘
else if(ky==0)k=0;

pos(43);                         //显示湿度
data(t);
data(z);
data(tdatas);
data(tdatag);

if(ko==0)k=1;                  //查询键盘
else if(ky==0)k=0;



pos(8);

data(r);                          //显示推荐数据
data(c);
data(z);
if(tdatas=='3') {if (k==1) {data(si);data(ling);}
                else {data(si);data(wu);}}
if(U8T_data_H<30&&U8T_data_H>=25) {if (k==1) {data(si);data(wu);}
                else {data(wu);data(ling);}}

if (U8T_data_H<25)  {if (k==1) {data(wu);data(wu);}
                else {data(liu);data(ling);}}


pos(0x4a);                           //显示当前光强
data(l);
data(z);
data(light_b);
data(light_s);
data(light_g);

pos(0x48);
data(count);


if(ko==0)k=1;                  //查询键盘
else if(ky==0)k=0;


cmd(0xc);                          //开显示屏@!!!!!!!!!!!!!!
_delay(250000); 
if(ko==0)k=1;                      //查询+延时
else if(ky==0)k=0;                   
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;
_delay(250000);
if(ko==0)k=1;
else if(ky==0)k=0;

} 
} 

//________________________________________________

//***********中断服务程序********************
void isr_ad(){

_adf=0;               //清除ad中断标志位
light=_adrh;          //读取ad数据寄存器高八位;
count++;
}

⌨️ 快捷键说明

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