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

📄 51

📁 51单片机典型模块开发
💻
📖 第 1 页 / 共 3 页
字号:
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define uchar   unsigned char
#define uint   	unsigned int
#define ulong 	unsigned long 
#define MAX_TM  70          				//号码存储暂时定为(12手机号码)*6=72+(ALARM2T:05)*2=20=92
#define MAX_T  	60							//AT指令收发数组最大缓冲
sbit 	IO_IGT	= 	P1^0;					//触发点火信号端
sbit 	LED		=	P1^1;					//初始化成功 LED亮 初始化失败LED闪烁4次
sbit 	RED		=	P1^2;					//工作指示灯
sbit 	DAT		=	P1^3;					//STH11数据
sbit 	SCK		=	P1^4;					//STH11时钟
sbit 	RS		=	P1^5;   				//LCD命令/数据端
sbit 	RW		=	P1^6;  					//LCD读/写端
sbit 	LCDE	=	P1^7;  					//LCD使能端
sbit 	send_key=	P2^0;  					//使能发送短信按键
uchar uart_buff[MAX_TM]; 					//通信程序中的缓冲
uchar idata send_count,receive_count;		//发送与接收 数组指针
uchar data   AT_Command_Type;				//当前发送的命令类型
uchar data   AT_Command_Status;				//命令发出以后的返回参数
uchar idata para_temp[MAX_T];     			//多用临时用
uchar data read_tmp;             			//读电话本号参数
uchar data num_tmp1;						//读短信号码参数
uchar idata TEL_temp[20];   				//存对方号码
uchar data system_server; 					//系统状态
uchar data timer_20ms_cnt;					//20ms计数变量  0~49
uchar data timer_S_cnt;						//秒计数变量 1个数1s
bit txd_rxd_bit;    						//接收正确标志位
bit at_send_bit;    						//发送标志位。发送完成标志1 接收允许,在发送为0。
bit chinit;									//进行初始化 标志
uchar chping;								//准备标志位 与READY有关
uchar error;								//全局错误变量
uchar ack;									//全局应答变量
uchar data_h;								//数据高位
uchar data_L;								//数据地位
uint  temp=0;								//温度显值
uint  Humi=0;								//湿度显值
uchar flag; 								//Busy标志
uchar dis_buf[5];							//显示缓冲区
uchar code dis1[] = {"temp:"};				//第一行显示表头
uchar code dis2[] = {"Humi:"};				//第二行显示表头
uchar code dis[] = {"0123456789."};			//显示代码
#define TEMP_ML 0x03   						//000 0001 1 温度命令
#define HUMI_ML 0x05   						//000 0010 1 温度命令
//============================================================================= 
//            话机的运行状态 ic.system_server系统状态 
//============================================================================= 
#define	SYS_ALARM			0x03			//处于报警时间设置状态
#define	SYS_SMSR			0xff			//主叫摘机
#define SYS_NUMSAVE         0x34 			//号码保存
#define SYS_FEE             0x35			//?????
//============================================================================= 
//             定义 TC35 的命令列表 
//============================================================================= 
#define RESET_TC35		    3				//复位TC35
#define TC35_INIT 		    4				//TC35初始化命令
#define CHECK_PIN 		    9				//检查当前是否要输入PIN码
#define SIM_ID          	13				//读出SIM卡的卡号,与SIM卡标明的卡号一样
#define AT_IPR  		    22				//设置TC35的内部时钟
#define	SMONC_ID            26				//????????????????
#define SMS_CMGS			31  			//SMS 短信发送
#define AT_COMMAND          33 				//AT 命令
#define SMS_CMGR			34   			//读一个短信
#define PHONE_READ          36  			//读电话本
#define PHONE_WRITE         37  			//写电话本
#define SMS_CMGD			38				//删除一个短信
#define REQUEST_MOD			42   			//请求模式
#define CMGS_MUB			51				//发报警短信内容
#define	SMSS_ID				53				//TC35i模块专用
#define SMS_CMGF            57				//SMS 接收方式
//=============================================================================
//       AT命令的返回类型 AT_Command_Status  命令发出以后的返回参数
//=============================================================================
#define COMMAND_WAIT		0xff			//等待命令回应
#define COMMAND_OK			0				//命令发送正确.
#define COMMAND_ERROR		4				//命令发送错误.
#define COMMAND_UNKNOW		8				//不可识别的返回类型
//============================================================================= 
//                  基本的常用常量 
//============================================================================= 
#define TRUE				1				//正确
#define FALSE				0				//错误
//============================================================================= 
//                  函数声明 
//============================================================================= 
uchar Send_AT_Command(uchar type);				//AT指令发送程序 
//uchar READ_TEL(uchar r);						//进行SIM卡中的1到20条短信号码的读
/* void read_sms(void); */						//读写短信程序
void send_sms(void);							//发送短信 
void Initialize_Model(void);					//初始化 PIN检测
void Sys_Init(void);							//话机启动的初始化程序,包含定时器,串口等
void start(void);								//指示灯指示
void delay1ms(uchar x);							//延时约1ms程序
uchar strsearch(uchar *ptr2);					//查字符串*ptr2在*ptr1中的位置

