【FPGA】基于状态机实现自动售货机模拟

2023-05-16

文章目录

  • 一、售货机功能
  • 二、售货机状态分析及模块划分
  • 三、代码实现
  • 四、上板验证

一、售货机功能

此自动售货机模拟基于EP4CE6F17C8开发板实现,用按键,led灯,数码管表示各个输入输出

功能:
此自动售货机可以选择A(三元)与B(五元)商品且选择商品数量,一次可以投1块与5块钱。当投币数量满足商品价格时则能出货,且退款额外支付,在任意阶段皆可以取消支付并退款。

二、售货机状态分析及模块划分

在这里插入图片描述
IDLE(初始状态):key3确认进入GOODS状态

GOODS(选择商品状态):key1选择A商品(3元),led0亮,key2选择B商品(5元),led2亮,key3确认进入NUM状态

NUM(选择商品数量状态):key1商品数量加一,key2商品数量减一,在数码管第一位显示数量,商品数量不为0时按key3进入PAY状态,同时得到所需支付总价并在数码管三四位显示

PAY(支付状态):key1付款1元,key2付款5元,若投币数量小于商品总价则在五六位显示投币数量,且数码管第二位显示0表示无法出货,若投币数量大于等于商品总价则在五六位显示投币超出总价所需退款价格,数码管第二位显示1表示key出货,此时按下key3进入OUT状态。

OUT(出货状态):商品出货,四个led灯全亮。

因开发板按键数量不足,每个状态需要取消支付和出货后回到初始状态都用复位按键key4表示。

模块划分
在这里插入图片描述

三、代码实现

auto_sell(顶层模块)

module auto_sell(
    input           clk,
    input           rst_n,

    input   [3:0]   key_in,
    
    output  [3:0]   led,
    output  [5:0]   sel,
    output  [7:0]   seg
);

wire    [9:0]   key_out ;
wire    [9:0]   price   ;
wire    [9:0]   cnt     ;
wire    [9:0]   coin    ;

key_debounce    key_debounce0(
    .clk        (clk),
    .rst_n      (rst_n),

    .key_in      (key_in),
    .key_out     (key_out)
);

seg_ctrl    seg_ctrl0(
    .clk        (clk),
    .rst_n      (rst_n),

    .seg        (seg),
    .sel        (sel),

    .coin       (coin),
    .price      (price),
    .cnt        (cnt)
);

sell_state  sell_state0(
    .clk        (clk),
    .rst_n       (rst_n),

    .key_in     (key_out),
    .led        (led),

    .coin       (coin),
    .price      (price),
    .cnt        (cnt)
);

endmodule

key_debounce(按键消抖模块)

