Điều khiển và giám sát toà nhà bằng vi xử lý 89c51

PHẦN I GIỚI THIỆU ĐỀ TÀI Chương I TỔNG QUAN VỀ ĐỀ TÀI ĐIỀU KHIỂN VÀ GIÁM SÁT TOÀ NHÀ BẰNG VI XỬ LÝ 89C51 I. Yêu cầu của đề tài: Trong cuộc sống hiện tại, khoa học kỹ thuật phát triển rất nhanh, những công cụ ra đời sẽ giúp giải phóng sự lao động trí óc: nghiên cứu, cải tiến, sáng tạo. Chỉ tiêu của khoa học kỹ thuật là làm sao nâng cao được chất lượng và hiệu suất công việc, hầu như công nghệ tự động ra đời là đáp ứng nhu cầu đó. Cho nên, em đã nghiên cứu về đề tài “ Điều khiển giám sát nhà cao tầng dùng vi xử lý 89C51 qua mạng RS-485. Các kít vi xử lý này có thể hoạt động hoàn toàn độc lập theo một chương trình lập sẵn. Bên cạnh đó, chúng còn có thể được giám sát và điều khiển các thiết bị trong từng phòng thông qua gởi lệnh đến đúng kít vi xử lý cần điều khiển để thi hành lệnh đó. Ngoài việc điều khiển các thiết bị dùng điện trong phòng, ta còn có thể đảm bảo an ninh cho từng phòng bằng hệ thống phát hiện cháy, phát hiện trộm bằng cảm biến quang. Một chuyên gia về công nghệ nhà thông minh ( Home Automation ) – Kenne P.Wacks – đã viết một bài báo giới thiệu về ngôi nhà thông minh như sau: “ Hơn 6 năm qua, một công nghệ mới gọi là công nghệ nhà thông minh đã được nghiên cứu và phát triển. Công nghệ này sẽ tạo nên một thế hệ mới của các thiết bị cung cấp cho người dùng chúng. Những công nghệ trước đó cùng với khái niệm ngôi nhà thông minh sau này sẽ tạo nên những sản phẩm và loại hình dịch vụ mới mẻ trong tương lai. Một số ít các công ty đang giới thiệu về ngôi nhà tự động. Một vài công ty lớn và các viện nghiện cứu đang thăm dò công nghệ mới nhưng đầy tiềm năng này. Mạng truyền thông trong nhà sẽ cung cấp những cơ sở hạ tầng để liên kết các thiết bị cảm biến, bộ điều khiển và bảng điều khiển trong nhà. Điều này sẽ trở nên khả thi bằng cách tạo ra sự phát triển công nghệ truyền thông trong những ngôi nhà tự động. Trong ngôi nhà thông minh từ “thiết bị” không chỉ đề cập đến các dụng cụ trong nhà bếp, thiết bị video/audio, các hệ thống có thể dịch chuyển , các thiết bị chiếu sáng, thiết bị sưởi ấm, làm lạnh, hệ thống an ninh . Công nghệ này sẽ bật đèn xanh cho các công ty nghiên cứu cho ra đời những sản phẩm và hình thức dịch vụ mới. Các sản phẩm này sẽ có chung điểm tương đồng nào đó hay là những thuộc tính tương tự nhau. Các thuộc tính đó là: ã Vai trò của các thiết bị trong nhà thông minh: hầu hết các thiết bị trong nhà đều có vỏ bằng nhựa hay kim loại. Một vài thiết bị vận hành độc lập với các thiết bị khác. Tuy nhiên cũng có những dụng cụ cần có một thiết bị khác điều khiển nó. Các thiết bị trong ngôi nhà thông minh đều có thể truyền dữ liệu. Ta sẽ nhóm các thiết bị này lại chung một nhóm. Ví dụ: hệ thống an ninh, hệ thống Audio/Video. Trong tương lai các hệ thống này có thể cho phép máy giặt hay máy rửa chén yêu cầu bộ phận nung nóng nước, chuẩn bị nước nóng khi chúng cần đến. ã Sự hợp nhất các chuẩn truyền thông: các thiết bị trong tương lai đều có một chuẩn truyền thông chung, có cùng dây nối đặc biệt. Tiêu chuẩn của ngôi nhà thông minh là sẽ làm nhẹ bớt đi công việc của các nhà sản xuất về việc phải sáng chế ra giao thức truyền thông và cung cấp các đường dây dẫn dữ liệu. ã Yêu cầu của đề tài mà em được giao:  Thiết kế phần cứng mạch báo cháy tự động.  Mạch động lực điều khiển thiết bị dùng điện bằng vi xử lý.  Mạch phát hiện trộm bằng cảm biến: dùng LED hồng ngoại.  Mạch giao tiếp máy tính của từng vi xử lý.  Lập trình giao tiếp bằng ngôn ngữ visual basic. II. Hướng thực hiện đề tài Để thực hiện được phần cứng đảm bảo yêu cầu như trên, em đã thiết kế mạch mô phỏng cảm biến quang phát hiện trộm và cảm biến quang đếm người ra vào phòng. Do mạch cảm biến cháy có giá trị rất cao nên em đã dùng một IC đo nhiệt độ để mô phỏng. Đó là IC nhiệt LM 335. Dùng vi xử lý 89C51 để điều khiển mạch động lực đóng tắt các thiết bị. Chuẩn truyền thông nối tiếp thông dụng hiện nay là RS-232C, tuy nhiên chuẩn truyền thông này chỉ dùng truyền số liệu trên khoảng cách ngắn (15m). Nên để có thể truyền dữ liệu từ kit vi xử lý về máy tính ở khoảng cách xa hơn ta dùng chuẩn RS-485. Để chuyển đổi từ chuẩn RS-232C sang chuẩn RS-485 ta cần phải có một mạch điện chuyển đổi. Sơ đồ khối mạch chuyển đổi như sau: Kit vi xử lý em thiết kế có những chức năng sau: ã Đo nhiệt độ hiện tại trong phòng hiển thị lên LED 7 đoạn, ngoài chức năng đo nhiệt độ, mạch này còn thay thế cho cảm biến cháy. Khi nhiệt độ trên IC LM335 tăng lên, tùy theo từng mức được lập sẵn trong chương trình mà nó sẽ báo chuông, hay sẽ gởi dữ liệu về máy tính để cho biết trạng thái hiện tại trong phòng theo giao thức truyền dữ liệu theo kiểu hỏi vòng. ã Ngoài ra, mạch còn có chức năng đếm số người đi ra hay vào phòng. Trong phòng để đảm bảo tính tự động hoàn toàn sẽ không có công tắc điện của những thiết bị mà vi xử lý có thể điều khiển. Nếu số người trong phòng lớn hơn hay bằng 1 thì vi xử lý sẽ gởi một tín hiệu đến mạch động lực kích đóng các thiết bị như quạt, máy lạnh, đèn. Nếu người trong phòng là không thì vi xử lý sẽ gởi một tín hiệu đến mạch động lực tắt các thiết bị trong phòng. Tuy nhiên, trên mạch có hai nút nhấn hay một số nút nhấn để người trong phòng có thể điều khiển có tín hiệu hồi tiếp về cho nên vi xử lý sẽ nhận biết các thiết bị đó đang đóng hay mở. Khi người dùng nhấn nút tương ứng thì tùy vào trạng thái của thiết bị mà vi xử lý sẽ kích đóng hay ngắt thiết bị đó. Phần này sẽ làm cho mạch được linh động, không tuân theo chương trình phần mềm cài sẵn một cách cứng ngắt. ã Giả sử khi nhiệt độ ngoài trời giảm xuống khoảng 15oC thì cũng không cần bật máy lạnh làm gì . Tuy nhiên, vi xử lý cứ nhận thấy có người trong phòng là nó sẽ đóng nguồn cho máy lạnh hoạt động. Người trong phòng có thể tắt máy lạnh bằng nút nhấn trên mạch vi xử lý. Ta có thể khắc phục được nhược điểm này bằng cách viết chương trình cho vi xử lý so sánh nhiệt độ hiện tại trong phòng với nhiệt độ chuẩn ( 15oC chẳng hạn ). Nếu nhiệt độ đo được bé hơn 15oC thì sẽ tắt máy lạnh đi. Do mạch sử dụng ADC 0809 sai số tương đối không nhiều, tuy nhiên do mạch gia công tín hiệu ra của IC nhiệt LM335 cho nên nhiệt độ càng thấp thì áp ra càng nhỏ và ADC sẽ đổi ra sai số tương đối cao. Sai số này là do mạch gia công gây ra đồng thời cộng thêm sai số của chính bản thân ADC 0809. Cho nên không đảm bảo rằng mạch hoạt động đúng như thiết kế ở nhiệt độ nhỏ hơn 15oC. ã Mạch cảm biến quang dùng để phát hiện trộm đặt ở những thiết bị hay dụng cụ cần gìn giữ. III. Vấn đề kết nối mạng Thuật ngữ mạng đã trở nên rất quen thuộc khi mạng thông tin Internet ngày càng trở nên rất gần gũi với con người chúng ta. Nếu quản lý thiết bị trong phòng theo phương pháp thông thường sẽ không kinh tế và tiết kiệm. Ta cần phải làm sao để tiết kiệm cho được càng nhiều càng tốt. Cho nên để tránh lãng phí ta nên điều khiển các thiết bị bằng máy tính. Chỉ cần một nhân viên cũng có thể tắt hay mở thiết bị trong từng phòng. Nếu ta tắt các thiết bị bằng tay thì sẽ không kinh tế, khi khách ra khỏi phòng mà quên tắt các thiết bị thì sẽ lãng phí rất nhiều năng lượng điện. Tiết kiệm được phần năng lượng hao phí đó ta sẽ giúp cho việc giảm giá thành khi kinh doanh cho thuê phòng chẳng hạn. Máy tính có khả năng đóng tắt các thiết bị thông qua vi xử lý, đồng lưu trữ trạng thái các thiết bị trước đó.

