51单片机实现利用定时/计数器T0对外部脉冲(用按键进行模拟)进行计数,并将计数值以二进制形式在8个LED上显示出来

51单片机实现利用定时/计数器T0对外部脉冲(用按键进行模拟)进行计数,并将计数值以二进制形式在8个LED上显示出来.

每次闪烁进一位

连线如下:

代码如下:

#include <reg51.h>
#define LED_PORT P2

                                   // 初始化函数
void init() {
                                   // 设置T0工作在模式1,并设置为外部时钟源
    TMOD = 0x01;                   // 设置 T0 为模式1
    TH0 = 0;                       // 初始计数值高位
    TL0 = 0;                       // 初始计数值低位
    TR0 = 1;                       // 启动 T0 定时器

// 配置外部中断0(用于T0溢出中断)
    ET0 = 1;                       // 允许T0中断
    EA = 1;                        // 允许总中断

// 初始化LED端口
    LED_PORT = 1;                  // 全部LED关闭
}

// 定时器0中断服务程序
void timer0_ISR() interrupt 1 {
    static unsigned int count = 0; // 计数值

// 更新计数值
    count++;

// 输出二进制形式到LED端口
    LED_PORT = ~count;                // 取反以便LED亮起,因为LED共阴
}

// 主函数
void main() {
    init();                           // 初始化

    while(1) {
                                       // 主循环中不需要做任何事情,因为计数和显示工作在中断中完成
    }
}
 

