Thứ Tư, 24 tháng 10, 2012

[Code mẫu 8051] Hiển thị trên matrix 8x8


Code cho các bác tham khảo nhé, mún chỉnh nhanh chậm thì sửa 2 dòng delay hoặc delay vòng lập, muốn thêm port để đk 8x16 hay 8x24 thì gọi thêm thôi, chúc các bác thành công:

#include <REGX51.H>
/* Cot tu P1.0 den 1.7
Hang tu P2.0 den P3.7
De quet dua muc logic 0 lan luot ra cong 0
*/
/* Ham tre */
void delay(long time)
{
long n;
for(n=0; n<time; n++)
{
;
}
}
unsigned char kytu1[9];
unsigned char k=0;
/* Ham nap gia tri hien thi cac ky tu vao mang kytu1
co 8 gia tri dua ra va 1 gia tri khong bat den nao de cac ky tu cach nhau 1 cot */
void mahoa(unsigned char x)
{
switch(x)
{
case 0: { kytu1[0]=0x00; kytu1[1]=0x00; kytu1[2]=0x00; kytu1[3]=0x00;
kytu1[4]=0x00; kytu1[5]=0x00; kytu1[6]=0x00; kytu1[7]=0x00; kytu1[8]=0x00;
break; }
case 1: { kytu1[0]=0x00; kytu1[1]=0x3E; kytu1[2]=0x0A; kytu1[3]=0x0E;
kytu1[4]=0x00; kytu1[5]=0x38; kytu1[6]=0x08; kytu1[7]=0x08; kytu1[8]=0x00;
break; }
case 2: { kytu1[0]=0x00; kytu1[1]=0x38; kytu1[2]=0x28; kytu1[3]=0x38;
kytu1[4]=0x00; kytu1[5]=0x38; kytu1[6]=0xA8; kytu1[7]=0xF8; kytu1[8]=0x00;
break; }
case 3: { kytu1[0]=0x00; kytu1[1]=0x38; kytu1[2]=0x08; kytu1[3]=0x08;
kytu1[4]=0x00; kytu1[5]=0x38; kytu1[6]=0x28; kytu1[7]=0x38; kytu1[8]=0x20;
break; }
case 4: { kytu1[0]=0x20; kytu1[1]=0x00; kytu1[2]=0x38; kytu1[3]=0x08;
kytu1[4]=0x38; kytu1[5]=0x08; kytu1[6]=0x38; kytu1[7]=0x00; kytu1[8]=0x38;
break; }
case 5: { kytu1[0]=0x38; kytu1[1]=0x08; kytu1[2]=0x38; kytu1[3]=0x08;
kytu1[4]=0x38; kytu1[5]=0x00; kytu1[6]=0x38; kytu1[7]=0x00; kytu1[8]=0x38;
break; }
case 6: { kytu1[0]=0x38; kytu1[1]=0x08; kytu1[2]=0x38; kytu1[3]=0x00;
kytu1[4]=0x38; kytu1[5]=0xA8; kytu1[6]=0xF8; kytu1[7]=0x00; kytu1[8]=0x00;
break; }
case 7: { kytu1[0]=0x00; kytu1[1]=0x3C; kytu1[2]=0x0A; kytu1[3]=0x3C;
kytu1[4]=0x02; kytu1[5]=0x3E; kytu1[6]=0x02; kytu1[7]=0x00; kytu1[8]=0x3E;
break; }
case 8: { kytu1[0]=0x3E; kytu1[1]=0x2A; kytu1[2]=0x3E; kytu1[3]=0x00;
kytu1[4]=0x2E; kytu1[5]=0x2A; kytu1[6]=0x3E; kytu1[7]=0x00; kytu1[8]=0x3E;
break; }
case 9: { kytu1[0]=0x3E; kytu1[1]=0x22; kytu1[2]=0x22; kytu1[3]=0x00;
kytu1[4]=0x28; kytu1[5]=0x10; kytu1[6]=0x28; kytu1[7]=0x00; kytu1[8]=0x28;
break; }
case 10: { kytu1[0]=0x28; kytu1[1]=0x10; kytu1[2]=0x28; kytu1[3]=0x00;
kytu1[4]=0x00; kytu1[5]=0x00; kytu1[6]=0x00; kytu1[7]=0x00; kytu1[8]=0x00;
break; }
case 11: { kytu1[0]=0x00; kytu1[1]=0x00; kytu1[2]=0x00; kytu1[3]=0x00;
kytu1[4]=0x00; kytu1[5]=0x00; kytu1[6]=0x00; kytu1[7]=0x00; kytu1[8]=0x00;
break; }
case 12: { kytu1[0]=0x00; kytu1[1]=0x00; kytu1[2]=0x00; kytu1[3]=0x00;
kytu1[4]=0x00; kytu1[5]=0x00; kytu1[6]=0x00; kytu1[7]=0x00; kytu1[8]=0x00;
break; }
}
}
/* Ham quet led ma tran_ vua hien thi vua dich ky tu dan sang trai*/
void hienthi(void)
{
unsigned char n,m,lap;
unsigned char cot[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
for(m=0; m<8 ; m++)
{
for(lap=0; lap<10; lap ++)
{
for(n=0; n<8 ; n++)
{
if((n+m)<9 )
{
mahoa(k);
P0=cot[n];
P2=kytu1[n+m];
delay(45);
}
if((n+m) > 7)
{
mahoa(k+1);
P0=cot[n];
P2=kytu1[n+m-8];
delay(45);
}
P0=0xFF;
P2=0x00;
}
}
}
}
void main(void)
{
while(1)
{
hienthi();
k=k+1;
if(k==12) k=0;
}
}




Giao tiếp 1 wire DS18b20, đo nhiệt độ hiển thị led 7




I Đặc điểm:
Các đặc điểm kỹ thuật của cảm biến DS18B20 có thể kể ra một cách tóm tắt như sau:
• Sử dụng giao diện một dây nên chỉ cần có một chân ra để truyền thông.
• Có thể đo nhiệt độ trong khoảng -55 -> +125 oC.Với khoảng nhiệt độ là -10°C to +85°C thì độ chính xác ±0.5°C.Có chức năng cảnh báo nhiệt độ vược qua giá trị cho trước.
• Điện áp sử dụng : 3 – 5.5 V,có thể cấu hình mã hóa nhiệu độ từ 9 – 12 bit
số bit càng lớn thì độ chính xác cao hơn.Thời gian chuyển đổi nhiệt độ tối đa là 750ms cho mã hóa 12 bit
• Dòng tiêu thụ tại chế độ nghỉ cực nhỏ.
• Mỗi cảm biến có một mã định danh duy nhất 64 bit chứa trong bộ nhớ ROM trên chip (on chip), giá trị nhị phân được khắc bằng tia laze.
• Nếu cấu hình cho DS18B20 theo 9,10,11,12 bit thì ta có độ chính xác tương ứng là : 0.5°C , 0.25°C ,0.125°C, 0.0625°C.Theo mặc định của nhà sản xuất nếu chúng ta không cấu hình chế độ chuyển đổi thì nó sẽ tự cấu hình là 12 bit.
Khi bắt đầu chuyển đổi nhiệt độ thì chân DQ sẽ được kéo xuống mức thấp và khi chuyển đổi xong thì ở mức cao.Như vậy ta sẽ căn cứ vào hiện tượng này để xác định khi nào chuyển đổi xong nhiệt độ.

II.Các tập lệnh của ds18b20

- READ ROM (33h)
Cho phép đọc ra 8 byte mã đã khắc bằng laser trên ROM, bao gồm: 8 bit mã định tên linh kiện (10h), 48 bit số xuất xưởng, 8 bit kiểm tra CRC. Lệnh này chỉ dùng khi trên bus có 1 cảm biến DS1820, nếu không sẽ xảy ra xung đột trên bus do tất cả các thiết bị tớ cùng đáp ứng.
- MATCH ROM (55h)
Lệnh này được gửi đi cùng với 64 bit ROM tiếp theo, cho phép bộ điều khiển bus chọn ra chỉ một cảm biến DS1820 cụ thể khi trên bus có nhiều cảm biến DS1820 cùng nối vào. Chỉ có DS1820 nào có 64 bit trên ROM trung khớp với chuỗi 64 bit vừa được gửi tới mới đáp ứng lại các lệnh về bộ nhớ tiếp theo. Còn các cảm biến DS1820 có 64 bit ROM không trùng khớp sẽ tiếp tục chờ một xung reset. Lệnh này được sử dụng cả trong trường hợp có một cảm biến một dây, cả trong trường hợp có nhiều cảm biến một dây.
- SKIP ROM (CCh)
Lệnh này cho phép thiết bị điều khiển truy nhập thẳng đến các lệnh bộ nhớ của DS1820 mà không cần gửi chuỗi mã 64 bit ROM. Như vậy sẽ tiết kiệm được thời gian chờ đợi nhưng chỉ mang hiệu quả khi trên bú chỉ có một cảm biến.
- SEARCH ROM (F0h)
Lệnh này cho phép bộ điều khiển bus có thể dò tìm được số lượng thành viên tớ đang được đấu vào bus và các giá trị cụ thể trong 64 bit ROM của chúng bằng một chu trình dò tìm.
- ALARM SEARCH (ECh)
Tiến trình của lệnh này giống hệt như lệnh Search ROM, nhưng cảm biến DS1820 chỉ đáp ứng lệnh này khi xuất hiện điều kiện cảnh báo trong phép đo nhiệt độ cuối cùng. Điều kiện cảnh báo ở đây được định nghĩa là giá trị nhiệt độ đo được lớn hơn giá trị TH và nhỏ hơn giá trị TL là hai giá trị nhiệt độ cao nhất và nhiệt độ thấp nhất đã được đặt trên thanh ghi trong bộ nhớ của cảm biến.
Sau khi thiết bị chủ (thường là một vi điều khiển) sử dụng các lệnh ROM để định địa chỉ cho các cảm biến một dây đang được đấu vào bus, thiết bị chủ sẽ đưa ra các lệnh chức năng DS1820. Bằng các lệnh chức năng thiết bị chủ có thể đọc ra và ghi vào bộ nhớ nháp (scratchpath) của cảm biến DS1820. khởi tạo quá trình chuyển đổi giá trị nhiệt độ đo được và xác định chế độ cung cấp điện áp nguồn. Các lệnh chức năng có thể được mô tả ngắn gọn như sau:
- WRITE SCRATCHPAD (4Eh)
Lệnh này cho phép ghi 2 byte dữ liệu vào bộ nhớ nháp của DS1820. Byte đầu tiên được ghi vào thanh ghi TH (byte 2 của bộ nhớ nháp) còn byte thứ hai được ghi vào thanh ghi TL (byte 3 của bộ nhớ nháp). Dữ liệu truyền theo trình tự đầu tiên là bit có ý nghĩa nhất và kế tiếp là những bit có ý nghĩa giảm dần. Cả hai byte này phải được ghi trước khi thiết bị chủ xuất ra một xung reset hoặc khi có dữ liệu khác xuất hiện.
- READ SCRATCHPAD (BEh)
Lệnh này cho phép thiết bị chủ đọc nội dung bộ nhớ nháp. Quá trình đọc bắt đầu từ bit có ý nghĩa nhấy của byte 0 và tiếp tục cho đến byte rhứ 9 (byte 8 – CRC). Thiết bị chủ có thể xuất ra một xung reset để làm dừng quá trình đọc bất kỳ lúc nào nếu như chỉ có một phần của dữ liệu trên bộ nhớ nháp cần được đọc.
- COPYSCRATCHPAD (48h)
Lệnh này copy nội dung của hai thanh ghi TH và TL (byte 2 và byte 3) vào bộ nhớ EEPROM. Nếu cảm biến được sử dụng trong chế dộ cấp nguồn l bắt đầu việc đo.
- CONVERT T (44h)
Lệnh này khởi động một quá trình đo và chuyển đổi giá trị nhiệt độ thành số (nhị phân). Sau khi chuyển đổi giá trị kết quả đo nhiệt độ được lưu trữ trên thanh ghi nhiệt độ 2 byte trong bộ nhớ nháp Thời gian chuyển đổi không quá 200 ms, trong thời gian đang chuyển đổi nếu thực hiện lệnh đọc thì các giá trị đọc ra đều bằng 0.
- READ POWER SUPPLY (B4h)
Một lệnh đọc tiếp sau lệnh này sẽ cho biết DS1820 đang sử dụng chế độ cấp nguồn như thế nào, giá trị đọc được bằng 0 nếu cấp nguồn bằng chính đường dẫn dữ liệu và bằng 1 nếu cấp nguồn qua một đường dẫn riêng.
III.Ứng dụng đo nhiệt độ hiển thị led 7.

Code đọc DS18b20

void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;
delay_18B20(8);
DQ = 0;
delay_18B20(80);
DQ = 1;
delay_18B20(14);
x=DQ;
delay_18B20(20);
}
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i–)
{
DQ = 0;
dat>>=1;
DQ = 1;
if(DQ)
dat|=0×80;
delay_18B20(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i–)
{
DQ = 0;
DQ = dat&0×01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
void ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0×44);
delay_18B20(100);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
delay_18B20(100);

a=ReadOneChar();
b=ReadOneChar();
nhiet_thuc=b<<4;
nhiet_thuc+=(a&0xf0)>>4;
Tải file chương trình + mô phỏng

Thứ Sáu, 19 tháng 10, 2012

[Lập trình ARM-LPC2378] Cách Chuyển Đổi Tương Tự/ Số - ADC, DAC

Nội dung

+ Tạo file Thư viện *.lib
+ Chuyển đổi Tương tự - Số: ADC
+ Chuyển đổi Số - Tương tự: DAC

Tạo file thư viện*.lib







+ Có 1 project định nghĩa các hàm.
+ Biên dịch project này ra file *.lib.
+ Một project khác add file .lib này vào và có thể gọi sử dụng các hàm trong file *.lib.
+ File gọi *.lib là file thư viện.


ADC
Giới thiệu
+ LPC2378 hỗ trợ 8 kênh chuyển đổi ADC


Các thanh ghi liên quan
+ AD0CR ( A/D Control Register ): Thanh ghi điều khiển AD - chọn chế độ xử lý cho qua trình chuyển đổi AD.
+ AD0GDR ( A/D Global Data Register ): Thanh ghi dữ liệu toàn cục - Chứa kết quả chuyển đổi AD gần nhất.
+ AD0STAT ( A/D Status Register ): Thanh ghi trạng thái - Cờ DONE và OVERRUN cho tất cả các kênh.
+ AD0INTEN (A/D Interrupt Enable Register): Thanh ghi bật / ngắt.

+ AD0DRn (A/D Channel n Data Register): Thanh ghi chứa dữ liệu tại kênh n– chứa kết quả chuyển đổi gần nhất trên kênh n.


Bật Power
Quản lý bởi Thanh ghi PCONP tại địa chỉ 0xE01FC0C4:






Cấu hình PINSEL





Đọc giá trị ADC

+ Kết quả chuyển đổi AD dược đọc tại thanh ghi AD0DR0 (từ bit thứ 6 đến bit thứ 15):
value = (AD0DR0 >> 6) & 0x3FF;





DACGiới thiệu
Bộ DAC chuyển đổi dữ liệu số thành tín hiệu bên ngoài (điển hình là âm thanh)


Các thanh ghi liên quan

+ DACR (D/A Control Register) : thanh ghi điều khiển AD –để đặt giá trị cần thay đổi tới.


Cấu hình PINSEL






PINSEL1 &= ~(0x03<<20); //enable DAC
PINSEL1 &= ~(0x02<<20); //enable DAC
(nguồn: ĐHKHTN TP.HCM)

[Lập trình ARM-LPC2378] Các Ngắt Trong LPC23xx

Nội Dung

+ Giới thiệu về ngắt trong LPC23xx
+ Các thanh ghi liên quan tới điều khiển ngắt
+ Hàm cài đặt ngắt install_irq()


Giới thiệu về ngắt trong LPC23xx

+ LPC2378 hỗ trợ 32 ngắt với 16 mức độ ưu tiên.
+ Có 2 loại ngắt: Interrupt request (IRQ) và Fast Interrupt Request (FIQ).
+ Fast Interrupt Request là ngắt có độ ưu tiên cao nhất. IRQ có độ ưu tiên thấp hơn.
+ Nếu có nhiều ngắt cùng độ ưu tiên thì ngắt nào ở Vector có chỉ số nhỏ hơn sẽ được thực thi trước.





+ Bảng trên thể hiện vị trí thứ tự các bit tương ứng với ngắt cho từng loại đối tượng.




Các thanh ghi liên quan tới điều khiển ngắt

+ VICIRQStatus (32bits) : Thanh ghi trạng thái của ngắt loại IRQ, bit bật lên 1 cho biết đối tượng ngắt tương ứng được kích hoạt và loại ngắt là IRQ.
+ VICFIQStatus (32bits) : Thanh ghi trạng thái của ngắt loại FIQ, bit bật lên 1 cho biết đối tượng ngắt tương ứng được kích hoạt và loại ngắt là FIQ.
+ VICVectAddrn (32bits) : Thanh ghi địa chỉ, chỉ tới hàm sẽ thực hiện nếu có ngắt xảy ra.
+ VICIntEnable (32bits) : Cho giá trị bằng 1 ở bit muốn cài đặt.
+ VICVectPriorityn (32bits) : Thanh ghi xét độ ưu tiên.
n: bit thứ n ( Với n: 0 -> 31 ).
Ví Dụ:
VICVectAddr4 = ( unsigned long ) TO_IRQHandler;
VICVectCnt4 = 15;
VICIntEnable = ( 1 << 4 );


+ Với n=4: Ngắt của Timer0
+ Hàm thực hiện khi ngắt xảy ra là TO_IRQHandler
+ Độ ưu tiên cho ngắt là 15
+ Khởi động Bộ điều khiển ngắt ở bit thứ 4


Khai báo
+ Hàm ngắt: có từ khóa __irq hoặc __fiq
VD:
void TO_IRQHandler(void)__irq
{
...
VICVectAddr = 0;
}
__irq void TO_IRQHandler(void)
{
...
VICVectAddr = 0;
}




Hàm cài đặt ngắt install_irq()
Hàm cài đặt ngắt
DWORD install_irq( DWORD IntNumber, void *HandlerAddr, DWORD Priority )
{
DWORD *vect_addr;
DWORD *vect_prio;


VICIntEnClr = 1 << IntNumber; //Disable Interrupt
if( IntNumber >= VIC_SIZE )
{
return( FALSE );
}
else
{
/* find first un assigned VIC address for the handler */
vect_addr = (DWORD *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + IntNumber*4);
vect_prio = (DWORD *)(VIC_BASE_ADDR + VECT_PRIO_INDEX + IntNumber*4);
*vect_addr = (DWORD)HandlerAddr; /* set interrupt vector */
*vect_prio = Priority;
VICIntEnable = 1 << IntNumber; /* Enable Interrupt */
return( TRUE );
}
}




Ví Dụ: Tạo ngắt cho Interrupt0 Button(INT0)





+ PINSEL4 = 0x01 << 20;
+ VICVectAddr14 = (unsigned long)abc;
+ VICVectCntl14 = 14;
+ VICIntEnable = (1 << 14);
+ __irq void abc (void)
{
……// xuat ten cua ban ra HyperTerminal
EXTINT=0x01;
VICVectAddr = 0;
}


(nguồn: ĐHKHTN TP.HCM)

[Lập trình ARM-LPC2378] Truyền Thông Nối Tiếp Không Đồng Bộ- UART

Nội dung
- - Giới thiệu về UART
- Các thanh ghi liên quan tới UART
- Cấu hình PINSEL
- Sử dụng Hyper Terminal


Giới thiệu về UART
Cổng COM









UART
+ + Viết tắt của: Universal Asynchronous Receiver/ Transmitter - Bộ thu/ phát không đồng bộ đa năng, là một loại thu/ phát không đồng bộ dùng để thực hiện việc chuyển đổi dữ liệu song song thành dữ liệu nối tiếp và truyền nhận nối tiếp giữa các bên phát và thu.
- + LPC2378 hỗ trợ 4 UARTs: UART 0, UART 1, UART 2, UART 3
- + UART 0/2/3: TXD, RXD
- + UART 1: TXD, RXD, CTS, RTS, DTR, DSR, RI…
-


Các thanh ghi liên quan tới UART
Các thanh ghi
- + UnRBR ( Receive Buffer Register, 1 byte) : thanh ghi chứa byte dữ liệu nhận.
- + UnTHR ( Transmit Holding Register, 1 byte): Thanh ghi chứa byte dữ liệu sẽ được gửi.
- + UnLCD (Line Control Register, 1 byte): Thanh ghi điều khiển, quyết định định dạng dữ liệu được truyền nhận (DataLength, Stop bit, Parity…)
- + UnIER (Interrupt Identification Register, 4 bytes ): thanh ghi để active 3 ngắt sử dụng cho UART
- + UnllR ( Interrupt Identification Register, 4 bytes) : thanh ghi cho biết có ngắt đang xảy ra hay không, nếu có thì là ngắt nào
- + UnDLL ( Divisor Latch LSB Register, 1 byte): quyết định baudrate của UART
- + UnDLM (Divisor Latch MSB Register, 1 byte)


Thanh ghi UnLSR
- + Nhận dữ liệu:
- Ta xét trạng thái ở bit 0
0: Thanh ghi UnRBR rỗng
1: Thanh ghi UnRBR có chứa dữ liệu
Int getkey (void)
{
While (!(UxLSR & 0x01));
Return (UxRBR);
}
- + Truyền dữ liệu:
+ Ta xét trạng thái ở bit 5
0: Thanh ghi UnTHR có chứa dữ liệu
1: Thanh ghi UnTHR rỗng
Int sendchar (int ch)
{
While (!(UxLSR & 0x20));
Return (UxTHR = ch);
}




Cấu hình PINSEL


Cấu hình PINSEL – UARTO





Cấu hình PINSEL – UART1










Sử dụng Hyper Terminal


Hyper Terminal
Các bạn Download phần mềm Hyper Terminal hercules 3.2.4 Tại Đây!


Các thông tin truyền nhận qua cổng COM
+ Baudrate: 9600 bps ( bits per second )
+ Data length: 8 bits
+ Parity: None
+ Stop bit: 1
+ Flow control: None


Thiết lập các thông số cho UART
+ Khi sử dụng thanh ghi UxDLL và UxDLM thì bit DLAB trong thanh ghi UxLCR phải là 1.
UxLCR = 0x83; // 8 bits, no Parity, 1 Stop bit
UxDLL = 78; // 9600 Baud Rate @ 12.0 MHZ PCLK
UxDLM = 0; // High divisor latch = 0
UxLCR = 0x03; // DLAB = 0
+ Sau khi thiết lập xong cho bit DLAB = 0 để sử dụng thanh ghi UnRBR, UnTHR

(Nguồn: ĐHKHTN TP.HCM)

DBS M05479
Quang Cao