void read(void);								//读两个字节测量结果函数
char write(uchar value); 						//写一个字节 返回应答信号
void sht11_start(void);  						//启动
void sht11_rest(void);  						//复位
void comp_temp_Humi(void);						//温湿度处理comp_temp_Humi
void measure(uchar ml);							//测量温度或者是温度,返回校验值
void comp_temp(void);							//计算温度comp_temp
void comp_Humi(void);							//计算湿度comp_Humi
void busy(void);								//LCD忙标志判断函数
void dat_wrt(uchar dat);						//写数据子函数
void cmd_wrt(uchar cmd);						//写命令子函数
void init_1602(void);							//1602初始化函数
void lcd_start(uchar start);					//设定显示位置函数
uchar dat_adj(uint dat1);						//显示数据调整函数
void disp(uint dat,uchar k);							//显示子函数
void print(uchar *str);							//字符串显示函数
/***********主程序***************/
void main (void)
{
	system_server=SYS_SMSR;	   					//系统状态主叫摘机
    LED=1;										//LED灭 //初始化成功 LED亮 初始化失败LED闪烁4次
	RED=0;										//工作指示灯
    Sys_Init();									//话机启动的初始化程序,包含定时器,串口等
    Initialize_Model(); 						//初始化 PIN检测
    delay1ms(2000);								//延时2S
	start();									//指示灯指示
	init_1602();								//初始化液晶
	lcd_start(0x00);							//确定显示起始位置第一行
	print(dis1);								//显示文字temp:
	lcd_start(0x40);							//确定显示起始位置第二行
	print(dis2);								//显示文字Humi:
	while(1)
    {
		comp_temp_Humi();						//测温湿度并转换
		disp(temp,0x03);						//第一行显示温度
		disp(Humi,0x43);						//第二行显示湿度
		while(send_key==0)							//发送短信按键按下 
		{
			delay1ms(20);						//延时20ms去抖
			if(send_key==0)
			{
				send_sms(); 					//发一次短信
			}
			else
				break;
			wait_key:
			while(send_key==0);					//等待按键释放
			delay1ms(20);						//延时20ms
			if(send_key==0)
			{
				goto wait_key;
			}
		}
		delay1ms(200);							//延时200ms重新采集温度与湿度
    }
}


void read(void) 								//读两个字节 返回应答信号
//----------------------------------------------------------------------------------
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1" 
{ 
	uchar i,val=0;
	data_L=0;
	data_h=0;
	SCK=0; 
	//********读高8位******	
	DAT=1;                     					//释放数据总线
	for (i=0x80;i>0;i/=2)        				//位移8位
	{ 
		SCK=1;                 					//上升沿读入
		if (DAT) 
			val=(val|i);        				//确定值 先读入的高位 
		SCK=0;  					 
	}
	DAT=0;              						//应答信号,有应答为0,无应答为1 通过CPU下拉为应答
	SCK=1;                   					//第9个脉冲
	_nop_(); _nop_(); _nop_();					//脉冲宽度约5us 
	SCK=0;						    
	DAT=1;                  					//释放数据总线
	data_h=val;             					//存测量高字节
	//********读低8位******
	val=0;	
	DAT=1;                     					//释放数据总线
	for (i=0x80;i>0;i/=2)    					//位移8位
	{ 
		SCK=1;                					//上升沿读入
		if (DAT) 
			val=(val | i);  					//确定值  
		SCK=0;  					 
	}
	DAT=1;               						//此处不需要应答 通过CPU下拉为应答
	SCK=1;                       				//第9个脉冲
	_nop_(); _nop_(); _nop_();  				//脉冲宽度约5us 
	SCK=0;						    
	DAT=1;                 						//释放数据总线
	data_L=val;  								//存测量低字节
}

