LỜI MỞ ĐẦU
Ngày nay, công nghệ thông tin liên lạc trên Thế giới nói chung và nước ta nói riêng đã và đang phát triển không ngừng, điện thoại di động đã được sử dụng một cách rộng rãi. Tuy vậy, điện thoại công cộng vẫn là dịch vụ không thể thiếu để phục vụ cho người dân.Vì vậy, vấn đề ở đây là làm thế nào để các trung tâm Bưu điện, các bưu cục có thể tính cước phí cuộc gọi một cách hiệu quả. Mạch tính cước cho điện thoại cố định đã xuất hiện để giải quyết vấn đề này. Đó cũng là lý do mà em đã chọn đề tài này.
Một máy tính cước phải đảm bảo được các yêu cầu sau:
Hiện số bị gọi ra Cabin.Hiện thời gian tính từ lúc thuê bao bị gọi nhấc máy.Hiện tiền cuộc gọi khi kết thúc đàm thoại.Lưu trữ dữ liệu khi có sự cố mất điện.Đồng thời tất cả phải được hiện lên giao diện máy tính để bưu cục dễ quản lý.
Với các yêu cầu đó và kiến thức em đã được học tại trường ĐH Kỹ Thuật Công Nghệ, em chọn chip vi điều khiển của hãng ATMEL cùng với các IC chuyên dùng khác, AT89C51 được chọn vì những ưu điểm sau:
AT89C51 trên thị trường được sử dụng khá phổ biến và giá thành hợp lý.Các bus địa chỉ và bus dữ liệu rộng, khả năng chuyển đổi cho nhau linh hoạt bởi phần mềm.Đơn giản hơn ở phần cứng mạch tính cước là không cần thêm mạch nhận biết quay số Pulse.
Visual Basic là ngôn ngữ để lập trình cho phần giao diện với máy tính.
Tuy nhiên, vì kiến thức và kinh nghiệm còn hạn chế nên đề tài lần này chắc chắn sẽ không tránh khỏi những thiếu sót. Em rất mong được sự chỉ bảo của thầy cô cũng như những ý kiến đóng góp quí báo của các bạn để lần sau, những đề tài sau này được hoàn thiện hơn.
Em xin chân thành cảm ơn!
76 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2808 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Luận văn Thiết kế mạch tính cước điện thoại, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ộng, phương thức thực hiện tiêu chuẩn là tính cước cuộc gọi khi thuê bao bị gọi nhấc náy trả lời, nghĩa là bắt đầu thời gian đàm thoại. Các đồng hồ tính cước (bộ phận ghi cước của thuê bao) hoạt động theo nguyên lý điện từ và được thiết kế và ghi nhận một đơn vị cước mỗi lần nam châm điện hoạt động. Điều quan trọng nhất là các mạch tính cước của một tổng đài tự động phải có độ tin cậy với mức sai số thấp, và đặc biệt phải bảo đảm tránh được hoạt động bất thường của đồng hồ tính cước do các hư hỏng của mạch điện hoặc do sử dụng sai lệch của thuê bao.
Tính cước bằng phương pháp đảo cực nguồn điện:
Khi nhận ra thuê bao bị gọi nhấc máy trả lời thì tổng đài sẽ đổi chiều dòng điện DC trên đôi dây của thuê bao gọi. Trong hệ tổng đài điện thoại tự động, tín hiệu đảo cực khởi động đồng hồ tính cước của thuê bao gọi. Khi cuộc đàm thoại kết thúc (một trong 2 bên gác máy) điện áp trên đôi dây lại được đảo chiều lần nữa và chấm dứt hoạt động của đồng hồ tính cước.
Tính cước bằng phương pháp đếm xung:
Sau khi thực hiện kết nối thông thoại cho 2 thuê bao, tổng đài sẽ cấp các xung gián đoạn có tần số qui định tính cước, số xung hiện diện trong một đơn vị thời gian cơ bản sẽ tỉ lệ với giá cước. Tùy theo khoảng cách giữa 2 thuê bao mà số xung trong mỗi đơn vị thời gian cơ bản khác nhau. Nếu thuê bao gọi đếm một vùng càng xa thì số xung nhận được để tính cước trong một đơn vị thời gian cơ bản sẽ càng nhiều. Bộ phận tính cước sẽ nhận các xung này và quy ra giá cước cuộc gọi.
Tính cước bằng cách phát hiện Ring back tone:
Trong 2 cách trên, thuê bao phải được tổng đài cung cấp cho dịch vụ: tín hiệu đảo cực hoặc xung tuần hoàn. Tại các thuê bao không có 2 dịch vụ trên, người ta có thể tính cước bằng cách kiểm tra tín hiệu hồi âm chuông (ring back tone). Khi số quay được gởi đi, tổng đài sẽ kết nối 2 thuê bao, bên thuê bao gọi sẽ nghe được hồi âm chuông (có tần số f = 425 Hz và chu kỳ 1s có 4s không). Khi thuê bao bị gọi nhấc máy, tín hiệu này sẽ mất. Do đó việc phát hiện hết hồi âm chuông chính là việc phát hiện thông thoại. Tín hiệu này sẽ khởi động bộ đếm thời gian thực. Khi giải tỏa cuộc gọi thì nội dung bộ đếm chính là khoảng thời gian thông thoại cần tính cước.
PHƯƠNG THỨC QUAY SỐ VÀ TÍNH CƯỚC Ở VIỆT NAM HIỆN NAY:
Phương thức quay số:
Gọi nội hạt:
Sau khi nhấc máy, nếu tín hiệu mời quay số (dial tone), quay số máy cần gọi, nếu nghe ring back tone thì tiếp tục chờ máy bị gọi nhấc máy. Nếu nghe busy tone thì có nghĩa là cuộc gọi không thực hiện được, người gọi đặt máy trở lại rồi sau đó gọi lại.
Nhấc máy
Nghe Dial tone
Quay số
Gọi liên tỉnh:
Gọi tự động liên tỉnh:
Nhấc máy
Nghe Dial tone
0
Mã vùng
Số thuê bao
Ngoài ra, với cách gọi trực tiếp thường dùng còn có các dịch vụ điện thoại giảm giá cước đường dài liên tỉnh như: 171, 178, 177, 179… ta tiến hành như sau:
171_0_mã tỉnh_số thuê bao…
Cước điện thoại đường dài liên tỉnh tại các điểm công cộng như tại thuê bao và thu thêm 454 VNĐ/cuộc (chưa bao gồm thuế VAT).
Nhấc máy
Nghe Dial tone
0
Mã vùng
Số thuê bao
Mã nước
Gọi quốc tế:
Nhấc máy
Nghe Dial tone
0
Mã mạng điện thoại
Số thuê bao
Gọi vào các mạng di động:
Mã gọi vào các mạng
Mobiphone (VMS)
90
93
122
Vina Phone
91
94
Viettel
98
97
Sfone
95
EVN
96
HT mobile
92
Bộ công an, bộ quốc phòng
69
Cục bưu điện Trung ương
80
VSAT
99
Giá cước các tỉnh thành trong nước và quốc tế:
Cước điện thoại đường dài trong nước:
Đơn vị tính đồng/ Block (áp dụng từ ngày 15/8/2006)
Vùng cước
Đường dài liên tỉnh PSTN
Đường dài liên tỉnh VOIP (171)
Thứ 2-7
Chủ nhật,
ngày lễ
Thứ 2-7
Chủ nhật,
ngày lễ
An Giang, Bà Rịa-Vũng Tàu, Lâm Đồng, Long An, Bến Tre, Bạc Liêu, Bình Dương,Bình Phước,Bình Thuận, Ninh Thuận,Cà Mau, Cần Thơ-Hậu Giang,Đồng Nai, Đồng Tháp, Sóc Trăng, Kiên Giang, Tiền Giang, Trà Vinh, Vĩnh Long, Tây Ninh.
90,90
81,82
76,36
72,72
Kon Tum, Bình Định, Phú Yên, Đà Nẵng, Đắk Lắk - Đắk Nông, Quảng Ngãi, Quảng Nam, Quảng Trị, Gia Lai, Khánh Hòa, Thừa Thiên Huế.
136,36
118,20
120
90,9
Bắc Cạn, Bắc Giang, Bắc Ninh, Lai Châu - Điện Biên, Lạng Sơn, Lào Cai, Nam Định, Nghệ An, Ninh Bình, Phú Thọ, Cao Bằng, Quảng Bình, Quảng Ninh, Hà Giang, Hà Nam, Hà Nội, Hà Tây, Hà Tĩnh, Hải Dương, Hải Phòng, Hòa Bình, Hưng Yên, Sơn La, Thái Nguyên, Thái Bình, Thanh Hóa, Tuyên Quang, Yên Bái, Vĩnh Phúc.
136,36
136,36
118,20
118,20
120
120
90,9
90,9
Cước điện thoại nội hạt:
Khu vực gọi đến
Cách tính cước
Giá cước
Thời gian tối thiểu
Thời gian tiếp theo
Thời gian tối thiểu
Thời gian tiếp theo
Toàn thành phố
3 phút đầu
Tính tròn 1 phút
1092
364
City Phone
3 phút đầu
Tính tròn 1 phút
1092
364
1080
1 phút đầu
Tính tròn 1 phút
1364
1364
1081
1 phút đầu
Tính tròn 1 phút
1364
1364
Cước điện thoại di động: (Chưa có VAT)
Thứ 2 – 7
Ngày lễ - Chủ nhật
Thời gian tối thiểu
Thời gian tiếp theo
Thời gian tối thiểu
Thời gian tiếp theo
6 giây
6 giây tiếp
6 giây
6 giây tiếp
136,36
136,36
95
95
CHƯƠNG 3: THIẾT KẾ VÀ THI CÔNG MẠCH
Sơ đồ khối hệ thống - Chức năng từng khối:
Khối xử lý trung tâm: Là khối xử lý chính của mạch tính cước. Nhiệm vụ là quản lý tất cả các khối còn lại : khối hiển thị, khối giao tiếp máy tính, khối giải mã DTMF, khối nhận biết tín hiệu đảo cực và khối bộ nhớ Ram ngoài. Nó là mạch logic tổ hợp được lập trình cho IC vi điều khiển AT89C51.
Khối giải mã DTMF: Giải mã các tín hiệu quay số ra các mức logic để cấp cho khối xử lý trung tâm làm việc.
Khối hiển thị: Hiển thị số được quay, tính thời gian và tiền cho cuộc gọi ra led 7 đoạn.
Khối nhận biết nhấc máy: Nhận biết thuê bao có nhấc máy không và cung cấp tín hiệu quay số cho khối giải mã.
Khối nhận biết tín hiệu đảo cực: Ở đây là dùng 1 Switch để tạo tín hiệu giả đảo cực báo cho khối xử lý trung tâm biết. Thông thường nếu thuê bao gọi có đăng ký tín hiệu đảo cực với tổng đài thì khi thuê bao bị gọi nhấc máy, tổng đài sẽ cung cấp 1 tín hiệu đảo cực đến khối xử lý trung tâm để xử lý tính tiền cho cuộc gọi.
Khối bộ nhớ Ram ngoài: Được nạp sẵn bảng giá tiền cho từng block thời gian gọi của từng vùng trong nước, từng mạng điện thoại di động, quốc tế, nội hạt…
Khối giao tiếp máy tính: Kết nối mạch tính cước với máy tính, nhằm chuyển đổi tín hiệu TTL sang RS232 để xuất số gọi đi, thời gian gọi, tiền lên máy tính để bưu cục dễ quản lý.
Tính toán thiết kế:
Tính toán cho 2 Module là tính cước và giao tiếp máy tính.
Module tính cước:
Mạch xử lý trung tâm:
Sơ đồ nguyên lý:
Nhiệm vụ của mạch này là điều khiển mọi hoạt động của Module tính cước như:
Nhận biết thuê bao nhấc máy.
Nhận biết tín hiệu đảo cực.
Kiểm tra xem số gọi đi là nội hạt, liên tỉnh hay di động.
Đếm thời gian và tính tiền cuộc gọi.
Xuất dữ liệu ra led 7 đoạn: số bị gọi, thời gian và tiền cuộc gọi.
Xuất các dữ liệu này qua Module giao tiếp.
Nạp bảng giá cước vào Rom ngoại.
Trong máy tính cước, tất cả các hoạt động của mạch đều liên quan đến xung clock cung cấp cho CPU vì các bộ Timers/Counters sẽ dựa vào tần số xung clock này mà thực hiện các công việc được lập trình sẵn (ngắt Timer, chương trình delay, đếm).
Do xung clock đóng một vai trò rất quan trọng nên mạch tạo xung phải bảo đảm các yêu cầu như có độ ổn định cao, sai số tần số phải nhỏ đồng thời tần số xung phải phù hợp với tần số của tất cả các linh kiện trong mạch.
Vi điều khiển AT89C51 có bộ dao động nằm bên trong vi mạch, do đó độ ổn định về tần số của mạch coi như thỏa. Mặt khác độ ổn định của mạch còn phụ thuộc vào thạch anh hay mạch dao động RC bên ngoài, ta chọn thạch anh vì nó dao động với tần số chuẩn và đơn giản mạch. Ngoài ra, ở điều kiện lý tưởng, tần số làm việc của CPU phải hoàn toàn tương thích với tốc độ truy xuất dữ liệu của bộ nhớ.
Dựa vào các yếu tố trên và thêm vào đó là sự phổ biến trên thị trường, giá cả hợp lý, ta chọn thạch anh 12Mhz. Các tụ C2 và C3 dùng để ổn định tần số dao động của thạch anh.
Port 1 và 2 bit P2.7, P2.6 dùng cho quét led.
Port 0 là port data cho led.
Chân 12 (INT0) được nối với chân STD của MT8870. Khi MT8870 giải mã xong 1 cặp tone, chân STD sẽ lên cao rồi xuống thấp tạo ngắt tại chân INT0 của CPU để xử lý đọc số.
Chân 17 được nối đến chân TOE của MT8870 để điều khiển cho phép xuất dữ liệu sang CPU xử lý.
Thông thường tại các bưu điện công cộng, thường được tổng đài cung cấp tín hiệu đảo cực (như đã trình bày ở chương 2) để tính cước cuộc gọi. Ở đây, do việc đăng ký tổng đài khó khăn nên em dùng 1 Switch nhấn giả đảo cực như sau:
Sau khi quay số xong, ta nhấn Switch thì CPU sẽ nhận biết là đã bắt đầu cuộc đàm thoại và bắt đầu đếm thời gian tính tiền.
2 chân 14, 15 được nối với Opto cảm biến nhấc máy, sẽ trình bày ở phần sau.
2 điện trở thanh 10K mắc dạng cực thu hở để lấy mức tín hiệu cho các bit xử lý của 89C51.
Khi mạch được cấp nguồn +5V, thì tụ nạp với thời hằng nạp điện là: τ = RC. Sau đó phóng điện vào chân RST của 89C51 và mạch được Reset lại từ đầu.
Điện trở R22 = 100 Ω để tránh trường hợp dòng nạp cho tụ phân cực bên trong 89C51.
Để reset CPU chân RST ở mức cao ít nhất 24 xung clock, tần số mỗi xung clock. Tần số mỗi xung clock là 12Mhz. Suy ra T= 24.(1/12.106) = 2 µs_ khoảng 2 chu kỳ máy.
Mạch Reset:
Tính giá trị cho R23 và C1:
Điện áp ở chân RST chính là điện áp xả trên tụ C3 khi nạp đầy.
Ta có: VRST = Vcc .e – T/τ.
T/τ = ln(Vcc/VRST).
è τ = T/ln(Vcc/VRST).
Ta lại có: τ = R.C.
è C = T/(R.ln(Vcc/VRST), với T = 2 µs, Vcc = 5V.
Giả sử khi tụ nạp gần Vcc thì xả, ta chọn VRST ≈ 5 V, với R = 10K, ta có:
C = 10 µF.
Phần cảm biến nhấc máy :
Khi nhấc máy, có dòng từ tổng đài qua 1 trong 2 Opto làm chân 5 dẫn xuống Mass, tín hiệu ở chân 5 của 2 Opto được đưa tới chân P3.4, P3.5 của 89C51 sẽ xử lý nhận biết tín hiệu nhấc máy.
2 Opto 4N35 là 2 cảm biến nhấc máy:
Sở dĩ dùng 2 Opto là vì để khi ta có mắc ngược đường line so với tổng đài thì đều có thể nhận biết được.
Điện trở R25 dùng để phân cực cho Opto dẫn. Với dòng của tổng đài khi nhấc máy là 20mA – 40mA, dòng qua led của Opto là 4mA, điện áp rơi trên led Opto là 2V thì ta có:
R25 = 2V/(0,02 – 0,004) = 125 Ω.
Ta chọn R25 = 150 Ω.
Tụ C6 là tụ liên lạc, dùng để ngăn dòng DC.
L1_Fit44_1 là biến thế cách ly 1:1, để chống quá áp ngõ vào bảo vệ cho các linh kiện bên trong mạch.
2 diode Zenner 4,7V dùng để ổn định điện áp ngõ vào IC MT8870 là:
4,7 + 0,6 = 5,3V.
Mạch giải mã DTMF:
Khi có tín hiệu quay số, một cặp tone sẽ đến ngõ vào của MT8870 và được giải mã ra 4 bit từ Q0 à Q3 để cấp cho CPU xử lý.
Các tụ điện, điện trở, thạch anh được sắp xếp theo tính toán của nhà sản xuất.
Chân STD khi có tone nhấn sẽ lên cao rồi xuống thấp để tạo ngắt tại chân INT0 của 89C51 xử lý.
Chân TOE sẽ được set lên cao khi MT8870 giải mã xong 1 cặp tone.
Mạch hiển thị:
Là mạch gồm 10 led 7 đoạn dùng để hiển thị số khi quay số điện thoại gọi đi. Sau đó, khi bắt đầu tính tiền cuộc gọi, 6 led bên trái dùng để hiển thị tiền, 4 led bên phải dùng để hiển thị thời gian.
Tính toán điện trở phân cực cho cực B của transistor:
Theo đặc tuyến ở ngõ ra của transitor ta có, khi dòng IB tăng thì dòng IC cũng tăng theo, đến một lúc nào đó khi dòng IB tăng thì IC sẽ không tăng nữa, khi đó transistor hoạt động ở chế độ bão hòa.
Khi transistor hoạt động ở chế độ bão hòa thì ta được ICmax ≤ β.IB.k
với k là hệ số bão hòa.
Trong tính toán thường chọn k = 2 à 5.
ICmax
è IB > (*)
β.k
Khi cực B tích cực mức thấp, thì mối nối B-E được phân cực thuận, lúc này:
Vcc = Vγ + IB.RB
Vcc - Vγ
è IB =
RB
Vcc - Vγ ICmax
Từ (*) ta suy ra: >
RB β.k
(Vcc - Vγ). β.k (5-0.6).1000.2
è RB < = = 4,56 kΩ
ICmax 1920.10-3
à Chọn RB = 4,7 kΩ.
Bên trong led 7 đoạn
8 bit data của Port 0 được đưa đến các chân từ a à g và chân p của led 7 đoạn. Các led này sẽ sáng khi chân tương ứng của nó ở mức 0 và transistor được kích dẫn.
_ Dòng quét led khoảng 10 mA là led sáng, ta chọn dòng để quét led là 20 mA để led được sáng rõ:
Ta có: Vcc - VLed 5V – 2V
R = = = 150Ω.
Iled 0.02
Chọn giá trị cho điện trở là 150 Ω.
Chọn điện trở hạn dòng cho led:
Bộ nhớ Rom ngoài AT24C04:
Do bộ nhớ Rom của 89C51 không đủ, nên phần thiết kế em đã sử dụng thêm Rom AT24C04. Đây là Rom có bộ nhớ 4Kb, được sử dụng để lưu bảng giá cước
- A0, A1, A2: Dùng để chọn bộ nhớ nếu có sử dụng nhiều Rom ngoài. Ở đây chỉ sử dụng 1 Rom nên 3 chân này được nối mass.
- SCL : Chuỗi xung ngõ vào
- SDA : Chuỗi dữ liệu
Phần truyền tín hiệu đi xa :
Do máy tính có thể để ở xa so với cabin, vì vậy cần phải có phần này nhằm đảm bảo tín hiệu không bị suy hao.
SN75176 có chức năng tương đương như MAX485 (giá thành rẻ hơn tuy nhiên tính ổn định không cao), là IC dùng để chuyển đổi tín hiệu TTL sang RS485 để truyền tín hiệu đi xa, đường truyền tối đa lên đến 15Km.
2 chân TXD và RXD là 2 chân truyền nhận được kết nối trực tiếp với 89C51. Khi truyền xong hoặc nhận xong 1 chuỗi dữ liệu sẽ tạo ra 1 xung ở chân 2 và 3, xung này sẽ kích hoạt ngắt ở chân INT1của 89C51 để phục vụ phần mềm xử lý.
2 chân 6 và 7 là ngõ ra hoặc vào của tín hiệu RS485.
Phần nguồn:
Sở dĩ phải dùng nguồn 12V, rồi sau đó biến đổi ra 5V để sử dụng cho các linh kiện là vì khi truyền tín hiệu đi xa (từ mạch RS232_Nguồn đến mạch tính cước) mà dùng nguồn 5V sẽ bị suy hao bớt dẫn đến không đủ điện áp để sử dụng.
Nguyên lý hoạt động của Module tính cước:
Khi thuê bao gác máy (on hook), trở kháng của điện thoại rất cao, không có dòng qua mạch cảm biến nhấc máy.
Khi thuê bao nhấc máy (off hook), trở kháng này giảm dẫn đến có dòng chạy qua mạch cảm biến, dòng này làm cho 1 trong 2 Opto dẫn à CPU nhận biết thuê bao đang nhấc máy.
Khi nhận biết được thuê bao đang nhấc máy, CPU sẽ hiển thị “An So” báo cho người dùng biết để quay số. Khi thuê bao quay số, tín hiệu tone sẽ qua biến thế cách ly đến ngõ vào IN-, sau đó tín hiệu quay ra theo đường chân GS của MT8870, qua R27 rồi về tổng đài.
Sau khi nhấn 1 số, 1 tín hiệu từ cao xuống thấp tại chân STD sẽ kích hoạt ngắt cạnh xuống báo cho CPU biết đã thực hiện xong việc giải mã 1 cặp tone.
Sau khi thuê bao quay số xong, CPU sẽ đợi tín hiệu đảo cực. Khi có tín hiệu đảo cực, CPU bắt đầu kiểm tra xem số gọi đi là nội hạt, liên tỉnh hay di động sau đó lấy bảng giá từ Rom ngoài áp vào để tính cước.
Tất cả các dữ liệu như: số bị gọi, thời gian hay tiền đều được xuất ra led 7 đoạn và máy tính để người sử dụng dễ quản lý.
Module giao tiếp máy tính:
Đề tài này em thiết kế một máy tính có thể quản lý được 4 Cabin, nên phải cần có module này. Đây là module trung gian để kết nối máy tính với các cabin.
Sơ đồ mạch Module giao tiếp:
Phần xử lý trung tâm:
Mạch xử lý trung tâm.
Đây là module trung tâm để giao tiếp giữa các module tính cước và máy tính. Nhiệm vụ của module này là nhận dữ liệu từ module tính cước rồi xuất ra đúng từng cabin lên máy tính để chủ bưu cục dễ quản lý.
Ở đây em thiết kế sử dụng cho 2 module tính cước.
2 chân TXD và RXD là 2 chân truyền và nhận dữ liệu.
Bit P1.0 là bit nhận biết dữ liệu nhận được từ module tính cước để xuất ra máy tính.
Phần giao tiếp RS232:
Đây là phần kết nối giữa máy tính và phần cứng tính cước.
Trong đề tài này do không cần tốc độ truyền cao nên ta chọn giao tiếp mạch với máy tính thông qua cổng nối tiếp, thông thường có 2 cách ghép nối:
Cách đơn giản là dùng Transistor làm bộ đệm.
Ghép nối các đường truyền và nhận (TXD và RXD) của vi điều khiển với bộ đệm dùng vi mạch. Đề tài này em dùng MAX232.
Vi mạch MAX232 chuyển đổi mức TTL ở ngõ vào thành mức +10V (mức 1) hoặc -10V (mức 0) ở phía truyền và mức logic 1 (mức dấu) thành mức +3V à 15V hoặc mức logic 0 (mức trống) thành mức -3V à -15V thành mức TTL ở phía nhận.
Do trong đề tài ta sử dụng việc bắt tay giữa vi điều khiển và máy tính bằng phần mềm nên ta chỉ cần 3 đường truyền để truyền dữ liệu từ máy tính và ngược lại. Đó là 1 đường Mass được nối chung với Mass của mạch, 1 đường TXD và 1 đường RXD của máy tính được nối với vi mạch MAX232.
Nhiệm vụ của phần này, em xin được tóm tắt như sau:
Dữ liệu từ module tính cước được truyền đi theo chuẩn RS485 tới module giao tiếp qua IC SN75176 để chuyển sang tín hiệu TTL đưa đến phần xử lý trung tâm.
Từ đây lại đưa đến Max232 để đổi TTL à RS232 sau đó truyền qua cổng Com máy tính.
Các tụ được mắc theo thiết kế của nhà sản xuất.
Giao diện kết nối với vi tính _ dùng Visual Basic:
Đây là giao diện dành cho chủ bưu cục quản lý.
Khi Cabin nào gọi thì tất cả dữ liệu về cuộc gọi sẽ xuất lên Cabin đó.
Ví dụ: Cabin 1 đang gọi số thuê bao là 0907706660.
Thời gian cuộc gọi là 0 phút và 47 giây.
Tiền cuộc gọi là: 1800 VNĐ.
0907706660
00:47
1800 VNĐ
Lưu đồ giải thuật:
Lưu đồ giải thuật của phần tính cước:
Lưu đồ giải thuật của phần giao tiếp máy tính:
KẾT LUẬN
Ở đề tài luận văn này, em đã hoàn thành được những yêu cầu sau:
Hiển thị số bị gọi.
Hiển thị thời gian cuộc gọi.
Tính tiền và hiển thị tiền cuộc gọi.
Hiển thị số bị gọi, thời gian đàm thoại và tiền cuộc gọi lên giao diện máy tính.
Máy tính có thể quản lý được nhiều Cabin tính cước.
Mặc dù em đã cố gắng rất nhiều, nhưng vì kiến thức và kinh nghiệm còn hạn chế, vì vậy luận văn lần này còn nhiều thiếu sót như:
Không lưu được các cuộc gọi trước đó.
Không nạp được bảng giá cước từ máy vi tính.
Giao diện máy tính chưa đẹp.
Tính thẩm mỹ của mạch chưa cao.
Những thiếu sót này sẽ là hướng phát triển cho đề tài của em sau này.
Em rất mong những ý kiến đóng góp của thầy cô và các bạn để bổ sung vào phần kiến thức còn hạn chế của mình. Em xin chân thành cảm ơn !
TÀI LIỆU THAM KHẢO
CẤU TRÚC VÀ LẬP TRÌNH HỌ VI ĐIỀU KHIỂN 8051 - NGUYỄN TĂNG CƯỜNG, PHAN QUỐC THẮNG.
TRANG WEB GOOGLE: TRA CỨU DATASHEET CÁC LINH KIỆN: AT89C51, MT8870, OPTO 4N35,SN75176, MAX232, MAX485.
LUẬN VĂN TỐT NGHIỆP CỦA CÁC KHÓA TRƯỚC.
PHỤ LỤC: CÁC LINH KIỆN CHÍNH SỬ DỤNG TRONG MẠCH
AT89C51:
CẤU TRÚC PHẦN CỨNG:
Đặc điểm và chức năng hoạt động của các IC họ MSC- 51 hoàn toàn tương tự như nhau. Ở đây giới thiệu IC89C51 là một họ IC vi điều khiển do hãng Intel của Mỹ sản xuất. Chúng có các đặc điểm được tóm tắt như sau:
8 KB EPROM bên trong.
128 Byte RAM nội.
4 Port xuất/nhập I/O 8 bit.
Giao tiếp nối tiếp.
64 KB vùng nhớ mã ngoài.
64 KB vùng nhớ dữ liệu ngoại.
Xử lý Boolean (hoạt động trên bit đơn).
210 vị trí nhớ có thể định vị bit.
4 µs cho hoạt động nhân hoặc chia.
KHẢO SÁT SƠ ĐỒ CHÂN AT89C51, CHỨC NĂNG TỪNG CHÂN:
40
Sơ đồ chân:
Vcc
XTAL.1
XTAL.2
PSEN\
ALE
EA\
RST
Vss
P0.7
P0.6
P0.5
P0.4
P0.3
P0.2
P0.1
P0.0
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
P2.7
P2.6
P2.5
P2.4
P2.3
P2.2
P2.1
P2.0
18
19
12 MHz
P3.7
P3.6
P3.5
P3.4
P3.3
P3.2
P3.1
P3.0
17
16
15
14
13
12
11
10
RD
WR
T1
T0
INT1
INT0
TXD
RXD
89C51
29
30
31
9
20
30pF
32
33
34
35
36
37
38
39
8
7
6
5
4
3
2
1
28
27
26
25
24
23
22
21
30pF
Chức năng các chân của AT89C51:
AT89C51 có tất cả 40 chân có chức năng như các đưng72 xuất nhập. Trong đó có 24 chân có tác dụng kép (có nghĩa 1 chân có 2 chức năng), mỗi đường có thể hoạt động như đường xuất nhập hoặc như đường điều khiển hoặc là thành phần của các bus dữ liệu và bus địa chỉ.
Các Port:
Port 0: là Port có 2 chức năng ở các chân 32 – 39 của 89C51. Trong các thiết kế cờ nhớ không dùng bộ nhớ mở rộng, nó có chức năng như các đường I/O. Đối với các thiết kế cỡ lớn có bộ nhớ mở rộng, nó được kết hợp giữa các bus địa chỉ và bus dữ liệu.
Port 1: là Port I/O trên các chân 1 – 8. Các chân được ký hiệu từ P1.0,.., P1.7 có thể dùng cho giao tiếp với các thiết bị ngoài nếu cần. Port 1 không có chức năng khác, vì vậy chúng chỉ được dùng cho các thiết bị bên ngoài.
Port 2: là Port có tác dụng kép nên các chân 21 – 28 được dùng như các đường I/O hoặc là byte cao của bus địa chỉ đối với các thiết bị dùng bộ nhớ mở rộng.
Port 3: là Port có tác dụng kép nên các chân từ 10 – 17. Các chân của Port này có nhiều chức năng, các công dụng chuyển đổi liên hệ với các đặc tính đặc tính đặc biệt của 89C51 như ở bản sau:
Bit
Tên
Chức năng chuyển đổi
P3.0
RXT
Ngõ vào dữ liệu nối tiếp.
P3.1
TXD
Ngõ xuất dữ liệu nối tiếp.
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
INT0\
INT1\
T0
T1
WR\
RD\
Ngõ vào ngắt cứng thứ 0.
Ngõ vào ngắt cứng thứ 1.
Ngõ vào của TIMER/COUNTER thứ 0.
Ngõ vào của TIMER/COUNTER thứ 1.
Tín hiệu ghi dữ liệu lên bộ nhớ ngoài.
Tín hiệu đọc bộ nhớ dữ liệu ngoài.
Các ngõ tín hiệu điều khiển:
Ngõ tín hiệu PSEN (Program Store Enable):
PSEN là tín hiệu ngõ ra ở chân 29 có tác dụng cho phép đọc bộ nhớ chương trình mở rộng thường được nối đến chân OE\ (Output Enable) của EPROM cho phép đọc các byte mã lệnh.
PSEN ở mức thấp trong thời gian Microcontroller 89C51 lấy lệnh. Các mã lệnh của chương trình được đọc vào từ EPROM qua bus dữ liệu và được chốt vào thanh ghi lệnh bên trong 89C51 để giải mã lệnh. Khi 89C51 thi hành chương trình trong ROM nội PSEN sẽ ở mức logic 1.
Ngõ tín hiệu điều khiển ALE (Address Latch Enable):
Khi 89C51 truy xuất bộ nhớ bên ngoài, Port 0 có chức năng là bus địa chỉ và bus dữ liệu, do đó phải tách các đường địa chỉ và dữ liệu. Tín hiệu ra ALE ở chân thứ 30 dùng làm tín hiệu điều khiển để giải đa hợp các đường địa chỉ và dữ liệu khi kết nối chúng với IC chốt.
Tín hiệu ra ở chân ALE có tốc độ bằng 1/6 lần tần số dao động trên chip và có thể được dùng làm tín hiệu clock cho các phần khác của hệ thống. Chân ALE được dùng làm ngõ vào xung lập trình cho EPROM trong 89C51.
Ngõ tín hiệu EA\ (External Access): Tín hiệu vào EA\ ở chân 31 thường được mắc lên mức 1 hoặc 0. Nếu ở mức 1, 89C51 thi hành chương trình từ ROM nội trong khoảng địa chỉ thấp 8 Kbyte. Nếu ở mức 0, 89C51 sẽ thi hành chương trình từ bộ nhớ mở rộng. Chân EA\ được lấy làm chân cấp nguồn 21V khi lập trình cho EPROM trong 89C51.
Ngõ tín hiệu RST (Reset): Ngõ vào RST ở chân 9 là ngõ vào Reset của 89C51. Khi ngõ vào tín hiệu này đưa lên cao ít nhất là 2 chu kỳ máy, các thanh ghi bên trong được nạp những giá trị thích hợp để khởi động hệ thống. Khi cấp điện, mạch tự động Reset.
Các ngõ vào bộ dao động X1, X2: Bộ dao động được tích hợp bên trong 89C51, khi sử dụng 89C51 người thiết kế chỉ cần kết nối thêm thạch anh và các tụ như hình vẽ trong sơ đồ. Tần số Thạch anh thường được sử dụng là 12Mhz.
Các chân nguồn: 89C51 vận hành với nguồn đơn 5V, Vcc (nguồn) được nối vào chân 40 và Vss (GND) được nối vào chân 20.
CẤU TRÚC BÊN TRONG 89C51:
Tổ chức bộ nhớ:
DATA
Memory
Enable
via
RD & WR
CODE Memory
Enable
via
PSEN
FFFF FFFF
FF
00
On – Chip 0000 0000
Memory
Bộ nhớ trên Chip
Hình : Tóm tắt các vùng nhớ của 89C51.
Hai đặc tính cần lưu ý:
Các thanh ghi và các Port xuất nhập đã được sắp xếp trong bộ nhớ và có thể được truy xuất trực tiếp như các địa chỉ bộ nhớ khác.
Ngăn sếp bên trong Ram nội nhỏ hơn so với RAM ngoài như trong các bộ vi xử lý khác.
Chi tiết về bộ nhớ RAM trên Chip:
RAM bên trong 89C51 được phân chia giữa các bank thanh ghi (00H à 1FH), RAM địa chỉ hoá từng bit (20H à 2FH), RAM đa dụng (30H à 7FH), và các thanh ghi chức năng đặc biệt (08H à FFH).
Bảng tóm tắt các vùng nhớ 89C51.
Bản đồ bộ nhớ data trên Chip như sau :
7F
RAM đa dụng
FF
F0
F7
F6
F5
F4
F3
F2
F1
F0
B
E0
E7
E6
E5
E4
E3
E2
E1
E0
ACC
D0
D7
D6
D5
D4
D3
D2
D1
D0
PSW
30
B8
-
-
-
BC
BB
BA
B9
B8
IP
2F
7F
7E
7D
7C
7B
7A
79
78
2E
77
76
75
74
73
72
71
70
B0
B7
B6
B5
B4
B3
B2
B1
B0
P.3
2D
6F
6E
6D
6C
6B
6A
69
68
2C
67
66
65
64
63
62
61
60
A8
AF
AC
AB
AA
A9
A8
IE
2B
5F
5E
5D
5C
5B
5A
59
58
2A
57
56
55
54
53
52
51
50
A0
A7
A6
A5
A4
A3
A2
A1
A0
P2
29
4F
4E
4D
4C
4B
4A
49
48
28
47
46
45
44
43
42
41
40
99
Không được địa chỉ hoá bit
SBUF
27
3F
3E
3D
3C
3B
3A
39
38
98
9F
9E
9D
9C
9B
9A
99
98
SCON
26
37
36
35
34
33
32
31
30
25
2F
2E
2D
2C
2B
2A
29
28
90
97
96
95
94
93
92
91
90
P1
24
27
26
25
24
23
22
21
20
23
1F
1E
1D
1C
1B
1A
19
18
8D
Không được địa chỉ hoá bit
TH1
22
17
16
15
14
13
12
11
10
8C
Không được địa chỉ hoá bit
TH0
21
0F
0E
0D
0C
0B
0A
09
08
8B
Không được địa chỉ hoá bit
TL1
20
07
06
05
04
03
02
01
00
8A
Không được địa chỉ hoá bit
TL0
1F
Bank 3
89
Không được địa chỉ hoá bit
TMOD
18
88
8F
8E
8D
8C
8B
8A
89
88
TCON
17
Bank 2
87
Không được địa chỉ hoá bit
PCON
10
0F
Bank 1
83
Không được địa chỉ hoá bit
DPH
08
82
Không được địa chỉ hoá bit
DPL
07
Bank thanh ghi 0
81
Không được địa chỉ hoá bit
SP
00
(mặc định cho R0 –R7)
88
87
86
85
84
83
82
81
80
P0
Bộ nhớ trong 89C51 bao gồm ROM và RAM. RAM trong 89C51 bao gồm nhiều thành phần: phần lưu trữ đa dụng, phần lưu trữ địa chỉ hoá từng bit, các bank thanh ghi và các thanh ghi chức năng đặc biệt.
89C51 có bộ nhớ theo cấu trúc Harvard: Có những vùng bộ nhớ riêng biệt cho chương trình và dữ liệu. Chương trình và dữ liệu có thể chứa bên trong 89C51 nhưng 89C51 vẫn có thể kết nối với 64Kbyte dữ liệu.
Hai đặc tính cần chú ý là:
Các thanh ghi và các Port xuất nhập đã được định vị (xác định) trong bộ nhớ và có thể truy xuất trực tiếp giống như các địa chỉ bộ nhớ khác.
Ngăn xếp bên trong RAM nội nhỏ hơn so với RAM ngoại như trong các bộ Microcontroller khác.
RAM bên trong 89C51 được phân chia như sau:
Các bank thanh ghi có địa chỉ từ 00H đến 1FH.
RAM địa chỉ hóa từng bit có địa chỉ từ 20H đến 2FH.
RAM đa dụng từ 30H đến 7FH.
Các thanh ghi chức năng đặc biệt từ 80H đến FFH.
RAM đa dụng:
Mặc dù trên hình vẽ cho thấy 80 byte đa dụng chiếm các địa chỉ từ 30H đến 7FH, 32 byte dưới từ 00H đến 1FH cũng có thể dùng với mục đích tương tự (mặc dù các địa chỉ này đã có mục đích khác).
Mọi địa chỉ trong vùng RAM đa dụng đều có thể truy xuất tự do dùng kiểu địa chỉ trực tiếp hoặc gián tiếp.
RAM có thể truy xuất từng bit:
89C51 chứa 210 bit được địa chỉ hóa, trong đó có 128 bit có chứa các byte chứa địa chỉ từ 20H đến 2FH và các bit còn lại chứa trong nhóm thanh ghi có chức năng đặc biệt.
Ý tưởng truy xuất bit bằng phần mềm là các đặc tính mạnh của Microcontroller xử lý chung. Các bit có thể được đặt, xóa, AND, OR …, với 1 lệnh đơn. Đa số các Microcontroller xử lý đòi hỏi một chuỗi lệnh đọc- sửa- ghi để đạt được mục đích tương tự. Ngoài ra các Port cũng có thể truy xuất được từng bit.
128 bit truy xuất từng bit này cũng có thể truy xuất như các byte hoặc như các bit phụ thuộc vào lệnh được dùng.
Các bank thanh ghi:
32 bit thấp của bộ nhớ nội được dành cho các bank thanh ghi. Bộ lệnh 89C51 hổ trợ 8 thanh ghi có tên là R0 đến R7 và theo mặc định sau khi reset hệ thống, các thanh ghi này có địa chỉ từ 00H đến 07H.
Các lệnh dùng các thanh ghi từ R0 à R7 sẽ ngắn hơn và nhanh hơn so với các lệnh có chức năng tương ứng dùng kiểu địa chỉ trực tiếp. Các dữ liệu được dùng thường xuyên nên dùng một trong các thanh ghi này
Do có 4 bank thanh ghi nên tại một thời điểm chỉ có một bank thanh ghi được truy xuất bởi các thanh ghi R0 à R7 để chuyển đổi việc truy xuất các bank thanh ghi ta phải thay đổi các bit chọn bank trong thanh ghi trạng thái.
Các thanh ghi có chức năng đặc biệt:
Các thanh ghi nội của 89C51 được truy xuất ngầm định bởi bộ lệnh.
Các thanh ghi trong 89C51 được định dạng như một phần của RAM trên chip, vì vậy mỗi thanh ghi sẽ có một địa chỉ.
Chú ý: Tất cả 128 địa chỉ từ 80H đến FFH khônh được định nghĩa, chỉ có 21 thanh ghi có chức năng đặc biệt được định nghĩa sẵn các địa chỉ.
Thanh ghi trạng thái chương trình (PSW: Program Status Word)):
Từ trạng thái chương trình ở địa chỉ D0H được tóm tắt như sau:
BIT
SYMBOL
ADDRESS
DESCRIPTION
PSW.7
CY
D7H
Cary Flag
PSW.6
AC
D6H
Auxiliary Cary Flag
PSW.5
F0
D5H
Flag 0
PSW4
RS1
D4H
Register Bank Select 1
PSW.3
RS0
D3H
Register Bank Select 0
00=Bank 0; address 00H¸07H
01=Bank 1; address 08H¸0FH
10=Bank 2; address 10H¸17H
11=Bank 3; address 18H¸1FH
PSW.2
OV
D2H
Overlow Flag
PSW.1
-
D1H
Reserved
PSW.0
P
DOH
Even Parity Flag
Chức năng từng bit trạng thái chương trình.
Cờ Carry CY (Carry Flag):
Cờ nhớ có tác dụng kép. Thông thường nó được dùng cho các lệnh toán học: C=1 nếu phép toán cộng có sự tràn hoặc phép trừ có mượn và ngược lại C=0 nếu phép toán cộng không tràn và phép trừ không có mượn.
Bit Parity (P):
Bit tự động được Set hay Clear ở mỗi chu kỳ máy để lập P chẵn với thanh ghi A. Sự đếm các bit 1 trong thanh ghi A cộng với bit P luôn luôn chẵn. Ví dụ: A chứa 10101101B thì bit P Set lên 1 để tổng số bit 1 trong A và P tạo thành số chẵn.
Bit P thường được dùng trong sự kết hợp với những thủ tục của Port nối tiếp để tạo ra bit P trước khi phát đi hoặc kiểm tra bit P sau khi thu.
Thanh ghi B:
Thanh ghi B ở địa chỉ F0H được dùng cùng với thanh ghi A cho các phép toán nhân chia. Lệnh MUL AB è sẽ nhận những giá trị không dấu 8 bit trong 2 thanh ghi A và B, rồi trả về kết quả 16 bit trong A (byte cao) và B (byte thấp). Lệnh DIV AB è lấy A chia B, kết quả phần nguyên đặt vào A, phần dư đặt vào B.
Thanh ghi B có thể được dùng như một thanh ghi đệm trung gian đa mục đích. Nó là những bit định vị thông qua những địa chỉ từ F0H à F7H.
Con trỏ ngăn xếp SP (Stack Pointer):
Con trỏ ngăn xếp là một thanh ghi 8 bit ở địa chỉ 81H. Nó chứa địa chỉ của byte dữ liệu hiện hành trên đỉnh ngăn xếp. Các lệnh trên ngăn xếp bao gồm các lệnh cất dữ liệu vào ngăn xếp (PUSH) và lấy dữ liệu ra khỏi ngăn xếp (POP). Lệnh cất dữ liệu vào ngăn xếp sẽ làm tăng SP trước khi ghi dữ liệu và lệnh lấy ra khỏi ngăn xếp sẽ làm giảm SP. Ngăn xếp của 89C51 được giữ trong RAM nội và giới hạn các địa chỉ có thể truy xuất bằng địa chỉ gián tiếp, chúng là 128 byte đầu của 89C51.
Để khởi động SP với ngăn xếp bắt đầu tại địa chỉ 60H, các lệnh sau đây được dùng:
MOV SP,#5FH.
Với lệnh trên thì ngăn xếp của 89C51 chỉ có 32 byte vì địa chỉ cao nhất của RAM trên chip là 7FH. Sở dĩ giá trị 5FH được nạp vào SP là vì SP tăng lên 60H trước khi cất byte dữ liệu.
Khi reset 89C51, SP sẽ mang giá trị mặc định là 07H và dữ liệu đầu tiên sẽ được cất vào ô nhớ ngăn xếp có địa chỉ 08H. Nếu phần mềm ứng dụng không khởi động SP một giá trị mới thì bank thanh ghi 1 có thể cả 2 và 3 sẽ không dùng được vì vùng RAM này đã được dùng làm ngăn xếp. Ngăn xếp được truy xuất trực tiếp bằng các lệnh PUSH và POP để lưu trữ tạm thời và lấy lại dữ liệu, hoặc truy xuất ngầm bằng lệnh gọi chương trình con (ACALL, LCALL) và các lệnh trở về (RET, RETI) để lưu trữ giá trị của bộ đếm chương trình khi bắt đầu thực hiện chương trình con và lấy lại khi kết thúc chương trình con.
Con trò dữ liệu DPTR (Data Pointer):
Được dùng để truy xuất bộ nhớ ngoài là 1 thanh ghi 16 bit ở địa chỉ 82H (DPL: byte thấp) và 83H (DPH: byte cao). Ba lệnh sau sẽ ghi 55H vào RAM ngoài ở địa chỉ 1000H:
MOV A,#55H
MOV DPTR,#1000H
MOV @DPTR,A
Lệnh đầu tiên dùng để nạp 55H vào thanh ghi A. Lệnh thứ 2 dùng để nạp địa chỉ của ô nhớ cần lưu giá trị 55H vào DPTR. Lệnh thứ 3 sẽ di chuyển nội dung của thanh ghi A (là 55H) vào ô nhớ RAM bên ngoài có địa chỉ chứa trong DPTR (là 1000H).
Các thanh ghi Port (Port Register):
Các Port của 89C51 bao gồm Port 0 ở địa chỉ 80H, Port 1 ở địa chỉ 90H, Port 2 ở địa chỉ A0H, Port 3 ở địa chỉ B0H. Tất cả các Port này đều có thề truy xuất từng bit nên rất thuận tiện trong khả năng giao tiếp.
Các thanh ghi Timer (Timer Register):
89C51 có chứa 2 bộ Timer/Counter 16 bit được dùng cho việc định thời được đếm sự kiện. Timer 0/1 ở địa chỉ 8AH/8BH (TL0/1: byte thấp), 8CH/8DH (TH0/1: byte cao). Việc khởi động Timer được Set bởi Timer Mode (TMOD) ở địa chỉ 89H và thanh ghi điều khiển Timer (TCON) ở địa chỉ 88H. Chỉ có TCON được địa chỉ hóa từng bit.
Các thanh ghi Port nối tiếp (Serial Port Register):
89C51 chứa 1 Port nối tiếp cho việc trao đổi thông tin với các thiết bị nối tiếp như máy tính, Modem hoặc giao tiếp nối tiếp với các IC khác. Một thanh ghi đệm dữ liệu nối tiếp (SBUF) ở địa chỉ 99H sẽ giữ cả 2 dữ liệu truyền và nhận. Khi truyền dữ liệu ghi lên SBUF, khi nhận dữ liệu thì đọc SBUF. Các mode vận khác nhau được lập trình qua thanh ghi điều khiển Port nối tiếp (SCON) được địa chỉ hóa từng bit ở địa chỉ 98H.
Các thanh ghi ngắt (Interrupt Register): 89C51 có cấu trúc 5 nguồn ngắt, 2 mức ưu tiên. Các ngắt bị cấm sau khi bị reset hệ thống và sẽ được cho phép bằng việc ghi thanh ghi cho phép ngắt (IE) ở địa chỉ A8H. Cả 2 được địa chỉ hóa từng bit.
Bộ nhớ ngoài (External Memory):
89C51 có khả năng mở rộng bộ nhớ lên đến 64K byte bộ nhớ chương trình và 64K byte bộ nhớ dữ liệu ngoài. Do đó, có thể dùng thêm ROM và RAM nếu cần.
Khi dùng bộ nhớ ngoài, Port 0 không còn chức năng I/O nữa. Nó được kết hợp giữa bus địa chỉ (A0-A7) và bus dữ liệu (D0-D7) với tín hiệu ALE để chốt byte của bus địa chỉ khi bắt đầu mỗi chu kỳ bộ nhớ. Port được cho là byte cao của bus địa chỉ.
Truy xuất bộ nhớ mã ngoài (Accessing External Code Memory):
Bộ nhớ chương trình bên ngoài là bộ nhớ ROM được cho phép của tín hiuệ PSEN\. Sự kết nối phần cứng của bộ nhớ EPROM như sau:
Port 0
EA
ALE
Port 2
PSEN
89C51
D0 ¸ D7
A0 ¸ A7
A8 ¸ A15
OE
74HC373
O D
G
EPROM
Trong 1 chu kỳ máy tiêu biểu, tín hiệu ALE tích 2 lần. Lần thứ 1 cho phép 74HC373 mở cổng chốt địa chỉ byte thấp, khi ALE xuống 0 thì byte thấp và byte cao của bộ đếm chương trình đều có nhưng EPROM chưa xuất vì PSEN\ chưa tích cực, khi tín hiệu lên 1 trở lại thì Port 0 đã có dữ liệu là Opcode. ALE tích cực lần thứ 2 được giải thích tương tự và byte 2 được đọc từ bộ nhớ chương trình. Nếu lệnh đang hiện hành là lệnh 1 byte thì CPU chỉ đọc Opcode, còn byte thứ 2 bỏ đi.
HOẠT ĐỘNG CỦA TIMER:
Giới thiệu:
Bộ định thời của Timer là một chuỗi các Flip Flop được chia làm 2, nó nhận tín hiệu vào là một nguồn xung clock, xung clock được đưa vào Flip Flop thứ nhất là xung clock của Flip Flop thứ 2 mà nó cũng chia tần số clock này cho 2 và cứ tiếp tục.
Vì mỗi tầng kế tiếp chia cho 2, nên Timer n tầng phải chia tần số clock ngõ vào cho 2n. Ngõ ra của tầng cuối cùng là clock của Flip Flop tràn Timer hoặc cờ mà nó kiểm tra bởi phần mềm hoặc sinh ra ngắt. Giá trị nhị phân trong các FF của bộ Timer có thể được nghĩ như đếm xung clock hoặc các sự kiện quan trọng bởi vì Timer được khởi động. Ví dụ Timer 16 bit có thể đếm đến từ FFFFH sang 0000H.
Hoạt động của Timer đơn giản 3 bit được minh họa như sau:
D Q
Q0
D Q
Q1
D Q
Q2
D Q
Q3
Flag FF
Clock
Q0 (LSB)
Q1
Q2 (MSB)
Count
Flag
LSB MSB Flag
Timer Flip Flops.
0 1 2 3 4 5 6 7
Trong hình trên mỗi tầng là 1 FF loại D phủ định tác động cạnh xuống được hoạt động ở mode chia cho 2 (ngõ ra Q\ được nối vào D). FF cờ là một bộ chốt đơn giản loại D được set bởi tầng cuối cùng trong Timer. Trong biểu đồ thời gian, tầng đầu đổi trạng thái ở 1/2 tần số clock, tầng thứ 2 đổi trạng thái ở tần số 1/4 tần số clock… Số đếm được biết ở dạng thập phân và được kiểm tra lại dễ dàng bởi việc kiểm tra các tần số của 3 FF. Ví dụ số đếm “4” xuất hiện khi Q2 = 1, Q1 = 0, Q0 = 0 ( 410 = 1002).
Các Timer được ứng dụng thực tế cho các hoạt động định hướng. 89C51 có 2 bộ Timer 16 bit, mỗi Timer có 4 mode hoạt động. Các Timer dùng để đếm giờ, đếm các sự kiện cần thiết và sự sinh ra tốc độ của tốc độ Baud bởi ự gắn liền Port nối tiếp.
Mỗi sự định thời là một Timer 16 bit, do đó tầng cuối cùng là tầng thứ 16 sẽ chia tần số clock vào cho 216 = 65.536.
Trong các ứng dụng định thời, 1 Timer được lập trình để tràn ở một khoảng thời gian đều đặn và được set cờ tràn Timer. Cờ được dùng để đồng bộ chương trình để thực hiện một hoạt động như việc đưa tới 1 tầng các ngõ vào hoặc gửi dữ liệu đếm ngõ ra. Các ứng dụng khác có sử dụng việc ghi giờ đều đều của Timer để đo thời gian đã trôi qua 2 trạng thái (ví dụ đo độ rộng xung). Việc đếm 1 sự kiện đựoc dùng để xác định số lần xuất hiện của sự kiện đó, tức thời gian trôi qua giữa các sự kiện.
Các Timer của 89C51 được truy xuất bởi việc dùng 6 thanh ghi chức năng đặc biệt:
Timer SFR
Purpose
Address
Bit-Addressable
TCON
Control
88H
YES
TMOD
Mode
89H
NO
TL0
Timer 0 low-byte
8AH
NO
TL1
Timer 1 low-byte
8BH
NO
TH0
Timer 0 high-byte
8CH
NO
TH1
Timer 1 high-byte
8DH
NO
CÁC THANH GHI ĐIỀU KHIỂN TIMER:
Thanh ghi điều khiển chế độ Timer - TMOD (Timer Mode Register):
Thanh ghi TMOD gồm 2 nhóm 4 bit là: 4 bit thấp đặt mode hoạt động dho Timer 0 và 4 bit cao đặt mode hoạt động cho Timer 1. 8 bit của thanh ghi TMOD được tóm tắt như sau:
Bit
Name
Timer
Description
7
GATE
1
Khi GATE = 1, Timer chỉ làm việc khi INT1=1
6
C/T
1
Bit cho đếm sự kiện hay ghi giờ
C/T = 1 : Đếm sự kiện
C/T = 0 : Ghi giờ đều đặn
5
M1
1
Bit chọn mode của Timer 1
4
M0
1
Bit chọn mode của Timer 1
3
GATE
0
Bit cổng của Timer 0
2
C/T
0
Bit chọn Counter/Timer của Timer 0
1
M1
0
Bit chọn mode của Timer 0
0
M0
0
Bit chọn mode của Timer 0
Hai bit M0 và M1 của TMOD để chọn mode cho Timer 0 hoặc Timer 1.
M1
M0
MODE
DESCRIPTION
0
0
0
Mode Timer 13 bit (mode 8048)
0
1
1
Mode Timer 16 bit
1
0
2
Mode tự động nạp 8 bit
1
1
3
Mode Timer tách ra :
Timer 0 : TL0 là Timer 8 bit được điều khiển bởi các bit của Timer 0. TH0 tương tự nhưng được điều khiển bởi các bit của mode Timer 1.
Timer 1 : Được ngừng lại.
TMOD không có bit định vị, nó thường được load một lần bởi phần mềm ở đầu chương trình để khởi động mode Timer. Sau đó sự định giờ có thể dừng lại, được khởi động lại như thế bởi sự truy xuất các thanh ghi chức năng đạc biệt của Timer khác.
Thanh ghi điều khiển Timer - TCON (Timer Control Register):
Thanh ghi điều khiển bao gồm các bit trạng thái và các bit điều khiển bởi Timer 0 và Timer 1. Thanh ghi TCON có bit định vị. Hoạt động của từng bit được tóm tắt như sau :
Bit
Symbol
Bit Address
Description
TCON.7
TF1
8FH
Cờ tràn Timer 1 được set bởi phần cứng ở sự tràn, được xóa bởi phần mềm hoặc bởi phần cứng khi các vector xử lý đến thủ tục phục vụ ngắt ISR
TCON.6
TR1
8EH
Bit điều khiển chạy Timer 1 được set hoặc xóa bởi phần mềm để chạy hoặc ngưng chạy Timer.
TCON.5
TF0
8DH
Cờ tràn Timer 0 (hoạt động tương tự TF1)
TCON.4
TR0
8CH
Bit điều khiển chạy Timer 0 (giống TR1)
TCON.3
IE1
8BH
Cờ kiểu ngắt 1 ngoài. Khi cạnh xuống xuất hiện trên ÍNT thì ÍE được xóa bởi phần mềm hoặc phần cứng khi CPU định hướng đến thủ tục phục vụ ngắt ngoài.
TCON.2
IT1
8AH
Cờ kiểu ngắt 1 ngoài được set hoặc xóa bằng phần mềm bởi cạnh kích hoạt bởi sự ngắt ngoài.
TCON.1
IE0
89H
Cờ cạnh ngắt ngoài 0
TCON
IT0
88H
Cờ kiểu ngắt ngoài 0.
II. MT8870 _IC GIẢI MÃ DTMF :
MT8870 là linh kiện được sản xuất theo công nghệ ISO2-CMOS. Nó thực hiện chức năng giải mã cặp 16 tone DTMF thành mã 4 bit. Năng lượng thấp và tối thiểu hoá linh kiện mắc bên ngoài.
Mô tả chân linh kiện:
Pin
Tên
Mô tả
1
IN+
Ngõ vào không đảo
2
IN-
Ngõ vào đảo
3
GS
Chân hồi tiếp của ngõ ra mạch khuếch đại để gắn với điện trở bên ngoài để điều khiển hệ số của mạch khuếch đại
4
Vref
Ngõ ra dùng để phân cực các ngõ vào tại điểm giữa, thường là 1/2 VDD
5
INH
Ngõ vào, chân này ở mức cao sẽ cấm sự tách dò các tone đại diện cho các ký tự A, B, C, D. Thông thường nối VSS
6
PWDN
(Power Down) Ngõ vào tích cực mức cao sẽ ngát nguồn IC và cấm ngõ vào dao động. Thường nối VSS
7
OSC1
Chân tạo xung clock (input)
8
OSC2
Chân tạo xung clock (output), thạch anh 3,58 Mhz được nối giữa OSC1 và OSC2 tạo thành mạch dao động
9
VSS
Nguồn 0V
10
TOE
Ngõ vào tích cực mức cao cho phép ngõ ra Q1-Q4
11 14
Q1 – Q4
Ngõ ra data, TOE =1 cung cấp mã tương ứng của cặp tone thu được, TOE = 0 ngõ ra trở kháng cao.
15
StD
(Delay Steering) Ngõ ra, STD ở mức cao khi hoàn thành việc giải mã 1 cặp tone, trở lại mức thấp khi điện áp trên chân St/Gt nhỏ hơn điện áp ngưỡng VRef .
16
ESt
(Early Steering) Ngõ ra sẽ ở mức cao khi thuật toán số dò tìm được cặp tone có giá trị (signal codition). Bất kỳ sự mất mát signal condition sẽ là nguyên nhân làm Est trở về mức thấp.
17
St/Gt
Khi điện áp chân này lớn hơn điện áp ngưỡng (VRef ) thì ghi nhận giải mã một tone và chốt dữ liệu ở ngõ ra. Khi điện áp nhỏ hơn VRef thì giải phóng thiết bị để nhận một tone mới
18
VDD
Nguồn 5V
NC
Để hở
Sơ đồ khối chức năng của MT8870
Phần lọc (Filter Section):
Tín hiệu Analog đưa qua bộ lọc để loại bỏ tone có tần số từ 350Hz đến 480Hz. Sau đó tín hiệu được chia thành 2 băng tần bởi 2 bộ lọc thông dải, 1 từ 697Hz đến 941 Hz và 1 từ 1209Hz đến 1633Hz. Hai nhóm tín hiệu này được biến thành xung vuông bởi bộ dò Zero Crossing.
Phần giải mã (Decoder Section):
Dùng kỹ thuật đếm số để xác định tần số các tone nhận được và kiểm tra chúng tương ứng với tần số chuẩn DTMF. Thuật toán trung bình phức bảo vệ chống lại tone giả bởi một tín hiệu từ bên ngoài khi mà dung sai cho phép của sự biến thiên và lệch tần số nhỏ. Khi bộ giải mã nhận diện được sự hiện diện của 2 giá trị tone, ngõ ra Est chuyển sang trạng thái tích cực.
Mạch Steering( Steering Circuit):
Est ở mức cao làm cho Vc tăng lên như sự phóng điện của tụ Signal Condition được duy trì. Khi Vc đạt đến ngưỡng VRef thì cặp tone được ghi nhận và 4 bit dữ liệu được đưa đến ngõ ra bộ chốt. Lúc đó Gt ở mức cao, cùng lúc Est ở mức cao. Sau khoảng thời gian trễ ngắn để kết thúc chốt ngõ ra cho đến khi STD ở mức cao thì cặp tone đã được ghi nhận. Khi TOE ở mức cao thì 4 bit dữ liệu được xuất ra ngoài.
Bảng giải mã 4 bit tương ứng với cặp tone nhận được:
Flow (Hz)
FHigh (Hz)
Key
TOE
Q4
Q3
Q2
Q1
697
1290
1
H
0
0
0
0
697
1336
2
H
0
0
0
1
697
1477
3
H
0
0
1
0
770
1290
4
H
0
0
1
1
770
1336
5
H
0
1
0
0
770
1477
6
H
0
1
0
1
852
1290
7
H
0
1
1
0
852
1336
8
H
0
1
1
1
852
1477
9
H
1
0
0
0
941
1290
0
H
1
0
0
1
941
1336
*
H
1
0
1
0
941
1477
#
H
1
0
1
1
697
1633
A
H
1
1
0
0
770
1633
B
H
1
1
0
1
852
1633
C
H
1
1
1
0
941
1633
D
H
1
1
1
1
-
-
?
L
Z
Z
Z
Z
H: mức trở kháng cao L:mức trở kháng thấp ?: không xác định
Bộ tạo dao động Thạch anh:
Gắn 1 thạch anh 3,5795Mhz vào giữa 2 chân OSC1 và OSC2 để hoàn tất mạch dao động. Nếu có nhiều bộ giải mã DTMF, ta có thể nối tiếp dao động bằng cách lấy xung đồng hồ từ OSC2 thông qua tụ 30p đưa vào OSC1 của bộ giải mã DTMF thứ 2 như sau:
MT8870 là IC dùng để giải mã DTMF từ bàn phím điện thoại đưa đến CPU để xuất ra led 7 đoạn.
BẢNG MÃ VÙNG CÁC TỈNH
Stt
Tên tỉnh
Mã vùng
Stt
Tên tỉnh
Mã vùng
1
An Giang
076
31
Kom Tum
060
2
Bạc Liêu
781
32
Lai Châu
023
3
Vũng Tàu
064
33
Lạng Sơn
025
4
Bắc Cạn
281
34
Lào Cai
020
5
Bắc Giang
240
35
Lâm Đồng
063
6
Bắc Ninh
241
36
Long An
072
7
Bến Tre
075
37
Nam Định
350
8
Bình Dương
650
38
Nghệ An
038
9
Bình Định
056
39
Ninh Bình
030
10
Bình Phước
651
40
Ninh Thuận
068
11
Bình Thuận
062
41
Phú Thọ
210
12
Cao Bằng
026
42
Phú yên
057
13
Cà Mau
780
43
Quãng Bình
052
14
Cần Thơ
071
44
Quãng Nam
510
15
Đà Nẵng
511
45
Quãng Ngãi
055
16
Đắc Lắc
050
46
Quãng Ninh
033
17
Đồng Nai
061
47
Quãng Trị
053
18
Đồng Tháp
067
48
Sóc Trăng
079
19
Gia Lai
059
49
Sơn La
022
20
Hà Giang
019
50
Tây Ninh
066
21
Hà Nam
351
51
Thái Bình
036
22
Hà Nội
04
52
Thái Nguyên
280
23
Hà Tây
034
53
Thanh Hóa
037
24
Hà Tĩnh
039
54
Thừa Thiên Huế
054
25
Hải Dương
320
55
Tiền Giang
073
26
Hải Phòng
031
56
Trà Vinh
074
27
Hòa Bình
018
57
Tuyên Quang
027
28
Hưng Yên
321
58
Vĩnh Long
070
29
Khánh Hòa
058
59
Vĩnh Phúc
211
30
Kiên Giang
077
60
Yên Bái
029
PHẦN MỀM NẠP CHO AT89C51
TRAMNGAN EQU 127
CHUCNGAN EQU 126
NGAN EQU 125
TRAM EQU 124
LED1 EQU 123
LED2 EQU 122
LED3 EQU 121
LED4 EQU 120
LED5 EQU 119
LED6 EQU 118
LED7 EQU 117
LED8 EQU 116
LED9 EQU 115
LED10 EQU 114
NGAT EQU 113
POS EQU 112
QUET EQU 111
PHUT EQU 110
GIAY EQU 109
KT EQU 108
TIEN EQU 107
NH EQU 106
DD EQU 105
L_T EQU 104
NHO10 EQU 103
NHO9 EQU 102
BAPHUT EQU 101
TIEN_LT EQU 100
TIEN_DD EQU 99
LJMP MAIN
ORG 0003H
LJMP HIENTHI
ORG 000BH
LJMP DEM
ORG 001BH
LJMP QUETLED
MAIN:
MOV TMOD,#11H
MOV TH0,#HIGH(-49995)
MOV TL0,#LOW(-49995)
MOV TH1,#HIGH(-2500)
MOV TL1,#LOW(-2500)
SETB TR1
MOV IE,#10001011B
SETB IT0
MOV SP,#60
MOV IP,#00000010B
MOV R0,#LED10
MOV R1,#LED10
MOV R6,#20
MOV QUET,#01111111B
MOV POS,#01111111B
MOV PHUT,#0
MOV GIAY,#0
MOV TRAMNGAN,#0
MOV CHUCNGAN,#0
MOV NGAN,#0
MOV TRAM,#0
MOV NH,#0
MOV DD,#0
MOV L_T,#0
MOV BAPHUT,#0
BEGIN:
SETB EX0
MOV NGAT,#0
MOV TIEN_LT,#13
MOV TIEN_DD,#3
CALL TAT
JNB P3.4,KIEMTRA
JNB P3.5,KIEMTRA
MOV R0,#LED10
MOV R6,#20
MOV GIAY,#0
MOV PHUT,#0
MOV TRAMNGAN,#0
MOV CHUCNGAN,#0
MOV NGAN,#0
MOV TRAM,#0
MOV NH,#0
MOV DD,#0
MOV L_T,#0
MOV BAPHUT,#0
SJMP BEGIN
TAT:
MOV LED10,#15
MOV LED9,#15
MOV LED8,#15
MOV LED7,#15
MOV LED6,#15
MOV LED5,#15
MOV LED4,#15
MOV LED3,#15
MOV LED2,#15
MOV LED1,#15
RET
KIEMTRA:
JNB P3.4,DOWN
JNB P3.5,DOWN
CLR TR0
BACK:
JNB P3.6,BEGIN
SJMP BACK
DOWN:
MOV A,NH
CJNE A,#0,A_NH
MOV A,DD
CJNE A,#0,B_DD
MOV A,L_T
CJNE A,#0,LIENTINH
MOV A,NGAT
CJNE A,#0,THOAT
MOV LED10,#15
MOV LED9,#15
MOV LED8,#15
MOV LED7,#15
MOV LED6,#15
MOV LED5,#15
MOV LED4,#11
MOV LED3,#12
MOV LED2,#13
MOV LED1,#14
THOAT:
JNB P3.6,TINHGIO
LJMP KIEMTRA
TINHGIO:
CLR EX0
MOV A,NHO10
CJNE A,#10,A_NH
MOV A,NHO9
CJNE A,#8,SST
A_NH:
LJMP NOIHAT
SST:
CJNE A,#9,LIENTINH
B_DD:
LJMP DIDONG
LIENTINH:
PUSH PSW
PUSH ACC
PUSH B
PUSH 03
PUSH 04
SETB TR0
MOV L_T,#1
MOV A,TIEN_LT
MOV B,#10
DIV AB
MOV R3,A
MOV A,B
MOV R4,A
MOV A,GIAY
MOV KT,A
MOV B,#30
DIV AB
MOV A,B
CJNE A,#0,ESC_LT
CONG_LT:
CJNE R6,#1,CONG_LT
MOV A,R3
ADD A,NGAN
MOV NGAN,A
MOV A,R4
ADD A,TRAM
MOV TRAM,A
CJNE A,#10,TIEP_LT
MOV TRAM,#0
INC NGAN
KT_LT:
MOV A,NGAN
CJNE A,#10,SO_LT
MOV NGAN,#0
CUOI_LT:
INC CHUCNGAN
MOV A,CHUCNGAN
CJNE A,#10,CHO_LT
MOV CHUCNGAN,#0
INC TRAMNGAN
SJMP CHO_LT
TIEP_LT:
JC CHO_LT
MOV B,#10
DIV AB
ADD A,NGAN
MOV NGAN,A
MOV A,B
MOV TRAM,A
SJMP KT_LT
SO_LT:
JC CHO_LT
MOV B,#10
DIV AB
MOV A,B
MOV NGAN,A
SJMP CUOI_LT
CHO_LT:
MOV A,KT
CJNE A,GIAY,ESC_LT
SJMP CHO_LT
ESC_LT:
POP 04
POP 03
POP B
POP ACC
POP PSW
LJMP KIEMTRA
DIDONG:
PUSH PSW
PUSH ACC
PUSH B
PUSH 03
PUSH 04
SETB TR0
MOV DD,#1
MOV A,TIEN_DD
MOV B,#10
DIV AB
MOV R3,A
MOV A,B
MOV R4,A
MOV A,GIAY
MOV KT,A
MOV B,#6
DIV AB
MOV A,B
CJNE A,#0,ESC_DD
CONG_DD:
CJNE R6,#1,CONG_DD
MOV A,R3
ADD A,NGAN
MOV NGAN,A
MOV A,R4
ADD A,TRAM
MOV TRAM,A
CJNE A,#10,TIEP_DD
MOV TRAM,#0
INC NGAN
KT_DD:
MOV A,NGAN
CJNE A,#10,SO_DD
MOV NGAN,#0
CUOI_DD:
INC CHUCNGAN
MOV A,CHUCNGAN
CJNE A,#10,CHO_DD
MOV CHUCNGAN,#0
INC TRAMNGAN
SJMP CHO_DD
TIEP_DD:
JC CHO_DD
MOV B,#10
DIV AB
ADD A,NGAN
MOV NGAN,A
MOV A,B
MOV TRAM,A
SJMP KT_DD
SO_DD:
JC CHO_DD
MOV B,#10
DIV AB
MOV A,B
MOV NGAN,A
SJMP CUOI_DD
CHO_DD:
MOV A,KT
CJNE A,GIAY,ESC_DD
SJMP CHO_DD
ESC_DD:
POP 04
POP 03
POP B
POP ACC
POP PSW
LJMP KIEMTRA
NOIHAT:
SETB TR0
MOV NH,#1
MOV A,PHUT
CJNE A,#3,KT3
MOV A,GIAY
CJNE A,#0,CUOCBAN
SJMP TINH1200
KT3:
JC TINH1200
SJMP CUOCBAN
TINH1200:
MOV A,BAPHUT
CJNE A,#0,BIEN
MOV TRAM,#2
MOV NGAN,#1
MOV CHUCNGAN,#0
MOV TRAMNGAN,#0
MOV BAPHUT,#1
BIEN:
LJMP KIEMTRA
CUOCBAN:
PUSH 02
MOV A,GIAY
MOV KT,A
CJNE A,#59,ESC_BAN
CONGTHEM:
CJNE R6,#19,CONGTHEM
MOV A,TRAM
ADD A,#4
MOV B,#10
DIV AB
ADD A,NGAN
CJNE A,#10,TINHTHEM
MOV A,#0
INC CHUCNGAN
MOV R2,CHUCNGAN
CJNE R2,#10,TINHTHEM
MOV CHUCNGAN,#0
INC TRAMNGAN
TINHTHEM:
MOV NGAN,A
MOV A,B
MOV TRAM,A
CHO_BAN:
MOV A,KT
CJNE A,GIAY,ESC_BAN
SJMP CHO_BAN
ESC_BAN:
POP 02
LJMP KIEMTRA
;------ TINH THOI GIAN CUOC GOI -----
DEM:
PUSH PSW
PUSH ACC
MOV TH0,#HIGH(-49995)
MOV TL0,#LOW(-49995)
CALL DOISO
DJNZ R6,EXIT
MOV R6,#20
INC GIAY
MOV A,GIAY
CJNE A,#60,EXIT
MOV GIAY,#0
INC PHUT
EXIT:
POP ACC
POP PSW
RETI
DOISO:
PUSH ACC
PUSH B
MOV A,GIAY
MOV B,#10
DIV AB
MOV LED2,A
MOV A,B
MOV LED1,A
MOV A,PHUT
MOV B,#10
DIV AB
MOV LED4,A
MOV A,B
MOV LED3,A
MOV LED5,#16
MOV LED6,#0
MOV A,TRAM
MOV LED7,A
MOV A,NGAN
MOV LED8,A
MOV A,TRAMNGAN
CJNE A,#0,DS1
MOV LED10,#15
MOV A,CHUCNGAN
CJNE A,#0,DS2
MOV LED9,#15
SJMP THOATDS
DS1:
MOV LED10,A
DS2:
MOV A,CHUCNGAN
MOV LED9,A
THOATDS:
POP B
POP ACC
RET
;-------CHUONG TRINH NGAT DE DOC SO------------
HIENTHI:
PUSH PSW
PUSH ACC
MOV A,NGAT
CJNE A,#0,DOCSO
LCALL TAT
DOCSO:
MOV NGAT,#1
MOV A,P2
ANL A,#0FH
MOV @R0,A
CJNE R0,#114,N
MOV NHO10,@R0
SJMP M
N:
CJNE R0,#115,M
MOV NHO9,@R0
M:
INC R0
CJNE R0,#124,EXITNGAT
MOV R0,#LED10
EXITNGAT:
POP ACC
POP PSW
RETI
;-------CHUONG TRINH QUET 10 LED DUNG NGAT TIMER(0)------------
QUETLED:
PUSH PSW
PUSH ACC
MOV TH1,#HIGH(-2500)
MOV TL1,#LOW(-2500)
MOV P1,#0FFH
SETB P2.7
SETB P2.6
MOV DPTR,#MALED
CJNE R1,#116,SS
MOV QUET,#01111111B
SJMP TIEP
SS:
JNC TIEP
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
MOV A,QUET
CJNE A,#01111111B,X2
CLR P2.7
SJMP X1
X2:
CLR P2.6
X1:
RR A
MOV QUET,A
INC R1
SJMP EXITQUET
TIEP:
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
MOV A,POS
MOV P1,A
RR A
MOV POS,A
INC R1
CJNE R1,#124,EXITQUET
MOV POS,#01111111B
MOV R1,#LED10
EXITQUET:
POP ACC
POP PSW
RETI
MALED: DB 11h, 0d7h, 32h, 92h, 0d4h, 98h, 18h, 0d3h ,10h, 90h, 11h, 50h, 5eh, 98h, 1eh, 0ffh, 01h
END