打印
[51单片机]

基于at89c52的流水灯,且要求灯有亮度变化

[复制链接]
1558|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
772671294|  楼主 | 2014-5-27 17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是原程序,但只有8个亮度,希望效果:灯的亮度有100个等级,每1s等级加1,100级时跳到1级亮度,每秒亮1个灯,依次P1^0,p1^1--P1^7,再跳到P1^0。
望大神们帮忙解决,最好附上Keil仿真的电路图。
#include <reg52.h>
#define uchar unsigned char           
#define uint  unsigned int
uchar code LED[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar t,k,m,r,tt;
void main(void)               
{
        TMOD=0X11;
        TH0=(65539-760)/256;
        TL0=(65536-760)%256;
        TH1 =(65536-46080)/256;              
        TL1 =(65536-46080)%256;
        EA=1;
        ET0=1;
        ET1=1;
        TR0=1;
        TR1=1;
        k=100;                    
        while(1)
        {
        }                     
}
void T0_time() interrupt 1
{
        TH0 =(65536-760)/256;               
        TL0 =(65536-760)%256;
         t++;
         r++;         
         if(t>=k)
         {
                 P1=LED[m];
         }
         else
         P1=0XFF;
         if(t==100)
         {
                 t=0;
                k--;
                if(k==0)
                k=100;
         }
}
void T1_time() interrupt 3
{
        TH1=(65536-46080)/256;
        TL1=(65536-46080)%256;       
        tt++;
        if(tt==20)
        {
                tt=0;
                m++;
                if(m==8)
                m=0;
        }
}




相关帖子

沙发
dirtwillfly| | 2014-5-27 19:35 | 只看该作者
这是毕业设计吧

使用特权

评论回复
板凳
dgd天师| | 2014-5-27 23:15 | 只看该作者
我的是P2口控制led的,我也是新手,试着做了下,我测试好像没啥问题,你试试自己再看看吧
#include <reg52.h>
#include <intrins.h>
void init (); //初始化函数
void liangdu (); //亮度调节函数(我参考的PWM文件)
unsigned char t0,led;
unsigned l;
void main ()
{
        init ();
        while (1)
        {
                liangdu ();
                if (t0==20)
                {
                        led = _crol_(led,1);        //循环左移
                        l = l + 10;                           //亮度增加
                        if (l>1000)                           //循环100次
                                l = 10;
                        t0 = 0;
                }
        }
}
void liangdu ()
{
        unsigned int i;
        for (i=0;i<1000;i++)
        {
                if (i<l)
                        P2 = led;
                else
                        P2 = 0xff;
        }
}
void init ()
{
        l = 10;
        t0 = 0;
        led = 0xfe;
        EA = 1;
        TMOD = 0x01;
        TH0 = (65536-50000)/256;
        TL0 = (65536-50000)%256;
        ET0 = 1;
        TR0 = 1;
}
void timer0 () interrupt 1
{
        TH0 = (65536-50000)/256;
        TL0 = (65536-50000)%256;
        t0++;
}
参考文件也传上去了

高级流水灯--水滴效果(渐变带拖尾效果)实现和讲解.pdf

538.56 KB

使用特权

评论回复
地板
ayb_ice| | 2014-5-28 15:27 | 只看该作者

typedef unsigned char bool;
typedef unsigned char U8;
typedef unsigned int U16;
typedef unsigned long U32;

sbit LED0 = P0^0;        // 低电平开
sbit LED1 = P0^1;        // 低电平开
sbit LED2 = P0^2;        // 低电平开
sbit LED3 = P0^3;        // 低电平开


typedef struct{
        bool flag;
        U8 set;        // 0~99;
}t_PWM;

bit flag_50ms;


void main(void)
{
//___________
// 初始化
        TMOD = 0x02;

        TH0 = TL0 = 256 - 200;

        TR0 = 1;
        ET0 = 1;
        EA = 1;

//___________
// 亮度设定
        pwm[0].set = 0;                // 0%
        pwm[1].set = 25;    // 25%
        pwm[2].set = 50;    // 50%
        pwm[3].set = 100;   // 100%

//___________
// 主循环
        while(1)
        {
                if(flag_50ms){
                        flag_50ms = 0;
//                        ....
                }
                PCON |= 0x01;
        }

}


t_PWM pwm[4];

void isr_t0(void) interrupt 1
{
        static U8 counter = 0;
        static U8 t = 0;
        U8 i;

//___________
// 输出
        LED0 = !pwm[0].flag;
        LED1 = !pwm[1].flag;
        LED2 = !pwm[2].flag;
        LED3 = !pwm[3].flag;

//___________
// PWM处理
        for(i=0; i<sizeof(pwm)/sizeof(t_PWM); i++){
                bit b;
                if(t < pwm[i].set){
                        b = 1;
                }else{
                        b = 0;
                }
                pwm[i].flag = b;
        }

        if(++t >= 100){
                t = 0;
        }

//___________
// 定时处理
        if(++counter >= 250){
                counter = 0;
                flag_50ms = 1;
        }
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

49

帖子

0

粉丝