这是一篇最近做的课设,选题要求如下:
设计任务: 模拟银行排队业务, 能提供三种业务, 服务代码首字
母分别为 A、 B、 C, 要求:
1、 用按键+1 表示新增一个客户, -1 表示减少一个客户。
2、 能对三种业务排队情况分别进行统计, 例如 A 业务当前有八个客户正在等待, 液晶屏显示 A08。 客户完成服务后相应队列统计值减 1。
使用了正点原子的stm32精英板,显示用的是正点原子的ALIENTEK OLED 模块。自己又加上了正点原子的ATK-ESP8266 WIFI模块来通过手机进行控制和信息交互。
基础要求逻辑并不复杂,自己写了几个函数完成相关操作,关于OLED的使用可以到B站上找正点原子的视频看。关于WIFI模块的使用我是使用指令控制的,使用的是server模式,即WiFi模块当主机,手机为从机。这个模块有相关的资料,使用usart串口进行通信,把资料研究一下使用起来并不是很难。需要的也可以找我要。我QQ:2254786469
程序里有的东西是以前做东西剩下的,因为对本次实验无影响,我也就没删掉,希望大家不要对其感到困惑。
关于WIFI模块,主函数前面的发送的一些指令完全是初始化配置,配置模式,联网,ip地址等。我把整个工程文件也附下。以供大家有需要的参考。
难点在于WIFI模块的使用,因为没有视频讲解,大家可以右键选择点到函数的定义去研究。
我把工程文件上传了,大家可以在在到我的主页找到并免费下载。
附上一下和通过WIFI模块手机通信的图片,不好意思,发现没截屏,嘿嘿。需要详细了解的私信或者加我QQ联系我吧。
把主函数附下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "oled.h"
#include "stdlib.h"
#include "lcd.h"
#include "key.h"
#include "usmart.h"
#include "malloc.h"
#include "sdio_sdcard.h"
#include "ff.h"
#include "w25qxx.h"
#include "exfuns.h"
#include "text.h"
#include "touch.h"
#include "usart3.h"
#include "common.h"
#include "adc.h"
#include "lsens.h"
#include "timer.h"
u8 a1,a2,b1,b2,c1,c2,t;
void draw_A(u8 row){
u8 a;
for(a=0;a<=127;a++){
if(a<36){
OLED_DrawPoint(a,row,1);
}
else{
OLED_DrawPoint(a,row,0);
}
}
}
void draw_B(u8 row){
u8 a;
for(a=0;a<=127;a++){
if(45<a&&a<82){
OLED_DrawPoint(a,row,1);
}
else{
OLED_DrawPoint(a,row,0);
}
}}
void draw_C(u8 row){
u8 a;
for(a=0;a<=127;a++){
if(a>91){
OLED_DrawPoint(a,row,1);
}
else{
OLED_DrawPoint(a,row,0);
}
} }
void indicator(){//指示当前操作的业务,在上面画条线
if(t==0) {
draw_A(36);
draw_A(37);}
else if(t==1) {
draw_B(36);
draw_B(37);}
else{
draw_C(36);
draw_C(37);}
}
void addition_A(){
if (a1<'9') a1++;
else {
if (a2<'9'){
a2++;
a1='0'; }
else {
a1='0';
a2='0';}
}
OLED_ShowChar(24,40,a1,24,1);//显示ASCII字符
OLED_ShowChar(12,40,a2,24,1);//显示ASCII字符
OLED_Refresh_Gram();}
void addition_B(){
if (b1<'9') b1++;
else {
if (a2<'9'){
b2++;
b1='0'; }
else {
b1='0';
b2='0';
}
}
OLED_ShowChar(70,40,b1,24,1);//显示ASCII字符
OLED_ShowChar(58,40,b2,24,1);//显示ASCII字符
OLED_Refresh_Gram();
}
void addition_C(){
if (c1<'9') c1++;
else {
if (c2<'9'){
c2++;
c1='0'; }
else {
c1='0';
c2='0';
}
}
OLED_ShowChar(116,40,c1,24,1);//显示ASCII字符
OLED_ShowChar(104,40,c2,24,1);//显示ASCII字符
OLED_Refresh_Gram();
}
void subtract_A(){
if (a1<'1'&& a2<'1') a1=='0';//个位十位都等于0
else {
if (a2>'0'&& a1<'1'){//个位等于0,十位大于零
a2--;
a1='9'; }
else {//都大于0或十位等于0,个位大于0
a1--;
}
}
OLED_ShowChar(24,40,a1,24,1);//显示ASCII字符
OLED_ShowChar(12,40,a2,24,1);//显示ASCII字符
OLED_Refresh_Gram();}
void subtract_B(){
if (b1<'1'&& b2<'1') b1=='0';//个位十位都等于0
else {
if (b2>'0'&& b1<'1'){//个位等于0,十位大于零
b2--;
b1='9'; }
else {//都大于0或十位等于0,个位大于0
b1--;
}
}
OLED_ShowChar(70,40,b1,24,1);//显示ASCII字符
OLED_ShowChar(58,40,b2,24,1);//显示ASCII字符
OLED_Refresh_Gram();}
void subtract_C(){
if (c1<'1'&& c2<'1') c1=='0';//个位十位都等于0
else {
if (c2>'0'&& c1<'1'){//个位等于0,十位大于零
c2--;
c1='9'; }
else {//都大于0或十位等于0,个位大于0
c1--;
}
}
OLED_ShowChar(116,40,c1,24,1);//显示ASCII字符
OLED_ShowChar(104,40,c2,24,1);//显示ASCII字符
OLED_Refresh_Gram();}
void key_press(u8 a){
if (a==0) ;
else{
if (a==1){
if(t==0) addition_A();
else if(t==1) addition_B();
else addition_C();
}
else if(a==2){
if(t==0) subtract_A();
else if(t==1) subtract_B();
else subtract_C();
}
else{//按下KEY3
if(t==2) t=0;
else t++;
indicator();
OLED_Refresh_Gram();}
}}
void mode(){
u8 s,m;
if(USART3_RX_STA&&((int)USART3_RX_BUF[0]>0)){
s=USART3_RX_BUF[11];
m=USART3_RX_BUF[12];
if((s=='A')&&(m=='+')){addition_A();atk_8266_send_cmd("AT+CIPSEND=0,10","H",50);
delay_ms(100);
u3_printf("A排队成功\n");}
if((s=='A')&&(m=='-')){subtract_A();delay_ms(100);}
if((s=='B')&&(m=='+')){addition_B();atk_8266_send_cmd("AT+CIPSEND=0,10","H",50);
delay_ms(100);
u3_printf("B排队成功\n");}
if((s=='B')&&(m=='-')){subtract_B();delay_ms(100);}
if((s=='C')&&(m=='+')){addition_C();atk_8266_send_cmd("AT+CIPSEND=0,10","H",50);
delay_ms(100);
u3_printf("C排队成功\n");}
if((s=='C')&&(m=='-')){subtract_C();delay_ms(100);}
USART3_RX_STA=0;}}
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化按键
uart_init(115200); //串口初始化为115200
usart3_init(115200); //初始化串口3
TIM3_PWM_Init(899,0);
Lsens_Init(); //初始化光敏传感?
OLED_Init(); //初始化OLED
t=0;
a1='0';
a2='0';
b1='0';
b2='0';
c1='0';
c2='0';
OLED_ShowString(0,40,"A00",24);
OLED_ShowString(46,40,"B00",24);
OLED_ShowString(92,40,"C00",24);
indicator();
OLED_Refresh_Gram(); //更新显示到OLED
atk_8266_send_cmd("AT+CWMODE=1","H",50);
delay_ms(700);
USART3_RX_STA=0;
atk_8266_send_cmd("AT+RST","H",50);
delay_ms(4000);
USART3_RX_STA=0;
//atk_8266_send_cmd("AT+CWJAP=\"HQU.501\",\"1815232036\"","H",50);
//delay_ms(5000);
//atk_8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.0.4\",2100","H",50);//"AT+CIPSTART=\"TCP\",\"192.168.0.4\",2100"
//elay_ms(2000);
atk_8266_send_cmd("AT+CIPMUX=1","H",50);
delay_ms(700);
USART3_RX_STA=0;
atk_8266_send_cmd("AT+CIPSERVER=1,8080","H",50);
delay_ms(700);
USART3_RX_STA=0;
atk_8266_send_cmd("AT+CIFSR","H",50);
delay_ms(1500);
USART3_RX_STA=0;
while(1){
mode();
key_press(KEY_Scan(0));
delay_ms(10);、
}
}
`