前言:作者想要帮助一些童鞋和爱好者进行项目构建,但自知能力有限,不喜可论,创作不易,勿喷。
发送模块代码
#include#include #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 int WIFItest_boot=0; unsigned char xdata WIFI_receive[45]; unsigned char xdata IP_receive[11]; 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,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P10n"); delaynms(10); } if(P11 == 0) { while(P11 == 0); Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P11n"); delaynms(10); } if(P12 == 0) { Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P12n"); delaynms(10); } if(P13 == 0) { Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P13n"); delaynms(10); } if(P14 == 0) { Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P14n"); delaynms(10); } if(P15 == 0) { Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P15n"); delaynms(10); } if(P16 == 0) { Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P16n"); delaynms(10); } if(P17 == 0) { Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P17n"); delaynms(10); } if(P20 == 0) { while(P20 == 0); Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(6); // 数据长度 Send_String("Dowm:P20rn"); delaynms(1); } if(P21 == 0) { Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P21rn"); delaynms(10); } if(P22 == 0) { Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P22rn"); delaynms(10); } if(P23 == 0) { Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P23rn"); delaynms(10); } if(P24 == 0) { Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P24rn"); delaynms(10); } if(P25 == 0) { Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P25rn"); delaynms(10); } if(P26 == 0) { Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P26rn"); delaynms(10); } if(P27 == 0) { Send_String("AT+CIPSEND=0,8rn"); // 多路连接时:AT+CIPSEND= , delaynms(60); // 数据长度 Send_String("Dowm:P27rn"); 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("ATrn"); delaynms(200); } WIFItest_boot=No; //设置为AP模式 while(WIFItest_boot==No) { Send_String("AT+CWMODE=2rn"); delaynms(200); } WIFItest_boot=No; //设置为多连接模式 while(WIFItest_boot==No) { Send_String("AT+CIPMUX=1rn"); delaynms(200); } WIFItest_boot=No; //设置为服务器端口号为:5000 while(WIFItest_boot==No) { Send_String("AT+CIPSERVER=1,5000rn"); delaynms(200); } WIFItest_boot=No; // 获取IP地址并显示 while(WIFItest_boot==No) { Send_String("AT+CIFSRrn"); 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();//按键扫描 } } 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#include #include //#include #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 int WIFItest_boot=0; unsigned char xdata WIFI_receive[45]; unsigned char xdata IP_receive[11]; 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; //开总中断 } void WIFI_INIT() { WIFItest_boot=No; //测试是否已经开机 while(WIFItest_boot==No) { Send_String("ATrn"); delaynms(200); } WIFItest_boot=No; //设置为sta模式 while(WIFItest_boot==No) { Send_String("AT+CWMODE=1rn"); delaynms(200); } WIFItest_boot=No; //设置为多连接模式 while(WIFItest_boot==No) { Send_String("AT+CWJAP="TTl",""rn"); delaynms(600); } WIFItest_boot=No; //设置为服务器端口号为:5000 while(WIFItest_boot==No) { Send_String("AT+CIPSTART="TCP","192.168.4.1",5000rn"); 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); } } } 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]);
}
发送模块原理图
发送模块PCB
接受板原理图
发送板PCB
资源区会上传相关资源,积分下载



