|
sbit DIO=P3^4; sbit a7=a^7; sbit LED=P3^5; TM1804信号就一个口,这个定义的三个作用是什么 |
angmall 发表于 2017-11-13 19:59 这怎么算的能教下吗? 还有个问题就是为什么我看网上的程序TM1804都是只写高电平的时间不写低电平的时间 if(date&0x80) { DIO=1; nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); DIO=0; } 就想这个一样,按工作波形图不应该是DIO=0;后面也加nop()达到1.25us吗? |
|
33Mhz一个nop就是0.0303us 你的程序有错 |
angmall 发表于 2017-11-12 15:41 33Mhz一个nop就0.36us了那程序里那么多个nop函数不也超了吗,这个波形计算怎么看的 |
angmall 发表于 2017-11-12 23:20 51的12M |
|
你用那个型号的单片机? 内部时钟是多少? 这才理解你的问题,应该怎么修改程序 |
angmall 发表于 2017-11-12 15:41 那要怎么修改程序,能否给讲解下,谢谢 |
|
这个程序 用MCU 型号:STC15F104E, 时钟是33MHZ(内部时钟) 的,如果把内部时钟设置为12MHZ或者其他频率,整个程序就不工作了! tm1804驱动时波形 |
0J4806.1200.png (9.92 KB, 下载次数: 67)
yzwzfyz 发表于 2017-11-12 00:48 原理我知道,就是通过控制占空比来输出不同颜色的光强度,我用keil看输出波形占空比也是发生变化的 |
| 关键是你要读通原理,而后再做。如果读不通,即使做成功了,你又得到什么呢? |
|
为了大家观看方便我把程序再发一次 #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; } } |