//4按键消抖
module key_debounce(
    input           clk,
    input           rst_n,
    input           [3:0]key_in,  // 按键输出,1是没有按下,0是按
    output   reg    [3:0]key_out  // 消抖后的按键输出,此时1为按下
);

    parameter TIME_DELAY = 1_000_000;  // 延时时间20ms

    reg    [19:0]cnt0        ;     // 计数器
    reg    [19:0]cnt1        ;     // 计数器
    reg    [19:0]cnt2        ;     // 计数器
    reg    [19:0]cnt3        ;     // 计数器
    wire         add_cnt0    ;     // 计数开始标志
    wire         end_cnt0    ;     // 计数结束标志
    wire         add_cnt1    ;     // 计数开始标志
    wire         end_cnt1    ;     // 计数结束标志
    wire         add_cnt2    ;     // 计数开始标志
    wire         end_cnt2    ;     // 计数结束标志
    wire         add_cnt3    ;     // 计数开始标志
    wire         end_cnt3    ;     // 计数结束标志
    reg     [3:0]key_before ;     // 前一时刻电平状态
    reg     [3:0]key_now    ;     // 当前时刻电平状态
    wire         flag_fall0 ;     // 抖动标志
    wire         flag_fall1 ;     // 抖动标志
    wire         flag_fall2 ;     // 抖动标志
    wire         flag_fall3 ;     // 抖动标志
    reg          flag_timing0;     // 计时标志,1为在计时
    reg          flag_timing1;     // 计时标志,1为在计时
    reg          flag_timing2;     // 计时标志,1为在计时
    reg          flag_timing3;     // 计时标志,1为在计时


    // 当前按键电平设置
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            key_now <= 4'b1111;
        else
            key_now <= key_in;
    end


    // 前一时刻按键电平设置
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            key_before <= 4'b1111;
        else
            key_before <= key_now;
    end


	// 边沿检测(前一个时刻高电平,下一个时刻低电平,就是出现了下降沿,相反是上升沿),开始抖动
    assign flag_fall0 = (key_before[0] && !key_now[0]);
    assign flag_fall1 = (key_before[1] && !key_now[1]);
    assign flag_fall2 = (key_before[2] && !key_now[2]);
    assign flag_fall3 = (key_before[3] && !key_now[3]);


    // 计时标志判断0
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            flag_timing0 <= 1'b0;
        else if (flag_fall0) 
            flag_timing0 <= 1'b1;
        else if (end_cnt0)  
            flag_timing0 <= 1'b0;
        else flag_timing0 <= flag_timing0 ;
    end


    // 计时标志判断1
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            flag_timing1 <= 1'b0;
        else if (flag_fall1) 
            flag_timing1 <= 1'b1;
        else if (end_cnt1)  
            flag_timing1 <= 1'b0;
        else flag_timing1 <= flag_timing1 ;
    end



    // 计时标志判断2
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            flag_timing2 <= 1'b0;
        else if (flag_fall2) 
            flag_timing2 <= 1'b1;
        else if (end_cnt2)  
            flag_timing2 <= 1'b0;
        else flag_timing2 <= flag_timing2 ;
    end



    // 计时标志判断3
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            flag_timing3 <= 1'b0;
        else if (flag_fall3) 
            flag_timing3 <= 1'b1;
        else if (end_cnt3)  
            flag_timing3 <= 1'b0;
        else flag_timing3 <= flag_timing3 ;
    end


    // 计数器0
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt0 <= 20'd0;
        else if (add_cnt0) begin   
            if (end_cnt0)
                cnt0 <= 20'd0;
            else
                cnt0 <= cnt0 + 1'd1;
			end
        else cnt0 <= 20'd0;
 
    end

    // 计数器1
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt1 <= 20'd0;
        else if (add_cnt1) begin   
            if (end_cnt1)
                cnt1 <= 20'd0;
            else
                cnt1 <= cnt1 + 1'd1;
			end
        else cnt1 <= 20'd0;
    end

    // 计数器2
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt2 <= 20'd0;
        else if (add_cnt2) begin   
            if (end_cnt2)
                cnt2 <= 20'd0;
            else
                cnt2 <= cnt2 + 1'd1;
			end
        else cnt2 <= 20'd0;
    end

    // 计数器3
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt3 <= 20'd0;
        else if (add_cnt3) begin   
            if (end_cnt3)
                cnt3 <= 20'd0;
            else
                cnt3 <= cnt3 + 1'd1;
			end
        else cnt3 <= 20'd0;
    end



    assign add_cnt0 = flag_timing0;  //开始计数条件
    assign end_cnt0 = ((cnt0==TIME_DELAY-1) && add_cnt0); //结束计时条件

    assign add_cnt1 = flag_timing1;  //开始计数条件
    assign end_cnt1 = ((cnt1==TIME_DELAY-1) && add_cnt1); //结束计时条件

    assign add_cnt2 = flag_timing2;  //开始计数条件
    assign end_cnt2 = ((cnt2==TIME_DELAY-1) && add_cnt2); //结束计时条件

    assign add_cnt3 = flag_timing3;  //开始计数条件
    assign end_cnt3 = ((cnt3==TIME_DELAY-1) && add_cnt3); //结束计时条件


    // 消抖后的按键输出
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            key_out[0] <= 1'b0;
        else if (end_cnt0)
            key_out[0] <= ~key_now[0];
        else
            key_out[0] <= 1'b0;
    end



      // 消抖后的按键输出
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            key_out[1] <= 1'b0;
        else if (end_cnt1)
            key_out[1] <= ~key_now[1];
        else
            key_out[1] <= 1'b0;
    end




        // 消抖后的按键输出
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            key_out[2] <= 1'b0;
        else if (end_cnt2)
            key_out[2] <= ~key_now[2];
        else
            key_out[2] <= 1'b0;
    end  


        // 消抖后的按键输出
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            key_out[3] <= 1'b0;
        else if (end_cnt3)
            key_out[3] <= ~key_now[3];
        else
            key_out[3] <= 1'b0;
    end
