设为首页收藏本站帮助中心
查看: 231|回复: 3
收起左侧

Quartus Verilog HDL/FPGA 实现驱动 MAX6675 K型热电偶传感器芯片 3位数码管显示温度

[复制链接]
发表于 2023-3-17 19:27:29 | 显示全部楼层 |阅读模式
main.png
  1. module digital_tube(                //3位共阴数码管驱动模块
  2.         input clk,                                //50Mhz时钟
  3.         input [7:0] A,                        //百位段码
  4.         input [7:0] B,                        //十位段码
  5.         input [7:0] C,                        //个位段码
  6.         output reg [7:0] sc,                //8位宽数码管段码 [0]:A [1]:B ... [6]:G [7]:DP
  7.         output reg [2:0] bc                //3位宽数码管位码 [0]:百位 [1]:十位 [2]:个位
  8. );
  9. reg [15:0] i;
  10. reg [1:0] j;
  11. reg [23:0] k;
  12. always @(posedge clk) begin
  13.         i = i + 16'd1;
  14.         if(i >= 16'd50000) begin        //50000个时钟即为1ms
  15.                 i = 0;
  16.                 if(j == 0) begin
  17.                         k = {A,B,C};
  18.                 end
  19.                 case(j)
  20.                         2'd0:sc <= k[23:16];
  21.                         2'd1:sc <= k[15:8];
  22.                         2'd2:sc <= k[7:0];
  23.                         default:sc <= 8'd0;
  24.                 endcase
  25.                 bc <= ~(1'd1 << j);
  26.                 j = j + 2'd1;
  27.                 if(j == 3) begin
  28.                         j = 0;
  29.                 end
  30.         end
  31. end
  32. endmodule

  33. module max6675(                                //MAX6675 K型热电偶芯片驱动模块
  34.         input CLK,                                        //时钟输入 390.625Khz
  35.         input SO,                                        //MAX6675 数据
  36.         output reg SCK,                        //MAX6675 时钟
  37.         output reg CS,                                //MAX6675 片选
  38.         output reg [15:0] out        //从MAX6675 读取到的16位宽数据
  39.         /*
  40.         [15]:伪符号位 (固定为0,1为芯片通信异常)
  41.         [14:3]:12位温度摄氏度(精度0.25度)
  42.         [2]:0:热电偶已连接,1:断开
  43.         [1]:标识符 [0]:三态
  44.         */
  45. );
  46. integer delay_clk;                        //延时时钟
  47. reg [15:0] dat;
  48. reg [4:0] order;
  49. always @(posedge CLK) begin
  50.         if(delay_clk != 0) begin
  51.                 delay_clk <= delay_clk - 1;
  52.                 CS <= 1'd1;
  53.                 SCK <= 1'd0;
  54.         end else begin
  55.         order <= order + 5'd1;
  56.         case(order)
  57.                 5'd0:CS <= 1'b0;                //CS拉低
  58.                 5'd1:{dat[15],SCK} <= {SO,1'd1};                //采集SO数据并将SCK拉高
  59.                 5'd2:SCK <= 1'd0;                //SCK拉低瞬间SO发生改变
  60.                 5'd3:{dat[14],SCK} <= {SO,1'd1};
  61.                 5'd4:SCK <= 1'd0;       
  62.                 5'd5:{dat[13],SCK} <= {SO,1'd1};
  63.                 5'd6:SCK <= 1'd0;       
  64.                 5'd7:{dat[12],SCK} <= {SO,1'd1};
  65.                 5'd8:SCK <= 1'd0;       
  66.                 5'd9:{dat[11],SCK} <= {SO,1'd1};
  67.                 5'd10:SCK <= 1'd0;       
  68.                 5'd11:{dat[10],SCK} <= {SO,1'd1};
  69.                 5'd12:SCK <= 1'd0;       
  70.                 5'd13:{dat[9],SCK} <= {SO,1'd1};
  71.                 5'd14:SCK <= 1'd0;       
  72.                 5'd15:{dat[8],SCK} <= {SO,1'd1};
  73.                 5'd16:SCK <= 1'd0;       
  74.                 5'd17:{dat[7],SCK} <= {SO,1'd1};
  75.                 5'd18:SCK <= 1'd0;       
  76.                 5'd19:{dat[6],SCK} <= {SO,1'd1};
  77.                 5'd20:SCK <= 1'd0;       
  78.                 5'd21:{dat[5],SCK} <= {SO,1'd1};
  79.                 5'd22:SCK <= 1'd0;       
  80.                 5'd23:{dat[4],SCK} <= {SO,1'd1};
  81.                 5'd24:SCK <= 1'd0;       
  82.                 5'd25:{dat[3],SCK} <= {SO,1'd1};
  83.                 5'd26:SCK <= 1'd0;       
  84.                 5'd27:{dat[2],SCK} <= {SO,1'd1};
  85.                 5'd28:SCK <= 1'd0;       
  86.                 5'd29:{dat[1],SCK} <= {SO,1'd1};
  87.                 5'd30:SCK <= 1'd0;
  88.                 default:begin
  89.                         {dat[0],SCK} = {SO,1'd1};
  90.                         out = dat;
  91.                         delay_clk <= 390625;                //延时1秒
  92.                 end
  93.         endcase
  94.        
  95.         end
  96. end

  97. endmodule

  98. module main(
  99.         input clk,                //50Mhz Pin17
  100.         input so,                //MAX6675 Pin40
  101.         output sck,                //MAX6675 Pin42
  102.         output [7:0] test,                //接8通道逻辑分析仪 Pin:41,43,45,48,52,55,58,60
  103.         output cs,                //MAX6675 Pin44
  104.         //接3位共阴数码管
  105.         output [7:0] sc,                //8位宽 数码管段码
  106.         output [2:0] bc                //3位宽 数码管位码       
  107. );

  108. function [7:0] display;                        //16进制数码管段码查询
  109.         input [3:0] hex;
  110.         begin
  111.         case(hex)
  112.                 4'h0:display = 8'h3F;
  113.                 4'h1:display = 8'h06;
  114.                 4'h2:display = 8'h5B;
  115.                 4'h3:display = 8'h4F;
  116.                 4'h4:display = 8'h66;
  117.                 4'h5:display = 8'h6D;
  118.                 4'h6:display = 8'h7D;
  119.                 4'h7:display = 8'h07;
  120.                 4'h8:display = 8'h7F;
  121.                 4'h9:display = 8'h6F;
  122.                 4'hA:display = 8'h77;
  123.                 4'hB:display = 8'h7C;
  124.                 4'hC:display = 8'h39;
  125.                 4'hD:display = 8'h5E;
  126.                 4'hE:display = 8'h79;
  127.                 4'hF:display = 8'h71;       
  128.         endcase
  129.         end
  130. endfunction

  131. reg [6:0] i;        //时钟分频 [0]:25M [1]:12.5M [2]:6.25M [3]:3.125M [4]:1.5625M [5]:781.25K [6]:390.625K
  132. wire clkb = i[6];
  133. always @(posedge clk) begin
  134.         i <= i + 7'd1;
  135. end

  136. wire [15:0] max6675_data;
  137. wire chip = !max6675_data[15];        //MAX6675芯片连接标志 (1:已连接 0:未连接)
  138. wire link = !max6675_data[2];                //热电偶连接标志 (1:已连接 0:未连接)
  139. assign test[0] = clkb;
  140. assign test[1] = so;
  141. assign test[2] = sck;
  142. assign test[3] = cs;
  143. assign test[4] = 1'd1;
  144. assign test[5] = 1'd0;
  145. assign test[6] = 1'd1;
  146. assign test[7] = 1'd0;

  147. wire [9:0] a = max6675_data[14:5];
  148. wire [9:0] temp = (a > 999) ? 10'd999 : a;                //测量摄氏度 精度1度 最大999度
  149. max6675 max6675(
  150.         .CLK(clkb),
  151.         .SO(so),
  152.         .SCK(sck),
  153.         .CS(cs),
  154.         .out(max6675_data)
  155. );
  156. //小数点亮:MAX6675初始化异常 3个减号:热电偶接触不良
  157. digital_tube digital_tube(
  158.         .clk(clk),
  159.         .A(chip ? (link ? display(temp/100%10) : 8'h40) : 8'h80),
  160.         .B(chip ? (link ? display(temp/10%10) : 8'h40) : 8'h80),
  161.         .C(chip ? (link ? display(temp%10) : 8'h40) : 8'h80),
  162.         .sc(sc),
  163.         .bc(bc)
  164. );

  165. endmodule
复制代码

相关帖子

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则