Truyền thông giữa 3 vi điều khiển (MCU) bằng atmega8
          
        
            
               
            
 
            
                
                    LỜI MỞ ĐẦU
 Điện tử đang trở thành một ngành khoa học đa nhiệm vụ. Điện tử đã đáp ứng được những đòi hỏi không ngừng từ các lĩnh vực Công – Nông – Lâm – Ngư nghiệp, cho đến các nhu cầu thiết yếu nhất trong hoạt động đời sống hằng ngày.
 Một trong những ứng dụng rất quan trọng của công nghệ điện tử là kỹ thuật truyền thông và ứng dụng về đèn giao thông.
 Vào thập kỷ 90, công nghệ truyền thông được đưa vào các sản phẩm cơ-điện tử, đã tạo nên các sản phẩm có khả năng kết nối mạng. Cũng trong giai đoạn này, các vi cảm biến và cơ cấu chấp hành siêu nhỏ được phát triển và ứng dụng trong nhiều sản phẩm như các hệ thống vi cơ-điện tử. Có thể nói rằng, chức năng của các máy móc và hệ thống cơ kỹ thuật hiện nay phụ thuộc chủ yếu vào phần mềm (có thể là một thuật toán, mạng nơron, hệ mờ) trong máy tính của sản phẩm. Riêng điều này đã là một sự khác biệt về chất so với các sản phẩm cơ điện cách đây 25-30 năm trước.
 
 MỤC LỤC 
 Mục lục 
 Danh sách các hình 
 LỜI MỞ ĐẦU . 
 CHƯƠNG 1: TRUYỀN THÔNG GIỮA 3 vi điều khiển MCU 
 1.1 các kiểu truyền thông . 
 1.1.1 Điểm – nối – điểm (Point-to-point) . 
 1.1.2 Điểm – nối – nhiều điểm (Point-to-multipoint) . 
 1.1.3 Quảng bá (broadcasting) . 
 1.1.4 Truyền đơn công (simplex) 
 1.1.5 Truyền bán song công (Half-duplex) 
 1.1.6 Truyền song công (Full-duplex) . 
 1.2 Truyền song công (Full-duplex) giữa các MCU 
 1.2.1 Thanh ghi 
 1.2.2 Sử dụng UART 
 1.3 Truyền thông 3 vi điều khiển (MCU) . 
 1.3.1 nguyên lý hoạt động của truyền thông 3 boad . 
 1.3.2 sơ đồ nguyên lý boad mạch 
 1.3.3 chương trình giải thuật 
 1.3.3.1 chương trình (truyền đi)master) . 
 1.3.3.2 Chương trình nhận (dữ liệu) savle1 
 1.3.3.3Chương trình nhận dữ liệu(savle2) .
 TÀI LIỆU THAM KHẢO 
 DANH SÁCH CÁC HÌNH 
 Hình 1.1 Điểm – nối – điểm (Point-to-point) 
 Hình 1.2 Điểm – nối – nhiều điểm (Point-to-multipoint) 
 Hình 1.3 Quảng bá (broadcasting) .
 Hình 1.4 Truyền đơn công (simplex) .
 Hình 1.5 Truyền bán song công (Half-duplex) 
 Hình 1.6 Truyền song công (Full-duplex .
 Hình 1.7 Atmega8 . .
 Hình 1.8 thanh ghi USART 
 Hình 1.9 thanh ghi UCSRC .
 Hình 1.10 hai thanh ghi UBRRL và UBRRH 
 Hình 1.11 kết nối giữa 3 MCU .
 Hình 1.12 sơ đồ nguyên lý boad mạch
                
              
                                            
                                
            
 
            
                 27 trang
27 trang | 
Chia sẻ: lvcdongnoi | Lượt xem: 2752 | Lượt tải: 1 
              
            Bạn đang xem trước 20 trang tài liệu Truyền thông giữa 3 vi điều khiển (MCU) bằng atmega8, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
 Trang 1 
 MỤC LỤC Trang 
 Mục lục ................................................................ ................. ........ ................. 1 
 Danh sách các hình .......................................... ................ ........................ 2 
 LỜI MỞ ĐẦU ................................................ ................ ........................ 3 
 CHƯƠNG 1: TRUYỀN THÔNG GIỮA 3 vi điều khiển MCU 
 1.1 các kiểu truyền thông......................... .............. ........................ 4 
 1.1.1 Điểm – nối – điểm (Point-to-point)………… ........................ 4. 
 1.1.2 Điểm – nối – nhiều điểm (Point-to-multipoint)… .................. 4 
 1.1.3 Quảng bá (broadcasting)………………………. .................... 4 
 1.1.4 Truyền đơn công (simplex)………………… ........................ 5 
 1.1.5 Truyền bán song công (Half-duplex)………… ...................... 5 
 1.1.6 Truyền song công (Full-duplex)………………...................... 5 
 1.2 Truyền song công (Full-duplex) giữa các MCU……… ............... 6 
 1.2.1 Thanh ghi……………………………………......................... 7 
 1.2.2 Sử dụng UART……………………………… ........................ 8 
 1.3 Truyền thông 3 vi điều khiển (MCU)………….. . ........................ 9 
 1.3.1 nguyên lý hoạt động của truyền thông 3 boad…………........... 9 
 1.3.2 sơ đồ nguyên lý boad mạch……………. ........ ........................ 10 
 1.3.3 chương trình giải thuật…………….. .............. ........................ 10 
 1.3.3.1 chương trình (truyền đi):(master)…………........................ 12 
 1.3.3.2 Chương trình nhận (dữ liệu) savle1……………................. 17 
 1.3.3.3 Chương trình nhận dữ liệu(savle2)………………………...23 
 TÀI LIỆU THAM KHẢO………………………………………………....45 
DANH SÁCH CÁC HÌNH 
 Hình 1.1 Điểm – nối – điểm (Point-to-point)......... ……………………………4 
 Hình 1.2 Điểm – nối – nhiều điểm (Point-to-multipoint)……………………....4 
 Hình 1.3 Quảng bá (broadcasting)……………………………………………...5 
 Hình 1.4 Truyền đơn công (simplex) ………………………………………….5 
 Hình 1.5 Truyền bán song công (Half-duplex)……………………………........5 
 Hình 1.6 Truyền song công (Full-duplex………………………………….........6 
 Hình 1.7 Atmega8 ……………………………………………………….….....6 
 Hình 1.8 thanh ghi USART……………………………………………………7 
 Hình 1.9 thanh ghi UCSRC……………………………………………….........8 
 Hình 1.10 hai thanh ghi UBRRL và UBRRH……………………………........8 
 Hình 1.11 kết nối giữa 3 MCU………………………………………………...9 
 Hình 1.12 sơ đồ nguyên lý boad mạch ……………………………………10 
 Trang 2 
 LỜI MỞ ĐẦU 
 Ngày nay, với những ứng dụng của khoa học kỹ thuật tiên tiến, thế giới của 
chúng ta đã và đang một ngày thay đổi, văn minh và hiện đại hơn. Sự phát triển của 
kỹ thuật điện tử đã tạo ra hàng loạt những thiết bị với các đặc điểm nổi bật như sự 
chính xác cao, tốc độ nhanh, gọn nhẹ đó cũng là những yếu tố rất cần thiết góp 
phầncho hoạt động của con người đạt hiệu quả cao. 
 Điện tử đang trở thành một ngành khoa học đa nhiệm vụ. Điện tử đã đáp ứng 
được những đòi hỏi không ngừng từ các lĩnh vực Công – Nông – Lâm – Ngư 
nghiệp, cho đến các nhu cầu thiết yếu nhất trong hoạt động đời sống hằng ngày. 
 Một trong những ứng dụng rất quan trọng của công nghệ điện tử là kỹ thuật 
truyền thông và ứng dụng về đèn giao thông. 
 Vào thập kỷ 90, công nghệ truyền thông được đưa vào các sản phẩm cơ-
điện tử, đã tạo nên các sản phẩm có khả năng kết nối mạng. Cũng trong giai đoạn 
này, các vi cảm biến và cơ cấu chấp hành siêu nhỏ được phát triển và ứng dụng 
trong nhiều sản phẩm như các hệ thống vi cơ-điện tử. Có thể nói rằng, chức năng 
của các máy móc và hệ thống cơ kỹ thuật hiện nay phụ thuộc chủ yếu vào phần 
mềm (có thể là một thuật toán, mạng nơron, hệ mờ) trong máy tính của sản phẩm. 
Riêng điều này đã là một sự khác biệt về chất so với các sản phẩm cơ điện cách đây 
25-30 năm trước. 
 Trang 3 
CHƯƠNG 1: TRUYỀN THÔNG GIỮA 3 MCU 
 1.1 CÁC KIỂU TRUYỀN THÔNG: 
 1.1.1 Điểm – nối – điểm (Point-to-point): truyền thông diễn ra giữa 2 điểm đầu 
cuối. Ví dụ, trong trường hợp của truyền thông bằng giọng nói sử dụng điện thoại, 
có một bên thực hiện cuộc gọi và bên còn lại nhận cuộc gọi. Vì thế truyền thông 
dạng này được gọi là điểm-tới-điểm. 
 Hình 1.1 
 1.1.2 Điểm – nối – nhiều điểm (Point-to-multipoint): Trong kiểu truyền thông 
này, có một bên gửi và nhiều bên nhận. Lấy ví dụ, trong một cuộc hội thoại (voice 
conferencing), một người sẽ nói và nhiều người khác lắng nghe. Thông điệp từ 
người gửi được truyền tải tới nhiều người nghe (multicast). 
 Hình 1.2 
 1.1.3 Quảng bá (broadcasting): có một điểm trung tâm mà từ đó thông tin 
được gửi tới nhiều người nhận, ví dụ như việc quảng bá hình ảnh từ đài truyền hình 
hoặc quảng bá âm thanh từ đài phát thanh. Trong một hệ thống quảng bá, những 
người nhận ở trạng thái thụ động (chỉ lắng nghe hoặc chỉ xem nhìn…), và không có 
một tuyến đường dành riêng cho việc truyền thông. 
 Trang 4 
 Hình 1.3 
 1.1.4Truyền đơn công (simplex): việc truyền thông chỉ xảy ra theo một 
chiều duy nhất. Có một bên gửi và một bên nhận; bên gửi chỉ có nhiệm vụ gửi 
thông tin, bên nhận chỉ việc nhận thông tin và 2 bên không thể thay đổi vai trò cho 
nhau. 
 Hình 1.4 
 1.1.5 Truyền bán song công (Half-duplex): Truyền thông giữa 2 thực thể 
(máy tính hoặc con người) có thể xảy ra theo cả 2 chiều, nhưng tại một thời điểm 
một thực thể chỉ có thể gửi hoặc nhận thông tin. Máy bộ đàm cầm tay (walkie-
talkie) sử dụng phương thức truyền tin này. Khi một người muốn nói thì anh ta nhấn 
nút “nói” trên bộ đàm để bắt đầu nói, và bộ đàm của người còn lại sẽ ở trong chế độ 
nhận tín hiệu. Khi người gửi hoàn thành việc gửi tin, anh ta gửi một thông điệp báo 
hiệu kết thúc việc gửi. Lúc này, người còn lại mới có thể nhấn nút “nói” và bắt đầu 
nói. Những hệ thống kiểu này yêu cầu băng thông kênh truyền giới hạn, vì vậy đây 
là những hệ thống có chi phí thấp. 
 Hình 1.5 
 1.1.6 Truyền song công (Full-duplex): Trong một hệ thống truyền song 
công, 2 bên – gửi và nhận – trong một thời điểm có thể đồng thời gửi và nhận tín 
hiệu cho nhau, ví dụ hệ thống điện thoại. Tuy nhiên, cần lưu ý rằng hệ thống truyền 
thông này cho phép truyền nhận dữ liệu đồng thời, nhưng khi có 2 người đồng thời 
 Trang 5 
cùng “nói” thì việc truyền thông kém hiệu quả đi rất nhiều! Một hệ thống truyền 
thông mà cùng lúc có khả năng vận chuyển dữ liệu theo cả 2 chiều được gọi là hệ 
thống truyền song công. 
 Hình 1.6 
 Trong truyền thông kiểu đơn công, việc truyền thông chỉ xảy ra theo 1 chiều 
duy nhất. Trong truyền thông kiểu bán song công, việc truyền thông xảy ra theo cả 
2 chiều, nhưng tại một thời điểm chỉ có duy nhất một chiều được hoạt động. Trong 
truyền thông kiểu song công toàn phần, việc truyền thông xảy ra đồng thời theo cả 2 
chiều. 
 Dựa trên loại thông tin được truyền tải, chúng ta có các hệ thống truyền 
thông như: thoại, fax, hình ảnh, dữ liệu… Khi nhiều loại thông tin được gộp chung 
lại với nhau, chúng ta có hệ thống truyền thông đa phương tiện (multimedia). 
 1.2 Truyền song công (Full-duplex) giữa các MCU: còn được gọi là truyền 
thông nối tiếp không đồng bộ, ở đây ta dùng atmega8. 
 Hình 1.7 Atmega8 
Vi điều khiển Atmega8 có 1 module truyền thông nối tiếp USART. Có 3 chân 
chính liên quan đến module này đó là chân xung nhịp - XCK (chân số 1), chân 
truyền dữ liệu – TxD (Transmitted Data) và chân nhận dữ liệu –RxD (Reveived 
Data). Trong đó chân XCK chỉ được sử dụng như là chân phát hoặc nhận xung giữ 
nhịp trong chế độ truyền động bộ. Tuy nhiên bài này chúng ta không khảo sát chế 
 Trang 6 
độ truyền thông đồng bộ, vì chỉ cần quan tâm đến 2 chân TxD và RxD.Vì các chân 
truyền/nhận dữ liệu chỉ đảmnhiệm 1 chức năng độc lập (hoặc là truyền, hoặc là 
nhận), để kết nối các chip AVR với nhau (hoặc kết nối AVR với thiết bị hỗ trợ 
UART khác) bạn phải đấu “chéo” 2 chân này. TxD của thiết bị thứ nhất kết nối với 
RxD của thiết bị 2 và ngược lại. Module USART trên chip Atmega32 hoạt động 
“song công” (Full Duplex Operation), nghĩa là quá trình truyền và nhận dữ liệu có 
thể xảy ra đồng thời. 
 1.2.1 Thanh ghi: 
 Cũng như các thiết bị khác trên AVR, tất cả hoạt động và tráng thái của module 
USART được điều khiển và quan sát thông qua các thanh ghi trong vùng nhớ I/O. 
Có 5 thanh ghi được thiết kế riêng cho hoạt động và điều khiển của USART, đó là: 
 UDR: hay thanh ghi dữ liệu, là 1 thanh ghi 8 bit chứa giá trị nhận được và phát 
đi của USART. Thực chất thanh ghi này có thể coi như 2 thanh ghi TXB (Transmit 
data Buffer) và RXB (Reveive data Buffer) có chung địa chỉ. Đọc UDR thu được 
giá trị thanh ghi đệm dữ liệu nhận, viết giá trị vào UDR tương đương đặt giá trị vào 
thanh ghi đệm phát, chuẩn bị để gởi đi. Chú ý trong các khung truyền sử dụng 5, 6 
hoặc 7 bit dữ liệu, các bit cao của thanh ghi UDR sẽ không được sử dụng 
 UCSRA (USART Control and Status Register A): là 1 trong 3 thanh ghi điều 
khiển hoạt động của module USART. 
 Hình 1.8 thanh ghi USART 
 Thanh ghi UCSRA chủ yếu chứa các bit trạng thái như bit báo quá trình nhận 
kết thúc (RXC), truyền kết thúc (TXC), báo thanh ghi dữ liệu trống (UDRE), khung 
truyền có lỗi (FE), dữ liệu tràn (DOR), kiểm tra parity có lỗi (PE)…Bạn chú ý một 
số bit quan trọng của thanh ghi này 
 UCSRC (USART Control and Status Register C): thanh ghi này chủ yếu quy 
định khung truyền và chế độ truyền. Tuy nhiên, có một rắc rối nho nhỏ là thanh ghi 
này lại có cùng địa chỉ với thanh ghi UBRRH (thanh ghi chứa byte cao dùng để xác 
lập tốc độ baud), nói một cách khác 2 thanh ghi này là 1. Vì thế bit 7 trong thanh 
ghi này, tức bit URSEL là bit chọn thanh ghi. Khi URSEL=1, thanh ghi này được 
chip AVR hiểu là thanh ghi điều khiển UCSRC, nhưng nếu bit URSEL=0 thì thanh 
ghi UBRRH sẽ được sử dụng. 
 Trang 7 
 Hình 1.9 thanh ghi UCSRC 
 UCPOL (Clock Pority) là bit chỉ cực của xung kích trong chế độ truyền 
thông đồng bộ. nếu UCPOL=0, dữ liệu sẽ thay đổi thay đổi ở cạnh lên của xung 
nhịp, nếu 
 UCPOL=1, dữ liệu thay đổi ở cạnh xuống xung nhịp. Nếu bạn sử dụng chế 
độ truyền thông không đồng bộ, hãy set bit này bằng 0.. 
 UBRRL và UBRRH (USART Baud Rate Register): 2 thanh ghi thấp và cao 
quy định tốc độ baud. 
 Hình 1.10 hai thanh ghi UBRRL và UBRRH 
 Nhắc lại là thanh ghi UBRRH dùng chung địa chỉ thanh ghi UCSRC, bạn phải 
set bit này bằng 0 nếu muốn sử dụng thanh ghi UBRRH. Như bạn quan sát trong 
hình trên, chỉ có 4 bit thấp của UBRRH được dùng, 4 bit này kết hợp với 8 bit trong 
thanh ghi UBRRL tạo thành thanh ghi 12 bit quy định tốc độ baud. Chú ý là nếu bạn 
viết giá trị vào thanh ghi UBRRL, tốc độ baud sẽ tức thì được cập nhật, vì thế bạn 
phải viết giá trị vào thanh ghi UBRRH trước khi viết vào thanh ghi UBRRL. 
 Giá trị gán cho thanh ghi UBRR không phải là tốc độ baud, nó chỉ được 
USART dùng để tính tốc độ baud. 
 1. 2.2 Sử dụng UART:. 
 Thông thường, để sử dụng module USART trên AVR bạn phải thực hiện 3 việc 
quan trọng, đó là: cài đặt tốc độ baud (thanh ghi UBRR), định dạng khung truyền 
(UCSRB, UCSRC) và cuối cùng kích hoạt bộ truyền, bộ nhận, ngắt…Như đã đề 
cập, trong tài liệu này tôi chủ yếu đề cập đến phương pháp truyền thông không đồng 
bộ, việc xác lập các thông số hoạt động chủ yếu dựa trên chế độ này. Trong hầu hết 
các ứng dụng, tốc độ baud và khung truyền thường không đổi, trong trường hợp này 
chúng ta có thể khởi tạo trực tiếp USART ở phần đầu trong main và sau đó chỉ cần 
truyền hoặc nhận dữ liệu mà không cần thay đổi các cài đặt. Tuy nhiên, nếu trường 
hợp giao tiếp “linh hoạt” ví dụ bạn đang chế tạo một thiết bị có khả năng giao tiếp 
với một thiết bị đầu cuối khác (như máy tính chẳng hạn), lúc này bạn nên cho phép 
người dùng thay đổi tốc độ baud hoặc các thông số khác để phù hợp với thiết bị đầu 
cuối. Đối với những ứng dụng kiểu này bạn nên viết 1 chương trình con để khởi 
động USART và có thể gọi lại nhiều lần khi cần thay đổi. Phần tiếp theo chúng ta 
 Trang 8 
sẽ viết một số chương trình ví dụ minh họa cách sử dụng module truyền thông 
USART từ đơn giản đến phức tạp. Các ví dụ sẽ được thực hiện cho chip Atmega32 
với giả sử nguồn xung nhịp hệ thống là 8MHz. 
 1.3 Truyền thông 3 vi điều khiển (MCU): 
 RxD TxD 
 TxD RxD 
 TxD 
 RxD 
Hình 1.11 kết nối giữa 3 MCU 
 1.3.1 nguyên lý hoạt động của truyền thông 3 boad: 
 Trong truyền thông 3 boad có 2 con tớ(savel) va 1 con chủ (master) bộ điều 
khiển atmega 8 được nối chung lại với nhau bằng 2 chân txd và rxd là 2 chân truyền 
thông được truyền dữ liệu đi. 
 con master sẽ chọn địa và chỉ truyền dữ liệu đi ,con master quy định với địa 
chỉ mà con savle thứ nhất sẽ làm công việc này và con savle thứ hai sẽ làm công 
việc kia. 
 Khi truyền dữ liệu bit stop được dần đẩy về sau cùng. 
 start stop add data1 data2 
 station 
MCU2 
(savle1) 
MCU3 
(savle2) 
MCU1 
 (master) 
 Trang 9 
 1.3.2 sơ đồ nguyên lý boad mạch 
J15
CON1
1
J16
CON1
1
J17
CON1
1
J18
CON1
1
Reset
J12
CON2
1
2
5V5V
R3
330
U1 ATMEGA8
PD0/RXD2
PD1/TXD
3
PD2/INT04
PD3/INT15
PD4/SCK/T06
VCC7
G
N
D
8
XTAL19
XTAL2
10
PD5/T111
PD6/AN012
PD7/AN113
PB0/ICP 14
OC1A/PB1 15
SS/OC1B/PB2 16
PB3/MOSI/OC2
17PB4/MISO
18PB5/SCK
19
AVCC20
AREF21 AG
N
D
22
PC0/ADC0 23
PC1/ADC1 24
PC2/ADC2 25
PC3/ADC3 26
PC4/ADC4/SDA 27
PC5/ADC5/SCL
28RESET
1
MOSI
SCK
MISO
J8
CON2
1
2
5V
5V
5V
J11
POWER
1
2
J14
CON6
1
2
3
4
5
6
D10
2A
RxD
TxD
J9
CON2
1
2
J10
Nap
1
2
3
4
5
6
SW4 SW5 SW6
RxD
C11
1100u/16V C12
470uF/16V
5V
TxD
U4
LM7805
+ in1
-
2
+ out 3
MOSI
MISO
SCK
Reset
C13
104
J19
CON2
1
2
TxD
RxD
C14
104
J20
CON2
1
2
U3
MAX232
C1 +1
R1IN 13
G
N
D
15
R2 IN 8R2 OUT9
T1 IN11
C2 +4
T1 OUT 14
Vc
c
16
C1 -3
V - 6
V + 2
C2 -5
T2 IN
10
T2 OUT
7
R1 OUT12
C6
30p
C10
4.7u/50V
C7
30p
SCL
SDA
P1
 DB9
5
9
4
8
3
7
2
6
1
C1
0.1uF
C8
104
5V
J21
CON2
1
2
SDA
SCL
R4
10K
C9
104
SCL
5V
SDA
Y1
8MHz
1
2
C2
0.1uF
D11 LED
Reset
C3
0.1uF
R5 1K
Reset
C4
0.1uF
5V
5V
C5
104
TxD
RxD
 Hình 1.12 
1.3.3 chương trình giải thuật 
 1.3.3.1 chương trình (truyền đi):(master): 
 #include 
#include 
#include 
#include 
#define len_F 2 
#define led PORTC 
#define RXB8 1 
#define TXB8 0 
#define UPE 2 
#define OVR 3 
#define FE 4 
#define UDRE 5 
#define RXC 7 
 Trang 10 
#define FRAMING_ERROR (1<<FE) 
#define PARITY_ERROR (1<<UPE) 
#define DATA_OVERRUN (1<<OVR) 
#define DATA_REGISTER_EMPTY (1<<UDRE) 
#define RX_COMPLETE (1<<RXC) 
char ktra=0,ktra2=0,ch; 
unsigned char index_F,start_F,received; 
unsigned char frame_Rx[100]; 
//unsigned char len_F; 
unsigned char data1,data2,i; 
// USART Receiver buffer 
#define RX_BUFFER_SIZE 8 
char rx_buffer[RX_BUFFER_SIZE]; 
#if RX_BUFFER_SIZE<256 
unsigned char rx_wr_index,rx_rd_index,rx_counter; 
#else 
unsigned int rx_wr_index,rx_rd_index,rx_counter; 
#endif 
// This flag is set on USART Receiver buffer overflow 
bit rx_buffer_overflow; 
// USART Receiver interrupt service routine 
interrupt [USART_RXC] void usart_rx_isr(void) 
{ 
char status,data; 
status=UCSRA; 
data=UDR; 
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) 
 { 
 rx_buffer[rx_wr_index]=data; 
 if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; 
 if (++rx_counter == RX_BUFFER_SIZE) 
 { 
 rx_counter=0; 
 Trang 11 
 rx_buffer_overflow=1; 
 }; 
 }; 
} 
#ifndef _DEBUG_TERMINAL_IO_ 
// Get a character from the USART Receiver buffer 
#define _ALTERNATE_GETCHAR_ 
#pragma used+ 
char getchar(void) 
{ 
char data; 
while (rx_counter==0); 
data=rx_buffer[rx_rd_index]; 
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; 
#asm("cli") 
--rx_counter; 
#asm("sei") 
return data; 
} 
#pragma used- 
#endif 
// USART Transmitter buffer 
#define TX_BUFFER_SIZE 8 
char tx_buffer[TX_BUFFER_SIZE]; 
#if TX_BUFFER_SIZE<256 
unsigned char tx_wr_index,tx_rd_index,tx_counter; 
#else 
unsigned int tx_wr_index,tx_rd_index,tx_counter; 
#endif 
// USART Transmitter interrupt service routine 
interrupt [USART_TXC] void usart_tx_isr(void) 
{ 
if (tx_counter) 
 { 
 --tx_counter; 
 Trang 12 
 UDR=tx_buffer[tx_rd_index]; 
 if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; 
 }; 
} 
#ifndef _DEBUG_TERMINAL_IO_ 
// Write a character to the USART Transmitter buffer 
#define _ALTERNATE_PUTCHAR_ 
#pragma used+ 
void putchar(char c) 
{ 
while (tx_counter == TX_BUFFER_SIZE); 
#asm("cli") 
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) 
 { 
 tx_buffer[tx_wr_index]=c; 
 if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0; 
 ++tx_counter; 
 } 
else 
 UDR=c; 
#asm("sei") 
} 
#pragma used- 
#endif 
// Standard Input/Output functions 
#include 
// Declare your global variables here 
void truyen(char station,char data1,char data2) 
{ 
 putchar('s'); 
 putchar('t'); 
 putchar(station); 
 putchar(data1); 
 putchar(data2); 
 delay_ms(100); 
 Trang 13 
} 
void nhan() 
{ 
 ch=getchar(); 
 if((index_F>=1)&&(ch=='t')&&(frame_Rx[index_F-1]=='s')) 
 { 
 index_F=0; 
 start_F=1; 
 } 
 else 
 frame_Rx[index_F++]=ch; 
 if((start_F)&&(index_F>len_F)) 
 { 
 start_F=0; 
 received=1; 
 } 
 if(index_F>RX_BUFFER_SIZE) 
 { 
 frame_Rx[0]=frame_Rx[index_F-2]; 
 frame_Rx[1]=frame_Rx[index_F-1]; 
 index_F=2; 
 } 
 if(received) 
 { 
 data1=frame_Rx[0]; 
 data2=frame_Rx[1]; 
 } 
} 
void main(void) 
{ 
// Declare your local variables here 
// Input/Output Ports initialization 
 Trang 14 
// Port B initialization 
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00; 
DDRB=0x00; 
// Port C initialization 
// Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out 
// State6=T State5=T State4=T State3=1 State2=1 State1=1 State0=1 
PORTC=0x0F; 
DDRC=0x0F; 
// Port D initialization 
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00; 
DDRD=0x00; 
// Timer/Counter 0 initialization 
// Clock source: System Clock 
// Clock value: Timer 0 Stopped 
TCCR0=0x00; 
TCNT0=0x00; 
// Timer/Counter 1 initialization 
// Clock source: System Clock 
// Clock value: Timer 1 Stopped 
// Mode: Normal top=FFFFh 
// OC1A output: Discon. 
// OC1B output: Discon. 
// Noise Canceler: Off 
// Input Capture on Falling Edge 
// Timer 1 Overflow Interrupt: Off 
// Input Capture Interrupt: Off 
// Compare A Match Interrupt: Off 
// Compare B Match Interrupt: Off 
TCCR1A=0x00; 
TCCR1B=0x00; 
TCNT1H=0x00; 
 Trang 15 
TCNT1L=0x00; 
ICR1H=0x00; 
ICR1L=0x00; 
OCR1AH=0x00; 
OCR1AL=0x00; 
OCR1BH=0x00; 
OCR1BL=0x00; 
// Timer/Counter 2 initialization 
// Clock source: System Clock 
// Clock value: Timer 2 Stopped 
// Mode: Normal top=FFh 
// OC2 output: Disconnected 
ASSR=0x00; 
TCCR2=0x00; 
TCNT2=0x00; 
OCR2=0x00; 
// External Interrupt(s) initialization 
// INT0: Off 
// INT1: Off 
MCUCR=0x00; 
// Timer(s)/Counter(s) Interrupt(s) initialization 
TIMSK=0x00; 
// USART initialization 
// Communication Parameters: 8 Data, 1 Stop, No Parity 
// USART Receiver: On 
// USART Transmitter: On 
// USART Mode: Asynchronous 
// USART Baud Rate: 9600 
UCSRA=0x00; 
UCSRB=0xD8; 
UCSRC=0x86; 
UBRRH=0x00; 
UBRRL=0x33; 
// Analog Comparator initialization 
 Trang 16 
// Analog Comparator: Off 
// Analog Comparator Input Capture by Timer/Counter 1: Off 
ACSR=0x80; 
SFIOR=0x00; 
// Global enable interrupts 
#asm("sei") 
while (1) 
 { 
 truyen(0x00,1,2); 
 delay_ms(10); 
 truyen(0x01,3,4); 
 delay_ms(10); 
 }; 
} 
 1.3.3.2 Chương trình nhận (dữ liệu) savle1: 
