51单片机-定时器&数码管扫描显示

发布者:独行侠客最新更新时间:2021-10-19 来源: eefocus关键字:51单片机  定时器 手机看文章 扫描二维码
随时随地手机看文章

1.定时器中断实现间隔切换


在第六章第4讲的测试代码中提到过数码管微闪烁问题,这是由于三八译码器的IO端口切换的间隔时间不均匀导致,这部分的问题宋老师已经在《手把手教你学51单片机》文档6.4.2节有详细解释,并在6.5.2节里解决了这个问题。数码管扫描函数我们使用定时器0强制实现间隔1ms切换三八译码器的IO输出,这样保证了每个数码管被点亮的时间都是均匀的。我们在主函数里不停地执行数码管显示函数。这里是测试代码,用定时器1实现add间隔50ms自增1,数码管显示add的值。


#include  

#include //详见第六章第8讲

#include

  

u32 add=9999;

  

void main()

{   

    LED_Init();          //初始化LED硬件模块

    EA = 1;              //闭合总中断开关

    TIM0_Init(1000,33);  //定时1ms,因为中断函数占用时间多一点,所以微调的值跨度比较大

    TIM1_Init(50000,10); //定时50ms,10是微调使定时更精确

     

    while(1)

    {   

        ShowNumber(add);

    }   

}

  

void TIM0_IRQHandler() interrupt 1

{

    TH0 = T0RH; //重新加载重载值

    TL0 = T0RL;

    SEG_Scan(); //间隔1ms执行三八译码器的不同IO输出低电平

}

  

void TIM1_IRQHandler() interrupt 3

{

    TH1 = T1RH; //重新加载重载值

    TL1 = T1RL;

    add++; 

}


2.PWM简单入门


PWM概念在《手把手教你学51单片机》文档10.2节有很好的解释,这里笔者就不费笔墨讲解了,我们简单入门PWM来让8盏小灯实现较暗地点亮。P0端口输出如下

8.14.png

代码实现如下


#include  

#include //详见第六章第8讲

#include

 

u8 pwm=0;

void main()

{   

    LED_Init();            //初始化LED硬件模块

    EA = 1;                //闭合总中断开关

    TIM0_Init(1000,10);    //定时1ms,10是微调使定时更精确

     

    while(1)

    {   

        if(pwm<=8)P0=0xFF; //pwm在0~8之间都会执行“P0=0xFF;”,也就是占空比为90%,小灯显示较暗

        else P0=0x00; 

    }   

}

  

void TIM0_IRQHandler() interrupt 1

    TH0 = T0RH;       //重新加载重载值

    TL0 = T0RL;

   

    pwm++;

    if(pwm>=10)pwm=0; //pwm在0~9之间间隔1ms变化

}


3.浅谈例程代码


在宋老师的lesson10_2例程代码中的“void ConfigPWM(unsigned int fr, unsigned char dc)”函数里大家阅读起来可能有点吃力,这里笔者解析一下。


我们先再次复习一下知识,定时器每加1经过的时间是(12/11059200)秒,如果计数到11059200(多次溢出),时间也就过去了12秒。时间过去了1秒的时候计数值就是(11059200/12)。


“ConfigPWM(100, 10);”意味着tmp的数值周期是(1/100)秒,也就是频率为100Hz。这个周期里高电平定时持续的时间为“(1/100)*0.1”秒,低电平定时持续的时间为“(1/100)*0.9”秒。所以占空比为10%。


主函数里的延时就是让这个PWM波形持续一段时间,然后又到下一个占空比为40%的PWM波形持续一段时间。4个阶段的占空比不同,也就表现为小灯的显示亮度不同。


这里笔者做个效果图给大家理解吧

8.15.png

关键字:51单片机  定时器 引用地址:51单片机-定时器&数码管扫描显示

上一篇:51单片机-数据类型强制转换
下一篇:51单片机-呼吸灯

推荐阅读最新更新时间:2024-11-16 23:44