代码截图如下:

 

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
课程设计报告 课程名称: 单片机课程设计 题 目: 基于单片机的频率计数器设计 学 院: 环境与化学工程 系:过程装备与测控工程 专 业: 班 级: 学 号: 学生姓名: 起讫日期: 指导教师: 摘要 数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它 是一种用十进制数字,显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信 号,方波信号以及其他各种单位时间内变化的物理量。本课程设计主要设计一个简易的 频率计,来实现信号在0-9999HZ范围内周期变化的方波频率的测定。 该文主要介绍了基于STC89C52 单片机频率计的设计方案和实现方法,该系统主要由硬件和软件两部分组成,其中重点 给出了具体硬件电路图和软件流程图以及具体工作原理。 硬件部分通过洞洞板的布线设计帮助,可以确保焊接时尽量少的飞线和出错。软件通过 keil µ vision编译及调试,其中在P1.7口编入了一个5500HZ的方波,用以仿真调试该频率计的 软硬件功能是否能够实现输出频率的功能。另外,本设计多增加了一个按键功能,通过 一个按键来控制定时计数器的开始和关闭。该频率计还带有3*3的矩阵键盘,可以作为扩 展应用区,通过编程实现。本设计中用的是LED共阴数码管,输出频率时采用的事动态显 示的方法。 关键词:频率计;单片机;动态显示 目录 一、频率计数器的设计任务和要求 1 1.1 频率计数器的设计任务 1 1.2 设计要求及发挥部分 1 二、方案的总体设计 1 2.1 方案的设计 1 2.2 方案的整体框图 2 2.3 方案的说明 2 三、 硬件设计 2 3.1 单片机的最小系统 2 3.1.1 上电复位电路 2 3.1.2 晶振电路 3 3.2 LED数码管显示电路 3 3.3 整体电路 4 四、 软件设计 5 4.1 程序流程图 5 4.2 初始化子函数 5 4.3 延时子函数 5 4.4 中断子函数 5 五、 系统的调试和说明 6 5.1 C程序的说明 6 5.2 C程序编译的结果 6 5.3 实物图 7 六、 设计总结与心得体会 8 6.1设计总结 8 6.2 设计心得 9 七、 参考文献 9 附录 10 一、频率计数器的设计任务和要求 1.1 频率计数器的设计任务 本课程设计任务主要是基于单片机系统,通过软件、硬件的调试,完成一个具有 计数功能的频率计数器。 1.2 设计要求及发挥部分 1.设计要求主要有: 设计的方案合理、正确; 完成系统硬件的设计及正确焊接; 完成系统软件的设计与调试; 2.发挥部分: 本课程设计的发挥部分较小,只再增加了一个按键来控制定时器,计数器的开始 。 二、方案的总体设计 2.1 方案的设计 本课程设计的基于ATMEL公司STC89C52单片机的频率计数器,是利用该52单片机内部 的定时计数器来完成待测信号频率的测量。 STC89C52单片机内部具有2个16位的定定时计数器T0与T1,可以通过编程来实现所需 要的功能。定时/计数器T0与T1的核心都是16位的加1计数器,TH0与TL0构成 在构成定时器/计数器T0加1计数器的高8位和低8位;TH1与TL1构成在构成定/计数器T1加 1计数器的高8位和低8位。加1计数器的初值可以通过程序设定,这样就可以获得不同的 计数器初值或定时时间。加1计数器用作定时器时,每个机器周期加1,这样以机器周期 为基准可以用来测量时间间隔。定时/计数器用作计数器时,在相应的外部方波从1到0的 跳变时计数器加1,这样在计数闸门的控制下可以测量待测信号的频率。定时/计数器的 工作由响应的运行控制位TR控制,当TR置1时,定时/计数器开始计数,当TR置零时停止计 数。 在本设计方案中,我在程序中设定T0工作在计数状态,T1工作在计时状态下。T0计数器 对输入信号进行计数,由于信号的频率就是每秒钟信号的脉冲个数,于是我让T1工作在 定时状态下,定时时间为1秒。每定1秒钟到,就停止T0计数,然后从T0计数单元中 读取计数的数值,即完成了信号的频率测量。最后通过四位数码显示出频率值。 由于要尽可能的使用最少的元件,在满足设计要求的前提下,我将P1.7口与P3.4口( 即T0)用导线连接,在设定程序时,利用T1定时的同时在P1.7口输出一个设定好的方波 ,以便直观的检测频率计数器的软件、硬件是否达到设计的基本功能。 2.2 方案的整体框图 图1 系统总体框图 2.3 方案的说明 本课程设计采用内部给定的方波来实现频率计数的功能,缺陷在于只能测得一个 方波的频率,但是这个方波的输入意在便于检测设计的软、硬件的功能是否实现,若 功能可以实现,则可用于测量外部输入的0--10000HZ之间的任意频率值。 硬件设计 3.1 单片机的最小系统 3.1.1 上电复位电路 复位是单片机的初始
根据您的需求,这里提供一个基于STC89C52单片机的C语言代码,实现外部脉冲计数按键控制和24进制计数: ``` #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit key=P3^2; // 按键连接到P3.2口 sbit disp1=P2^0; // 数显第一位连接到P2.0口 sbit disp2=P2^1; // 数显第二位连接到P2.1口 uint cnt=0; // 计数器初值为0 void delay(uint ms) // 延时函数 { uint i,j; for(i=0;i<ms;i++) for(j=0;j<125;j++); } void init_timer0() // 初始化定时器0 { TMOD &= 0xF0; // 清零T0工作方式 TMOD |= 0x02; // 设置T0为方式2 TH0 = 0x3C; // 设置重载值,时钟频率为11.0592MHz,计数1ms,TH0=0x3C TL0 = 0xAF; ET0 = 1; // 开启T0中断 TR0 = 1; // 启动T0 EA = 1; // 开启总中断 } void timer0_isr() interrupt 1 // 定时器0中断服务函数 { TH0 = 0x3C; // 重新设置重载值 TL0 = 0xAF; cnt++; // 计数器自增 } void main() { uchar bcd1,bcd2; // 存放BCD码的两个数 init_timer0(); // 初始化定时器0 while(1) { if(key == 0) // 检测按键是否按下 { delay(10); // 延时去抖 if(key == 0) // 确认按键按下 { while(!key); // 等待按键释放 cnt++; // 计数器自增 } } if(cnt > 86399) // 计数器达到86399时自动清零,实现24进制计数 cnt = 0; bcd1 = cnt/3600; // 计算小时数的BCD码 bcd2 = (cnt%3600)/60*10 + (cnt%3600)%60/10; // 计算分钟数的BCD码 disp1 = 1; // 显示第一位数 P0 = bcd1; // 输出第一位数的BCD码 delay(5); // 显示延时 disp1 = 0; // 关闭第一位数的显示 disp2 = 1; // 显示第二位数 P0 = bcd2; // 输出第二位数的BCD码 delay(5); // 显示延时 disp2 = 0; // 关闭第二位数的显示 } } ``` 代码中通过定时器0实现了1ms的计数按键检测和24进制计数按键每按下一次,计数器自增1,当计数器达到86399时自动清零,实现24进制计数。数显使用两个BCD码数码管,通过P0口输出BCD码,P2口控制数码管的显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值