#include 
#include 
#include 
#include 
#define len_F 3 
#define led PORTC 
#define station 0x00 
// #define station 0x01 
#define RXB8 1 
#define TXB8 0 
#define UPE 2 
#define OVR 3 
#define FE 4 
#define UDRE 5 
#define RXC 7 
#define FRAMING_ERROR (1<<FE) 
#define PARITY_ERROR (1<<UPE) 
 Trang 17 
#define DATA_OVERRUN (1<<OVR) 
#define DATA_REGISTER_EMPTY (1<<UDRE) 
#define RX_COMPLETE (1<<RXC) 
char ktra=0,ktra2=0,ch; 
unsigned char index_F,start_F,received; 
unsigned char frame_Rx[100]; 
//unsigned char len_F; 
unsigned char data1,data2,i; 
// USART Receiver buffer 
#define RX_BUFFER_SIZE 8 
char rx_buffer[RX_BUFFER_SIZE]; 
#if RX_BUFFER_SIZE<256 
unsigned char rx_wr_index,rx_rd_index,rx_counter; 
#else 
unsigned int rx_wr_index,rx_rd_index,rx_counter; 
#endif 
// This flag is set on USART Receiver buffer overflow 
bit rx_buffer_overflow; 
// USART Receiver interrupt service routine 
interrupt [USART_RXC] void usart_rx_isr(void) 
{ 
char status,data; 
status=UCSRA; 
data=UDR; 
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) 
 { 
 rx_buffer[rx_wr_index]=data; 
 if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; 
 if (++rx_counter == RX_BUFFER_SIZE) 
 { 
 rx_counter=0; 
 rx_buffer_overflow=1; 
 }; 
 }; 
 Trang 18 
} 
#ifndef _DEBUG_TERMINAL_IO_ 
// Get a character from the USART Receiver buffer 
#define _ALTERNATE_GETCHAR_ 
#pragma used+ 
char getchar(void) 
{ 
char data; 
while (rx_counter==0); 
data=rx_buffer[rx_rd_index]; 
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; 
#asm("cli") 
--rx_counter; 
#asm("sei") 
return data; 
} 
#pragma used- 
#endif 
// USART Transmitter buffer 
#define TX_BUFFER_SIZE 8 
char tx_buffer[TX_BUFFER_SIZE]; 
#if TX_BUFFER_SIZE<256 
unsigned char tx_wr_index,tx_rd_index,tx_counter; 
#else 
unsigned int tx_wr_index,tx_rd_index,tx_counter; 
#endif 
// USART Transmitter interrupt service routine 
interrupt [USART_TXC] void usart_tx_isr(void) 
{ 
if (tx_counter) 
 { 
 --tx_counter; 
 UDR=tx_buffer[tx_rd_index]; 
 if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; 
 }; 
} 
 Trang 19 