基于51单片机的ds18B20温度程序
在学习板上正常运行,目前只能简单的检测温度。 温度变化速度有点慢,需要再调试。数码管显示还有点鬼影,暂时没想出来怎么去消鬼影。 没有添加温度上下限报警程序,没有添加按键可调温度程序,暂时不能显示小数部分。 以后还得继续努力把功能添加进去。 测得室温为31度 #include reg51.h /************共阳LED段码表*****************/ unsigned char code tab ={0xc0,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6}; /************端口定义*************/ sbit
[单片机]
基于<font color='red'>51单片机</font>的ds18B20温度程序
中断&定时器(三)
单片机中断简介 52单片机一共有6个中断源,它们的符号,名称以及各产生的条件分别如下: INT0 - 外部中断0,由P3.2端口线引入,低电平或下降沿引起 INT1 - 外部中断1,由P3.3端口线引入,低电平或下降沿引起 T0 - 定时器/计数器0中断, 由T0计数器计满回零引起 T1 - 定时器/计数器1中断, 由T1计数器计满回零引起 T2 - 定时器/计数器2中断, 由T2计数器计满回零引起 TI/RI - 串行口中断,串行端口完成一帧字符发送/接收后引起 其中T2是52单片机特有的。 中断允许寄存器IE 中断优先级寄存器IP 定时器中断 51单片机内部共有两个16位可编程的
[单片机]
中断&<font color='red'>定时器</font>(三)
如何使用8051定时器生成时间延迟?
8051单片机有两个独立的16位向上计数定时器,名为Timer0和Timer1,本文是关于使用8051定时器生成时间延迟。使用纯软件循环可以生成延迟,但这种延迟精度较差,不能用于敏感应用。使用定时器延迟是最准确的,当然也是最好的方法。 定时器可以概括为多位计数器,它在接收时钟信号时增加/减少自身,并在翻转时产生中断信号。当计数器在处理器时钟上运行时,它被称为“定时器”,它对预定数量的处理器时钟脉冲进行计数并产生可编程延迟。当计数器在外部时钟源(可能是周期性或非周期性外部信号)上运行时,它本身被称为“计数器”,可用于对外部事件进行计数。 在8051单片机中,振荡器输出使用12分频网络进行12分频,然后作为时钟信号馈入定
[单片机]
如何使用8051<font color='red'>定时器</font>生成时间延迟?
430单片机之定时器A功能的大致介绍
总的来说,430单片机一共有三个定时器,定时器A,定时器B,还有就是看门狗定时器,这里我们主要是讨论430单片机的定时器A的功能,定时器A的功能是我目前见过最厉害的定时器,视频上说用好定时器A的话,对于今后真正的掌握430具有很重要的意义 同样是先介绍一下定时器A的特点:(英语六级科学类文章的常用写法,总分总) 1:可作为异步的16位定时器,16位的计数器,其中计数器有四种工作方式 2:可以调节的外部时钟源 3:3个捕获比较源 4:拥有可以输出PWM功能 5:异步的输入与输出锁存 6:拥有多个中断源 其实,看datasheet现在真的掌握方法了,看完简介关键就是看懂下面这张图,在编程的时候熟悉相关寄存器的操作就可以了 并且看图
[单片机]
430单片机之<font color='red'>定时器</font>A功能的大致介绍
教你给51单片机扩展片外RAM
上一文中扩展了单片机的程序存储器,4KB存储空间提升到64KB。其实,4K的代码空间还凑合,但是51自带的256B数据存储空间使用起来还真紧张,其中留给用户的连128B都不到,所以不得不扩展片外RAM。扩展RAM方法和扩展ROM差不多,都是占用P0/P2口做地址线,同时P0用锁存器74373分时复用地址和数据信号。 以前扩展RAM是用汇编语言访问存储器,好处是定位精准,指哪打哪,坏处就是:程序规模一大就有点难维护了,所以还得改用C实现。 对应于汇编语言用R1,R0/DPTR访问外部RAM,keil C扩展了存储类型,增加了如pdata(等同用movx @Rn访问方式)/xdata(等同于movx @DPTR访问方式)存储类
[单片机]
教你给<font color='red'>51单片机</font>扩展片外RAM
基于8051单片机的超声波发生器设计方案
本设计的超声波发生器是利用单片机生成初始信号,然后经过一系列处理电路的作用后生成用来杀灭水蚤的超声波,成本低、效果好,可以在农业上加以采用。在此对3个模块进行设计:   (1)信号发生模块。12 MHz的8051单片机硬件连接及其程序设计。   (2)信号处理模块。驱动电路设计(CD4069非门集成芯片);倍频电路设计(S9014或ECGl08三极管、104普通电容、11 257.9 nH自制电感、1 kΩ电阻);整波电路设计(CD4069非门集成芯片);和频电路设计(CD4081与门集成芯片);选频电路设计(S9014或ECGl08三极管、104普通电容、112.58 nH自制电感、1 kΩ电阻)。   (3)信号检
[单片机]
51单片机-串口&EEPROM
1.题目要求 作为本教程最后一个例程,我们也不打算写的太复杂,这次还是运用串口的知识,实现用串口往EEPROM写入数据,同时也能用串口读出EEPROM里的数据出来显示在电脑端的窗口上。根据前几讲的串口与液晶屏的代码理解,这一讲的例程也不难理解。 2.main.c测试代码 #include reg52.h #include function.h //详见第六章第8讲 #include uart.h //详见第十章第4讲 #include iic.h //详见第十二章第3讲 u8 uart_i=0; u8 pdata RXDBUF ; void COUNT_TIMES() { TMOD&=0xF0;
[单片机]
基于51单片机的智能婴儿车控制系统设计
总体方案设计 智能遥控音乐婴儿车由婴儿车智能控制模块、检测系统、遥控模块、显示模块、执行系统、音乐模块等几部分构成。 (1)婴儿车智能控制系统采用嵌入式系统设计,能够自动运行,处理数据,控制和协调各部分模块工作。用户可以在本系统开发的基础上对婴儿车的各部分进行观察和控制。同时可通过按键板或红外遥控器对系统进行控制。 (2)检测模块又分为声音检测、尿湿检测和温度检测。分别对婴儿是否睡醒、婴儿是否尿湿、奶水温度分别给89C52对应的信号。其中各个检测模块均受系统控制。 (3)遥控模块采用NEC制式红外遥控,可遥控MP3解码的播放模式、音乐效果、选歌、音量、系统的时间调节各个模块的控制和协调。 (4)显示部分采用LC
[单片机]
基于<font color='red'>51单片机</font>的智能婴儿车控制系统设计