doc110 trang | Chia sẻ: lvcdongnoi | Lượt xem: 5453 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Điều khiển và giám sát toà nhà bằng vi xử lý 89c51, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
n trên cáp sợi quang có thể đạt tốc độ 2Gb/s và cho phép khoảng cách truyền khá xa do độ suy hao tín hiệu trên cáp rất thấp. Ngoài ra do tín hiệu truyền là dạng quang nên nó không bị ảnh hưởng bởi nhiễu điện từ và các hiệu ứng điện khác. Hơn nữa, tín hiệu truyền trên cáp sợi quang có độ bảo mật rất cao. Tuy nhiên cáp sợi quang có nhược điểm là khó lắp đặt và giá thành còn tương đối cao. b. Phương tiện vô tuyến: Radio: Radio chiếm dải tần từ 10KHz đến 1GHz, trong đó có các băng tần quen thuộc như: Sóng ngắn. VHF ( Very High Frequency ) : Dùng cho truyền hình và FM radio. UHF ( Ultra High Frequency ) : Dùng cho truyền hình. Các phương thức truyền theo tần số radio là : Công suất thấp tần số đơn, công suất cao tần số đơn và trải phổ. Viba (Microwave ): Có hai dạng truyền thông vi ba là mặt đất và vệ tinh. Các hệ thống vi ba mặt đất thường hoạt động ở băng tần 4-6GHz và 21-23GHz, tốc độ truyền dữ liệu từ 1-10Mb/s Các hệ thống tia hồng ngoại (Iinfrared System ): Các mạng điểm – điểm hoạt động bằng cách chuyển các tín hiệu hồng ngoại từ một thiết bị tới một thiết bị kế tiếp, dải tần hoạt động là 100GHz đến 1000GHz với tốc độ khoảng 100Kb/s đến 16b/s. Các mạng quãng bá hồng ngoại cũng có dải tần như trên nhưng có tốc độ truyền thực tế chỉ đạt dưới 1Mb/s. 2. Thiết bị mạng: Các bộ giao tiếp mạng: Các bộ giao tiếp mạng có thể được thiết kế ngay trong Mainboard của máy tính hoặc ở dạng các tấm giao tiếp mạng ( Network Interface Card- NIC ) hoặc là các bộ thích nghi đường truyền. Một NIC có thể được cài đặt vào một khe cắm (slot ) của máy tính . Đây là loại thiết bị thông dụng nhất để nối máy tính với mạng. Trong NIC có bộ thu phát với một số kiểu đầu nối. Bộ thu phát chuyển đổi các tín hiệu bên trong máy tính thành các tín hiệu mà mạng đòi hỏi và cũng biến đổi ngược lại các tín hiệu truyền trên mạng thành các tín hiệu mà máy tính có thể làm việc được. Bộ thích nghi đường truyền là thiết bị có chức năng làm thích nghi một kiểu đầu nối nào đó trên máy tính với một kiểu đầu nối khác mà mạng đòi hỏi. Có các bộ thích nghi đường truyền như là: transceiver, media filter, parallel port adapter, SCSI port adapter. Hub ( bộ tập trung ): Hub là bộ chia hay còn gọi là bộ tập trung ( concentrators) dùng để đấu mạng. Có các loại Hub như sau: Passive Hub, Active Hub, và Intelligent Hub. Repeater ( bộ chuyển tiếp ): Repeater có chức năng tiếp nhận và chuyển tiếp các tín hiệu dữ liệu thường được dùng nối hai đoạn cáp mạng Ethernet ( để mở rộng mạng). Một số repeater chỉ có chức năng đơn giản là khuếch đại tín hiệu. Tuy nhiên lúc đó mọi tiếng ồn trên mạng cũng bị khuếch đại theo. Ngoài ra nếu tín hiệu gốc đã bị nhiễu thì repeater này cũng khuếch đại luôn nhiễu. Các loại repeater tiên tiến hơn có thể mở rộng phạm vi của đường truyền mạng bằng hai cách: khuếch đại và tái sinh tín hiệu. Chúng định danh dữ liệu trong tín hiệu nhận và dùng dữ liệu đó để tái sinh tín hiệu gốc. Bridge ( Cầu ): Bridge là một thiết bị mềm dẻo hơn rất nhiều so với repeater. Một repeater chuyển đi tất cả các tín hiệu mà nó nhận được. Còn Bridge thì có chọn lọc và chỉ chuyển đi các tín hiệu có đích ở phần mạng phía bên kia. Multiplexor (bộ dồn kênh ): Multiplexor là thiết bị có chức năng tổ hợp một số tín hiệu để chúng có thể được truyền với nhau và sau đó khi nhận lại được tách ra trở thành tín hiệu gốc. Modem: Modem ( Modulation/ demodulation ) là thiết bị có chức năng chuyển đổi tín hiệu số thành tín hiệu analog và ngược lại để kết nối các máy tính qua đường điện thoại. Modem cho phép trao đổi thư điện tử, truyền tệp và trao đổi dữ liệu theo yêu cầu. Tuy nhiên modem không phải là thiết bị liên mạng nên nó không thể nối kết các mạng ở xa với nhau. Để khắc phục điều này ta có thể kết hợp với router để nối kết các mạng qua mạng điện thoại chuyển mạch công cộng. Router : Router ( bộ chọn đường ) là thiết bị có chức năng tương tự như bridge, tuy nhiên nó đa năng hơn bridge vì có thể thực hiện các giải thuật chọn đường đi tối ưu theo một chỉ tiêu nào đó. B. Giao tiếp nối tiếp: Những thiết bị thực hiện việc giao tiếp bao gồm hai loại là : DCE ( Data Communications Equipment ) và DTE ( Data Terminal Equipment ). DTE ( còn gọi là thiết bị đầu cuối dữ liệu ) là một thuật ngữ chung để chỉ các máy của người sử dụng cuối, chúng có thể là máy tính hoặc một trạm cuối (terminal ). Như vậy tất cả các ứng dụng của người sử dụng điều nằm ở DTE. Mục đích của mạng máy tính chính là để nối các DTE lại cho phép chúng phân chia tài nguyên, trao đổi dữ liệu và lưu trữ thông tin dùng chung. DCE ( còn gọi là thiết bị cuối kênh dữ liệu ) là thuật ngữ chung dùng để chỉ các thiết bị nối các DTE với các đường ( mạng) truyền thông. Nó có thể là một Modem, Transducer, Multiplex…DCE có thể được cài đặt ngay bên trong DTE hoặc đứng riêng như một thiết bị độc lập. Chức năng chính của DCE là chuyển đổi tín hiệu biểu diễn dữ liệu của người sử dụng thành dạng tín hiệu chấp nhận được bởi đường truyền và ngược lại. Việc truyền dữ liệu, chủ yếu được thực hiện thông qua mạng điện thoại, phải tuân theo những nguyên tắc nhất định, và thường là dùng các chuẩn truyền được quốc tế hóa. Có nhiều chuẩn truyền thông khác nhau, trong đó có các chuẩn thuộc họ RS- ( ngày nay đã đổi thành họ EIA- ) của EIA ( Electronics Industries Association ) được sử dụng rất phổ biến là: RS-232C, RS-422A, RS-423, RS-485. Chúng ta sẽ lần lượt khảo sát từng chuẩn trên. I. Đặc điểm của các chuẩn truyền thông RS-232C, RS-422A, RS-485: Thông số RS-232C RS-422 RS-423 RS-485 Chiều dài cáp Length (max) 15m (50 ft) 1.2km (4000ft ) 1.2km (4000ft) 1.2km (4000ft) Baud rate (Tốc độ Baud) 20Kbs/15m 10M bs/12m 1Mbs/120m 100Kbs/1.2km 100Kbs/9m 10Kbs/90m 1Kbs/1.2km 10Mbs/12m 1Mbs/120m 100Kbs/1.2km Mode Unbalanced Balanced Differential Balanced Differential Balanced Differential Driver No. 1 1 1 32 Receiver 1 10 10 32 Logic 0 +3V->+25V +2V->+5V +3.6V->+6V +1.5V->+5V Logic 1 -3V ->-25V -2V-> -5V -3.6V ->-6V -1.5V ->-5V Community 2V 1.8V 3.4V 1.3V Cable/signal 1 2 2 2 Methode Simplex Simplex Simplex Simplex Phương thức Half-duplex Full-duplex Half-duplex Full-duplex Half-duplex Full-duplex Half-duplex Full-duplex Short circuit current 500mA 150 mA 150mA 150mA 1. Chuẩn RS-232C : Là chuẩn của EIA nhằm định nghĩa giao diện vật lý giữa DTE và DCE (ví dụ như giữa một máy tính và một modem ). Chuẩn này sử dụng đầu nối 25 chân, tuy nhiên chỉ có một số ít chân là thực sự cần thiết cho việc liên kết. Về phương diện điện , chuẩn này quy định các mức logic 0 và 1 tương ứng với các điện thế nhỏ hơn -3V và lớn hơn +3V. Tốc độ đường truyền không được vượt quá 20Kbs và khoảng cách nhỏ hơn 15m. Chuẩn RS-232C có thể chấp nhận phương thức truyền song công ( full-duplex ). Một trong những yêu cầu quan trọng của RS-232C là thời gian chuyển từ mức logic này sang mức logic khác không vượt quá 4% thời gian tồn tại của một bit. Giả sử với tốc độ truyền 19200 baud thì thời gian chuyển mức logic phải nhỏ hơn 0.04/19200 = 2.1ms. Điều này làm giới hạn chiều dài đường truyền. Với tốc độ 19200baud ta có thể truyền xa nhất là 50ft (15.24m ). Một trong những vấn đề quan trọng cần chú ý là khi sử dụng RS-232C là mạch thu phát không cân bằng ( đơn cực ), tức là tín hiệu vào và ra được so với đất. 2. Chuẩn RS-422A: Một cải tiến quan trọng của chuẩn RS-232C là chuẩn RS-422A. Chuẩn này sử dụng việc truyền dữ liệu sai lệch differential data ) trên những đường truyền cân bằng. Một dữ liệu sai lệch cần hai dây, một cho dữ liệu không đảo (non-inverted) và một đường cho dữ liệu đảo (inverted). Dữ liệu được truyền trên đường dây cân bằng, thường là cặp dây xoắn với một trở ở đầu cuối. Một IC lái (driver) sẽ biến đổi các mức logic thông thường thành một cặp tín hiệu sai lệch để truyền. Bên nhận sẽ có một mạch chuyển đổi tín hiệu sai lệch thành các mức logic tương ứng. Các IC lái RS-422A hầu hết hoạt động với nguồn +5V như các chip logic khác. Với chuẩn mới này, tốc độ cũng như khoảng cách truyền được cải thiện rất nhiều. 3. Chuẩn RS-485 : Giao tiếp EIA RS-485 là một cải tiến của chuẩn RS-422A. Đặc tính điện của nó giống như chuẩn RS-422A. RS-485 là chuẩn truyền vi sai, sử dụng hai dây cân bằng. Với RS-485 tốc độ truyền có thể đạt đến 10Mbs và chiều dài cáp có thể lên đến 1.2km. Điện áp vi sai ngõ ra từ +1.5V-> +5V nếu là logic mức 0 và mức logic 1 sẽ là từ -1.5V-> -5V. Một đặc điểm quan trọng của RS-485 là có thể cung cấp đến 32 drivers và receivers trên cùng một đường truyền. Điều này cho phép tạo thành một mạng cục bộ. Để có khả năng như vậy, ngõ ra driver RS-485 phải là ngõ ra 3 trạng thái. Và do đó một slave sẽ ở trạng thái tổng trở cao khi nó không được chọn để giao tiếp cùng với master. Chỉ có một trạm được chọn làm master, các trạm còn lại đều là slave. Master được quyền truyền bất cứ lúc nào, nó sẽ chỉ định một slave bất kì giao tiếp với nó. Slave chỉ có thể truyền sau khi nhận được lệnh của master. Mọi slave có một địa chỉ riêng trên đường truyền và sẽ không được phép truyền nếu không có yêu cầu từ master. II. Các phương thức truyền thông: Có 3 phương pháp truyền được dùng trong mục đích truyền thông tin: Đơn công, bán song công, và song công. Ta sẽ lần lượt khảo sát các phương pháp truyền trên. Đơn công: Đường truyền đơn công có khả năng truyền dữ liệu chỉ theo một hướng. Nguyên nhân không phải do tính chất của đường dây đơn giản chỉ vì một đầu cuối chỉ có một máy phát và đầu cuối kia cũng chỉ có một máy thu. Cấu hình này ít được sử dụng trong các máy tính vì không có cách nào để máy thu phát tín hiệu nhận biết tới máy phát cho biết thông điệp đã nhận đúng. Phát thanh và truyền hình là một trong những thí dụ về đơn công. Bán song công(Half-duplex Communication): Đường truyền bán song công có thể phát và nhận dữ liệu theo cả hai hướng không đồng thời. Trong suốt một cuộc truyền, một modem là máy phát và modem còn lại sẽ là máy thu. Ví dụ như một thiết bị A là máy phát gởi dữ liệu đến thiết bị B là máy thu, sau đó A và B đổi vai trò cho nhau, B là máy phát gởi tín hiệu báo dữ liệu nhận được có lỗi hay không đến máy thu A. Nếu không có lỗi thì A và B sẽ lại đổi vai trò cho nhau và A tiếp tục gởi dữ liệu đến máy thu B. Nếu máy thu B báo dữ liệu có lỗi thì máy phát A sẽ gởi lại dữ liệu cũ cho đến khi B báo là dữ liệu không có lỗi. Nhược điểm của phương pháp này là thời gian cần để chuyển đường truyền bán song công từ hướng này sang hướng khác có thể dài gấp nhiều lần thời gian truyền một kí tự. Sự chuyển động của xe trên đường ray là một thí dụ về phương pháp này. Song công ( Full-duplex Communication): Ngược lại so với truyền bán song công, đường truyền song công có khả năng phát và nhận dữ liệu đồng thời theo cả hai hướng. Một cách khái quát, đường truyền song công tương đương với 2 đường truyền đơn công, một đường cho mỗi hướng. Vì hai đường truyền có thể tiến hành song song, một đường cho mỗi hướng, nên truyền song công có thể phát nhiều thông tin hơn truyền bán song công với cùng tốc độ truyền dữ liệu. Truyền song công không mất thời gian để thay đổi hướng truyền. III. Truyền thông tuần tự: Hầu hết các máy tính lưu trữ dữ liệu và thao tác dữ liệu theo cách song song. Nghĩa là khi gởi một byte từ bộ nhận này tới bộ nhận khác của máy tính, nó không truyền từng bit một mà một lúc một byte trên những cáp sợi song song nhau. Số các bit truyền đi cùng một lúc thay đổi tùy thuộc vào từng máy tính nhưng thông thường là 8 hoặc bội của 8. Tuy nhiên việc truyền dữ liệu từ máy tính này đến máy tính hay một thiết bị khác thì xảy ra theo kiểu tuần tự, nghĩa là dữ liệu được gởi đi từng bit một. Một bộ giao tiếp tuần tự sẽ đảm nhận nhiệm vụ chuyển đổi dữ liệu từ song song sang nối tiếp trước khi chúng gởi đi hoặc đổi từ nối tiếp sang song song khi chúng nhận về. Có hai hình thức truyền thông tuần tự: truyền thông đồng bộ và không đồng bộ. Truyền thông bất đồng bộ ( Asynchronous communication): Khoảng thời gian giữa hai kí tự truyền đi không cố định, mặc dù khoảng thời gian giữa hai bit liên tiếp trong một kí tự là không thay đổi nhưng khoảng thời gian giữa hai kí tự liên tiếp không phải là hằng số. Sự biến thiên tốc độ này làm nảy sinh vấn đề là phải làm sao máy thu phân biệt được giữa bit 0 và không có dữ liệu. Để giải quyết vấn đề trên , người ta phát trực tiếp một bit start ngay trước một kí tự và một hoặc hai stop bit ngay sau mỗi kí tự được truyền đi. Để kiểm tra lỗi đường truyền, người ta sử dụng bit chẵn lẻ( parity bit), tức kiểm tra tổng số bit trong 1 byte dữ liệu được truyền. Phương thức này thường được sử dụng trong các máy tính PC vì tính đơn giản của nó. Hạn chế của phương pháp này là tốc độ truyền thấp do phải truyền thêm một số bit start, bit stop và bit parity. Truyền thông đồng bộ ( Synchronous Communications): Phương thức truyền này không dùng các bit start, stop để đóng khung mỗi kí tự mà chèn các kí tự đặc biệt như SYN ( Synchronization), EOT (End Of Transmission) hoặc một cờ giữa các dữ liệu của người sử dụng để báo hiệu cho bên nhận biết rằng có dữ liệu đang đến hay đã đến. Truyền đồng bộ thường được tiến hành ở tốc độ dưới 4800Bps,9600Bps hoặc thậm chí còn cao hơn. Trong phương pháp này, một khi đã đồng bộ, các modem vẫn tiếp tục gởi các kí tự để duy trì đồng bộ, ngay cả lúc không phát dữ liệu. Một kí tự “idle” được gởi đi khi không có dữ liệu phát. Trong phương pháp truyền đồng bộ không giống như phương pháp truyền bất đồng bộ, khoảng thời gian giữa hai kí tự luôn bằng nhau. Truyền thông đồng bộ đòi hỏi các xung clock trong máy phát và thu phải duy trì đồng bộ những khoảng thời gian dài. Thời gian truyền có thể tiếp tục lâu mà không có sự tái đồng bộ của máy thu với pha của máy phát tùy thuộc vào sự ổn định của xung clock. Chương II GIAO TIẾP MÁY TÍNH VỚI VI XỬ LÝ Điều khiển thu phát dữ liệu qua cổng Com: Máy tính và ngoại vi muốn liên kết được với nhau cần phải được kết nối với nhau theo một chuẩn nhất định. Có nhiều kiểu kết nối ngoại vi với máy tính, trong đó các cách thường dùng là gắn vào slot trên Mainboard, qua cổng máy in và thông qua cổng nối tiếp( cổng Com). Mỗi kiểu đều có nhiều ưu và khuyết điểm khác nhau, tùy theo yêu cầu mà ta có thể chọn những phương cách khác nhau. Cổng nối tiếp được sử dụng cho việc truyền tín hiệu theo dạng nối tiếp. Cổng nối tiếp truyền mức logic 1 ở tầm điện áp từ –3V đến –25V và mức logic 0 là từ +3V đến +25V. Trong khi đó, với cổng song song, mức logic 0 là 0V logic 1 là +5V. Vì vậy cổng nối tiếp có thể có mức chênh lệch điện áp tối đa là 50V so với 5V của cổng song song và do đó vấn đề điện áp rơi trên đường dây ở đường truyền nối tiếp không nghiêm trọng hơn so với đường truyền song song. Do đó truyền tín hiệu theo kiểu nối tiếp không bị ảnh hưởng nhiễu nhiều như kiểu cổng song song. Giao tiếp nối tiếp chỉ sử dụng 3 đường dây cho TXD, RXD và GND và do đó yêu cầu cho thiết bị giao tiếp với nó có ít chân hơn so với 19 hay 25 dây trong việc giao tiếp song song và yêu cầu ít nhất là 9 chân cho giao tiếp nối tiếp,điều này làm phức tạp thêm công nghệ chế tạo và giá thành sản xuất đối với các thiết bị giao tiếp song song. Giới thiệu cổng nối tiếp RS-232C: Cổng giao RS-232C là giao diện phổ biến rộng rãi nhất. Giống như cổng máy in, cổng nối tiếp RS-232C được sử dụng mức cách thuận tiện cho mục đích đo lường và điều khiển. Việc truyền dữ liệu qua cổng RS-232C được tiến hành theo cách nối tiếp, nghĩa là các bit dữ liệu được gởi đi nối tiếp nhau trên cùng mức đường truyền dẫn. Cổng nối tiếp RS-232C không phải là một hệ thống bus, nó cho phép dễ dàng tạo ra liên kết dưới hình thức điểm-điểm giữa hai máy tính cần trao đổi thông tin với nhau. Một thành viên thứ 3 không thể tham gia vào cuộc trao đổi này. Mức logic 0 sẽ nằm giữa +3V-> +25v. Mức logic 1 từ -3V -> -25V. Khoảng từ –3V -> +3V là trạng thái mặc định. Điện áp hở mạch phải nhỏ hơn 25V. Dòng ngắn mạch không vượt quá 500mA. Có hai loại Jack cắm nối tiếp RS-232C là loại 9 chân và 25 chân. Chúng khác với cổng máy in ở chỗ cổng máy in là loại ổ cắm còn đây là Jack nhiều chân. Các Jack cắm RS-232C có tổng cộng 8 đường dẫn chưa kể đường nối đất. Việc truyền dữ liệu xảy ra ở trên hai đường dây TXD và RXD. Máy tính nhận dữ liệu từ các thiết bị khác thông qua đường TXD và nó dùng đường RXD để truyền dữ liệu đến các thiết bị kia. 9 chân 25 chân Chức năng 1 8 DCD- data Carrier Detect (In) 2 3 RXD- Receive data (In) 3 2 TXD-Transmit Data (Out) 4 20 DTR – Data Terminal Ready(Out) 5 7 GND-Ground(Mass) 6 6 DSR-Data Set Ready (In) 7 4 RTS- Request to Send(Out) 8 5 CTS- Clear To Send (In) 9 22 RI- Ring Indicator(In) Ký hiệu Tên Chức năng TD Transmit data Đường truyền dữ liệu RD Receive Data Đường nhân dữ liệu CTS Clear To Send Báo modem đã sẵn sàng cho việc trao đổi dữ liệu DCD Data Carrier detect DCD sẽ tích cực khi modem nhận được dữ liệu. DSR Data Set Ready Báo cho UART là modem đã sẵn sàng cho việc thiết lập đường truyền. TDR Data Terminal Ready Báo cho modem biết là UART đã sẵn sàng cho việc kết nối. RTS Request To Send Thông báo cho modem biết là UART đã sẵn sàng cho việc truyền nhận dữ liệu. RI Ring Indicator Lên mức tích cực khi modem nhận được tín hiệu. Bảng chức năng các chân trong RS-232C . Name Address IRQ Name Address IRQ COM1 3F8 4 COM 3 3E8 4 COM 2 2F8 3 COM 4 2E8 3 Bảng địa chỉ các cổng. Việc truyền dữ liệu giữa máy tính và ngoại vi được điều khiển bởi các bộ điều khiển thu phát đồng bộ hay bất đồng bộ. II. Chip thu phát bất đồng bộ-Vi mạch UART (Universal Asynchronous Receiver) 8250A/16450: Tổng quan: Vi mạch 8250A của Intel là một UART được dùng rất rộng rãi.UART 8250A có các chức năng sau: _ Biến đổi dữ liệu song song từ CPU thành dạng nối tiếp để truyền đi đồng thời thu dòng dữ liệu nối tiếp, đổi chúng thành dữ liệu dạng song song và gởi chúng đến CPU. _ Thêm các bit start, stop và parity vào từng kí tự trước khi phát đi và tách các bit này ra khỏi kí tự nhận được. _ Bảo đảm các bit dữ liệu được truyền đi với tốc độ được lập trình trước, kiểm tra để phát hiện lỗi. _ Set tín hiệu bắt tay phần cứng và cho biết trạng thái của tín hiệu. Các thanh ghi UART: _ Thanh ghi điều khiển đường truyền (Line Control Register – LCR): Dùng đặt các thông số truyền. _ Thanh ghi điều khiển Modem(Modem Control Register- MCR): Điều khiển tín hiệu bắt tay từ UART. _ Thanh ghi cho phép ngắt( Interrput Enable Register-IER): Thanh ghi này cho phép/cấm các nguyên nhân gây ngắt khác nhau tương ứng với các bit trong thanh ghi. Các bit của thanh ghi này ở mức 1 là cho phép, mức 0 là cấm ngắt. -_ Thanh ghi trạng thái( Status Register –SR):Thông báo cho CPU biết trạng thái hoạt động của UART: _ Thanh ghi trạng thái đường truyền (Line Status Register-LSR): Chứa thông tin về truy xuất dữ liệu. _ Thanh ghi trạng thái modem( Modem Status Register-MSR): Chứa thông tin liên quan về trạng thái của những đường truyền bắt tay. _ Thanh ghi định danh ngắt( Interrupt Identification Register-IIR): Thanh ghi nhận dạng nguồn ngắt là một thanh ghi chỉ đọc ( read only). Trạng thái các bit trong thanh ghi này sẽ thay đổi khi có sự thay đổi trạng thái của các thanh ghi khác trong UART. CPU sẽ đọc bit IR0 để xem có yêu cầu ngắt hay không và kiểm tra nguồn ngắt từ các bit IR1-IR0. Các vi mạch UARTS: 8250: Là vi mạch UART đầu tiên. 8250A là phiên bản cải tiến hơn của 8250 với tốc độ được cải tiến nhiều. 8250A: Tốc độ nhanh hơn so với 8250, có cùng chức năng như 16450. 16450: Cải tiến của 8250, hoạt động tốt ở tốc độ 38.4bps, hiện này vẫn còn được sử dụng rộng rãi. 16550: Là thế hệ đầu tiên của họ UART có buffer. Có hai loại buffer. Tuy nhiên 16550 không được sử dụng nhiều và bị thay thế bởi 16550A. 16550A: Là vi mạch UART thông dụng nhất sử dụng cho mục đích giao tiếp với tốc độ cao như 14.4k và 28.8k modem . 16650/16750: Thuộc UART thế hệ mới chứa 32/64 byte FIFO, hỗ trợ Power management. III .Truyền nhận dữ liệu qua cổng nối tiếp: Việc truyền nhận dữ liệu qua cổng nối tiếp được thực hiện bởi UART. Nguyên tắc chip UART hoạt động cho việc truyền và nhận một kí tự như sau: Để truyền một kí tự, đầu tiên kí tự đó sẽ được đưa vào thanh ghi đợi truyền ( Transmit Holding Register), sau đó được đưa vào thanh ghi dịch của bộ phát ( Transmit Shift Register). Sau khi kí tự trước đã được truyền xong, từng bit của kí tự được truyền sẽ được dịch vào kênh dữ liệu. Khi nhận một kí tự, đầu tiên các bit của nó lần lượt được nạp vào thanh ghi dữ liệu của bộ thu( Receive Shift Register ), sau đó chúng được đưa vào thanh ghi dữ liệu của bộ thu ( Receive Data Register ) sau khi đã loại bỏ các bit start, stop và parity. X Thu phát dữ liệu : Có hai phương pháp để thu phát dữ liệu qua UART. Phương pháp thứ nhất là phương pháp hỏi vòng để chờ dữ liệu được phát xong hoặc nhận xong. Phương pháp thứ hai là phương pháp tạo ra một trình điều khiển ngắt. Phương pháp hỏi vòng chậm hơn nhiều so với phương pháp kia. Tốc độ cao nhất có thể đạt của phương pháp hỏi vòng là 34.8Kbps trong khi phương pháp tạo ngắt có thể đạt được tốc độ 115,2Kbps. Ơ đây ta chọn phương pháp hỏi vòng để điều khiển việc thu phát dữ liệu. X Để phát một kí tự: Với phương pháp hỏi vòng UART, khi gởi một kí tự ta phải kiểm tra xem thanh ghi đợi truyền có rỗng không bằng cách xem bit 6 của LCR có bằng 1 hay không . X Để thu một kí tự: để biết khi nào kí tự thu vào hay chưa ta kiểm tra bit 0 của thanh ghi LCR. Nếu nó bằng 1 thì đã có 1 kí tự được nhận vào. Chương III : CHƯƠNG TRÌNH TRUYỀN THÔNG BẰNG NGÔN NGỮ VISUAL BASIC 6.0 I. Tổng quan về Visual Basic : Visual Basic là ngôn ngữ lập trình trên môi trường Windows ra đời sớm nhất, và đã thực sự tạo nên một cuộc cách mạng trong công nghệ phần mềm .cho nên khi phát hành Visual Basic 1.0 vào năm 1991, ông Bill Gates, chủ tịch hãng Microsoft đã gọi Visual Basic là một sản phẩm “đáng nể”, còn các nhân vật nổi tiếng khác trong giới công nghệ phần mềm cũng không tiếc lời khen ngợi công cụ lập trình trực quan này. Nếu đã từng cảm thấy thực sự thích thú khi chuyển từ việc sử dụng hệ điều hành MS-DOS sang Windows thì ta cũng dễ hiểu những lời khen ngợi này. Trước đây, khi làm việc trong môi trường DOS, không ít người đã cảm thấy thực sự khó khăn với việc phải nhớ những câu lệnh để nhập vào từ dấu nhắc DOS. Windows đã giải quyết khó khăn này cho người dùng bằng cách sử dụng một giao diện đồ họa với những nút lệnh, hộp thoại chuẩn, các menu để chọn lựa…Tuy nhiên trước khi Visual Basic ra đời thì để tạo được một ứng dụng trong Windows, các lập trình viên sử dụng C phải tốn rất nhiều công sức dành cho việc tạo giao diện cho chương trình. Chỉ có việc tạo một nút lệnh không thôi đã cần phải dùng đến hàng trăm dòng ma. Với VisualBasic, công việc tạo giao diện đã trở nên dễ dàng hơn bao giờ hết. Chỉ với một vài thao tác click – drag đơn giản, ta đã có thể bổ sung vào các cửa sổ còn trống các lệnh đơn, các hộp văn bản, các nút lệnh, các nút tùy chọn, các nhãn, các hộp kiểm…Sau khi tạo giao diện thì công việc của ta chỉ là viết mã cho các đối tượng này (gọi là các điều khiển : Control). Như vậy, có thể nói, với Visual Basic công việc tạo giao diện đồ họa cho ứng dụng đã được Visual Basic đảm nhận. Visual Basic cho phép ứng dụng tạo ra liên kết với các ứng dụng Windows khác rất dễ dàng, cho phép dễ dàng tạo ra các ứng dụng thiên về quản lý dữ liệu và mạng. Visual Basic cho phép người sử dụng giao tiếp với thư viện liên kết động DLL. Điều này giúp giảm kích cỡ chương trình, tập tin thực thi và đặc biệt là làm cho chương trình có khả năng được nâng cấp dễ dàng hơn. Visual Basic còn cung cấp một số phương pháp bẫy lỗi trong ứng dụng. Đây là một công cụ rất mạnh của Visual Basic. II. Truyền thông nối tiếp dùng visual basic: Do sự phát triển ngày càng tăng của các ứng dụng truyền thông qua cổng nối tiếp ,từ phiên bản 4.0 của Visual Basic ,điều khiển truyền thông đã được hoàn chỉnh để sử dụng cho việc lập trình ghép nối máy tính qua cổng nối tiếp .Trong phần này ta sẽ tìm hiểu về điều khiển này . 1. Điều khiển truyền thông: Bình thường khi chạy phần mềm Visual Basic ta chỉ thấy có một số thành phần quen thuộc trên hộp công cụ (toolbox) .Nhưng Visual Basic cho phép nhiều thành phần có thể được bổ sung thêm vào .Điều khiển truyền thông Mscomm của Visual Basic là một trong số các đối tượng có thể được bổ sung để tham gia vào một số ứng dụng cần việc chuyển nhận dữ liệu qua cổng nối tiếp . Trong Visual Basic 5.0 và 6.0 ta có thể bổ sung thành phần Mscomm đề cập ở trên như sau : Chọn Project => Components (Ctrl – T) ,cửa sổ sau sẽ xuất hiện. Điều khiển truyền thông cung cấp hai khả năng để trao đổi thông tin : Điều khiển sự kiện : Truyền thông điều khiển sự kiện là phương pháp tốt nhất được sử dụng trong quá trình điều khiển việc trao đổi thông tin nối tiếp khi nó giải phóng máy tính để làm các công việc khác .Trong nhiều tình huống, ta cần được thông báo về sự thay đổi. Thí dụ như ta cần biết khi có ký tự gửi đến hoặc sự thay đổi xảy ra trên đường DCD (Data Carrier Detect ) hoặc đường RTS (Request To Send). Để làm điều đó ta sẽ sử dụng sự kiện truyền thông OnComm để bẫy và điều khiển các sự kiện. Điều khiển truyền thông còn phát hiện và điều khiển các lỗi truyền thông. Hỏi Vòng (Polling): Ta cũng có thể hỏi vòng các sự kiện và lỗi bằng cách kiểm tra giá trị của đặc tính ComEvent sau mỗi chu kỳ của chương trình để xác định xem liệu một sự kiện hoặc một lỗi đã xuất hiện. Chẳng hạn, chương trình có thể tạo vòng lặp để chờ một ký tự cần được nhận. Cứ mỗi lần như vậy, ký tự được đọc từ bộ đệm nhận. Thông thường phương pháp này được sử dụng khi chương trình có thời gian để tiến hành hỏi vòng bộ nhận thông tin, hay nói cách khác là trong các ứng dụng không lớn. Visual Basic sử dụng các bộ điều khiển cửa sổ chuẩn cho các cổng truyền tin nối tiếp (như serialui.dll và serial.vxd ). Điều khiển truyền thông được bổ sung cho ứng dụng của một cổng nối tiếp, nói khác đi mỗi điều khiển truyền thông mà ta dùng chỉ có thể điều khiển một cổng nối tiếp. Nếu cần truy nhập nhiều cổng trong ứng dụng thì ta phải dùng nhiều điều khiển truyền thông. Địa chỉ cổng và địa chỉ ngắt có thể thay đổi nhờ Control Panel trong Windows .Các tham số (như tốc độ truyền theo bit ,chẵn lẻ ,…) đều có thể được thay đổi bằng cách lựa chọn: Control Panel => System => Device Manager => Port (COM và LPT) =>Port Settings. Việc thiết lập các cổng truyền thông (IRQ và địa chỉ cổng) có thể thay đổi bằng cách lựa chọn Control Panel => System => Device Manager => Port (COM và LPT) => Resources. 2 .Thuộc tính (property): Thành phần Comm được bổ sung vào biểu mẫu ( Form ) bất cứ lúc nào cần đến việc truyền thông nối tiếp. Theo mặc định, cổng thứ nhất tạo ra đối tượng có tên MSComm1, đối tượng ứng với cổng thứ hai được gọi là MSComm2,…Có thể nhìn thấy các đặc tính chính của đối tượng là: CommPort, DTREnable, EOFEnable, HandShaking ,InBufferSize, Index, InputLen, Inputmode, Left, Name, NullDiscard, OutBufferSize, ParityReplace, Rthreshold, RTSEnable, Settings, SThreshold, Tag, Top. Ta thấy điều khiển truyền thông có nhiều thuộc tính, nhưng để có thể làm việc với điều khiển truyền thông, trước hết ta cần hiểu kỹ các thuộc tính chính được liệt kê trong bảng sau . Các thuộc tính Sự mô tả CommPort Đặt và trả lại số cổng truyền thông Input(nhập vào) Trả lại và loại bỏ các ký tự khỏi bộ đệm nhận Output(xuất ra) Viết một xâu ký tự tới vào bộ đệm truyền PortOpen Mở/Đóng một cổng (tùy thuộc vào thông số) và đặt thông số cho cổng . Settings Đặt và trả lại các tham số truyền thông như :tốc độ truyền theo bit ,chẵn lẻ ,số các bit dữ liệu ,… Thí dụ sau đây chỉ ra cách truyền thông qua cổng nối tiếp có thể được tiến hành như thế nào bằng cách sử dụng một Modem. Private sub Form_load() ‘biến để lưu giữ chuỗi nhập vào Dim Instring as String ‘sử dụng COM1 Mscomm11.ComPort = 1 ‘9600 baud ,no parity ,8 bit data ,1 stop bit Mscomm11.Settings = ”9600 ,N,8,1” ‘ra lệnh cho điều khiển Mscomm1 đọc hết bộ đệm nhận khi dùng ‘lệnh Input Mscomm11.InputLen = 0 ‘mở cổng Mscomm11.PortOpen = True ‘gửi lệnh attention tới MODEM Mscomm11.Output = “ATV1Q0” & Chr$(13) ‘để chắc rằng ‘MODEM trả lời “OK” ‘đợi dữ liệu trả lời gửi về cổng nối tiếp Do DoEvents Buffer$ = Buffer$ & MSComm1.Input Loop Until InStr(Buffer$ , “OK” &vbCRLF) ‘đọc dữ liệu trả lời “OK” ‘đóng cổng nối tiếp Mscomm11.PortOpen = False End Sub Sau đây ta sẽ lần lượt tìm hiểu một số thuộc tính quan trọng của điều khiển truyền thông . Thuộc tính Settings Thuộc tính Settings đặt và trả lại các thông số truyền thông cho cổng RS-232, như tốc độ baud, tính chẵn lẻ, số bit dữ liệu và số các bit dừng. Cú pháp của câu lệnh là : [form.]Mscomm1.Settings [=paramString$] Nếu paramString$ không hợp lệ (valid) thì khi mở cổng, điều khiển truyền thông sẽ phát sinh lỗi 380 ( lỗi giá trị thuộc tính không hợp lệ ). ParamString$ là một chuỗi chứa 4 thông số thiết lập cho cổng truyền thông RS-232 và có dạng như sau : “BBBB ,P ,D ,S” Ở đây BBBB xác định tốc độ baud, P là bit chỉ tính chẵn lẻ, D là số bit dữ liệu và S là số các bit dừng (stop bits). Giá trị mặc định của paramString$ là : “9600, N, 8,1” Bảng sau đây liệt kê các giá trị baud hợp lệ : Thông số tốc độ baud 110 2400 19200 57600 300 4800 28800 115200 600 9600 38400 128000 1200 14400 56000 256000 Số bit dữ liệu hợp lệ trong một lần truyền (khung truyền) là : 4 ,5 ,6 ,7 ,8 (default) Số bit Stop hợp lệ là : 1 ,1.5 ,2. Thí dụ sau cho phép đặt thông số cho cổng truyền ở tốc độ baud là 4800,không kiểm tra bit chẵn lẻ ,8 bit dữ liệu ,1 bit dừng : Mscomm11.Settings =”4800 ,N ,8 ,1” Kiểu dữ liệu của Mscomm11.Settings là : String . Thuộc tính CommPort : Thuộc tính này đặt và trả lại số cổng truyền thông .Cú pháp của câu lệnh là : [form.].CommPort [=portnumber%] Trong khi thiết kế (design time) ta có thể đặt Portnumber% bằng một giá trị nằm trong khoảng từ 1 đến 16 (giá trị mặc định là 1). Trước khi dùng lệnh PortOpen phải thiết lập cổng bằng CommPort. Nếu ta dùng thuộc tính PortOpen trước khi thiết lập cổng bằng CommPort thì điều khiển truyền thông sinh ra lỗi 68 (cổng không tồn tại). Kiểu dữ liệu : Integer Thuộc tính PortOpen : Thuộc tính PortOpen đặt và trả lại trạng thái của cổng truyền thông (đóng hoặc mở). Thuộc tính này không có trong thời gian thiết kế chương trình. Cú pháp của câu lệnh là : [form.] MSComm.PortOpen [={True/ False}] Thông số thiết lập là True để mở cổng, còn False để đóng (giải phóng) cổng và xóa nội dung các bộ đệm nhận và truyền MSComm tự động đóng cổng nối tiếp khi ứng dụng kết thúc (Terminated). Trước khi dùng thuộc tính này (PortOpen), phải đặt thông số cổng bằng thuộc tính CommPort với một giá trị hợp lệ, nếu ta quên đi thuộc tính này lỗi 68 sẽ phát sinh. Thí dụ sau đây mở cổng truyền thông số 1 (COM1) với tốc độ baud là 4800 baud, không kiểm tra tính chẵn lẻ, 8 bit dữ liệu, 1 bit stop: MSComm1.Settings = “4800 ,N ,8 ,1” MSComm1.CommPort=1 MSComm1.PortOpen=True Kiểu dữ liệu : Boolean. Các thuộc tính phục vụ việc nhập dữ liệu (Input ,InBufferCount và InBufferSize) a. Thuộc tính Input : Thuộc tính Input trả lại và xóa bỏ một chuỗi ký tự từ bộ đệm nhận. Thuộc tính này không sẵn có trong khi thiết kế và là chỉ đọc (Read_only) khi chạy chương trình. Cú pháp của câu lệnh là : [form.] MSComm.Input Thuộc tính InputLen quy định số ký tự được đọc bởi câu lệnh Input. Để xác định số các ký tự trong bộ đệm, thuộc tính InBufferCount được kiểm tra. Đặt InputLen là 0 để đọc toàn bộ nội dung của bộ đệm nhận. Thuộc tính InputMode quyết định kiểu dữ liệu thu về qua thuộc tính Input. Nếu thuộc tính này được set là CommInputModeText thì thuộc tính Input sẽ trả về dữ liệu kiểu text vào 1 biến Variant. Nếu InputMode là comInputModeBinary thì Input sẽ trả về dữ liệu nhị phân trong một mảng các byte vào một biến Variant . Thí dụ dưới đây chỉ ra cách đọc dữ liệu từ bộ đệm nhận. MSComm1.InputLen= 0 ‘đọc toàn bộ nội dung của bộ đệm ‘nhận ‘kiểm tra có dữ liệu hay không If MSComm1.InbufferCount then ‘đọc dữ liệu InString$ = MSComm1.Input End if Kiểu dữ liệu Variant. b. Thuộc tính InBufferSize: Thuộc tính InBufferSize đặt và trả lại kích thước bộ đệm nhận, tính theo số byte. Cú pháp của câu lệnh là : [form.]MSComm .InBufferSize [=numbyte%] Thuộc tính này có liên quan đến kích thước bộ đệm nhận. Giá trị mặc định là 1024 bytes. Kích thước của bộ đệm phải được đặt sao cho có thể cất giữ được số lớn nhất của các ký tự sẽ được nhận trước khi chương trình ứng dụng có thể đọc chúng từ bộ đệm, trừ khi ta làm việc ở chế độ bắt tay (handshaking). Kiểu dữ liệu của thuộc tính này là Integer. c. Thuộc tính InBufferCount: Thuộc tính InBufferCount trả lại số ký tự trong bộ đệm nhận. Nó cũng có thể được sử dụng để xóa bộ đệm bằng cách đặt số của các ký tự bằng 0. Thuộc tính này không có trong thời gian thiết kế chương trình (design time). Cú pháp câu lệnh như sau: [form.]MSComm.InBufferCount [=count%] Ta có thể xóa bộ đệm nhận bằng cách đặt thuộc tính InBufferCount = 0. Kiểu dữ liệu của thuộc tính này là Integer. Các thuộc tính phục vụ việc xuất dữ liệu (Output ,OutBufferCount và OutBufferSize ) a. Thuộc tính Output: Thuộc tính Output sẽ viết một chuỗi ký tự vào bộ đệm truyền, thuộc tính này không có trong thời gian thiết kế chương trình. Cú pháp câu lệnh là : [form.]MSComm.Output [=outstring$] Thí dụ sau đây cho biết cách gửi các ký tự mà người dùng gõ vào từ bàn phím: Private Sub Form_load (KeyAscii as Integer) MSComm1.Outport =Chr$(KeyAscii) End Sub Thuộc tính Output có thể xuất dữ liệu dạng text hay dạng binary. Để gửi dữ liệu text, ta phải khai báo một biến kiểu Variant và cho nó chứa chuỗi muốn gửi, sau đó gán biến này cho thuộc tính Output. Để gửi dữ liệu dạng binary, ta phải truyền một biến Variant chứa một mảng các byte cho thuộc tính Output . Thông thường, nếu ta gửi một chuỗi theo chuẩn ANSI tới ứng dụng, ta có thể gửi dữ liệu dạng text. Nếu ta có dữ liệu mà chứa các ký tự điều khiển được nhúng (embedded) như các ký tự NULL,… thì ta sẽ truyền dữ liệu theo dạng binary. Kiểu dữ liệu của thuộc tính này là Variant. b. Thuộc tính OutBufferSize : Thuộc tính OutBufferSize đặt và trả lại kích thước của các ký tự trong bộ đệm truyền. Cú pháp của câu lệnh là : [form.] MSComm.OutBufferSize [=numbyte%] Giá trị mặc định của thuộc tính này là 512 bytes. Không nên nhầm lẫn giữa hai thuộc tính OutBufferCount và OutBufferSize với nhau. Thuộc tính OutBufferCount nói lên số bytes hiện đang có trong bộ đệm truyền, còn OutBufferSize quy định tổng kích thước của bộ đệm truyền. Không nên để kích thước bộ đệm truyền quá lớn. Tuy nhiên nếu để quá nhỏ thì sẽ xảy ra hiện tượng tràn dữ liệu (trừ khi làm việc ở chế độ bắt tay). Thông thường nên bắt đầu với kích thước bộ đệm truyền là 512 bytes. Nếu lỗi tràn xảy ra thì phải tăng kích thước bộ đệm cho thích hợp với ứng dụng hiện tại. Kiểu dữ liệu của thuộc tính này Integer. c. Thuộc tính OutBufferCount : Thuộc tính OutBufferCount trả lại số ký tự trong bộ đệm truyền. Nhờ thuộc tính này ta có thể xóa nội dung bộ đệm truyền bằng cách đặt giá trị của OutBufferCount=0. Cú pháp của câu lệnh là : [form.]MSComm.OutBufferCount [=value%] Kiểu dữ liệu của thuộc tính này là Integer. d. Thuộc tính RTSEnable : Thuộc tính này xác định xem liệu có cho phép đường RTS hay không. Thông thường tín hiệu RTS (Request To Send) được gửi từ máy tính tới MODEM để yêu cầu sự cho phép truyền dữ liệu. Cú pháp câu lệnh như sau: [form.]Mscomm1.RTSEnable [=(True | False)] Ta xác lập giá trị này là True để đặt đường RTS lên mức cao nếu cổng đang mở và xuống mức thấp nếu cổng đang đóng. Đường RTS được sử dụng khi có bắt tay phần cứng sử dụng RTS/CTS. Thuộc tính RTSEnable cho phép hỏi vòng đường RTS nếu ta cần xác định trạng thái của nó. Kiểu dữ liệu của thuộc tính này : Boolean. e. Thuộc tính CommEvent : Thuộc tính này trả lại hầu hết sự kiện hoặc lỗi truyền thông gần nhất. Thuộc tính này không có sẵn trong khi thiết kế và là chỉ đọc khi chạy chương trình. Cú pháp câu lệnh là: [form.]Mscomm1.CommEvent Mặc dù sự kiện OnComm được phát sinh mỗi khi có một sự kiện hay lỗi truyền thông xảy ra nhưng thuộc tính CommEvent lại chứa mã số của sự kiện hay là lỗi truyền thông đó .Như vậy để xác định xem điều gì đã xảy ra thì ta phải kiểm tra thuộc tính CommEvent . Các lỗi truyền thông bao gồm : Hằng số Giá trị Mô tả comEventBreak 1001 Đã nhận được tín hiệu Break comEventFrame 1004 Phần cứng phát hiện một lỗi khung truyền comEventOverrun 1006 Tràn cổng .Phần cứng không thể đọc được ký tự này trước khi ký tự kế gửi đến và bị mất comEventRxOver 1008 Tràn bộ đệm nhận .Hết chỗ trong bộ đệm nhận comEventRxParity 1009 Phần cứng phát hiện ra một lỗi chẵn lẻ comEventTxFull 1010 Bộ đệm truyền đầy .Bộ đệm truyền bị đầy khi cố đưa thêm ký tự vào hàng đợi comEventDCB 1011 Một lỗi xuất hiện ở bộ điều khiển dữ liệu(Data Control Block) của port Các sự kiện truyền thông bao gồm: Hằng số Giá trị Mô tả ComEvSend 1 Có ít hơn số ký tự định bởi SThreshold trong bộ đệm truyền comEvReceive 2 Đã nhận số ký tự bằng với số ký tự định bởi Rthreshold .Sự kiện này được phát ra liên tục cho đến khi ta dùng thuộc tính Input để chuyển dữ liệu khỏi bộ đệm nhận . ComEvCTS 3 Có sự thay đổi trên đường CTS ComEvDSR 4 Có sự thay đổi trên đường DSR .Sự kiện này chỉ phát sinh khi DSR chuyển từ 1 về 0 ComEvCD 5 Có sự thay đổi trên đường CD (Carrier Detect) ComEvRing 6 Phát hiện tiếng chuông (gọi). Một số vi mạch UART không hỗ trợ việc này. ComEvEOF 7 Ký tự EOF (Mã ASCII 26) được nhận. Kiểu dữ liệu của thuộc tính này : Integer f. Thuộc tính InputLen Đặt và trả lại số ký tự mà thuộc tính Input đọc được từ bộ đệm nhận .Giá trị mặc định của thuộc tính này là bằng 0 .Đặt InputLen =0 để điều khiển truyền thông đọc hết nội dung bộ đệm nhận .Cú pháp câu lệnh như sau : [form.] Mscomm1.InputLen [=numchars%] Thuộc tính này rất có hữu ích khi đọc dữ liệu từ các máy có lối ra được định dạng cố định về chiều dài khối dữ liệu . Kiểu dữ liệu của thuộc tính này : Integer g. Thuộc tính ParityReplace Đặt và trả lại ký tự dùng thay thế ký tự không hợp lệ trong dòng dữ liệu khi lỗi chẵn lẻ xảy ra .Cú pháp : [form.]Mscomm1.ParityReplace [=char$] Bit chẵn lẻ là bit được truyền cùng với các bit dữ liệu và được dùng cho việc kiểm tra lỗi .Khi dùng bit chẵn lẻ ,điều khiển truyền thông sẽ cộng tất cả các bit có giá trị bằng 1 và kiểm tra tổng số các bit đó xem là chẵn hay lẻ (tương ứng với việc xác lập bit chẵn lẻ khi mở cổng ) .Theo mặc định ,điều khiển dùng dấu chấm hỏi (?) để thay thế các ký tự không hợp lệ .Đặt ParityReplace là “ “ để bỏ khả năng thay thế ký tự khi lỗi chẵn lẻ xuất hiện .Sự kiện OnComm vẫn được phát sinh và thuộc tính CommEvent được đặt thành comEventRxParity . Kiểu dữ liệu của thuộc tính này : String h. Thuộc tính Rthreshold Đặt và trả lại số ký tự sẽ nhận trước khi điều khiển Mscomm1 đặt thuộc tính comEvent thành comEvReceive và phát sinh sự kiện OnComm .Cú pháp : [form.] Mscomm1.Rthreshold [=numchar%] Xác lập bằng 0 để làm mất khả năng phát sinh sự kiện OnComm khi nhận các ký tự .Xác lập bằng 1,chẳng hạn, để làm phát sinh sự kiện OnComm mỗi khi có 1 ký tự được nhận vào bộ đệm nhận Kiểu dữ liệu của thuộc tính này : Integer § Hàm ComInput Trả lại và xóa chuỗi ký tự ở bộ đệm nhận .Cú pháp như sau : ComInput(ByVal hwnd As Integer ,LpData as Any ,ByVal do Data as Integer ) As Integer Hàm này tương tự như thuộc tính Input nhưng trả lại số byte nhận được . § Hàm ComOutput Viết một chuỗi ký tự vào bộ đệm truyền .Cú pháp như sau : ComOutput(ByVal hwnd As Integer ,LpData as Any ,ByVal do Data as Integer ) As Integer Hàm này tương tự như thuộc tính Output nhưng trả lại số byte ký tự được gửi đi 3. Sự kiện Oncomm Sự kiện OnComm được phát sinh vào bất cứ khi nào giá trị của thuộc tính CommEvent thay đổi . Cú pháp sự kiện : Private Sub [form.]Mscomm1_OnComm() Thuộc tính CommEvent chứa mã số của lỗi hay sự kiện phát sinh bởi sự kiện OnComm. Nếu đặt các thuộc tính Rthreshold hoặc SThreshold bằng 0 sẽ vô hiệu bẫy sự kiện Receive và Send . 4. Hỏi vòng ở cổng RS-232 : Thường khi làm việc với điều khiển Mscomm1, ta dùng phương pháp điều khiển theo sự kiện .Nhưng ta cũng có thể sử dụng kỹ thuật hỏi vòng để thông tin qua cổng RS-232. Chương trình ví dụ sau đây sử dụng COM2 để gửi thông báo “Hello” và sau đó chờ chuỗi nhận. Kỹ thuật này quy định là sẽ nhận được đáp ứng bằng cách kiểm tra liên tục số các ký tự nhận được trong bộ đệm nhận (InBufferCount). Khi có nhiều hơn một ký tự trong bộ đệm lối vào thì ký tự này sẽ được đọc. Chương trình như sau : Private Sub Form_Load() Dim Str as String ‘chuỗi để chứa dữ liệu nhập Mscomm11.ComPort =2 ‘dùng COM2 Mscomm11.Settings=”9600 ,N ,8 ,1” ‘9600 baud ,không ‘parity ,8 bits data ,1 ‘stop bit Mscomm11.InputLen=0 ‘đọc hết bộ đệm lối vào khi Input đã được dùng Mscomm11.PortOpen=True ‘mở cổng Text1.text=”Sending : Hello” Mscomm11.Output=”Hello” ‘gửi thông báo Do ‘chờ đáp ứng từ cổng DoEvents Loop Until Mscomm11.InBufferCount>=2 Str = Mscomm11.Input ‘đọc bộ đệm Input Text2.Text=”Received:” +Str Mscomm11.PortOpen=False ‘đóng cổng nối tiếp End Sub 5. Các thông báo lỗi (Error Messages Code) Số lỗi Mô tả Số lỗi Mô tả 380 Giá trị thuộc tính không hợp lệ 8009 Lỗi ở các thông số mặc định 383 Thuộc tính là chỉ đọc, comSetNotSupport 8010 Phần cứng không sẵn dùng (bị khóa bởi thiết bị khác) 394 Thuộc tính là chỉ đọc, comGetNotSupport 8011 Không thể định vị được hàng đợi (queues) 8000 Tác động không hợp lệ lên cổng đã mở 8012 Cổng chưa mở 8001 Giá trị timeout cần phải lớn hơn Zero 8013 Cổng đã mở rồi 8002 Số cổng không hợp lệ 8014 Không thể cho phép khai báo(nitification)comm 8003 Thuộc tính chỉ có khi chạy chương trình 8015 Không đặt trạng thái cho comm được 8004 Thuộc tính là chỉ đọc khi chạy chương trình 8016 Không đặt mặt nạ sự kiện comm được 8005 Cổng đã mở rồi 8018 Tác động chỉ hợp lệ khi cổng đã mở 8006 Số nhận dạng thiết bị là không hợp lệ hoặc không được hỗ trợ 8019 Thiết bị bận 8007 Giá trị Baud xác định là không hợp lệ 8020 Lỗi đọc thiết bị truyền thông 8008 Kích thước byte xác định là không hợp lệ 8021 Lỗi bên trong liên quan khối điều khiển thiết bị của port III. Phần giao diện : Chương trình giao tiếp nối tiếp dùng ngôn ngữ Visual Basic như sau: ‘Phần khai báo biến toàn cục trrong module public LenhT, DiaChi As String 'bien chua ma lenh dua ve cho vi xu ly Public GTNhan As Variant ' bien chua data tu vi xu ly gui len Public Byte1, Byte2, Byte3, Byte4 As String 'la 4 byte nhan duoc tu vi xu ly 'byte1 chua dia chi cua vxl 'byte2 chua gia tri nhiet do 'byte3 chua so nguoi trong phong 'byte4 trang thai den va quat Public Byte21, Byte22, Byte23, Byte24 As String 'cac bien cho phong 2 Public Const AnNinh = "Khong co nguoi la xam nhap" Public Const KAnNinh = "Canh bao co nguoi la xam nhap" ‘ ham truyen du lieu toi cac vi xu li Public Sub TRUYEN(GIATRI As String) Dim i As Integer frmchinh.MSComm1.RTSEnable = True frmchinh.MSComm1.Output = GIATRI For i = 0 To 10000 i = i + 1 Next i frmchinh.MSComm1.RTSEnable = False End Sub ‘ Ham nhan du lieu tu vi xu li Public Sub NHAN() Dim i, thongbao As Integer Dim Test As String frmchinh.MSComm1.RTSEnable = False For i = 1 To 30000 i = i + 1 Next i Do DoEvents Loop Until (frmchinh.MSComm1.InBufferSize >= 4) Or (i >= 30000) GTNhan = frmchinh.MSComm1.Input 'thuc hien gan gia tri cho bytei (i=1-4) Test = Left$(GTNhan, 1) If Test = "A" Then Byte1 = Left$(GTNhan, 1) Byte2 = Mid$(GTNhan, 2, 1) Byte3 = Mid$(GTNhan, 3, 1) Byte4 = Right$(GTNhan, 1) Else If Test = "B" Then Byte21 = Left$(GTNhan, 1) Byte22 = Mid$(GTNhan, 2, 1) Byte23 = Mid$(GTNhan, 3, 1) Byte24 = Right$(GTNhan, 1) Else thongbao = MsgBox("So lieu truyen ve bi loi.Can xem lai duong truyen", vbOKOnly, "Loi duong truyen") End If End If End Sub ‘******************************************************** ‘Chuong trinh trong Frmchinh ‘******************************************************* Dim ToanCuc As Variant Dim Dem, i, j As Integer Dim NHAN As String Private Sub ChkP01_Click() If ChkP01.Value = 1 Then frmP01.Show If ChkP01.Value = 0 Then Unload frmP01 End If '****************************** End Sub Private Sub ChkP02_Click() If ChkP02.Value = 1 Then frmP02.Show If ChkP02.Value = 0 Then Unload frmP02 End If '*************************** End Sub Private Sub Command1_Click() End End Sub Private Sub Form_Load() Dim i1, i2 As Integer ChkP03.Enabled = False ChkP04(1).Enabled = False LblTThai.Caption = "Binh thuong" TxtChinh = CStr(2) OptAuto.Value = True '********************************* 'PHAN GIA DINH BIEN Byte2 = "!" Byte3 = "!" Byte4 = "O" Byte22 = "!" Byte23 = "!" Byte24 = "O" LenhT = "a" '********************************* 'KHOI DONG COM If MSComm1.PortOpen = True Then MSComm1.PortOpen = False MSComm1.CommPort = 1 MSComm1.Settings = "9600,n,8,1" MSComm1.PortOpen = True 'cho thu du lieu dua ve tu vi xu ly frmP02.Timer1.Enabled = True frmP01.Timer1.Enabled = True 'hien thi so nguoi len frmchinh frmchinh.Timer1 = True End Sub Private Sub OptAuto_Click() With frmP01 frmP01.fraDkP01.Enabled = False frmP01.OptTdenP01.Enabled = False frmP01.OptMdenP01.Enabled = False frmP01.OptTquatP01.Enabled = False frmP01.OptMquatP01.Enabled = False frmP01.Frame1.Enabled = False frmP01.Frame2.Enabled = False End With With frmP02 frmP02.FraDkP02.Enabled = False frmP02.OptTdenP02.Enabled = False frmP02.OptMdenP02.Enabled = False frmP02.OptTquatP02.Enabled = False frmP02.OptMquatP02.Enabled = False frmP02.Frame2.Enabled = False frmP02.Frame3.Enabled = False End With frmP01.cmdDongYP01.Enabled = False frmP02.cmDongYP02.Enabled = False '*********************************** End Sub Private Sub OptDenChinh_Click() FrmDkDen.Show End Sub Private Sub OptManual_Click() With frmP01 frmP01.fraDkP01.Enabled = True frmP01.OptTdenP01.Enabled = True frmP01.OptMdenP01.Enabled = True frmP01.OptTquatP01.Enabled = True frmP01.OptMquatP01.Enabled = True frmP01.Frame1.Enabled = True frmP01.Frame2.Enabled = True End With With frmP02 frmP02.FraDkP02.Enabled = True frmP02.OptTdenP02.Enabled = True frmP02.OptTquatP02.Enabled = True frmP02.OptMdenP02.Enabled = True frmP02.OptMquatP02.Enabled = True frmP02.Frame2.Enabled = True frmP02.Frame3.Enabled = True End With frmP01.cmdDongYP01.Enabled = True frmP02.cmDongYP02.Enabled = True '************************************ End Sub Private Sub OptQuatChinh_Click() FrmDkQuat.Show End Sub Private Sub Timer1_Timer() ' xuat so nguoi ra frmchinh i1 = Val(frmP01.TxtSoNguoiP01.Text) i2 = Val(frmP02.TxtSoNguoiP02.Text) TxtChinh.Text = CStr(i1 + i2) End Sub Private Sub cmdDongYP01_Click() Dim Test As String 'xac dinh lenh hoat dong cho vxl If (OptMdenP01.Value = False And OptMquatP01.Value = False) Then LenhT = "C" If (OptMdenP01.Value = False And OptMquatP01.Value = True) Then LenhT = "D" If (OptMdenP01.Value = True And OptMquatP01.Value = False) Then LenhT = "F" If (OptMdenP01.Value = True And OptMquatP01.Value = True) Then LenhT = "G" 'xac dinh dia chi truyen la vxl 1 DiaChi = "A" Test = LenhT 'goi ham truyen LenhT cho vi xu ly Call TRUYEN(DiaChi) Call TRUYEN(Test) Stop End Sub Private Sub cmdThoatP01_Click() Unload Me frmchinh.ChkP01.Value = False End Sub Private Sub Option1_Click() End Sub Private Sub Form_Load() If frmchinh.OptAuto.Value = True Then With frmP01 frmP01.fraDkP01.Enabled = False frmP01.OptTdenP01.Enabled = False frmP01.OptMdenP01.Enabled = False frmP01.OptTquatP01.Enabled = False frmP01.OptMquatP01.Enabled = False frmP01.Frame1.Enabled = False frmP01.Frame2.Enabled = False End With With frmP02 frmP02.FraDkP02.Enabled = False frmP02.OptTdenP02.Enabled = False frmP02.OptMdenP02.Enabled = False frmP02.OptTquatP02.Enabled = False frmP02.OptMquatP02.Enabled = False frmP02.Frame2.Enabled = False frmP02.Frame3.Enabled = False End With End If '************************************** 'KHOI DONG COM If frmchinh.MSComm1.PortOpen = True Then frmchinh.MSComm1.PortOpen = False frmchinh.MSComm1.CommPort = 1 frmchinh.MSComm1.Settings = "9600,n,8,1" frmchinh.MSComm1.PortOpen = True 'Cap nhat trang thai cua phong frmP01.Timer1.Enabled = True End Sub Private Sub CapnhatP01() Dim NhietdoP01, SoNguoiP01, i As Integer Dim thongbao As String NhietdoP01 = Asc(Byte2) txtNhietDoP01.Text = Val(NhietdoP01) 'hien thi nhiet do SoNguoiP01 = Asc(Byte3) TxtSoNguoiP01.Text = Val(SoNguoiP01) 'hien thi so nguoi If Byte4 = "O" Then txtDenP01.Text = "OFF" txtQuatP01.Text = "OFF" frmchinh.LblTThai = AnNinh End If If Byte4 = "P" Then txtDenP01.Text = "OFF" txtQuatP01.Text = "OFF" frmchinh.LblTThai = KAnNinh End If If Byte4 = "Q" Then txtDenP01.Text = "OFF" txtQuatP01.Text = "ON" frmchinh.LblTThai = AnNinh End If If Byte4 = "R" Then txtDenP01.Text = "OFF" txtQuatP01.Text = "ON" frmchinh.LblTThai = KAnNinh End If If Byte4 = "S" Then txtDenP01.Text = "ON" txtQuatP01.Text = "OFF" frmchinh.LblTThai = AnNinh End If If Byte4 = "T" Then txtDenP01.Text = "ON" txtQuatP01.Text = "OFF" frmchinh.LblTThai = AnNinh End If If Byte4 = "U" Then txtDenP01.Text = "ON" txtQuatP01.Text = "ON" frmchinh.LblTThai = AnNinh End If If Byte4 = "X" Then txtDenP01.Text = "ON" txtQuatP01.Text = "ON" frmchinh.LblTThai = KAnNinh End If 'BAO LOI TRUYEN (lenh truyen ve sai) Select Case Byte4 Case "O" GoTo TB Case "P" GoTo TB Case "Q" GoTo TB Case "R" GoTo TB Case "S" GoTo TB Case "T" GoTo TB Case "U" GoTo TB Case "X" GoTo TB End Select thongbao = MsgBox("Ban can kiem tra lai he thong.Chu trong cac he thong chong trom", vbOKOnly, "Loi dieu khien") TB: i = i + 1 End Sub Private Sub Timer1_Timer() Dim Kich As String Kich = "E" Call TRUYEN(DiaChi) Call TRUYEN(Kich) Call CapnhatP01 End Sub

Các file đính kèm theo tài liệu này:

  • docĐiều khiển và giám sát toà nhà bằng vi xử lý 89c51.doc