#ifndef _DEBUG_TERMINAL_IO_ 
// Write a character to the USART Transmitter buffer 
#define _ALTERNATE_PUTCHAR_ 
#pragma used+ 
void putchar(char c) 
{ 
while (tx_counter == TX_BUFFER_SIZE); 
#asm("cli") 
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) 
 { 
 tx_buffer[tx_wr_index]=c; 
 if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0; 
 ++tx_counter; 
 } 
else 
 UDR=c; 
#asm("sei") 
} 
#pragma used- 
#endif 
// Standard Input/Output functions 
#include 
// Declare your global variables here 
void truyen() 
{ 
 putchar('s'); 
 putchar('t'); 
 putchar(1); 
 putchar(2); 
 delay_ms(100); 
} 
void nhan() 
{ 
 { 
 ch=getchar(); 
 Trang 20 
 if((index_F>=1)&&(ch=='t')&&(frame_Rx[index_F-1]=='s')) 
 { 
 index_F=0; 
 start_F=1; 
 } 
 else 
 frame_Rx[index_F++]=ch; 
 if((start_F)&&(index_F>len_F)) 
 { 
 start_F=0; 
 if(frame_Rx[0]==station) 
 { 
 received=1; 
 } 
 } 
 if(index_F>RX_BUFFER_SIZE) 
 { 
 frame_Rx[0]=frame_Rx[index_F-3]; 
 frame_Rx[1]=frame_Rx[index_F-2]; 
 frame_Rx[2]=frame_Rx[index_F-1]; 
 index_F=3; 
 } 
 if(received) 
 { 
 data1=frame_Rx[1]; 
 data2=frame_Rx[2]; 
 } 
 if(data2==2) 
 { 
 led=0XFF; 
 for(i=0;i<4;i++) 
 { 
 led<<=1; 
 delay_ms(500); 
 } 
 led=0XFF; 
 for(i=0;i<4;i++) 
 { 
 led>>=1; 
 Trang 21 
 delay_ms(500); 
 } 
 } 
 } 
} 
void main(void) 
{ 
PORTB=0x00; 
DDRB=0x00; 
PORTC=0x0F; 
DDRC=0x0F; 
PORTD=0x00; 
DDRD=0x00; 
TCCR0=0x00; 
TCNT0=0x00; 
TCCR1A=0x00; 
TCCR1B=0x00; 
TCNT1H=0x00; 
TCNT1L=0x00; 
ICR1H=0x00; 
ICR1L=0x00; 
OCR1AH=0x00; 
OCR1AL=0x00; 
OCR1BH=0x00; 
OCR1BL=0x00; 
ASSR=0x00; 
TCCR2=0x00; 
TCNT2=0x00; 
OCR2=0x00; 
MCUCR=0x00; 
TIMSK=0x00; 
UCSRA=0x00; 
UCSRB=0xD8; 
UCSRC=0x86; 
UBRRH=0x00; 
UBRRL=0x33; 
ACSR=0x80; 
 Trang 22 
SFIOR=0x00; 
// Global enable interrupts 
#asm("sei") 
while (1) 
 { 
 if(rx_counter!=0) 
 { 
 nhan(); 
 } 
 else 
 received=0; 
 data1=0; 
 data2=0; 
 }; 
} 
 1.3.3.3 Chương trình nhận dữ liệu(savle2): 
