找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3922|回复: 11
打印 上一主题 下一主题
收起左侧

Tm1804 程序无法控制彩灯求教

[复制链接]
跳转到指定楼层
楼主

这个是我的电路图,不知道有没问题,如有错误请点出谢谢
我用网上的TM1804运用程序来测试电路,但是发现IO口的输入并不能控制彩灯变换颜色,程序大概意识是每种颜色渐变暗亮的过程;哪出问题实在琢磨不出希望有知道的大佬能给指点下。先谢谢大家来看帖了 Tm1804.rar (719 Bytes, 下载次数: 16)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:171584 发表于 2017-11-11 22:01 | 只看该作者
为了大家观看方便我把程序再发一次
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define nop() _nop_()
#define Red 1
#define Green 2
#define Blue 3
#define White 4
#define High 1
#define Low 0
sbit DIO=P3^4;
bdata uchar a;
sbit a7=a^7;
sbit LED=P3^5;
uchar show[3],color=1,temp=0xff;
void delay_ms(int z)
{
int x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void write(uchar date)
{
uchar i;
for(i=0;i<8;i++)
{
      if(date&0x80)
              {
                  DIO=1;
                  nop();   nop();        nop();                nop();
                  nop();   nop();        nop();                nop();
                  nop();   nop();        nop();               
                 
                  DIO=0;
                 
                  
                  }
          else
              {
                  DIO=1;
                  nop();nop();nop();nop();
                  nop();
                  
                  DIO=0;
       
                  }
        date<<=1;
}
}
void display()
{
     uchar i,j;
             for(j=0;j<1;j++)
                 for(i=0;i<3;i++)
                    write(show[i]);
}
void load()
{
        uchar i;
                for(i=0;i<1;i++)
                {
                        if(color==Red)
                        {
                        show[i*3+0]=temp;
                        show[i*3+1]=0x00;
                        show[i*3+2]=0x00;
                        }
                        if(color==Green)
                        {
                        show[i*3+0]=0x00;
                        show[i*3+1]=temp;
                        show[i*3+2]=0x00;
                        }
                        if(color==Blue)
                        {
                        show[i*3+0]=0x00;
                        show[i*3+1]=0x00;
                        show[i*3+2]=temp;
                        }
                        if(color==White)
                        {
                        show[i*3+0]=temp;
                        show[i*3+1]=temp;
                        show[i*3+2]=temp;
                        }

                }
}
void show_3()
{
    for(color=1;color<5;color++)
        {
            for(temp=0;temp<255;temp++)
                {
                     load();
                         display();
                         delay_ms(50);
                }
                for(temp=255;temp>0;temp--)
                {
                    load();
                        display();
                        delay_ms(50);
                }
        }
}
void show_1()
{
     uchar i;
         for(i=0;i<2;i++)
         {
         write(0xff);
         write(0x00);
         write(0xaa);

     write(0xff);
         write(0x00);
         write(0xaa);

         write(0xff);
         write(0x00);
         write(0xaa);

         write(0xff);
         write(0xff);
         write(0xff);
         }
}
void main()
{
    uchar i,j;
        for(j=0;j<4;j++)
           for(i=0;i<3;i++)
        write(0xff);
        delay_ms(50);
        while(1)
        {
         show_1();
         LED=!LED;
        }  
}
回复

使用道具 举报

板凳
ID:123289 发表于 2017-11-12 00:48 | 只看该作者
关键是你要读通原理,而后再做。如果读不通,即使做成功了,你又得到什么呢?
回复

使用道具 举报

地板
ID:171584 发表于 2017-11-12 11:38 | 只看该作者
yzwzfyz 发表于 2017-11-12 00:48
关键是你要读通原理,而后再做。如果读不通,即使做成功了,你又得到什么呢?

原理我知道,就是通过控制占空比来输出不同颜色的光强度,我用keil看输出波形占空比也是发生变化的
回复

使用道具 举报

5#
ID:155507 发表于 2017-11-12 15:41 | 只看该作者
这个程序 用MCU 型号:STC15F104E, 时钟是33MHZ(内部时钟) 的,如果把内部时钟设置为12MHZ或者其他频率,整个程序就不工作了!

tm1804驱动时波形

0J4806.1200.png (9.92 KB, 下载次数: 66)

0J4806.1200.png
回复

使用道具 举报

6#
ID:171584 发表于 2017-11-12 22:20 | 只看该作者
angmall 发表于 2017-11-12 15:41
这个程序 用MCU 型号:STC15F104E, 时钟是33MHZ(内部时钟) 的,如果把内部时钟设置为12MHZ或者其他频率,整 ...

那要怎么修改程序,能否给讲解下,谢谢
回复

使用道具 举报

7#
ID:155507 发表于 2017-11-12 23:20 | 只看该作者
你用那个型号的单片机? 内部时钟是多少?
这才理解你的问题,应该怎么修改程序
回复

使用道具 举报

8#
ID:171584 发表于 2017-11-13 11:00 | 只看该作者
angmall 发表于 2017-11-12 23:20
你用那个型号的单片机? 内部时钟是多少?
这才理解你的问题,应该怎么修改程序

51的12M
回复

使用道具 举报

9#
ID:171584 发表于 2017-11-13 18:39 | 只看该作者
angmall 发表于 2017-11-12 15:41
这个程序 用MCU 型号:STC15F104E, 时钟是33MHZ(内部时钟) 的,如果把内部时钟设置为12MHZ或者其他频率,整 ...

33Mhz一个nop就0.36us了那程序里那么多个nop函数不也超了吗,这个波形计算怎么看的
回复

使用道具 举报

10#
ID:155507 发表于 2017-11-13 19:59 | 只看该作者
33Mhz一个nop就是0.0303us

你的程序有错
回复

使用道具 举报

11#
ID:171584 发表于 2017-11-13 22:05 | 只看该作者
angmall 发表于 2017-11-13 19:59
33Mhz一个nop就是0.0303us

你的程序有错

这怎么算的能教下吗?
还有个问题就是为什么我看网上的程序TM1804都是只写高电平的时间不写低电平的时间
if(date&0x80)
              {
                  DIO=1;
                  nop();   nop();        nop();                nop();
                  nop();   nop();        nop();                nop();
                  nop();   nop();        nop();               
                 
                  DIO=0;
                 
                  
                  }
就想这个一样,按工作波形图不应该是DIO=0;后面也加nop()达到1.25us吗?
回复

使用道具 举报

12#
ID:621923 发表于 2019-10-10 20:50 | 只看该作者
sbit DIO=P3^4;
sbit a7=a^7;
sbit LED=P3^5;   TM1804信号就一个口,这个定义的三个作用是什么
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表