❶ 小弟初識松翰單片機,現用sn8p2711,編寫了一個PWM調光的程序。
TC0C是定時器自身計數用的當然不能賦值,如果想調整占空比只有對TC0R賦值。規格書上寫得很清楚:
PWM 信號輸出到 PWM0OUT ( P5.4 引腳), TC0OUT 和 ALOAD0 標志位控制 PWM 輸出的階數( 256 、 64 、 32
和 16 )。 8 位計數器 TC0C 計數過程中不斷與 TC0R 相比較,當 TC0C 計數到兩者相等時, PWM 輸出低電平,當 TC0C
再次從零開始計數時, PWM 被強制輸出高電平。 PWM0 輸出占空比 = TC0R/ 計數量程 (計數量程 = 256 、 64 、 32 或 16 ) 。
參考寄存器保持輸入 00H 可使 PWM 的輸出長時間維持在低電平,通過修改 TC0R 可改變 PWM 輸出占空比。
❷ 松翰單片機,如何用匯編進行位定義
1、如果你是要定義一個位變數的話。一般,我們都先定義一個位元組:『XXX
DS
1』;這個條語句表示定義一個位元組,然後,們再定義想要的位變數。比如:『getdata_flag
equ
xxx.0』。這樣我們就定義了一個位變數,如果你還想定義一個位變數,那麼你可以再加一條語句:『getdata_flag
equ
xxx.1』。依此類推。你就可以定義8個位變數。要是你還覺得不夠用的話,你可以歸以上的做法,再定義一個位元組,然後再定義另外8個位變數。
2、如果你是想用一個位來代替I/O口的某一個位的話,你可以直接用:『YYY
EQU
P1.x』或『YYY
EQU
P2.x』就可以了。
3、如果你想用一個位代替寄存器的某一位的話,其做法和2當中是一樣的。例如:『zzz
EQU
GIE』。
❸ 松翰單片機SN8P2711A產生pwm程序,急
給個51單片機的給你參考下
*---------------
文件名稱: PWM.C
功能 :單片機脈沖方式產生PWM信號
----------------*/
#include <reg52.h> // 引用標准庫的頭文件
#include <absacc.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define COUNT0 XBYTE [0X0000] // 8254計數器0寄存器地址
#define COUNT1 XBYTE [0X0200] // 8254計數器1寄存器地址
#define COUNT2 XBYTE [0X0400] // 8254計數器2寄存器地址
#define COMWORD XBYTE [0X0600] // 8254控制寄存器地址
/********************************
函數名稱: SIGNAL(SIG_OUTPUT_COMPARE1A)
功能 :定時器0中斷子程序
入口參數:無
返回值 :無
********************************/
void time0_int () interrupt 1 using 1
{
TR0=0; // 關閉T0
TH0=-(20000/256);
TL0=-(20000%256); //重置20ms計數值
/*--------------用8254計數器發送第一路的PWM信號-----------*/
COMWORD=0x30; //1MHz時鍾作為計數時鍾,計數1000次後實現1ms高電平
COUNT0=0xE0;
COUNT1=0x03;
/*--------------用8254發送第二路的PWM信號----------------*/
COMWORD=0x70; //1MHz時鍾作為計數時鍾,計數2000次後實現2ms高電平
COUNT0=0xD0;
COUNT1=0x07;
/*-------------用8254發送第三路的PWM信號----------------*/
COMWORD=0xB0;//1MHz時鍾作為計數時鍾,計數3000次後實現32ms高電平
COUNT0=0xB0;
COUNT1=0x0B;
TR0=1; //啟動T0
}
//主函數
void main ()
{
EA=1; // 開CPU總中斷
ET0=1; // 開T0定時器中斷
TMOD=0x01; // 開定時器中斷
TH0=-(20000/256); //20ms定時器計數初值
TL0=-(20000%256);
/*--------------向8254控制寄存器選擇計數器0,並對其賦值0-----------------*/
COMWORD=0x30;
COUNT0=0; //賦低位位元組
COUNT0=0; //賦高位位元組
/*---------------向8254控制寄存器選擇計數器1,並對其賦值0------------------*/
COMWORD=0x70;
COUNT0=0; //賦低位位元組
COUNT0=0; //賦高位位元組
/*---------------向8254控制寄存器選擇計數器2,並對其賦值0-----------------*/
COMWORD=0xB0;
COUNT0=0; //賦低位位元組
COUNT0=0; //賦高位位元組
TR0=1; //啟動定時器0
While (1); //無限次循環
}
❹ 松翰單片機匯編實現控制一個LED燈閃爍SOS求救信號。
led_scan260:
upto led_count,26,led_scan90 ;;
bts0 f_led_change ;;
jmp $+4 ;;
bclr led_1 ;;
bset f_led_change ;;
jmp led_scan90 ;;
bset led_1 ;;
bclr f_led_change ;;
upto led_change,3,led_scan90 ;;
bclr f_led_260ms ;;
bset f_led_50ms ;;
ret
led_scan50:
upto led_count1,5,led_scan90 ;;
bts0 f_led_change1 ;;
jmp $+4 ;;
bclr led_1 ;;
bset f_led_change1 ;;
jmp led_scan90 ;;
bset led_1 ;;
bclr f_led_change1 ;;
upto led_change,16,led_scan90 ;;
; bclr f_led_260ms ;;
bclr f_led_50ms ;;
bset f_led_360ms ;;
這是一個亮260MS 閃爍後 50MS閃爍 ,的程序 ,和你的要求差不多 我也是剛學松翰單片機 ,希望多多交流 後面是360MS的閃爍程序
❺ 松翰單片機:SN8P2711A,SN8P2501B可以用C語言來寫程序嗎用什麼編譯器
可以。
有專門的編譯器,在官網下載,www.sonix.com.cn。
最新的版本是SN8_C_Studio_V144。
❻ 松翰單片機C程序FOR循環調試出錯
不應該出現這種情況的,可能是你模擬時單步執行操作有誤或者其他問題(比如編譯器本身),你可以驗證一下延時時間長短來查看具體情況,比如a=10000時如果延時約10秒證明沒有什麼問題,如果如你所說可能延時就只有一二十毫秒的話就肯定有問題了。