#include 
#include 
#include 
#include 
#define len_F 3 
#define led PORTC 
#define station 0x01 
#define RXB8 1 
#define TXB8 0 
#define UPE 2 
#define OVR 3 
#define FE 4 
#define UDRE 5 
#define RXC 7 
#define FRAMING_ERROR (1<<FE) 
#define PARITY_ERROR (1<<UPE) 
#define DATA_OVERRUN (1<<OVR) 
 Trang 23 
#define DATA_REGISTER_EMPTY (1<<UDRE) 
#define RX_COMPLETE (1<<RXC) 
char ktra=0,ktra2=0,ch; 
unsigned char index_F,start_F,received; 
unsigned char frame_Rx[100]; 
//unsigned char len_F; 
unsigned char data1,data2,i; 
// USART Receiver buffer 
#define RX_BUFFER_SIZE 8 
char rx_buffer[RX_BUFFER_SIZE]; 
#if RX_BUFFER_SIZE<256 
unsigned char rx_wr_index,rx_rd_index,rx_counter; 
#else 
unsigned int rx_wr_index,rx_rd_index,rx_counter; 
#endif 
// This flag is set on USART Receiver buffer overflow 
bit rx_buffer_overflow; 
// USART Receiver interrupt service routine 
interrupt [USART_RXC] void usart_rx_isr(void) 
{ 
char status,data; 
status=UCSRA; 
data=UDR; 
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) 
 { 
 rx_buffer[rx_wr_index]=data; 
 if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; 
 if (++rx_counter == RX_BUFFER_SIZE) 
 { 
 rx_counter=0; 
 rx_buffer_overflow=1; 
 }; 
 }; 
} 
 Trang 24 
