前言:作者想要帮助一些童鞋和爱好者进行项目构建,但自知能力有限,不喜可论,创作不易,勿喷。
发送模块代码
#include<reg52.h>
#include<intrins.h>
#include "uart.h"
sfr ISP_DATA = 0xe2; // 数据寄存器
sfr ISP_ADDRH = 0xe3; // 地址寄存器高八位
sfr ISP_ADDRL = 0xe4; // 地址寄存器低八位
sfr ISP_CMD = 0xe5; // 命令寄存器
sfr ISP_TRIG = 0xe6; // 命令触发寄存器
sfr ISP_CONTR = 0xe7; // 命令寄存器
sfr T2MOD = 0xC9;
#define Yes 1
#define No 0
/********测试WIFI是否启动**********/
int WIFItest_boot=0;
/********WIFI串口接收数据缓存**********/
unsigned char xdata WIFI_receive[45];
unsigned char xdata IP_receive[11];
/********WIFI串口接收计数器**********/
unsigned char WIFIDATA_count;
bit xx_flag; //手机连接标志
bit flag2s = 0;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
unsigned char H_buff[5];
unsigned char moshi=0;
unsigned char jibie=0;
unsigned char count = 0;
extern bit Start18B20();
extern bit Get18B20Temp(int *temp);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
extern void LcdWriteCmd(unsigned char cmd);
extern void LcdSetCursor(unsigned char x, unsigned char y);
extern void LcdWriteDat(unsigned char dat);
void ConfigPWM(unsigned int fr, unsigned char dc);
void ClosePWM();
void wendu_chuli();
/*****************************************************************************
延迟函数
/****************************************************************************/
void Delay_Ms (unsigned int a)
{
unsigned int i;
while( a-- != 0)
{
for(i = 0; i < 600; i++);
}
}
void Key_set_scan()
{
if(P10 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P10\n");
delaynms(10);
}
if(P11 == 0)
{
while(P11 == 0);
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P11\n");
delaynms(10);
}
if(P12 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P12\n");
delaynms(10);
}
if(P13 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P13\n");
delaynms(10);
}
if(P14 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P14\n");
delaynms(10);
}
if(P15 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P15\n");
delaynms(10);
}
if(P16 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P16\n");
delaynms(10);
}
if(P17 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P17\n");
delaynms(10);
}
if(P20 == 0)
{
while(P20 == 0);
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(6); // <length> 数据长度
Send_String("Dowm:P20\r\n");
delaynms(1);
}
if(P21 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P21\r\n");
delaynms(10);
}
if(P22 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P22\r\n");
delaynms(10);
}
if(P23 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P23\r\n");
delaynms(10);
}
if(P24 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P24\r\n");
delaynms(10);
}
if(P25 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P25\r\n");
delaynms(10);
}
if(P26 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P26\r\n");
delaynms(10);
}
if(P27 == 0)
{
Send_String("AT+CIPSEND=0,8\r\n"); // 多路连接时:AT+CIPSEND=<id>,<length>
delaynms(60); // <length> 数据长度
Send_String("Dowm:P27\r\n");
delaynms(10);
}
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void timer2_init() //定时器2初始化 2毫秒@11.0592MHz
{
T2CON=0; //设置定时器的T2CON,设置T2为内部定时器,T2EX的跳变对定时器2无效
T2MOD=0; //定时器2输出使能,定时器递增计数
/// 以下设置将定时器2的输出频率设置成42HZ///
RCAP2H = 0xCD; //设置定时器2的RCAP2H为254
RCAP2L = 0xF8; //设置定时器2的RCAP2L为255
TH2 = RCAP2H; //将RCAP2H中的值(254)重装到TH2中
TL2 = RCAP2L; //将RCAP2L中的值(255)重装到TL2中
///
TR2 = 1; //开启定时器2计数
ET2 = 1; //开启定时器2中断
EA = 1; //开总中断
}
void WIFI_INIT()
{
WIFItest_boot=No; //测试是否已经开机
while(WIFItest_boot==No)
{
Send_String("AT\r\n");
delaynms(200);
}
WIFItest_boot=No; //设置为AP模式
while(WIFItest_boot==No)
{
Send_String("AT+CWMODE=2\r\n");
delaynms(200);
}
WIFItest_boot=No; //设置为多连接模式
while(WIFItest_boot==No)
{
Send_String("AT+CIPMUX=1\r\n");
delaynms(200);
}
WIFItest_boot=No; //设置为服务器端口号为:5000
while(WIFItest_boot==No)
{
Send_String("AT+CIPSERVER=1,5000\r\n");
delaynms(200);
}
WIFItest_boot=No; // 获取IP地址并显示
while(WIFItest_boot==No)
{
Send_String("AT+CIFSR\r\n");
delaynms(200); //每次延时函数必须时间足够长
}
WIFItest_boot=No;
}
/************主函数(程序的入口)****************/
void main()
{ unsigned char a = 0;
EA = 1; //开总中断
Uart_Init();
timer2_init();
WIFI_INIT(); //WIFI初始化
while(1)
{
Key_set_scan();//按键扫描
}
}
/************串行口1中断处理函数*************/
void UART_1Interrupt(void) interrupt 4
{
unsigned char UART_data;
unsigned char i;
// unsigned char a,b,c;
if(RI==1)
{
UART_data=SBUF;
if(UART_data=='\n')
{
if(WIFI_receive[0]=='O'&&WIFI_receive[1]=='K') WIFItest_boot=Yes;
else if(WIFI_receive[0]=='+'&&WIFI_receive[1]=='C'&&WIFI_receive[2]=='I'&&WIFI_receive[3]=='F'&WIFI_receive[9]=='I'&&WIFI_receive[10]=='P')//+CIFSR:APIP,"192.168.4.1"
{ //+CIFSR:APMAC,"5e:cf:7f:15:bd:62"
for(i=0;i<11;i++)
{
IP_receive[i] = WIFI_receive[13+i];
}
}
// else if(WIFI_receive[0]=='+'&&WIFI_receive[1]=='I'&&WIFI_receive[2]=='P'&&WIFI_receive[3]=='D')
// {
// }
else if(WIFI_receive[2]=='C'&&WIFI_receive[3]=='O'&&WIFI_receive[4]=='N')
{
xx_flag = 1;
}
else if(WIFI_receive[2]=='C'&&WIFI_receive[3]=='L'&&WIFI_receive[4]=='O')
{
xx_flag = 0;
}
WIFIDATA_count=0;
}
else
{
WIFI_receive[WIFIDATA_count]=UART_data;
WIFIDATA_count++;
}
}
RI=0;
}
void timer2()interrupt 5 using 1 //定时器2中断处理函数 2ms
{
static unsigned int ms3 = 0;
TF2 = 0;
ms3++;
if(ms3>=200)
{
flag2s = 1;
ms3 = 0;
}
}
接受模块代码
main.c
#include<reg52.h>
#include<intrins.h>
#include <stdio.h>
//#include <stdlib.h>
#include "uart.h"
#include "ds1602.c"
sbit P22 = P2^2;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sfr ISP_DATA = 0xe2; // 数据寄存器
sfr ISP_ADDRH = 0xe3; // 地址寄存器高八位
sfr ISP_ADDRL = 0xe4; // 地址寄存器低八位
sfr ISP_CMD = 0xe5; // 命令寄存器
sfr ISP_TRIG = 0xe6; // 命令触发寄存器
sfr ISP_CONTR = 0xe7; // 命令寄存器
sfr T2MOD = 0xC9;
#define Yes 1
#define No 0
/********测试WIFI是否启动**********/
int WIFItest_boot=0;
/********WIFI串口接收数据缓存**********/
unsigned char xdata WIFI_receive[45];
unsigned char xdata IP_receive[11];
/********WIFI串口接收计数器**********/
unsigned char WIFIDATA_count;
bit xx_flag; //手机连接标志
bit flag2s = 0;
bit flag1 = 0;
char mode=0,mode1=0,mode2,qia_time=10,da_time=30;
unsigned char H_buff[5];
unsigned char moshi=0,num3,num2;
unsigned char jibie=0,cp,cp1,sec;
unsigned char count = 0;
/*****************************************************************************
延迟函数
/****************************************************************************/
void Delay_Ms (unsigned int a)
{
unsigned int i;
while( a-- != 0)
{
for(i = 0; i < 600; i++);
}
}
void Key_set_scan()
{
uchar i;
if(P32 == 0 )
{
while(P32 == 0);
LCD_clr1602();
mode1 = 0;
num3 = 0;
num2 = 0;
P22 = 1;
mode ++;
if(mode >= 3)mode=0;
}
if(P33 == 0 )
{
while(P33 == 0);
if(mode == 1)
{
qia_time ++;
if(qia_time >= 60)qia_time=60;
}
if(mode == 2)
{
da_time ++;
if(da_time >= 60)da_time=60;
}
}
if(P34 == 0 )
{
while(P34 == 0);
if(mode == 1)
{
qia_time --;
if(qia_time <= 0)qia_time=0;
}
if(mode == 2)
{
da_time ++;
if(da_time <= 0)da_time=0;
}
}
if(P35 == 0 )
{
while(P35 == 0);
LCD_clr1602();
num3 = 0;
num2 = 0;
for(i=0;i<11;i++)
{
WIFI_receive[i] = 0;
}
flag1 =0;
if(mode == 0)mode1 ++;
if(mode1 >= 2)mode1=0;
}
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void timer2_init() //定时器2初始化 2毫秒@11.0592MHz
{
T2CON=0; //设置定时器的T2CON,设置T2为内部定时器,T2EX的跳变对定时器2无效
T2MOD=0; //定时器2输出使能,定时器递增计数
/// 以下设置将定时器2的输出频率设置成42HZ///
RCAP2H = 0xCD; //设置定时器2的RCAP2H为254
RCAP2L = 0xF8; //设置定时器2的RCAP2L为255
TH2 = RCAP2H; //将RCAP2H中的值(254)重装到TH2中
TL2 = RCAP2L; //将RCAP2L中的值(255)重装到TL2中
///
TR2 = 1; //开启定时器2计数
ET2 = 1; //开启定时器2中断
EA = 1; //开总中断
}
/*
AT+E=ON
AT+CWMODE=1
AT+RST
AT+CWJAP="TTl",""
AT+CIPSTART="TCP","192.168.4.1",5000
+IPD,8:Dowm:P23
*/
void WIFI_INIT()
{
WIFItest_boot=No; //测试是否已经开机
while(WIFItest_boot==No)
{
Send_String("AT\r\n");
delaynms(200);
}
WIFItest_boot=No; //设置为sta模式
while(WIFItest_boot==No)
{
Send_String("AT+CWMODE=1\r\n");
delaynms(200);
}
WIFItest_boot=No; //设置为多连接模式
while(WIFItest_boot==No)
{
Send_String("AT+CWJAP=\"TTl\",\"\"\r\n");
delaynms(600);
}
WIFItest_boot=No; //设置为服务器端口号为:5000
while(WIFItest_boot==No)
{
Send_String("AT+CIPSTART=\"TCP\",\"192.168.4.1\",5000\r\n");
delaynms(200);
}
}
/************主函数(程序的入口)****************/
void main()
{
unsigned char aa = 0,bb=0;
EA = 1; //开总中断
Uart_Init();
timer2_init();
init_1602();
WIFI_INIT(); //WIFI初始化
P22 = 1;
while(1)
{
Key_set_scan();
if(mode == 0&&mode1 == 0)
{
goto_xy(1,0);
display_string("Welcome to ");
goto_xy(2,0);
display_string("responder");
}
if(mode == 1)
{
goto_xy(1,0);
display_string("Rush time");
goto_xy(2,0);
display_num(qia_time);
}
if(mode == 2)
{
goto_xy(1,0);
display_string("Answer time");
goto_xy(2,0);
display_num(da_time);
}
if(mode == 0&&mode1 == 2)
{
P22 = 1;
bb = da_time-sec;
if(bb <= 0)
{
bb = 0;
sec=0;
mode1 = 0;
}
goto_xy(1,0);
display_num(num2);
goto_xy(2,0);
display_num(bb);
}
if(mode == 0&&mode1 == 1)
{
aa = qia_time-sec;
if(aa <= 0)
{
P22 = 1;
aa = 0;
sec=0;
mode1 = 0;
}
if(aa <= 5)
{
P22 = 0;
}
if(flag1 == 1)
{
sec=0;
mode1 = 2;
}
goto_xy(2,0);
display_num(aa);
}
if(mode1 == 0 &&flag1 == 1)
{
if(flag1 == 1)LCD_clr1602();
flag1 = 0;
mode = 3;
}
if(mode == 3)
{
P22 = 0;
goto_xy(1,0);
display_string("Error");
goto_xy(2,0);
display_num(num2);
}
}
}
/************串行口1中断处理函数*************/
void UART_1Interrupt(void) interrupt 4
{
unsigned char UART_data;
// unsigned char i;
// unsigned char a,b,c;
if(RI==1)
{
UART_data=SBUF;
if(UART_data=='\n')
{
if(WIFI_receive[0]=='O'&&WIFI_receive[1]=='K') WIFItest_boot=Yes;
//+IPD,8:Dowm:P23
else if(WIFI_receive[0]=='+'&&WIFI_receive[1]=='I'&&WIFI_receive[2]=='P'&&WIFI_receive[3]=='D')
{
// if((WIFI_receive[7]=='D')&&(WIFI_receive[8]=='o')&&(WIFI_receive[9]=='w')&&(WIFI_receive[10]=='m'))
// {
if(mode1 != 2 ) num3 = (WIFI_receive[13])*10+(WIFI_receive[14]);
if(num3 != 0 ) flag1 = 1;
if(num3 == 26 )num2 = 1;
if(num3 == 27 )num2 = 2;
if(num3 == 28 )num2 = 3;
if(num3 == 29 )num2 = 4;
if(num3 == 30 )num2 = 5;
if(num3 == 31 )num2 = 6;
if(num3 == 32 )num2 = 7;
if(num3 == 33 )num2 = 8;
if(num3 == 36 )num2 = 9;
if(num3 == 37 )num2 = 10;
if(num3 == 38 )num2 = 11;
if(num3 == 39 )num2 = 12;
if(num3 == 40 )num2 = 13;
if(num3 == 41 )num2 = 14;
if(num3 == 42 )num2 = 15;
if(num3 == 43 )num2 = 16;
// }
}
WIFIDATA_count=0;
}
else
{
WIFI_receive[WIFIDATA_count]=UART_data;
WIFIDATA_count++;
}
}
RI=0;
}
void timer2()interrupt 5 using 1 //定时器2中断处理函数 2ms
{
unsigned int ms3 = 0;
TF2 = 0;
ms3++;
if(mode1 != 0)cp++;
if(ms3 >= 200)
{
flag2s = 1;
ms3 = 0;
}
if( cp >= 125)
{
cp=0;
cp1 ++;
if(cp1 >= 2)
{
cp1 = 0;
sec++;
}
if(sec >=80)
{
sec = 0;
}
}
}
1602.c
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^5;//数据/命令
sbit RW = P2^6;//读/写
sbit E = P2^7;//使能
uchar i;
uchar str[] = {"Internet of Things00"};
uchar num[] = {"0123456789"};
void delayus(uint x) //延时函数
{
while(x--);
}
void write_com(uchar com)//写命令
{
RW = 0;
RS = 0;
E = 1;
P0 = com;
delayus(100);
E = 0;
}
void write_data(uchar da)//写入数据
{
RW = 0;
RS = 1;
E = 1;
P0 = da;
delayus(100);
E = 0;
}
void init_1602() //LCD1602 初始化
{
write_com(0x3c);//设定数据总线的个数4/8,显示一行/两行
write_com(0x0c);// //光标不显示
write_com(0x06);// //光标随字符右移
}
void LCD_clr1602() //LCD1602 清屏
{
write_com(0x01); // 对字符串清0
write_com(0x02); //对光标清0
}
void goto_xy(uchar y,uchar x) //定位显示位置
{
if(y == 1)
write_com(x + 0x80); //定位第一行
else
write_com(x + 0x80 + 0x40); //定位第二行
}
void display_num(unsigned char x) //显示数字
{
write_data(num[x / 10%10]);
write_data(num[x % 10]);
}
void display_num1(unsigned int x) //显示数字
{
write_data(num[x / 100 % 10]);
write_data(num[x / 10 % 10]);
write_data(num[x % 10]);
}
void display_string(uchar *p) //显示字符
{
while(*p)
{
write_data(*p);
p++;
}
}
void display_xnum2(float x) //显示数字
{
uint y,x1;
y = (int)x;
write_data(num[y / 10]);
write_data(num[y % 10]);
x1 = (int)((x -(float)y)*1000);
display_string(".");
write_data(num[x1 / 100 % 10]);
// write_data(num[x1 / 10 % 10]);
// write_data(num[x1 % 10]);
}
void display_xnum1(float x) //显示数字
{
uint y,x1;
y = (int)x;
write_data(num[y / 100%10]);
write_data(num[y / 10%10]);
write_data(num[y % 10]);
x1 = (int)((x -(float)y)*1000);
display_string(".");
write_data(num[x1 / 100 % 10]);
write_data(num[x1 / 10 % 10]);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/156065.html