endmodule

sell_state(状态机判断及逻辑模块)

module sell_state(
    input   clk,
    input   rst_n,

    input   [3:0]   key_in,
    output reg [3:0]   led,

    output reg [9:0] coin, //投币总价
    output reg [9:0] price,//商品总价
    output reg [9:0] cnt   //商品数量
);

reg     [4:0]   state_c ;
reg     [4:0]   state_n ;

reg     [9:0]   A_select;
reg     [9:0]   B_select;

localparam
    IDLE  = 5'b00001 ,
    GOODS = 5'b00010 ,
    NUM   = 5'b00100 ,
    PAY   = 5'b01000 ,
    OUT   = 5'b10000 ;

wire        IDLE_GOODS ;
wire        GOODS_NUM  ;
wire        NUM_PAY    ;
wire        PAY_OUT    ;
wire        OUT_IDLE   ;
 
 //状态转移条件
assign IDLE_GOODS = IDLE  && ( key_in == 4'b0100 ) ;         
assign GOODS_NUM  = GOODS && ( key_in == 4'b0100 ) && ( A_select || B_select ) ;   
assign NUM_PAY    = NUM   && ( key_in == 4'b0100 ) && ( cnt != 0 ) ;
assign PAY_OUT    = PAY   && ( key_in == 4'b0100 ) && ( coin >= price ) ;
assign OUT_IDLE   = OUT   && ( key_in == 4'b0100 ) ;
 
 //状态机第一段
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        state_c <= IDLE ;
    else
        state_c <= state_n ;
end

//状态机第二段
always @(*)begin
    case(state_c)
        IDLE  : begin
            if(IDLE_GOODS)
                state_n <= GOODS ;
            else
                state_n <= state_c ;
        end
        GOODS: begin
            if(GOODS_NUM)
                state_n <= NUM ;
            else
                state_n <= state_c ;
        end
        NUM   : begin
            if(NUM_PAY)
                state_n <= PAY ;
            else
                state_n <= state_c ;
         end
        PAY : begin
            if(PAY_OUT)
                state_n <= OUT ;
            else
                state_n <= state_c ;
        end
        OUT : begin
            if(OUT_IDLE)
                state_n <= IDLE ;
            else
                state_n <= state_c ;
        end
    endcase
end

//商品选择A或B
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        A_select <= 1'b0 ;
        B_select <= 1'b0 ;
    end
    else if(state_c == GOODS)begin
        if(key_in==4'b0001)begin
            A_select <= 1'b1 ;
            B_select <= 1'b0 ;
        end
        else if(key_in==4'b0010)begin
            A_select <= 1'b0 ;
            B_select <= 1'b1 ;
        end
        else begin
            A_select <= A_select ;
            B_select <= B_select ;
        end
    end        
    else begin
        A_select <= A_select ;
        B_select <= B_select ;
    end
end

//商品数量选择
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        cnt <= 1'b0 ;
    else if(state_c == NUM)begin
        if(key_in==4'b0001)
        cnt <= cnt + 1 ;
        else if(key_in==4'b0010)
        cnt <= cnt - 1 ;
        else  
        cnt <= cnt ;
    end        
    else
        cnt <= cnt ;
end

//投币数量
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        coin <= 1'b0 ;
    else if(state_c == PAY)begin
        if(key_in==4'b0001)
            coin <= coin + 1'b1 ;
        else if(key_in==4'b0010)
            coin <= coin + 3'd5 ;
        else  
        coin <= coin;
    end        
    else
        coin <= 1'b0 ;
end

//商品总价
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        price <= 1'b0 ;
    else if(state_c == PAY)begin
        if(A_select)
            price <= 3 * cnt ;//A商品三元
        else if(B_select)
            price <= 5 * cnt ;//B商品三元
        else  
            price <= price ;
    end        
    else
        price <= 1'b0 ;
end

//确认出货
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        led <= 4'b0000 ;
    else if(state_c == OUT)
        led <= 4'b1111 ;
    else if(state_c == GOODS)begin
        if(key_in==4'b0001)
            led <= 4'b0001 ;
        else if(key_in==4'b0010)
            led <= 4'b0010 ;
        else
            led <= led ;
    end        
    else
        led <= led ;
end

endmodule

seg_ctrl(数码管显示模块)

 module seg_ctrl(
    input clk,
    input rst_n,

    input [9:0] coin,
    input [9:0] price,
    input [9:0] cnt,

    output reg [7:0] seg,
    output reg [5:0] sel
);

wire [9:0] change       ;//找零
wire [9:0] change_bit   ;//找零的个位数字
wire [9:0] change_Ten   ;//找零的十位数字
wire [9:0] Bit          ;//总消费个位数字
wire [9:0] Ten          ;//总消费十位数字

assign Bit          = price%10          ;//取总价钱个位
assign Ten          = (price/10)%10     ;//取总价钱十位
assign change_bit   = change%10         ;//取找零个位
assign change_Ten   = (change_Ten/10)%10;//取找零十位

//投的币大于等于消费总和,找剩余的钱,小于消费总和,全部退回
assign change=(coin>=price)?(coin-price):coin;

//每位数码管显示
reg [7:0] seg0;
reg [7:0] seg1;
reg [7:0] seg2;
reg [7:0] seg3;
reg [7:0] seg4;
reg [7:0] seg5;

//第一位数码管显示商品数量
always@(posedge clk or negedge rst_n)begin
     if(!rst_n)begin
        seg0<=8'b1100_0000;
    end
    else 
   
    case(cnt)
    4'd0   : seg0 <= 8'b1100_0000;
	4'd1   : seg0 <= 8'b1111_1001;
	4'd2   : seg0 <= 8'b1010_0100;
	4'd3   : seg0 <= 8'b1011_0000;
	4'd4   : seg0 <= 8'b1001_1001;
	4'd5   : seg0 <= 8'b1001_0010;
	4'd6   : seg0 <= 8'b1000_0010;
	4'd7   : seg0 <= 8'b1111_1000;
	4'd8   : seg0 <= 8'b1000_0000;
	4'd9   : seg0 <= 8'b1001_0000;
    default: seg0 <= 8'b1100_0000;
    endcase
end

//第二位显示是否能出货
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        seg1 <= 8'b1100_0000;
    end
    else if(coin>=price && price != 0)
        seg1 <= 8'b1111_1001;
    else
        seg1 <= 8'b1100_0000;
end

//第三位数码管显示消费总和个位
always@(posedge clk or negedge rst_n)begin
     if(!rst_n)begin
        seg2<=8'b1100_0000;
    end
    else 
   
    case(Bit)
    4'd0   : seg2 <= 8'b1100_0000;
	4'd1   : seg2 <= 8'b1111_1001;
	4'd2   : seg2 <= 8'b1010_0100;
	4'd3   : seg2 <= 8'b1011_0000;
	4'd4   : seg2 <= 8'b1001_1001;
	4'd5   : seg2 <= 8'b1001_0010;
	4'd6   : seg2 <= 8'b1000_0010;
	4'd7   : seg2 <= 8'b1111_1000;
	4'd8   : seg2 <= 8'b1000_0000;
	4'd9   : seg2 <= 8'b1001_0000;
    default: seg2 <= 8'b1100_0000;
    endcase
end

//第四位数码管显示消费总和十位
always@(posedge clk or negedge rst_n)begin
     if(!rst_n)begin
        seg3<=8'b1100_0000;
    end
    else 
   
    case(Ten)
    4'd0   : seg3<= 8'b1100_0000;
	4'd1   : seg3<= 8'b1111_1001;
	4'd2   : seg3<= 8'b1010_0100;
	4'd3   : seg3<= 8'b1011_0000;
	4'd4   : seg3<= 8'b1001_1001;
	4'd5   : seg3<= 8'b1001_0010;
	4'd6   : seg3<= 8'b1000_0010;
	4'd7   : seg3<= 8'b1111_1000;
	4'd8   : seg3<= 8'b1000_0000;
	4'd9   : seg3<= 8'b1001_0000;
    default: seg3<= 8'b1100_0000;
    endcase
end

//第五位数码管显示找零个位
always@(posedge clk or negedge rst_n)begin
     if(!rst_n)begin
        seg4<=8'b1100_0000;
    end
    else 
   
    case(change_bit)
    4'd0   : seg4 <= 8'b1100_0000;
	4'd1   : seg4 <= 8'b1111_1001;
	4'd2   : seg4 <= 8'b1010_0100;
	4'd3   : seg4 <= 8'b1011_0000;
	4'd4   : seg4 <= 8'b1001_1001;
	4'd5   : seg4 <= 8'b1001_0010;
	4'd6   : seg4 <= 8'b1000_0010;
	4'd7   : seg4 <= 8'b1111_1000;
	4'd8   : seg4 <= 8'b1000_0000;
	4'd9   : seg4 <= 8'b1001_0000;
    default: seg4 <= 8'b1100_0000;
    endcase
end

//第六位数码管显示找零十位
always@(posedge clk or negedge rst_n)begin
     if(!rst_n)begin
        seg5<=8'b1100_0000;
    end
    else 
   
    case(change_Ten)
    4'd0   : seg5 <= 8'b1100_0000;
	4'd1   : seg5 <= 8'b1111_1001;
	4'd2   : seg5 <= 8'b1010_0100;
	4'd3   : seg5 <= 8'b1011_0000;
	4'd4   : seg5 <= 8'b1001_1001;
	4'd5   : seg5 <= 8'b1001_0010;
	4'd6   : seg5 <= 8'b1000_0010;
	4'd7   : seg5 <= 8'b1111_1000;
	4'd8   : seg5 <= 8'b1000_0000;
	4'd9   : seg5 <= 8'b1001_0000;
    default: seg5 <= 8'b1100_0000;
    endcase
end



//根据哪位数码管亮显示对应的
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        seg<=8'b1100_0000;
    end
    else begin
        case(sel)
            6'b111110:seg<=seg0;
            6'b111101:seg<=seg1;
            6'b111011:seg<=seg2;
            6'b110111:seg<=seg3;
            6'b101111:seg<=seg4;
            6'b011111:seg<=seg5;


        endcase
    end
end

parameter CNT_1MS = 50000 ;
reg [15:0] cnt_1ms ;

//1ms计数器
always @(posedge clk  or negedge rst_n) begin
    if(!rst_n)begin
        cnt_1ms <= 0 ;
    end
    else if(cnt_1ms==CNT_1MS)begin
        cnt_1ms <= 0 ;
    end
    else
    cnt_1ms <= cnt_1ms+1 ;
end

//位选,每1ms切换数码管显示
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        sel <= 6'b111110 ;
    end
    else if(cnt_1ms == CNT_1MS-1)
        sel <= { sel[4:0] , sel[5] } ;
    else 
        sel<=sel ;     
end

endmodule

四、上板验证

KEY1确认>A商品>3件,九元>付款11元>退款两元,商品出货
在这里插入图片描述

可以看出,需求功能实现了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【FPGA】基于状态机实现自动售货机模拟 的相关文章

  • pixhawk博客导读

    写的东西有点多 xff0c 写的也有点乱 xff0c 看题目也不知道内容是什么 xff0c 为了方便网友观看自己感兴趣的地方 xff0c 笔者把pixhawk博客归类一下 由于笔者也是边学习边写的 xff0c 难免有错误 xff0c 还请多
  • 笔记(STM32篇)day13——USART串口与PC通信实例

    USART 常用来实现控制器与电脑之间的数据传输 这使得我们调试程序非常方便 xff0c 比如我们可以把一些变量的值 函数的返回值 寄存器标志位等等通过 USART 发送到串口调试助手 xff0c 这样我们可以非常清楚程序的运行状态 xff
  • Leetcode 566. 重塑矩阵(C++矩阵容器)

    题目 输入 xff1a mat 61 1 2 3 4 r 61 1 c 61 4 输出 xff1a 1 2 3 4 思路 将原二维数组变成一维数组 xff0c 在重新放入变换后的二维数组 可以使用一维数组过渡 xff0c 也可以直接用整数除
  • 笔记(嵌入式Linux C篇)4——创建顺序存储表(二级指针方法)

    顺序存储表 概念等同于一个数组 xff0c 使用结构体定义 xff0c 成员为一个某类型的数组 xff0c 以及一个整形的last xff0c 作用是指示顺序存储表最后一个元素的下标 xff0c last默认为 1即数组为空 typedef
  • 笔记(嵌入式Linux C篇)5——单链表(有头节点)

    链表 数据元素随机存储 xff0c 通过指针表示数据之间的逻辑关系的结构就是链式存储结构 xff0c 即链表 一个链表节点包括一个数据域和一个指针域 数据域存储数据 xff0c 指针域存储下一个节点的地址 链表的结构体声明如下 xff1a
  • 实现对单链表的赋值、去重、拆分、排序。

    在一个带头结点的单链表A中 xff0c 自行输入A中的元素值 xff0c 请实现 xff1a xff08 1 xff09 将链表A中值相同的结点 xff0c 仅保留第一次出现的结点 xff1b xff08 2 xff09 将新得到的A链表
  • Linux高级编程——网络通信实现TCP(1)

    基于TCP协议的文件传输 xff08 套接字 xff09 实例 xff1a 客户端 xff1a 只用于收文件 xff1b 执行命令 xff1a 执行文件名 IP Port span class token comment 客户端 输入 执行
  • FPGA学习笔记—UART,RS485串口通信(verilog)

    目录 一 串口通信基础知识1 什么是串口 xff1f 2 同步通信和异步通信3 串行通信的传输方向4 常见的串口通信接口 二 UART串口通信UART基础知识1 协议层 xff1a 通信协议 xff08 包括数据格式 xff0c 传输速率等
  • 使用多线程编码实现:火车站卖票实例,四个卖票窗口随机卖出50张票

    public class Test 火车票 public static void main String args TicketWindow th1 61 new TicketWindow TicketWindow th2 61 new T
  • 【Arduino】arduino使用l298n的代码分享

    一 接线 二 使用步骤 int Left motor go 61 8 左电机前进 IN1 int Left motor back 61 9 左电机后退 IN2 int Right motor go 61 10 右电机前进 IN3 int R
  • Arduino基础与常用函数

    文章目录 1 Arduino语言2 Arduino代码结构1 类似于C的头文件包含 xff0c 变量定义等2 void setup 3 void loop 3 串口常用函数1 串口收发函数 Serial begin speed 2 读取串口
  • pixhawk px4 commander.cpp

    对于复杂的函数 xff0c 要做的就是看函数的输入是什么 来自哪里 xff0c 经过处理后得到什么 给谁用 xff0c 这样就可以把程序逻辑理清 中间的分析就是看函数如何处理的 span class hljs keyword extern
  • ESP8266 读取多个传感器数据(风速、风向、颗粒物、CO)

    文章目录 1 ESP8266开发板资源2 Arduino编程1 准备工作2 读取多个串口数据1 定义软串口 2 涉及传感器简介 3 集成代码 xff08 注释详细 xff09 4 Arduino 串口监视器 1 ESP8266开发板资源 一
  • ESP8266采集多个传感器数据通过WIFI上传到本地数据库(风速、风向、CO、颗粒物)

    文章目录 1 数据库使用简介1 Navicat premium连接2 新建数据库3 在数据库中新建表 2 代码实现代码 1 数据库使用简介 建立数据库连接 xff0c 在连接里新建数据库 xff0c 在数据库里新建表 1 Navicat p
  • STM32读取串口传感器(颗粒物传感器,被动传输)

    文章目录 1 串口2中断 xff08 在主动上传的基础上 xff09 1 添加发送字符和数组函数2 主函数调用3 串口助手接收数据 2 遇到的串口通信不成功问题 1 串口2中断 xff08 在主动上传的基础上 xff09 1 添加发送字符和
  • STM32采集问答式串口传感器数据写入SD卡(spi模式)

    文章目录 1 实验工具2 接线说明3 部分代码说明1 文件的覆盖问题1 文件系统的文件打开方式2 移动文件初始写入指针位置 2 变量的转换及写入问题1 sprintf函数2 CSV文件创建 3 数据采集流程 xff08 主函数 中断函数处理
  • (1)STM32 RC522模块测试代码

    文章目录 1 使用资源2 RC522模块2 1 RC522简介2 2 RC522工作模式 3 模块测试代码 工程文件源码链接 1 使用资源 使用32 的SPI1资源 xff1a SDA PA4 RST PA1 普通io SCK PA5 MI
  • (3)STM32 SG90舵机模块测试

    文章目录 1 资源简介2 测试源码 1 资源简介 stm32 rct6板SG90舵机模块 接线引脚 xff1a 橙色 xff1a 信号线 红色 xff1a 电源 43 5v 咖色 xff1a GND 此模块三条线固定在一起 xff0c 如果
  • (4) STM32 AS608指纹识别模块测试代码

    文章目录 1 使用资源2 实现思路简述3 指纹测试代码3 1 部分代码介绍3 2 源码链接 1 使用资源 stm32RCT6板子AS608指纹模块 软件资源 xff1a 串口二资源连接AS608 TX RX接线AS608 wak线连接PA8
  • 通过路由器连接JetsonNano与地面站

    通过路由器连接JetsonNano与地面站 一 前期准备注意事项连接局域网虚拟机网络设置 二 获取IP地址和设备名称IP地址设备名称 三 配置Nano修改bashrc文件修改hosts文件 四 配置地面站修改bashrc文件修改hosts文

随机推荐

  • jvm 堆 栈中存什么?

    数据类型 Java虚拟机中 xff0c 数据类型可以分为两类 xff1a 基本类型和引用类型 基本类型的变量保存原始值 xff0c 即 xff1a 他代表的 值就是数值本身 xff1b 而引用类型的变量保存引用值 引用值 代表了某个对象的引
  • YOLOv5 数据集划分及生成labels

    0 本人文件夹存放格式 xff08 因为要测试多个数据集和不同的yolov5版本和其他算法 xff0c 所以数据集整体放到外面 xff09 1 划分数据集 验证集 测试集 coding utf 8 import os import rand
  • mission planner发送数据之mavlink

    前段时间研究mp的地面站 xff0c 看了几天有点体会 xff0c 看网上的解析比较少 xff0c 写上来和大家分享下 xff0c 全是自己的理解 xff0c 东西比较少 xff0c 硬货不多 xff0c 还请见谅 最开始是想做个无人机超声
  • 实验三、嵌入式Linux网络通信实验

    实验三 嵌入式Linux网络通信实验 一 实验目的 1 掌握TCP与UDP协议原理 2 掌握套接字通信原理 2 掌握TCP套接字服务器端与客户端通信方法 二 实验基本要求 1 学习TCP与UDP协议原理 2 掌握TCP套接字服务器端与客户端
  • QT重载keyPress焦点问题

    最近项目上需要用到键盘上的快捷键 xff0c 就重载了键盘的按下事件 xff0c 以为万事大吉 实际界面上有很多控件 xff0c 导致如果鼠标点击了其中一个不能接收焦点的控件 xff0c 就不知道焦点传到了什么地方 上网查大致两种思路 xf
  • QT实现地图或图片的细节图(抓取图片的细节,放大图片)

    最近由于项目上的要求 xff0c 需要实现一个细节图 xff0c 就是一个矩形框中加载一个大图 xff0c 右下或者左下方有一个小矩形框 xff0c 可以加载全图 xff0c 并显示大矩形框中图片在全图的位置 xff0c 有点拗口 xff0
  • centos7 搭建vtk7.1.1+Qt开发环境+运行编译工程

    一 CMAKE安装 vtk必须用cmake编译 xff0c 但是 xff0c 由于高版本的cmake没有支持qt5的gui xff0c 所以选择低版本的 xff0c 但是低版本的必须得依赖于qt4 xff0c 而qt4相较于qt5 xff0
  • centos搭建vtk开发环境

    一 OpenGL3 0 vtk有个硬性要求就是OpenGL3 0及以上版本 xff0c 由于笔者此前使用的是centos7 xff0c 照着网上的教程配置OpenGL xff0c 但是之后glxinfo grep OpenGL发现openg
  • 读取ugrid格式文件

    include lt iostream gt include lt vector gt include lt string gt include lt fstream gt using namespace std int main int
  • C语言:#define详解

    define定义标识符 语法 xff1a define name stuff tips xff1a 我们在define定义标识符的时候 xff0c 不建议在后面加上 xff1b xff0c 这样很容易出问题 比如说在以下的情况中 xff1a
  • FPGA学习-UART串口发送单字节(UART时序分析+真正的FPGA设计看图写代码)

    首先看UART发送时序图 xff1a 要发送一个完整字节 xff0c 需要 1位起始位 43 8位数据位 43 1位停止位 xff0c 图上的第11位 xff0c 是确认一个字节发送完的一位 重点是每一位之间的发送时间需要保持一致 xff0
  • STM32串口2初始化

    在STM32提供的官方库里只有串口一的初始化代码 xff0c 但当你需要用到两个以上的串口 xff0c 就得自己写相应的代码 xff0c 下面是串口2的 xff0c 其他的串口也差不多 usart2 c include 34 sys h 3
  • VINS-Fusion跑kitti stereo及stereo+GPS数据

    Stereo source vfusion devel setup bash roslaunch vins vins rviz launch source vfusion devel setup bash rosrun loop fusio
  • vue 配置代理,简单解决跨域问题

    开发环境下 xff0c 借助vue cli简单解决跨域问题 配置方式一 xff1a 在vue config js文件中添加以下代码 xff1a devServer proxy 39 被代理的基础路径 39 这种方式只能配置一个代理 xff0
  • Wireshark网络抓包疯狂聊天程序

    文章目录 一 疯狂聊天环境配置二 使用wireshark进行抓包三 分析抓包四 参考文献 一 疯狂聊天环境配置 下载好疯狂聊天软件后 xff0c 打开计算机管理 xff0c 设备管理器 网络适配器中需要禁用这几项 xff0c 否则无法双向通
  • 游戏客户端编程

    文章目录 一 代码框架二 新建项目三 演示效果 一 代码框架 本次实验使用的网游客户端框架来自课堂老师的资料 链接 xff1a https pan baidu com s 1WSkrRTFPuN1N34BsySkeaQ 提取码 xff1a
  • 数学图形与机器视觉基础(1)

    文章目录 一 图片处理及分析1 修改图片位数和颜色并进行分析2 修改图片格式并进行分析 二 用奇异值分解 xff08 SVD xff09 对一张图片进行特征值提取 xff08 降维 xff09 处理三 采用图像的开闭运算 腐蚀 膨胀 xff
  • STM32之串口通信

    文章目录 一 串口通信与USART二 程序编写输出Hello Windows三 GPIO波形参考链接 一 串口通信与USART 二 程序编写输出Hello Windows 串口通信 串口通信是一种设备间非常常用的串行通行方式 xff0c 其
  • 【FPGA】UART串口通信

    文章目录 一 通信方式1 串行通信2 并行通信 二 UART串口通信1 模块设计与时序图2 代码实现 三 测试结果1 仿真结果2 上板验证 一 通信方式 1 串行通信 串行通信是指利用一条传输线将数据一位位地顺序传送 xff08 也就是说串
  • 【FPGA】基于状态机实现自动售货机模拟

    文章目录 一 售货机功能二 售货机状态分析及模块划分三 代码实现四 上板验证 一 售货机功能 此自动售货机模拟基于EP4CE6F17C8开发板实现 xff0c 用按键 xff0c led灯 xff0c 数码管表示各个输入输出 功能 xff1