推荐帖子

如何使用G2452来显示ADC量测到的电压值及存进SD卡内?
如提,各位大侠,能否提供小弟方向及SOURCECODE来应用?利用G2452内的ADC来量测电压值(作为即时监控电压),再利用一按键(当触发)来进行SD卡的存储数据?最後,感激不尽~如何使用G2452来显示ADC量测到的电压值及存进SD卡内?刚刚有看到有人利用2452来和SD卡作沟通,但他只是将卡上的大写英文字符转换成小写字符,那我要作连续储存的动作,该要如何撰写呢?还有人说不行用2452只能用最新的G系列2553才行?那到底应该如何呢?很抱歉,自己的C不好,无法张贴上来分享~那
espon2006 微控制器 MCU
应用技术
电力系统比较好资料应用技术确实不错的,可以多多益善
wangllma DigiKey得捷技术专区
请问用图形点阵的液晶显示中文汉字,怎么显示?
请问用图形点阵的液晶显示中文汉字,怎么显示?这种液晶不带中文字库,怎么才能显示汉字呢,把汉字编程数组吗,怎么编程数组呢?请问用图形点阵的液晶显示中文汉字,怎么显示?有这样的工具,输入汉字,就可以输出汉字编码网络上有高人做的免费字库提取软件。百度一下,谷歌一下,很多。根据你的显示方式,看驱动时是以行为单位还是以列为单位!提取汉字的点阵码!然后一行(列)显示就OK了!一般需要建一个字库数组;typedefstructtypFNT_GB16//汉字字模显示数据结构{ch
stronghui 嵌入式系统
请教yaffs2的问题。
小弟是新手,现在遇到两个问题,向各位大侠请教。目前我在玩一个ARM-linux的开发板,根文件系统是jffs2,挂在mtdblk2,我想把它换成yaffs2。第一个问题:启动后我把mtdblk3以yaffs2的方式挂载的/mnt目录,然后把用来制作jffs2文件系统镜像的根文件系统目录(bin,root,home,mnt.....)直接拷贝的/mnt目录下,最后修改内核启动参数启动,内核挂上根文件系统后就死了,信息好像是“KernelPannic.....initno
fiercewind 嵌入式系统
请问哪位仁兄有SP12的data sheet
请问哪位仁兄有SP12的datasheet,本人由于设计的需要,要用到它。请有此资料的仁兄高抬贵手,给我发个来,在下不胜感激。我的邮箱:tsm234@163.com。请问哪位仁兄有SP12的datasheet看看这个
tangshaoming 汽车电子
【STM32H7S78-DK】⑨TouchGFX项目实践:电子相册
TouchGFX在前面的帖子中,我们已经体验到TouchGFX与STM32绝配的功能及精美的显示效果。本例我们将制作一款电子相册。首先,欣赏几张美景,来自BingWallpaper,下载下来后,我们将分辨率调成800*480,图片格式调为PNG,单张图片1MB左右。在TouchGFXDesigner中新建4个SCREEN:每个SCREEN插入一个图片:为了实现电子相册的功能,我们还要加上图
cc1989summer stm32/stm8
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved