📄 51
字号:
#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 + -