基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计)
基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计)
文章目录
- 基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计)
- 一、低功耗蓝牙(BLE)的配置和与FPGA通信代码
- 1.1 低功耗蓝牙的介绍及配置
- 1.2 低功耗蓝牙与FPGA通信
- 二、FPGA控制器的设计
- 2.1 8-4译码器的设计
- 2.2 主控器的设计
- 三、数码管译码电路以及数码管轮询显示
- 四、微信小程序的设计
- 4.1 bluetooth.js
- 4.2 bluetooth.wxml
本次FPGA课程设计基于Cyclone IV的 EP4CE6F17C8。使用的是AX301开发板(正点原子的新起点也是用同一种芯片,只是要修改引脚)。
本系统能够实现通过蓝牙发送密码给FPGA,并在开发板的数码管上显示密码,密码正确,则手机端(微信小程序)接收到开门信号,并显示开门。其余时候显示关闭。
一、低功耗蓝牙(BLE)的配置和与FPGA通信代码
1.1 低功耗蓝牙的介绍及配置
低功耗蓝牙的介绍见这篇文章:BLE基础知识详解
买到蓝牙模块后,使用AT指令对蓝牙进行配置,详见:常见蓝牙模块介绍和AT指令
用串口调试助手配置蓝牙
1.2 低功耗蓝牙与FPGA通信
蓝牙通过串口收发实现与FPGA的数据交换,想要了解串口通信可以看这篇文章: 串口通信详解
代码:
// 串口接收模块
module uart_rx(input sys_clk, //50M系统时钟input sys_rst_n, //系统复位input uart_rxd, //接收数据线output reg uart_rx_done, //数据接收完成标志output reg [7:0]uart_rx_data //接收到的数据
);
//常量化波特率,可更改parameter BPS=9600; //波特率9600bps,可更改parameter SYS_CLK_FRE=50_000_000; //50M系统时钟localparam BPS_CNT=SYS_CLK_FRE/BPS; //传输一位数据所需要的时钟个数reg uart_rx_d0; //寄存1拍reg uart_rx_d1; //寄存2拍reg [15:0] clk_cnt; //时钟计数器reg [3:0] rx_cnt; //接收计数器reg rx_flag; //接收标志位reg [7:0] uart_rx_data_reg; //数据寄存wire neg_uart_rx_data; //数据的下降沿assign neg_uart_rx_data=uart_rx_d1 & (~uart_rx_d0); //捕获数据线的下降沿,用来标志数据传输开始//将数据线打两拍,作用1:同步不同时钟域信号,防止亚稳态;作用2:用以捕获下降沿always@(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)beginuart_rx_d0<=1'b0;uart_rx_d1<=1'b0;endelse beginuart_rx_d0<=uart_rxd;uart_rx_d1<=uart_rx_d0;end end//捕获到数据下降沿(起始位0)后,拉高传输开始标志位,并在第9个数据(终止位)的传输过程正中(数据比较稳定)再将传输开始标志位拉低,标志传输结束always@(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)rx_flag<=1'b0;else begin if(neg_uart_rx_data)rx_flag<=1'b1;else if((rx_cnt==4'd9)&&(clk_cnt==BPS_CNT/2))//在第9个数据(终止位)的传输过程正中(数据比较稳定)再将传输开始标志位拉低,标志传输结束rx_flag<=1'b0;else rx_flag<=rx_flag; endend//时钟每计数一个BPS_CNT(传输一位数据所需要的时钟个数),即将数据计数器加1,并清零时钟计数器always@(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)beginrx_cnt<=4'd0;clk_cnt<=16'd0;endelse if(rx_flag)beginif(clk_cnt<BPS_CNT-1'b1)beginclk_cnt<=clk_cnt+1'b1;rx_cnt<=rx_cnt;endelse beginclk_cnt<=16'd0;rx_cnt<=rx_cnt+1'b1;endendelse beginrx_cnt<=4'd0;clk_cnt<=16'd0;end end//在每个数据的传输过程正中(数据比较稳定)将数据线上的数据赋值给数据寄存器always@(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)uart_rx_data_reg<=8'd0;else if(rx_flag)if(clk_cnt==BPS_CNT/2) begincase(rx_cnt) 4'd1:uart_rx_data_reg[0]<=uart_rxd;4'd2:uart_rx_data_reg[1]<=uart_rxd;4'd3:uart_rx_data_reg[2]<=uart_rxd;4'd4:uart_rx_data_reg[3]<=uart_rxd;4'd5:uart_rx_data_reg[4]<=uart_rxd;4'd6:uart_rx_data_reg[5]<=uart_rxd;4'd7:uart_rx_data_reg[6]<=uart_rxd;4'd8:uart_rx_data_reg[7]<=uart_rxd;default:;endcaseendelseuart_rx_data_reg<=uart_rx_data_reg;elseuart_rx_data_reg<=8'd0;end //当数据传输到终止位时,拉高传输完成标志位,并将数据输出always@(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)beginuart_rx_done<=1'b0;uart_rx_data<=8'd0;end else if(rx_cnt==4'd9)beginuart_rx_done<=1'b1;uart_rx_data<=uart_rx_data_reg;end else beginuart_rx_done<=1'b0;uart_rx_data<=8'd0;endend
endmodule
// 串口发送模块
module uart_tx(input sys_clk, //50M系统时钟input sys_rst_n, //系统复位input [7:0] uart_data, //发送的8位置数据input uart_tx_en, //发送使能信号output reg uart_txd //串口发送数据线);parameter SYS_CLK_FRE=50_000_000; //50M系统时钟
parameter BPS=9_600; //波特率9600bps,可更改
localparam BPS_CNT=SYS_CLK_FRE/BPS; //传输一位数据所需要的时钟个数reg uart_tx_en_d0; //寄存1拍
reg uart_tx_en_d1; //寄存2拍
reg tx_flag; //发送标志位
reg [7:0] uart_data_reg; //发送数据寄存器
reg [15:0] clk_cnt; //时钟计数器
reg [3:0] tx_cnt; //发送个数计数器wire pos_uart_en_txd; //使能信号的上升沿
//捕捉使能端的上升沿信号,用来标志输出开始传输
assign pos_uart_en_txd= uart_tx_en_d0 && (~uart_tx_en_d1);always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)beginuart_tx_en_d0<=1'b0;uart_tx_en_d1<=1'b0; endelse beginuart_tx_en_d0<=uart_tx_en;uart_tx_en_d1<=uart_tx_en_d0;end
end
//捕获到使能端的上升沿信号,拉高传输开始标志位,并在第9个数据(终止位)的传输过程正中(数据比较稳定)再将传输开始标志位拉低,标志传输结束
always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)begintx_flag<=1'b0;uart_data_reg<=8'd0;endelse if(pos_uart_en_txd)beginuart_data_reg<=uart_data;tx_flag<=1'b1;endelse if((tx_cnt==4'd9) && (clk_cnt==BPS_CNT/2))begin//在第9个数据(终止位)的传输过程正中(数据比较稳定)再将传输开始标志位拉低,标志传输结束tx_flag<=1'b0;uart_data_reg<=8'd0;endelse beginuart_data_reg<=uart_data_reg;tx_flag<=tx_flag; end
end
//时钟每计数一个BPS_CNT(传输一位数据所需要的时钟个数),即将数据计数器加1,并清零时钟计数器
always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)beginclk_cnt<=16'd0;tx_cnt <=4'd0;endelse if(tx_flag) beginif(clk_cnt<BPS_CNT-1)beginclk_cnt<=clk_cnt+1'b1;tx_cnt <=tx_cnt;endelse beginclk_cnt<=16'd0;tx_cnt <=tx_cnt+1'b1;endendelse beginclk_cnt<=16'd0;tx_cnt<=4'd0;end
end
//在每个数据的传输过程正中(数据比较稳定)将数据寄存器的数据赋值给数据线
always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)uart_txd<=1'b1;else if(tx_flag)case(tx_cnt)4'd0: uart_txd<=1'b0;4'd1: uart_txd<=uart_data_reg[0];4'd2: uart_txd<=uart_data_reg[1];4'd3: uart_txd<=uart_data_reg[2];4'd4: uart_txd<=uart_data_reg[3];4'd5: uart_txd<=uart_data_reg[4];4'd6: uart_txd<=uart_data_reg[5];4'd7: uart_txd<=uart_data_reg[6];4'd8: uart_txd<=uart_data_reg[7];4'd9: uart_txd<=1'b1;default:;endcaseelse uart_txd<=1'b1;
end
endmodule
编译代码后可以生成元件,放入bdf中
如下图所示
二、FPGA控制器的设计
由于串口接收器输出的是ASCII码(8位)的vector,这样检测6位密码需要6*8=48个寄存器。我们可以将接收端并行输出的8位数组经过译码器得到4位数组(0-9十进制数用4位二进制数表示)。这样不仅节省了寄存器,也使后续的计算变得方便。所以,我们首先设计84译码器。
2.1 8-4译码器的设计
原理比较简单,直接放代码。注意这里使用的是VHDL代码。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;entity uart_rx_encoder isport(clk, en_rxd: in std_logic;en_rxd_next: out std_logic;D: in std_logic_vector(7 downto 0);Q: out std_logic_vector(3 downto 0));
end entity;architecture behav of uart_rx_encoder issignal data: std_logic_vector(7 downto 0);
beginprocess(clk)beginif (clk'event and clk='1') thenif (en_rxd = '1') then --en_rxd必须只持续一个时钟周期,因为我没做上升沿检测data <= D;en_rxd_next<='1';elseen_rxd_next<='0';end if;end if;end process;with data selectQ<= "0000" when "00110000","0001" when "00110001","0010" when "00110010","0011" when "00110011","0100" when "00110100","0101" when "00110101","0110" when "00110110","0111" when "00110111","1000" when "00111000","1001" when "00111001","1111" when others;end behav;
2.2 主控器的设计
主控器的作用是接收发送的密码并存储,当密码正确时向手机端发送开门信号,其余时候发送关门信号。
同时,主控器还连接着数码管,能将输入的密码实时显示出来。
整体设计图如下:
我们小组的本课程设计是实现一整个智慧门控系统(包括VGA显示,开门驱动,摄像头识别开门,红外检测等),我只是将我本人的工作开源,我也负责整个智慧门控系统的主控设计,但这里不需要主控电路的代码,在这篇文章里,主控电路就是上述框图中的BLE_PSW_数码管控制器。
这里给出BLE_PSW_数码管控制器(即主控器)的代码
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;entity ble_led_psw_controller2 isport(clk,rst: in std_logic;en_rxd,shutdoor: in std_logic;indata: in std_logic_vector(3 downto 0);ledout: out std_logic_vector(23 downto 0);doorstate: out std_logic;en_txd: buffer std_logic;txd_out: out std_logic_vector(7 downto 0));
end entity;architecture behav of ble_led_psw_controller2 istype state_type is (s0,s1,s2,s3,s4);signal present_state, next_state : state_type;signal disp_data: std_logic_vector(27 downto 0);signal pin: std_logic_vector(23 downto 0);signal en_rxd0,en_rxd1,en_rxd_posedge: std_logic;
beginprocess(clk)beginif clk'event and clk = '1' thenen_rxd0 <= en_rxd; --这里是上升沿检测的入口end if;end process;process(clk)beginif clk'event and clk = '1' thenen_rxd1 <= en_rxd0;end if;end process;en_rxd_posedge <= en_rxd0 and not en_rxd1; --检测en_rxd的上升沿pin<="011001100110011001100110"; --密码的初值,就是6个6seq:process(clk,en_rxd_posedge)variable count : integer range 0 to 4;beginif rst='0' thendisp_data <= "1111111111111111111111111111";if (present_state /= s4) thenpresent_state <= s0;elsepresent_state <= s4;end if;elsif (rising_edge(clk)) thenpresent_state <= next_state; if (en_rxd_posedge = '1') thendisp_data(3 downto 0) <= indata;count := 4;elsif count > 0 thendisp_data <= to_stdlogicvector(to_bitvector(disp_data) sll 1);count := count - 1;end if;case present_state iswhen s0=>disp_data <= "1111111111111111111111111111";when others=>null;end case;-- case present_state is
-- when s0=>
-- disp_data <= "001000110110011110000101"; --全1为数码管不显示
-- when s1=>
-- disp_data <= "001000110110011110000101";
-- when s2=>
-- if (en_rxd_posedge = '1')then
-- disp_data <= disp_data(19 downto 0) & indata ;
-- end if;
-- when others=>null;
-- end case; end if;end process seq;ledout <= disp_data(27 downto 4);com:process(present_state,en_rxd_posedge,shutdoor)variable txd_out_buff: std_logic_vector(7 downto 0);begindoorstate <= '0';en_txd <= '0';txd_out <= txd_out_buff;case present_state iswhen s0=>next_state <= s1;when s1=>txd_out_buff := "00111111";en_txd <= '1'; --串口发送未开门next_state <= s2; when s2=>txd_out_buff := "00111111";en_txd <= not en_txd; --disp_data <= "001000110110011110000101"; --全1为数码管不显示if (en_rxd_posedge = '1')then next_state <= s3; elsenext_state <= s2;end if;when s3=>if (disp_data(27 downto 4) = pin) then next_state <= s4;doorstate <= '1'; elsenext_state <= s1;end if;when s4=>txd_out_buff := "00111110";en_txd <= not en_txd; --串口发送开门if (shutdoor = '1') thennext_state <= s0;elsenext_state <= s4;end if;end case; end process com
end behav;
主控器的ASM图:
Modelsim仿真结果
检查RTL图,我们可以通过RTL图更好理解代码
三、数码管译码电路以及数码管轮询显示
数码管译码电路就是数码管7段译码器,轮询显示就是通过片选的方式每1ms给其中一个数码管供电,每6ms一循环,人的肉眼就看不出数码管的变化。
代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;entity leddisplay isport(in_information: in std_logic_vector(23 downto 0);clk,rst: in std_logic;sel: out std_logic_vector(5 downto 0);dig: out std_logic_vector(6 downto 0);cnt_ceshi: out std_logic_vector(14 downto 0);clk1_ceshi: out std_logic);
end leddisplay;architecture behav of leddisplay issignal sel_count: std_logic_vector(2 downto 0);signal original_information: std_logic_vector(3 downto 0);signal clk1: std_logic;
beginfreq_divide:process(clk,rst)variable cnt : std_logic_vector(14 downto 0);beginif (rst='0') thencnt:="000000000000000";clk1 <= '0';elsif (clk'event and clk = '1') thenif (cnt = "110000110100111") then--if (cnt = "000000000000111") thencnt:="000000000000000";clk1 <= not clk1;else cnt:=cnt+'1';end if;end if;cnt_ceshi <= cnt;end process freq_divide; clk1_ceshi <= clk1;sel_counter:process(clk1)beginif (rst='0') thensel_count<="000";elsif (rising_edge(clk1)) thenif (sel_count = "101") thensel_count<="000";else sel_count<=sel_count+'1';end if;end if;end process sel_counter;display:process(sel_count)begincase sel_count iswhen "000" => sel <= "011111"; original_information<=in_information(3 downto 0);when "001" => sel <= "101111"; original_information<=in_information(7 downto 4);when "010" => sel <= "110111"; original_information<=in_information(11 downto 8); when "011" => sel <= "111011"; original_information<=in_information(15 downto 12);when "100" => sel <= "111101"; original_information<=in_information(19 downto 16);when "101" => sel <= "111110"; original_information<=in_information(23 downto 20);when others=> null;end case; end process display; decode:process(original_information)begincase original_information is --我们按照从高到低为ABCDEFG,让H永远高电平就行了when "0000"=> dig <= "0000001"; --数字0when "0001"=> dig <= "1001111"; --数字1when "0010"=> dig <= "0010010"; --数字2when "0011"=> dig <= "0000110"; --数字3when "0100"=> dig <= "1001100"; --数字4when "0101"=> dig <= "0100100"; --数字5when "0110"=> dig <= "0100000"; --数字6when "0111"=> dig <= "0001111"; --数字7when "1000"=> dig <= "0000000"; --数字8when "1001"=> dig <= "0000100"; --数字9when "1111"=> dig <= "1111111"; --全灭when others=> dig <= "1111111"; end case;end process decode;
end behav;
最后整个电路整个蓝牙密码显示电路放在bdf图中如下所示。红框里的是本模块的电路。
这个程序存在一些接口是无用的,这些是为了和主控器通信的,到时候删掉就可以了。
四、微信小程序的设计
低功耗蓝牙微信小程序官方给出了很多示例代码,我的代码是参考这篇文章微信小程序调用Android手机蓝牙BLE传输数据 改写的。效果如下
关键程序的代码(主要就是.js和.wxml)
4.1 bluetooth.js
// An highlighted block
// pages/bluetooth/bluetooth.js
var app = getApp()
var temp = []
var string_temp=""
var serviceId = "0000ffe0-0000-1000-8000-00805f9b34fb"
var characteristicId = "0000ffe1-0000-1000-8000-00805f9b34fb"Page({data: {isbluetoothready: false,defaultSize: 'default',primarySize: 'default',warnSize: 'default',disabled: false,plain: false,loading: false,searchingstatus: false,receivedata: '666',onreceiving: false,id_text: string_temp,list: [],receive_data:'none',door_state:'关闭',temperature:'20.0'},onLoad: function () {},open_BLE: function () {var that = thisthat.setData({isbluetoothready: !that.data.isbluetoothready,})if (that.data.isbluetoothready) {//开启蓝牙模块并初始化wx.openBluetoothAdapter({success: function (res) {},fail: function (res) {wx.showModal({title: '提示',content: '请检查手机蓝牙是否打开',})}})//开启蓝牙模块并初始化//检查蓝牙模块是否初始化成功wx.getBluetoothAdapterState({success: function (res) {var available = res.availableif (!available) {wx.showToast({title: '蓝牙初始化失败',icon: 'loading',duration: 2000})}else {wx.showToast({title: '蓝牙初始化成功',icon: 'success',duration: 2000})}}})//检查蓝牙模块是否初始化成功}else{wx.closeBLEConnection({deviceId: that.data.connectedDeviceId,complete: function (res) {that.setData({deviceconnected: false,connectedDeviceId: ""})wx.showToast({title: '蓝牙连接断开',icon: 'success',duration: 2000})}})setTimeout(function () {that.setData({list: []})//释放蓝牙适配器wx.closeBluetoothAdapter({success: function (res) {that.setData({isbluetoothready: false,deviceconnected: false,devices: [],searchingstatus: false,receivedata: ''})wx.showToast({title: '蓝牙适配器释放',icon: 'success',duration: 2000})},fail: function (res) {}})//释放蓝牙适配器}, 1000)}},search_BLE: function () {temp = []var that = thisif (!that.data.searchingstatus) {var that = this//开始搜索附近蓝牙设备wx.startBluetoothDevicesDiscovery({success: function (res) {wx.showToast({title: '开始搜索BLE',icon: 'loading',duration: 2000})that.setData({searchingstatus: !that.data.searchingstatus})}})//开始搜索附近蓝牙设备} else {//停止搜索附近蓝牙设备wx.stopBluetoothDevicesDiscovery({success: function (res) {wx.showToast({title: '停止搜索BLE',icon: 'success',duration: 2000})that.setData({searchingstatus: !that.data.searchingstatus})}})//停止搜索附近蓝牙设备setTimeout(function () {//获取发现的蓝牙设备wx.getBluetoothDevices({success: function (res) {for(var i=0;i<100;i++){if (res.devices[i]) {string_temp = string_temp + '\n' + res.devices[i].deviceId}}that.setData({id_text: string_temp,list: res.devices})}})//获取发现的蓝牙设备}, 1000) //1s后执行函数}},connectTO: function (e) {var that = thiswx.showLoading({title: '连接蓝牙设备中...',})wx.createBLEConnection({deviceId: e.currentTarget.id,success: function (res) {wx.hideLoading()wx.showToast({title: '连接成功',icon: 'success',duration: 1000})that.setData({deviceconnected: true,connectedDeviceId: e.currentTarget.id})// 启用 notify 功能wx.notifyBLECharacteristicValueChanged({state: true, deviceId: that.data.connectedDeviceId,serviceId: serviceId,characteristicId: characteristicId,success: function (res) {}})// 启用 notify 功能// ArrayBuffer转为16进制数function ab2hex(buffer) {var hexArr = Array.prototype.map.call(new Uint8Array(buffer),function (bit) {return ('00' + bit.toString(16)).slice(-2)})return hexArr.join('');}// 16进制数转ASCLL码function hexCharCodeToStr(hexCharCodeStr) {var trimedStr = hexCharCodeStr.trim();var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr;var len = rawStr.length;var curCharCode;var resultStr = [];for (var i = 0; i < len; i = i + 2) {curCharCode = parseInt(rawStr.substr(i, 2), 16);resultStr.push(String.fromCharCode(curCharCode));}return resultStr.join("");}//监听回调,接收数据wx.onBLECharacteristicValueChange(function (characteristic) {var hex = ab2hex(characteristic.value)var string = hexCharCodeToStr(hex)var state_of_doorvar tem_temperatureif(string.charAt(0)=='?'){state_of_door='关闭'}else {state_of_door='开启'}if(string.charAt(0)=='s'){if(string.slice(2,6)){tem_temperature=string.slice(2,6)}else{tem_temperature='error'}}else {tem_temperature='error'}that.setData({receive_data: hexCharCodeToStr(hex),door_state: state_of_door,temperature: tem_temperature})})},fail: function (res) {wx.hideLoading()wx.showToast({title: '连接设备失败',icon: 'success',duration: 1000})that.setData({connected: false})}})wx.stopBluetoothDevicesDiscovery({success: function (res) {}})},formSubmit: function (e) {var senddata = e.detail.value.senddata;var that = thislet buffer = new ArrayBuffer(senddata.length)let dataView = new DataView(buffer)for (var i = 0; i < senddata.length; i++) {dataView.setUint8(i, senddata.charAt(i).charCodeAt())}wx.writeBLECharacteristicValue({deviceId: that.data.connectedDeviceId,serviceId: serviceId,characteristicId: characteristicId,value: buffer,success: function (res) {wx.showToast({title: '发送成功',icon: 'success',duration: 2000})}})},receiveMessages: function () {var that = this;wx.readBLECharacteristicValue({deviceId: that.data.connectedDeviceId,serviceId: serviceId,characteristicId: characteristicId,success: function (res) {}})},})
4.2 bluetooth.wxml
// An highlighted block
<!--pages/bluetooth/bluetooth.wxml-->
<!--pages/mine/mine.wxml-->
<view class="container"><view class="section"> <!-- 第一行 --><view class="content"><text>蓝牙开关</text></view><view class="switch"><switch checked="{{isbluetoothready}}" bindchange="open_BLE" /></view></view><view class="section"> <!-- 第二行 --><button type="default" size="{{primarySize}}" loading="{{searchingstatus}}" plain="{{plain}}" disabled="{{disabled}}" bindtap="search_BLE"> {{searchingstatus?"搜索中":"搜索蓝牙"}} </button></view><block wx:for="{{list}}"> <!-- 第三行 --><view class="section" style="flex-direction:row" ><view><text>{{index}}:\n </text><text>设备名称: {{item.name}}\n</text><text>MAC地址: {{item.deviceId}}</text></view><view class="connection"><button id="{{item.deviceId}}" size="mini"bindtap="connectTO"> {{deviceconnected?"已连接":"连接"}} </button></view></view></block> <block wx:if="{{deviceconnected}}"> <!-- 第四行 --><view class="content1"><text decode="{{true}}" space="{{true}}">\n\n门的状态 \n</text><!-- <text>{{receive_data}}\n</text> --><!-- <button size="mini" bindtap="receiveMessages">接收</button> --></view><view class="content1"><!-- <text>{{receive_data}}\n</text> --><text decode="{{true}}" space="{{true}}">{{door_state}}\n</text><!-- <button size="mini" bindtap="receiveMessages">接收</button> --></view><view class="send"><form bindsubmit="formSubmit"><text>\n\n密码发送:</text><input name="senddata"/><button size="mini" formType="submit">发送</button><button size="mini" formType="reset">清空</button></form></view></block></view>
基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计)相关推荐
- 微信小程序之校园摆渡车系统
微信小程序之校园摆渡车系统 简介 本项目的设计初衷是为了解决在校一直等待校园摆渡车的情况,想通过这个软件实现司机可以实时看到等车人的位置,等车人也可以实时的叫车,并且看到司机位置,并且恰逢 orcl大 ...
- vue.js反编译_基于electron-vue开发的微信小程序反编译客户端
开源一个小程序反编译客户端 咨询小程序反编译的同学比较多,虽然有开源库但是还是有同学不清楚如何去操作,所以索性做了一个客户端方便进行小程序的反编译 # 技术选型 网上已经有大佬实现了C#版的反编译工具 ...
- 基于云开发的微信小程序:个人相册ByUestcXiye
基于云开发的微信小程序:个人相册ByUestcXiye 作业要求 第一次作业 第二次作业 结课作业 小程序开发入门 开发前的准备 注册微信小程序 新建一个模板小程序 开通云开发服务 第一次作业 参考资 ...
- [附源码]计算机毕业设计springboot基于微信小程序的网络办公系统
项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
- 基于微信小程序的网上订餐系统 报告+任务书+开题报告+文献综述+中期PPT+外文翻译及原文+PPT+项目源码及数据库文件
摘要 随着微信小程序的飞速发展,很多系统随之兴起,微信已经是我们生活中的一部分,可不单单是人们用于沟通聊天的工具.还有很多公告平台.小程序也随之发展.大部分公众平台都只起到了一个信息消息的推送或者浏览 ...
- (附源码)springboot基于微信小程序的校园外卖系统 毕业设计091024
Springboot基于微信小程序的校园外卖系统 摘要 随着生活质量的日益改善以及生活节奏的日益加快,人们对餐饮需求的质量以及速度也随之发生着变化.为了满足社会需求,餐饮的高质量和快节奏也渐渐使电话订 ...
- 基于微信小程序的体育课评分系统小程序
文末联系获取源码 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/my ...
- node.js基于微信小程序的外卖订餐系统 uniapp 小程序
美食是人类永恒的话题,无论是在古代还是现代人们对美食都有一种非常的热爱在里面,但是随着时代的发展,人们可能没有更多的时间去研究美食,很多时候人们在下班或者放学之后更希望通过网络来进行订餐,为此我开发了 ...
- 计算机毕业设计Python+uniapp基于微信小程序某企业考勤系统(小程序+源码+LW)
计算机毕业设计Python+uniapp基于微信小程序某企业考勤系统(小程序+源码+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ ...
最新文章
- 软考高项之各大管理计划内容-攻坚记忆
- 杀毒软件引起的WinCE编译出错问题
- python安装、anaconda安装、pycharm安装(学习笔记,自己重新整理后的内容,最新版本工具安装)
- C#调用C++的dll文件方法
- 【牛客 - 330C】Applese 走迷宫(bfs)
- “macOS Catalina下TeXstudio内置PDF阅读器无法正常显示中文”的解决办法
- 【语义分割】全卷积网络(Fully Convolutional Networks, FCN)详解
- Linux操作系统PS命令详细解析
- banana pro 板子
- VM两个虚拟机之间的通讯测试
- CentOS 7.X配置连接网络
- C语言编写走迷宫小游戏
- 王德顺《追求自由的亡命徒》
- Java基础学习笔记(十)——常用API(3)
- WPF教程(二) WPF vs WinForms
- 解决Ubuntu系统下的VMware Workstation无法打开虚拟网络编辑器界面的问题
- nsis打包时候如何让附带的第三方软件静默安装
- Python程序设计基础第二版董付国版课后习题答案
- 微信第三方服务平台开发(一)
- JAVA 面向对象与面向过程区别