#ifndef _DEBUG_TERMINAL_IO_ 
// Get a character from the USART Receiver buffer 
#define _ALTERNATE_GETCHAR_ 
#pragma used+ 
char getchar(void) 
{ 
char data; 
while (rx_counter==0); 
data=rx_buffer[rx_rd_index]; 
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; 
#asm("cli") 
--rx_counter; 
#asm("sei") 
return data; 
} 
#pragma used- 
#endif 
// USART Transmitter buffer 
#define TX_BUFFER_SIZE 8 
char tx_buffer[TX_BUFFER_SIZE]; 
#if TX_BUFFER_SIZE<256 
unsigned char tx_wr_index,tx_rd_index,tx_counter; 
#else 
unsigned int tx_wr_index,tx_rd_index,tx_counter; 
#endif 
// USART Transmitter interrupt service routine 
interrupt [USART_TXC] void usart_tx_isr(void) 
{ 
if (tx_counter) 
 { 
 --tx_counter; 
 UDR=tx_buffer[tx_rd_index]; 
 if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; 
 }; 
} 
 Trang 25 
#ifndef _DEBUG_TERMINAL_IO_ 
// Write a character to the USART Transmitter buffer 
#define _ALTERNATE_PUTCHAR_ 
#pragma used+ 
void putchar(char c) 
{ 
while (tx_counter == TX_BUFFER_SIZE); 
#asm("cli") 
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) 
 { 
 tx_buffer[tx_wr_index]=c; 
 if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0; 
 ++tx_counter; 
 } 
