![]() |
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; } } |