收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
接着就是分频模块。这种分频非常简单,就不具体解释了,直接给出代码:
下面重点来了
首先,要实现k2按下数值清0的效果,这个非常简单。直接在if语句里面判断,符合条件直接清0就行。然后要实现时间的预设功能,那么假定只有在倒计时暂停的情况下才可以进行时间设定,倒计时运行过程中不能对时间进行修改。所以在设定时间时首先要判断k1的状态,如果k1为0,才可以进行时间预设。当k1为1时,就是正常的倒计时状态。Sec信号在1HZ脉冲的驱动下(clk_hz信号每隔1S会置1一次)减1,每次减到0都判断一次minute是否为0,如果minute不为0,说明倒计时过程还未结束,应该重新给sec赋值并且minute减1,否则说明倒计时结束了,蜂鸣器报警,同时暂停倒计时的过程。这部分的逻辑代码如下:
需要注意这里使用的是 if else if 语句,里面的条件是有优先级顺序的。复位信号的优先级最高,然后的清0按键k2,然后是k1.
最后就是将所得的时间数值,取出来,送给显示模块进行显示。
仿真图如下:
这是不加数码管显示的,为的是更清楚的看到时间的变化。一开始我令k3按下去一个周期 K5按下去2个周期,那么对应的效果就是minute+1,sec+2。从仿真的结果看,确实是这样。随后当k1置为高电平以后,分钟和秒钟在进行倒计时的过程。当时间减完以后,可以看到蜂鸣器输出了高电平,倒计时过程暂停了!
接下来给出一张完整的仿真图:
完整代码如下:
module count_down(
input clk , // 时钟信号 假设时钟信号为50M
input rst_n , // 复位信号
input k1, //用于控制计时的启动和停止 1表示启动 0表示停止
input k2, //用于控制计数时间的归零
input k3, //用于设置倒计时时间时 对分钟的+
input k4, //用于设置倒计时时间时 对分钟的-
input k5, //用于设置倒计时时间时 对秒钟的+
input k6, //用于设置倒计时时间时 对秒钟的- //所有按键都假设 不按下为1 按下为0
output [5:0] minut_out, //将时间输出 便于观察
output [5:0] sec_out,
output reg beep, //蜂鸣器报警 高电平报警
output [3:0] seg_sel, // 数码管位选,最左侧数码管为最高位
output [6:0] seg_led // 数码管段选
);
//parameter hz_num=32'd50_000_000;
parameter hz_num=32'd50; //将50M时钟分频到1HZ所需要的分频系数 仿真时取50 实物取50_000_000
reg [5:0] minute; //预设时间的分钟
reg [5:0] sec; //预设时间的秒钟
reg clk_hz; //分频后的1hz信号
reg [31:0] hz_cnt; //分频模块使用的寄存器
wire [3:0] minute_ge; //保存分钟的个位 用于输出到数码管显示
wire [3:0] minute_shi; //保存分钟的十位 用于输出到数码管显示
wire [3:0] sec_ge; //保存秒钟的个位 用于输出到数码管显示
wire [3:0] sec_shi; //保存秒钟的时位 用于输出到数码管显示
wire [15:0] data_out; //要传递到数码管显示的数据
//产生1hz的模块
always @(posedge clk) begin
if(hz_cnt==hz_num-1)
begin
hz_cnt<=32'd0;
clk_hz<=1'b1;
end
else
begin
hz_cnt<=hz_cnt+1;
clk_hz<=1'b0;
end
end
//读取按键信息 进行倒计时预设 假设只有在停止状态下才能进行时间预设 (也就是k1=0 才可以设置时间)
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
begin //复位时 时间都归0
minute<=6'd0;
sec<=6'd0;
beep<=1'b0; //蜂鸣器不响
end
else if(k2==0) //按下k2 时间也归0
begin
minute<=6'd0;
sec<=6'd0;
end
else if(k1==0) //如果是在停止状态下,则对时间进行设定
begin
if(k3==0)
begin
minute<=minute+6'd1;
end
else if(k4==0)
begin
minute<=minute-6'd1;
end
else if(k5==0)
begin
sec<=sec+6'd1;
end
else if(k6==0)
begin
sec<=sec-6'd1;
end
else
begin
minute<=minute;
sec<=sec;
end
end
else if(k1==1) //如果实在开启状态下
begin
if(clk_hz) //在1S的脉冲驱动下 进行倒计时操作
begin
if(sec>0)
sec<=sec-6'd1;
else //秒钟倒计时到0了
begin
if(minute>0) //如果分钟不为0
begin
sec<=6'd60; //秒钟重新赋值为60
minute<=minute-6'd1; //分钟 减1
end
else //如果分钟为0 说明倒计时结束了
begin
![img](https://img-blog.csdnimg.cn/img_convert/6025a7fe5bfc56361e592c820ca5c93b.png)
![img](https://img-blog.csdnimg.cn/img_convert/afee22bdcd909bd03b65179cab7e7cbf.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**