char write(uchar value) 						//写一个字节 返回应答信号
{ 
	uchar i ;
	ack=0; 										//默认 低表示有应答
	SCK=0;
	for (i=0x80;i>0;i/=2)      					//释放数据总线
	{ 
		if (i & value)      					//先写入高位
			DAT=1;         						//写入1值
		else 
			DAT=0;             					//写入0值                    
		SCK=1;              					//上升沿写入
		_nop_(); _nop_(); _nop_();				//延时脉冲宽度约5us 	
		SCK=0;
	}
	DAT=1;                						//释放数据总线
	SCK=1;                    					//第9个脉冲
	if(DAT==1) 									//读应答信号
		ack=1;									//高为未应答 低表示有应答
	SCK=0;        
	return ack;              					//返回ack 1表示没有应答 0表示有应答
}


void sht11_start(void)  						//启动
{  
	DAT=1; 										//数据为1
	SCK=0;                   					//SCK=0
	_nop_();
	SCK=1;                   					//第一个脉冲
	_nop_();
	DAT=0;                   					//数据拉低
	_nop_ ();
	SCK=0;                    					//完成一个脉冲
	_nop_(); _nop_(); _nop_();					//延时
	SCK=1;                 						//第二个脉冲
	_nop_();
	DAT=1;                  					//数据变为1		   
	_nop_();
	SCK=0;                  					//完成第二个脉冲		   
}


void sht11_rest(void)  							//复位
{  
	uchar i; 
	DAT=1; 										//数据为1
	SCK=0;           							//时钟为0
	for(i=0;i<9;i++)           					//9个脉冲为复位
	{ 
		SCK=1;
		SCK=0;
	}
	sht11_start();            					//紧挨着 传输启动
}

void  measure(uchar ml)							//测量温度或者是温度,返回校验值
{ 
	uint i;
 	sht11_start();     							//启动
 	write(ml);									//写入测温度或湿度指令
	if (ack==1) 								//无应答
	{	
		sht11_rest();							//复位
		write(ml);								//再次写入测温度或湿度指令
    }
	 for (i=0;i<55535;i++) 						//判断是否处于忙
	{ 
		if(DAT==0) 								//有应答则退出
			break;
/* 		else 	
			xianshi(); 							//无应答则显示 */
	}
	read();										//读温度或湿度
}

void comp_temp(void)							//计算温度
{
	float aa=0,temp_zi;
	aa=(float)(data_h)*256+(float)data_L; 		//高字节和低字节合并
	temp_zi=0.01*aa-40.1;						//14bit 系数为0.01 +5V 系数为-40.1
	if  (temp_zi<0)								//低于0时以0计算
	{
		temp_zi=0;
	}
	temp_zi=temp_zi*10;							//*10 保留小数点后1位
	temp=(int)temp_zi;							//温度
}

void comp_Humi(void)							//计算湿度
{
	float aa=0,bb=0,humi_zi,cc;
	int   abcd=0;
	aa=(float)data_h*256+(float)data_L;  		//高字节和低字节合并
	bb=-2.0468+0.0367*aa-aa*aa*1.5955/1000000; 	//相对湿度
	cc=((float)(temp)/10-25)*(0.01+0.00008*aa)+bb;//湿度信号的温度补偿
	humi_zi=cc;
	humi_zi=humi_zi*10;							//*10 保留小数点后1位
	Humi=(int)humi_zi;							//湿度
}

void comp_temp_Humi(void)						//温湿度处理
{
	error=0;
	ack=0;
	sht11_rest() ;								//复位
	measure(TEMP_ML);							//测温度
	comp_temp();								//计算温度
	measure(HUMI_ML);							//测湿度
	comp_Humi();								//计算湿度
}

/************************LCD忙标志判断函数*******************/
void busy(void)
{
    flag=0x80;									//赋初值 高位为1 禁止
    while (flag&0x80)							//读写操作使能位禁止时等待 继续检测
    {
        P0=0xff;
        RS=0; 									//指向地址计数器
        RW=1; 									//读
        LCDE=1; 								//信号下降沿有效
        flag=P0;								//读状态位 高位为状态
        LCDE=0;
    }
}
/************************写数据子函数************************/
void dat_wrt(uchar dat)
{
    busy();										//检测 读写操作使能吗
    LCDE=0;
    RS=1;										//指向数据寄存器
    RW=0; 										//写

⌨️ 快捷键说明

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