View Single Post
Old 02-05-2006, 01:47 AM   #10
ngohaibac
Đệ tử 9 túi
 
ngohaibac's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: BKHN
Bài gửi: 231
:
Send a message via Yahoo to ngohaibac
Điều chế PWM và đếm xung hiển thị 4Led

Đây là chương trình điều chế xung PWM trên chân RC2/CCP1 và đếm xung từ chân RC1/T1OSI/CCP2 hiển thị lên 4led7 thanh. Mình dùng Encoder 100 lỗ mượn của bạn .
Code:
#include<pic.h>
__CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS );

const unsigned char Font[]={ 0b00000011, 0b10011111, 0b00100101, 0b00001101, 0b10011001,\
							0b01001001, 0b01000001, 0b00011111, 0b00000001, 0b00001001};


// Chuyen doi
void Convert(unsigned char *a,unsigned char index, unsigned int number){
	unsigned char i;
	for(i=0;i< index; i++){
		*(a+i)  = number%10;
		number = number/10;
	};	
 }

//=====  Ham khoi tao
void interrupt MyInt(void){
	static volatile unsigned int counter1, counter2, counter3;//, counterTimer1;
	unsigned int temp;					
	// counter1 dem so lan Timer0 tran
	// counter2  dem so lan ca  4 led7 thanh  duoc quet
	static volatile unsigned int number;
	static volatile unsigned char a[4]={0,0,0,0};
	static volatile unsigned char j,k;  // bien dem kiem tra xem led nao duoc quet
		if(T0IF & T0IE){	
			TMR0 = 6;
			T0IF = 0 ;// xoa co ngat
			++counter1;
			if( counter1 == 5){
				counter1 = 0;
				PORTD = 0xFF;
				PORTA  = 0xFF - (1<<(5- j)) ;
				PORTD	= Font[a[j]];
				if( j==2) RD0= 0;
				if(++j==4)	j=0;
			};
			if(++counter2 == 200){
				number  = (TMR1H << 8) | TMR1L;
				// gia tri toc do trong 1s = number * 1000/(100 * counter2 )		(vong/s)
				number = number * 5 ;	 //= number *0.0 5 vong/s  => * 5vong/s de hien thi len 4led
				TMR1ON = 0 ; // ngung Timer1
				TMR1H = TMR1L = 0;
				TMR1ON = 1 ;  // bat lai Timer1
				 if(number>9999) number= 0;
				counter2 = 0;
				Convert(a, 4, number);
			};
			if(++counter3 == 1000){
				k  = 70;
				counter3 = 0;
				temp = 4* (PR2 + 1) * k/100;
				CCPR1L = temp>>2;
				CCP1Y  = temp - ((temp>>1)<<1);//temp%2;
				CCP1X = (temp>>1)%2;
				//k += 10; 					// tang 10%
				//if( k > 100) k=0;
			};	
		};
}

//------------------------------------init
void init(void){

//===== init for PWM
	// PWM Period = [ PR2 +1 ] x 4 x Tosc x   (TMR2 Prescaler Value)
	PR2 = 82;						// Tan so = 15 KHz, TMR2 Prescaler Value = 4
	// PWM Duty Cycle = [ CCPR1L : CCP1CON<5:4>) x Tosc x  (TMR2  Prescaler Value)
	// =>   CCPR1L : CCP1CON<5:4> = k% x (TMR2 + 1 ) x 4;
	CCPR1L = 0;
	TRISC2 = 0;						// RC2 la output
	RC2  = 1;
	T2CON = 0b00000101;			// Timer2 on, TMR2 Prescaler Value = 4
	CCP1CON = 0b00001100;		// CCP1 hoat dong trong che do PWM

//=================   init for PORTs
	OPTION =  0b00000000;
	ADCON1 = 0b00000111;
	TRISA	= 0b00000000;
	TRISD	= 0b00000000;
	PORTD = Font[0];

//================  Khoi tao cho Timer0
	GIE		= 1;
	T0IE = 1;
	TMR0 = 6;
	
// ========= Khoi tao cho dem Timer1
	TMR1CS   = 1;						// Timer1 hoat dong o che do Counter Mode
	T1SYNC  = 1;						// TMR1 hoat dong o che do dem khong dong bo
	T1OSCEN = 1;						// Dem xung tu chan RC1/T1OSI/CCP2
	T1CKPS1 = T1CKPS0 = 0;			// Chon Prescaler = 1:1
	TMR1H = TMR1L = 0;
	TMR1IE = 0 ;						// Khong dung ngat Timer1
	TMR1ON = 1;						// Bat Timer1
}

//------------------------------------MAIN
void main(){
	init();
	while(1);
}
// == Kết thúc
Chúc các bạn thành công.
ngohaibac vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn