1.定时器中断实现间隔切换
在第六章第4讲的测试代码中提到过数码管微闪烁问题,这是由于三八译码器的IO端口切换的间隔时间不均匀导致,这部分的问题宋老师已经在《手把手教你学51单片机》文档6.4.2节有详细解释,并在6.5.2节里解决了这个问题。数码管扫描函数我们使用定时器0强制实现间隔1ms切换三八译码器的IO输出,这样保证了每个数码管被点亮的时间都是均匀的。我们在主函数里不停地执行数码管显示函数。这里是测试代码,用定时器1实现add间隔50ms自增1,数码管显示add的值。
#include #include #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端口输出如下 代码实现如下 #include #include #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个阶段的占空比不同,也就表现为小灯的显示亮度不同。 这里笔者做个效果图给大家理解吧
上一篇:51单片机-数据类型强制转换
下一篇:51单片机-呼吸灯
推荐阅读最新更新时间:2024-11-16 23:44
推荐帖子
- 如何使用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
设计资源 培训 开发板 精华推荐
- EC20 USB dongle EC20 USB上网卡
- LT1370、5V 至 12V 升压转换器
- LT6657BHMS8-1.25 来自外部电路的灌电流的典型应用电路
- LT3755IMSE-1 降压模式 500mA LED 驱动器的典型应用电路,用于 20kHz PWM 调光
- 【涂鸦智能】温湿度传感器时钟
- RDR-736 - 使用 LinkSwitch-XT2 900 V 的 7 W 宽范围输入、双输出、非隔离反激式转换器
- SEVB9S08DZ60、用于 MC9S08DZ60 微控制器的 S08D 系列评估板
- ADM7171CP-EVALZ,用于评估 ADM7171 1A 线性稳压器的评估板
- STM32F411RET6(2)
- LT1767EMS8E-3.3 12V 至 3.3V 降压转换器的典型应用电路