else 
 UDR=c; 
#asm("sei") 
} 
#pragma used- 
#endif 
#include 
void truyen() 
{ 
 putchar('s'); 
 putchar('t'); 
 putchar(1); 
 putchar(2); 
 delay_ms(100); 
} 
void nhan() 
{ 
 { 
 ch=getchar(); 
 if((index_F>=1)&&(ch=='t')&&(frame_Rx[index_F-1]=='s')) 
 { 
 index_F=0; 
 start_F=1; 
 } 
 Trang 26 
 else 
 frame_Rx[index_F++]=ch; 
 if((start_F)&&(index_F>len_F)) 
 { 
 start_F=0; 
 received=1; 
 } 
 if(index_F>RX_BUFFER_SIZE) 
 { 
 frame_Rx[0]=frame_Rx[index_F-3]; 
 frame_Rx[1]=frame_Rx[index_F-2]; 
 frame_Rx[2]=frame_Rx[index_F-1]; 
 index_F=3; 
 } 
 if((received)&&(frame_Rx[0]==station)) 
 { 
 data1=frame_Rx[1]; 
 data2=frame_Rx[2]; 
 } 
 if(data1==3) 
 { 
 for(i=0;i<10;i++) 
 { 
 led=~led; 
 delay_ms(400); 
 } 
 } 
 } 
} 
void main(void) 
{ 
PORTB=0x00; 
DDRB=0x00; 
PORTC=0x0F; 
DDRC=0x0F; 
PORTD=0x00; 
DDRD=0x00; 
TCCR0=0x00; 
 Trang 27 
TCNT0=0x00; 
TCCR1A=0x00; 
TCCR1B=0x00; 
TCNT1H=0x00; 
TCNT1L=0x00; 
ICR1H=0x00; 
ICR1L=0x00; 
OCR1AH=0x00; 
OCR1AL=0x00; 
OCR1BH=0x00; 
OCR1BL=0x00; 
TCNT2=0x00; 
OCR2=0x00; 
MCUCR=0x00; 
TIMSK=0x00; 
UCSRA=0x00; 
UCSRB=0xD8; 
UCSRC=0x86; 
UBRRH=0x00; 
UBRRL=0x33; 
ACSR=0x80; 
SFIOR=0x00; 
#asm("sei") 
while (1) 
 { 
 if(rx_counter!=0) 
 { 
 nhan(); 
 } 
 else 
 received=0; 
 data1=0; 
 data2=0; 
 }; 
} TÀI LIỆU THAM KHẢO 
            Các file đính kèm theo tài liệu này:
 Truyền thông giữa 3 vi điều khiển (MCU) bằng atmega8.pdf Truyền thông giữa 3 vi điều khiển (MCU) bằng atmega8.pdf