51单片机 LED点阵的呼吸灯效果

发布者:HarmonySpirit最新更新时间:2017-11-15 来源: eefocus关键字:51单片机  LED点阵  呼吸灯效果 手机看文章 扫描二维码
随时随地手机看文章

STC 89C52RC


  1. #include   

  2.   

  3. typedef unsigned char uchar;  

  4. typedef unsigned int uint;  

  5. typedef unsigned long ulong;  

  6.   

  7. sbit ADDR0 = P1^0;  

  8. sbit ADDR1 = P1^1;  

  9. sbit ADDR2 = P1^2;  

  10. sbit ADDR3 = P1^3;  

  11. sbit ENLED = P1^4;  

  12.   

  13. ulong periodCnt = 0;  //PWM周期计数值  

  14. uchar highRH = 0;  //高电平重载值的高字节  

  15. uchar highRL = 0;  //高电平重载值的低字节  

  16. uchar lowRH  = 0;  //低电平重载值的高字节  

  17. uchar lowRL  = 0;  //低电平重载值的低字节  

  18. uchar T1RH = 0;    //T1重载值的高字节  

  19. uchar T1RL = 0;    //T1重载值的低字节  

  20.   

  21. uchar code dutyCycle[13] = {  //占空比调整表  

  22.     5, 18, 30, 41, 51, 60, 68, 75, 81, 86, 90, 93, 95  

  23. };  

  24. uchar code image[8] = {  

  25.     0x81,0x81,0xE7,0xC3,0xC3,0xE7,0x81,0x81  

  26. };  

  27. uchar hRHi[13], hRLi[13], lRHi[13], lRLi[13];  

  28.   

  29. void configTmr1(uint ms);  

  30. void configPWM(uint fr, uchar dc);  

  31. void calcRldVal(uchar idx);   

  32.   

  33. void main() {  

  34.     uchar i;  

  35.   

  36.     EA = 1;     //开总中断  

  37.     ADDR3 = 0;  //选中LED点阵  

  38.     configPWM(1000, dutyCycle[0]);  //配置并启动PWM  

  39.     for (i = 0; i < 13; i++)  

  40.         calcRldVal(i);  

  41.     configTmr1(50);    //用T1定时调整占空比  

  42.     while (1);  

  43. }  

  44. /* 配置并启动T1,ms-定时时间 */  

  45.   

  46. void configTmr1(uint ms) {  

  47.     ulong tmp;  //临时变量  

  48.   

  49.     tmp = 11059200 / 12;      //定时器计数频率  

  50.     tmp = (tmp * ms) / 1000;  //计算所需的计数值  

  51.     tmp = 65536 - tmp;        //计算定时器重载值  

  52.     tmp = tmp + 12;           //补偿中断响应延时造成的误差  

  53.     T1RH = tmp >> 8;  //定时器重载值拆分为高低字节  

  54.     T1RL = tmp;  

  55.   

  56.     TMOD &= 0x0F;   //清零T1的控制位  

  57.     TMOD |= 0x10;   //配置T1为模式1  

  58.     TH1 = T1RH;     //加载T1重载值  

  59.     TL1 = T1RL;  

  60.     ET1 = 1;        //使能T1中断  

  61.     TR1 = 1;        //启动T1  

  62. }  

  63. /* 配置并启动PWM,fr-频率,dc-占空比 */  

  64. void configPWM(uint fr, uchar dc) {  

  65.     uint high, low;  

  66.   

  67.     periodCnt = 11059200 / 12 / fr; //计算一个周期所需的计数值  

  68.     high = periodCnt * dc / 100;    //计算高电平所需的计数值  

  69.     low  = periodCnt - high;        //计算低电平所需的计数值  

  70.     high = 65536 - high + 12;       //计算高电平的定时器重载值并补偿中断延时  

  71.     low  = 65536 - low  + 12;       //计算低电平的定时器重载值并补偿中断延时  

  72.     highRH = high >> 8; //高电平重载值拆分为高低字节  

  73.     highRL = high;  

  74.     lowRH  = low >> 8;  //低电平重载值拆分为高低字节  

  75.     lowRL  = low;  

  76.   

  77.     TMOD &= 0xF0;   //清零T0的控制位  

  78.     TMOD |= 0x01;   //配置T0为模式1  

  79.     TH0 = highRH;   //加载T0重载值  

  80.     TL0 = highRL;  

  81.     ET0 = 1;        //使能T0中断  

  82.     TR0 = 1;        //启动T0  

  83. }  

  84. /* 占空比调整函数,频率不变只调整占空比 */  

  85. void calcRldVal(uchar idx) {  

  86.     uint  high, low;  

  87.   

  88.     high = periodCnt * dutyCycle[idx] / 100;    //计算高电平所需的计数值  

  89.     low  = periodCnt - high;        //计算低电平所需的计数值  

  90.     high = 65536 - high + 12;       //计算高电平的定时器重载值并补偿中断延时  

  91.     low  = 65536 - low  + 12;       //计算低电平的定时器重载值并补偿中断延时  

  92.     hRHi[idx] = high >> 8; //高电平重载值拆分为高低字节  

  93.     hRLi[idx] = high;  

  94.     lRHi[idx] = low >> 8;  //低电平重载值拆分为高低字节  

  95.     lRLi[idx] = low;  

  96. }  

  97.   

  98. void LED1_Scan() {  

  99.     static uchar i = 0;  

  100.     P0 = 0xFF;  

  101.     P1 = (P1 & 0xF8) | i;  

  102.     P0 = image[i];  

  103.     i = ++i & 0x07;  

  104. }  

  105. /* T0中断服务函数,产生PWM输出 */  

  106. void interruptTimer0() interrupt 1 {  

  107.     if (ENLED == 1) {  

  108.         TH0 = lowRH;  

  109.         TL0 = lowRL;  

  110.         ENLED = 0;  

  111.         LED1_Scan();  

  112.     }  

  113.     else {  

  114.         TH0 = highRH;  

  115.         TL0 = highRL;  

  116.         ENLED = 1;  

  117.     }  

  118. }  

  119. /* T1中断服务函数,定时动态调整占空比 */  

  120. void interruptTimer1() interrupt 3 {  

  121.     static bit dir = 0;  

  122.     static uchar index = 0;  

  123.       

  124.     TH1 = T1RH;  //重新加载T1重载值  

  125.     TL1 = T1RL;  

  126.     highRH = hRHi[index];  

  127.     highRL = hRLi[index];  

  128.     lowRH = lRHi[index];  

  129.     lowRL = lRLi[index];  

  130.     if (dir == 0) {  

  131.         index++;  

  132.         if (index == 12)  

  133.             dir = 1;  

  134.     }  

  135.     else {  

  136.         index--;  

  137.         if (index == 0)  

  138.             dir = 0;  

  139.     }  


关键字:51单片机  LED点阵  呼吸灯效果 引用地址:51单片机 LED点阵的呼吸灯效果

上一篇:51单片机之大杂烩
下一篇:51单片机 使用蜂鸣器播放简单音乐

推荐阅读最新更新时间:2024-03-16 15:45

51单片机驱动点阵显示数字程序+电路
电路原理图:X轴为P2 Y轴为P0 c51单片机程序代码: #include reg52.H #include intrins.h #define uint unsigned int #define uchar unsigned char //1 unsigned char code tab1P0 ={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; unsigned char code tab1P2 ={0xff,0xcF,0xc7,0xc3,0xcf,0xcf,0xcf,0xff}; //2 unsigned char code tab2P0 ={0x0
[单片机]
<font color='red'>51单片机</font>驱动点阵显示数字程序+电路
51单片机 LCD1602调试工具
本章博客讲述的是关于LCD1602的调试,使用它是为了更加直观的表示出代码所要实现的功能 1.首先,需要添加两份驱动文件到新建的工程中来,再插入到新建的工程中来 将其复制到新建文件的同一目录下,在进行添加 2.写出以下代码进行编译查看效果 #include REGX52.H #include LCD1602.h void main() { LCD_Init(); LCD_ShowChar(1,1,'A'); LCD_ShowString(1,3, Hello ); LCD_ShowNum(1,9,123,3); //高位补零,如果最后一位是2则显示23 LCD_
[单片机]
<font color='red'>51单片机</font> LCD1602调试工具
LED点阵显示屏的特点及扫描驱动方案
组合型LED点阵显示屏自八十年代开始出现,以发光二极管为像素,它用高亮度发光二极管芯阵列组合后,环氧树脂和塑模封装而成。具有高亮度、功耗低、引脚少、视角大、寿命长、耐湿、耐冷热、耐腐蚀等特点。   点阵显示屏有单色和双色两类,可显示红,黄,绿,橙等。LED点阵有4×4、4×8、5×7、5×8、 8×8、16×16、24×24、40×40等多种;根据像素的数目分为等,双基色、三基色等,根据像素颜色的不同所显示的文字、图象等内容的颜色也不同,单基色点阵只能显示固定色彩如红、绿、黄等单色,双基色和三基色点阵显示内容的颜色由像素内不同颜色发光二极管点亮组合方式决定,如红绿都亮时可显示黄色,如果按照脉冲方式控制二极管的点亮时间,则
[电源管理]
基于51单片机的多功能八路抢答器设计
1.功能介绍 多功能八路抢答器是基于51单片机来设计的,除了可以实现最基本功能——8路抢答外,还具有自动处理犯规选手,抢答时间调整,还可以进行答题,计分,并且可以查询或修改分数。 2.硬件设计 (1)硬件框图 该抢答器的硬件由五个部分组成,包括单片机、按键电路、数码管显示电路、指示灯电路和声音提示电路。硬件框图如下 (2)硬件原理图 由于每个部分的硬件电路都比较简单,就不做介绍了,大家直接看图。 3.软件设计 (1)软件流程图 (2)程序源码 由于本例程代码比较多,这里就只贴出部分代码,有兴趣的小伙伴可以下载源码去看看 复制 void main() { uint j;//用来构成循环 TMOD=0x11
[单片机]
基于<font color='red'>51单片机</font>的多功能八路抢答器设计
51单片机T0做精确时钟
用T0做精确时钟,为了做到尽量精确,必须减少中断的次数,所以选择使用方式1,它最多可以计数65536次。但是,方式1中断后需要重新给定时器赋初值,这样就要耽误几个机器周期,很难保证时钟的精确。 有两个方法可以解决这个问题。 第一个方法:你可以计算出中断处理时重新给定时器赋初值所用的机器周期数,在你计算出的初值里除去这几个机器周期,作为补偿。这个方法,只是在每次定时器中断后,都可以按时得到执行时很精确,但事实上中断什么时候执行谁都说不准,所以这个方法,只能做到尽量精确。 第二个方法:计算出一个凑巧的初值,使TL0正好等于0x00,这样每次中断溢出后,TL0都从0x00开始计数,即使中断没有得到执行,TL0也会继续计数。利用这一点,
[单片机]
51单片机实现4位数以内的加减法
  中南民族大学,电子信息工程学院,开设了一门课程,叫《嵌入式电路设计》,由舒老师带头,旨在引导低年级的学生入门嵌入式,其内容比较多,包括模电、数电、C语言、单片机、EDA技术等。最近有位师弟找到我,希望我能帮他指导一下,利用AT89C52单片机设计一个最小系统,其中包括矩阵键盘、数码管显示、中断、2位数加减法、定时计数与暂停等功能。我也粗略的设计了一个,在此分享出来,希望能对初学者有所帮助,使更多的人加入到嵌入式的行业来。   开发工具:keil   仿真工具:proteus 代码如下: 头文件:inc_all.h 1 #ifndef INC_ALL_H_ 2 #define INC_ALL_H_ 3 4 volati
[单片机]
什么是51单片机最小系统
1.什么是51单片机 51 内核单片机是 指兼容Intel 的8051指令系统的单片机统称;从诞生到现在的几十年时间,已成为一款经过市场考验、成熟的芯片产品。目前国内也众多51单片机厂家,且还有众多带51内核,用于各种不同场景的专用类单片机。 51单片机内部框架: 以下以STC89C52单片机为例,其内部总体结构其基本特性如下: 8位CPU、4-8k 字节 ROM、128 字节 RAM、21 个特殊功能寄存器32根I/0线、可寻址的 64 字节外部数据、程序存贮空间、2个 16 位定时器计数器中断结构:具有二个优先级、五个中断源、一个全双工串行口、位寻址(即可对寄存器进行位操作)功能,能按位进行逻辑运算的位处理器。 除 1
[单片机]
什么是<font color='red'>51单片机</font>最小系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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