MỞ ĐẦU
Ngày nay cùng với sự tiến bộ của khoa học kỹ thuật, đặc biệt là ngành Kỹ thuật Điện tử, đời
sống xã hội ngày càng phát triển hơn dựa trên những ứng dụng của khoa học vào đời sống. Vì
vậy mà những công nghệ điện tử mang tính tự động ngày càng được ứng dụng rộng rãi. Trong
đó có sự đóng góp không nhỏ của kỹ thuật vi điều khiển. Các bộ vi điều khiển đang đựơc ứng
dụng rộng rãi và thâm nhập ngày càng nhiều trong các lĩnh vực kỹ thuật và đời sống xã hội.
Hầu hết là các thiết bị được điều khiển tự động từ các thiết bị văn phòng cho đến các thiết bị
trong gia đình đều dùng các bộ vi điều khiển nhằm đem lại sự tiện nghi cho con người trong thời
đại công nghiệp hóa hiện đại hóa.
Với tính ưu việt của vi xử lí thì trong bài này, chúng em chỉ dùng để tiến hành đo nhiệt độ, đây
chỉ là 1 ứng dụng nhỏ của vi xử lí trong các ứng dụng của nó.
Mục đích chính của đề tài là thiết kế được một bộ đo nhiệt độ sử dụng 8051 và LM35, có thể cho
ra được
kết quả hiển thị trực quan với độ chính xác cao.
Mặc dù cố gắng nhưng do còn thiếu kinh nghiệm nên trong bài viết khó tránh khỏi sai sót,
chúng em rất mong được sự hướng dẫn chỉ bảo thêm của thầy!
Sinh viên thực hiện :
Đỗ Thanh Huy
Cù Quang Anh
PHẦN I: LÝ THUYẾT CHUNG
I. MỤC ĐÍCH, YÊU CẦU
-Sự cần thiết , quan trọng và tính khả thi vào lợi ích của mạch số , nhằm dùng kiến thức số học
và kỹ thuật số vào thực tiễn
-Tìm hiểu nguyên tắc hoạt động của thiết bị cảm biến (cảm biến nhiệt LM35), ADC0808,
AT89s52
- Yêu cầu của bài : Đo sử dụng vi điều khiển họ 8051 đo nhiệt độ hiển thị LED 7 thanh dùng
cảm biến LM35
II. Ý NGHĨA
- Thấy được tính khoa học và ứng dụng thực tế của đề tài
- 8051 là họ vi điều khiển có nhiều tính năng, khả năng xử lí nhanh
- Ứng dụng của ADC trong việc chuyển đổi tín hiệu tương tự sang tín hiệu số . Tín hiệu tương tự
là tín hiệu lấy dc từ bộ cảm biến
-Mạch hiển thị LED 7 đoạn nên dễ dàng cho người sử dụng theo dõi nhiệt độ hiển thị
III. GIỚI HẠN ĐỀ TÀI
- Đề tài “hiển thị nhiệt độ” rất đa dạng và phong phú , nhiều loại dựa trên độ phức tạp và công
dụng. Do trình độ có hạn nên đề tài còn nhiều thiếu sót, mong thầy bỏ qua
PHẦN II : LÝ THUYẾT VÀ CÁC LINH KIỆN
I. CƠ SỞ LÝ THUYẾT
Các linh kiện sử dụng trong mạch
- Sử dụng vi điều khiển họ 8051
- Đo nhiệt độ bằng cảm biến LM35 thông qua bộ thiết kế mạch chuyển đổi ADC0808 để chuyển
tín hiệu tương tự sang tín hiệu số
- Hiển thị bằng LED 7 đoạn
II. Các linh kiện sử dụng trong đo lường
1. Giới thiệu về dòng ADC 080x và ADC 0808
ADC (Analog-to-Digital Converter) là một thiết bị chuyển đổi một tín hiệu từ dạng liên tục
(thường là điện áp) sang dạng số. Nó là thành phần quan trọng và không thể thiếu trong hầu
hết các hệ thống số, nhất là trong ngành đo lường. Vì các vi điều khiển, vi xử lý, … chỉ làm
việc với tín hiệu số trong khi các tín hiệu ngoài thực ( như điện áp, dòng điện, …) đều ở dạng
tương tự, nên để có thể dùng vi điều khiển để xử lý các tín hiệu này ta cần phải chuyển đổi nó
sang dạng digital. ADC rất phổ biến và được ứng dụng nhiều, ở đây ta có thể kể đến dòng
ADC080x của National Semiconductor.
Hình : ADC0808
Dòng ADC080x của National Semiconductor thuộc dòng CMOS 8-bit có nhiệm vụ chuyển đổi
xấp xỉ điện áp từ tương tự sang số, sử dụng bậc thang phân áp điện, với những tính năng cơ
bản sau:
-
Độ phân giải 8 bit.
-
Dễ dàng kết nối với mọi vi điều khiển.
-
Có thể hoạt động với điện áp từ 2.5-5.0V.
-
Bộ tạo xung trên chip.
-
Điện áp analog vào từ 0-5V với nguồn cung cấp 5V
-
Không cần “điều chỉnh không”.
-
Độ rộng tiêu chuẩn 0.3 inch với 20 pin.
-
Điện áp tham chiếu có thể tùy chỉnh
.
Với :
IN0 tới IN7 : 8 ngõ đầu vào tương tự
DDR A,B,C : là 3 chân giải mã chọn 1 trong 8 ngõ vào
Z1 tới Z8 : ngõ ra song song 8 bit
ALE : Cho phép chốt yêu cầu
START : xung bắt đầu chuyển đổi
CLK : xung dao dộng cho quá trình biến đổi A-D
OE : Cho phép dữ liệu đầu ra
Ref+/- : Chân tham chiếu điện áp
Bảng chọn kênh :
Cấu trúc bên trong của ADC0808 và giản đồ xung hoạt động
Dòng ADC này của NS hoạt động và tương thích tốt với hầu hết các vi điều khiển nên được
ứng dụng rộng rãi.
2.
Giới thiệu chung về họ vi điều khiển 8051 và IC 89s52
2.1 Giới thiệu
Vi điều khiển là một máy tính được tích hợp trên một chíp, nó thường được sử dụng để điều
khiển các thiết bị điện tử. Vi điều khiển, thực chất, là một hệ thống bao gồm một vi xử lý có
hiệu suất đủ dùng và giá thành thấp (khác với các bộ vi xử lý đa năng dùng trong máy tính) kết
hợp với các khối ngoại vi như bộ nhớ, các mô đun vào/ra, các mô đun biến đổi số sang tương
tự và tương tự sang số,... Ở máy tính thì các mô đun thường được xây dựng bởi các chíp và
mạch ngoài.
Vi điều khiển thường được dùng để xây dựng các hệ thống nhúng. Nó xuất hiện khá nhiều
trong các dụng cụ điện tử, thiết bị điện, máy giặt, lò vi sóng, điện thoại, đầu đọc DVD, thiết bị
đa phương tiện, dây chuyền tự động, v.v. Điển hình nhất trong số đó có thể kể đến đó là dòng
vi điều khiển MCS-51 của Intel hay còn gọi là Intel 8051.
Intel 8051 - là vi điều khiển đơn tinh thể kiến trúc Harvard, được Intel phát triển vào năm 1980,
để dùng trong các hệ thống nhúng. Những phiên bản đầu tiên được phổ biến những năm 1980
và đầu những năm 1990, các dẫn xuất tương thích nhị phân nâng cao của nó vẫn còn phổ biến
cho đến ngày nay.
Kiến trúc cơ bản bên trong 8051 bao gồm các đặt tính sau:
-
8-bit ALU, thanh ghi 8-bit, 8-bit data bus và 2x16-bit địa chỉ bus/program.
-
32 thanh ghi (4 bit-định địa chỉ 8-bit).
-
4 băng thanh ghi chuyển đổi nhanh, mỗi băng 8 thanh ghi.
-
2 bus địa chỉ 16-bit.
-
128 bytes RAM trên chip (IRAM).
-
4 KiB ROM trên chip.
-
Bốn cổng vào ra 8-bit.
-
2 bộ đếm/định thời 16-bit
2.2 . Sơ đồ cấu trúc chung của họ 8051
-Trong bài chúng ta sử dụng vi điều khiển AT89S52, 1 vi điều khiển thuộc họ 8051
AT89S52 cung cấp những đặc tính chuẩn như: 8 KByte bộ nhớ chỉ đọc cóthể xóa và lập trình
nhanh (EPROM), 128 Byte RAM, 32 đường I/O, 3TIMER/COUNTER 16 Bit, 5 vectơ ngắt có
cấu trúc 2 mức ngắt, một Port nối tiếpbán song công, 1 mạch dao động tạo xung Clock và bộ dao
động ON-CHIP.
Hình ảnh và sơ đồ của vi điều khiển
2.3. Sơ đồ chân của họ 8051 :
-
-
Chức năng :
Chân 40 nối dương nguồn 5V
Chân 20 nối đất (Mass,GND)
Chân 29 (PSEN): là tín hiệu điều khiển xuất ra của 8051, nó cho phép chọn bộ nhớ ngoài và
được nối chung với chân OE (output) của EPROM ngoài để cho phép đọc các byte của
chương trình ( ở đây là đọc các lệnh- khác với đọc dữ liệu).
Chân 30 (ALE) là tín hiệu điều khiển xuất ra của 8051, nó cho phép kênh Bus địa chỉ và Bus
dữ liệu của Port 0.
Chân 31 (EA) được đưa xuống thấp cho phép chọn bộ nhớ mã ngoài đối với 8051.
P0 từ chân 39-> 32 tương ứng là các chân P0_0 -> P0_7
P1 từ chân 1->8 tương ứng với các chân P1_0 -> P1_7
P2 từ chân 21->28 tương ứng là các chân P2_0->P2_7
P3 từ chân 10->17 tương ứng là các chân P3_0->P3_7
Riêng cổng 3 có 2 chức năng ở mỗi chân như trên hình vẽ :
P3.0 – RxD : chân nhận dữ liệu nối tiếp khi giao tiếp với RS232 (COM)
P3.1 – TxD : phân truyền dữ liệu nối tiếp khi giao tiếp RS232
P3.2 – INT0 : interupt 0, ngắt ngoài 0.
P3.3 – INT1 : interupt 1 ngắt ngoài 1.
P3.4 – T0 : Timer 0 đầu vào timer 0.
P3.5 – T1 : Timer 1 đầu vào timer 1.
P3.6 – WR : Điều khiển ghi dữ liệu
P3.7 – RD : Điều khiển đọc dữ liệu
Chân 18,19 nối với thạch anh tạo thành mạch dao động cho vi điều khiển, vi xử lý.
Tần số thạch anh thường dùng trong các ứng dụng là 12Mhz và 11.092MHz (Giao tiếp với cổng
COM), tần số tối đa là 24Mhz.
-
-
•
-
2.4. Cổng vào ra song song (I/O Port)
8051 có 4 cổng vào ra song song có tên lần lượt là P0, P1, P2, P3 tất cả các cổng này đều là
cổng ra vào 2 chiều 8 bit. Các bít của mỗi cổng là một chân trên chíp như vậy mỗi cổng sẽ có 8
chân trên chíp. Hướng dữ liệu dùng cổng đó làm cổng ra hay cổng vào là độc lập giữa các cổng
và giữa các chân trong cùng 1 cổng.
Các chân P0 không có điện trở treo cao (pullup resistor) bên trong, mạch lái tạo mức cao chi
có khi sử dụng cổng này với tính năng là bus dồn kênh địa chỉ/ dữ liệu. Như vậy với chức năng
ra thông thường, P0 là cổng ra open drain, với chức năng vào, P0 là cổng cao trở. Nếu muốn sử
dụng cổng P0 làm cổng vào /ra thông dụng thì ta phải thêm trở tử 4K7 đến 10K. Các cổng P1,
P2, P3 đều có điện trở pullup bên trong, do đó có thể dùng với chức năng cổng vào/ra thông
thường mà không cần thêm điện trở bên ngoài.
Cổng truyền thông nối tiếp ( Serial Port) :
Cổng nối tiếp trong 8051 chủ yếu được dùng trong các ứng dụng có yêu cầu truyền thông với
máy tính, hoặc với 1 vi điều khiển khác. Liên quan đến cổng nối tiếp chủ yếu có 2 thanh ghi :
SCON và SBUF. Ngoài ra, một thanh ghi khác là thanh ghi PCON (không đánh địa chỉ bít) có bít
7 tên là SMOD quy định tốc độ truyền của cổng nối tiếp có gấp đôi lên (SMOD=1) hay không
(SMOD=0).
Cổng có đặc điểm :
Truyền song công : có nghĩa là tại một thời điểm có thể vừa truyền vừa nhận dữ liệu.
Phương thức truyền không đồng bộ: là dữ liệu được truyền đi theo từng kí tự.
Bộ đệm truyền nhận dữ liệu đều có tên là SBUF
SCON là thanh ghi bit được dùng để lập trình việc đóng khung dữ liệu, xác định chế độ làm việc
của cổng truyền thông nối tiếp.
3. LED 7 thanh
3.1. Giới thiệu chung
LED 7 thanh được dùng nhiều trong các mạch hiện thị thông báo, hiện thị số, kí tự đơn
giản... LED 7 được cấu tạo từ các LED đơn sắp xếp theo các thanh nét để có thể biểu diễn các
chữ số hoặc các kí tự đơn giản như từ số 0 đến 9 và A đến F chả hạn. LED 7 thanh dùng để hiện
số thì rất đẹp và dễ nhìn. Tùy vào kích thước của số và kí tự mà mỗi thanh được cấu tạo bởi một
hay nhiều LED đơn. Các LED đơn đó được ghép và được đặt tên bằng các chữ cái a...g và có
một dấu chấm dot ( dấu chấm này có thể sáng và tắt tùy theo yêu cầu) được cấu tạo bởi 1 LED
đơn. Qua đó người ta chỉ cần 8 bit tương ứng với 8 LED đơn để điều khiển được và hiện thị số từ
0 đến 9 và các kí tự từ A đến F.
Ở trên là hình dạng LED7 ngoài thực tế và trong mạch nguyên lý và cấu tạo.
Cấu tạo của LED chúng ta nhìn trên rất đơn giản chúng chỉ gồm các LED đơn được xếp lại
với nhau thành hình như trên hình vẽ. Các LED đơn này chỉ chung nhau Anot hoặc Katot và
riêng nhau các chân con lại Anot hặc Katot. Nhiệm vụ của chúng ta là cho sáng các LED đơn
đó để cho nó thành số hay kí tự đơn giản.
Hiện nay LED 7 được sản xuất theo 2 kiểu là Anot chung và Katot chung và được điều
khiển làm việc tương tự như bơm dòng hay nuốt dòng của các LED đơn có trong LED7
(Thường hay thiết kế theo kiểu bơm dòng cho LED). Thông thường trong các mạch thiết kế
thực tế người thiết kế thường hay sử dụng loại Anot chung. Phương pháp ghép nối là cấp
dòng, đảo trạng thái thông qua đệm và quét LED
3.2 . Ghép nối led 7 thanh
Để ghép nối với LED7 có thể có nhiều cách, nhưng phải đảm bảo sao có thể điều khiển
tắt mở riêng từng LED đơn trong đó để tạo ra các số và các ký tự mong muốn.Các ICs điều
khiển đều khó khả năng sinh dòng kém tức là dòng đầu ra của các chân ICs nhỏ hơn khả năng
nuốt dòng. Do vậy, nếu ghép nối trực tiếp các net với các chân cổng IC thì loại Anode chung là
thích hợp hơn cả. Cần phải chú ý dòng dồn về ICs quá mức chịu được thì cũng không được vì
làm nóng và dei ICs điều khiển
* 2 cách ghép nối thường dùng:
+ Cách 1 : Dùng trực tiếp các chân điều khiển (vi xử lý)
Đối với cách này thì nhìn thì rất tốn chân của vi xử lý. Và dòng của LED sẽ dồn tất cả về vi
xử lý. Nếu một hệ thống lớn thì cách này không ổn vì ảnh hưởng đến vi xử lý và nhiều dòng
dồn về vi xử lý sẽ làm vi xử lý nóng và dẫn tới chết ( chúng ta tưởng tượng xem nếu mà hệ
thống nhiều phần điều khiển từ các chân vi xử lý mà tất cả các tải điều khiển dồn trực tiếp
dòng về vi xử lý thì lúc đó dòng trong 1 thời điểm khá lớn vượt quá ngưỡng cho phép của vi xử
lý.
Dòng mà vi xử lý chịu đựng được cũng khá nhỏ đâu dưới 100mA ). Các này chỉ dùng
được hệ thống điều khiển ít, mạch dùng vi xử lý khá đơn giản như hiện thị LED, đếm số từ 0
đến 9 ... chẳng hạn.
+ Cách 2 : Dùng IC giải mã BCD sang LED 7 thanh
Sử dụng IC giải mã 7447 để giả mã từ mã BCD sang mã LED7. Đối với cách này thì
trông rất ổn. Vừa tiếp kiệm được chân vi xử lý và tránh được dòng dồn về vi xử lý (dòng ở đây
được dồn về 7447). Đây là cách mà người thiết kế thường dùng trong các hệ thống cần đến hiện
thị.
Thông thường các thiết kế, LED 7 thanh được dùng để hiện thị các giá trị các giá trị số từ
0 đến 9 và đôi khi cần phải hiện thị các kí tự đơn giản như A đến F trong hệ thống để báo trạng
thái của hệ thống. Các giá trị hiện thị bao gồm nhiều chữ số tức là chúng ta phải dùng đến nhiều
LED7 ghép lại thì mới hiện thị được nhiều số. Ví dụ như muốn hiện thị số 123 chả hạn thì
chúng ta phải dùng đến 3 LED 7 thanh ghép lại.
Như vậy để ghép nhiều LED 7 thanh thay vì chung ta phải dùng 8 chân riêng rẽ cho mỗi
LED. Ví dụ để hiện thị được 3 chữ số lên LED 7 (123 chả hạn) khi đó ta sẽ mất 3x8 = 24 chân
dữ liệu điều khiển để hiện thị được 3 chữ số. Như vậy sẽ rất tốn chân vi xử lý, do vậy người ta
dùng chung các đường dữ liệu cho các LED 7 thanh và thiết kế thêm các tín hiệu điều khiển cấp
nguồn riêng rẽ cho từng LED 7 một hay là cấp nguồn cho các chân Anot chung hay Katot chung.
Nhìn trên sơ đồ trên ta thấy được kiểu ghép nối giữa các LED. Các đường dữ liệu vào của 3 LED
được chung với nhau và các chân điều khiển nguồn cho các LED được riêng rẽ và được điều
khiển bằng transitor ( khuếch đại dòng). Như vậy đối với mạch trên chúng ta tiếp kiệm được
nhiều chân vi xử lý. Đối với mạch trên và cách ghép nối như trên thì mất tối đa chỉ có 11 chân vi
xử lý.
8 chân dữ liệu của LED 7 được chung nhau và chung được ghép nối qua 2 cách : Thứ
nhất dùng vào trực tiếp các chân vi xử lý và thứ 2 là qua các IC đệm hay IC giải mã...Nhưng
trong thiết kế không mấy khi người ta cho trực tiếp các chân dữ liệu đó vào trực tiếp vi xử lý mà
người ta phải cho qua các IC đệm hay giải mã đối với hệ thống lớn. Chỉ những mạch đơn giản
người ta mới cho vào trực tiếp vi xử lý.Thông thường người ta dùng thêm các IC đệm hay giải
mã như ULN2803, 74LS47
Đối với phương pháp ghép LED như thế này thì làm sao điều khiển được hiện thị số 123
chả hạn. Nếu chúng ta mới nhìn thì sẽ thấy các LED 7 sẽ hiện thị giống nhau vì chúng chung
nhau đường dữ liệu. Nhưng không phải là vậy. Nếu chung ta cho từng thời điểm từng LED sáng
1 thì chúng ta sẽ thấy khác đó. Số 123 sẽ được hiện thị lên 3 LED đó. Đó là thuật toán quét LED
dựa vào hiện tượng lưu ảnh trong mắt khi chúng ta quét với tần số lớn.
Như vậy đối với phương pháp này chúng ta tiếp kiệm được một số lượng lớn chân vi xử
lý và đồng thời tiếp kiệm được năng lượng tiêu thụ do phương pháp quét LED trong thời gian
ngắn. Khi đó tối đa trong 1 thời điểm có 1 LED sáng toàn bộ thôi. Cần phải tính toán giá trị dòng
vào cho LED sao cho LED sáng đẹp bằng cách thêm bớt điện trở.
4. Cảm biến nhiệt LM35
4.1 Giới thiệu về cảm biến nhiệt độ LM35
LM35 là cảm biến nhiệt độ bán dẫn thông dụng của hãng National Semiconductor .
Đặc tính của LM35 :
•
•
•
•
Chuẩn hóa theo thang đo nhiệt đọ Cesius
Đầu ra tuyến tính 10mV/1độC
Dải nhiệt độ đo được từ -55 tới 150 độ tùy theo kiểu đóng vỏ
Dòng tiêu thụ rất nhỏ cỡ 60uA, nên nhiệt tự tỏa rất nhỏ hầu như không ảnh hưởng đến kết
quả đo.
Sai số nhỏ , chỉ khoảng 0.5độ C
PHẦN III: NỘI DUNG THIẾT KẾ
1. Sơ đồ nguyên lý
•
Phân tích mạch :
Cảm biến nhiệt LM35 được nối với đầu vào IN0 tương ứng với chân chọn địa
chỉ đầu vào ADD A = ADD B = ADD C = 0;
Đầu ra số của ADC0808 được nối với Port 1 của 8051 .
Vì cảm biến LM35 làm loại LM35DZ với dải nhiệt độ max là 128 độ C
nên giá trị điện áp max là 1.28V tương ứng với giá trị số đầu ra là 255.= > cần
đưa điện áp tham chiếu Vref(+) = 1.28V, Vref(-) = 0.
Nguồn xung chuyển đổi clock với tần số 640Khz .
Khối hiển được nối với port P0 và được hiển thị theo phương pháp quét a not.
Hoạt động
Ta đặt cho hệ thống trong dải đo từ 15 0C đến 400C nếu hệ thống đo được
trong khoảng này và báo về bộ xử lý thì sẽ không có hiện tượng gì xảy ra,
•
khi hệ thống đo đo được giá trị ngoài khoảng này thì hệ thống sẽ xử lý và
đưa ra cảnh báo ở ngoài loa, nếu hệ thống đang hoạt động mà ấn stop thì giá
trị đo được sẽ được lưu lại cho lần đo tiếp theo.
Việc đo và tính toán được thực hiện qua các thiết bị như cảm biến các
con IC, các transistor , cùng một số thiết bị khác
2. Hình ảnh mô phỏng trên altium
3. Code chương trình
/*
8051 project 7seg demo
created by hoangloc360
*/
#include <AT89X52.h>
//#include "delay.c"
#define ALE
P2_3
#define OE
P2_6
#define START
P2_4
#define EOC
P2_5
#define CLK
P2_7
#define SEL_A
P2_0
#define SEL_B
P2_1
#define SEL_C
P2_2
#define ADC_DATA P3
/*---------------------------------------------------------------------------------void delay_us(unsigned int n)
---------------------------------------------------------------------------------* I/P Arguments: unsigned int.
* Return value : none
* description : This function is used generate delay in us.
It genarates a approximate delay of 10us for each count,
if 5000 is passed as the argument then it generates a delay of apprx 50ms.
-----------------------------------------------------------------------------------*/
void delay_us(unsigned short us_count)
{
while(us_count!=0)
{
us_count--;
}
}
/*---------------------------------------------------------------------------------void delay_ms(unsigned int n)
----------------------------------------------------------------------------------* I/P Arguments: unsigned int.
* Return value : none
* description: This function is used generate delay in ms.
It genarates a approximate delay of 1ms for each count,
if 1000 is passed as the argument then it generates delay of apprx 1000ms(1sec)
-----------------------------------------------------------------------------------*/
void delayms(unsigned int time)
{
unsigned int i=0 , j=0;
for(i=0; i<=1000; i++)
{
for(j=0;j<=time;j++)
{
}
}
}
/*----------------------------------------------------------------------------------
void delay_sec(unsigned char sec_count)
----------------------------------------------------------------------------------* I/P Arguments: unsigned char.
* Return value : none
* description:
This function is used generate delay in sec .
It genarates a approximate delay of 1sec for each count,
if 10 is passed as the argument then it generates delay of apprx 10sec
note: A max of 255 sec delay can be generated using this function.
-----------------------------------------------------------------------------------*/
//void delayms(unsigned int time);
//void display_7seg(unsigned int dat);
unsigned char i=0;
unsigned char font[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x80,0x10,0xC6};
sbit en0=P1^0;
sbit en1=P1^1;
sbit en2 = P1^2;
sbit en3 = P1^3;
unsigned short time_tick=0;
void timer0() interrupt 1 // Function to generate clock of frequency 500KHZ using Timer 0
interrupt.
{
CLK=~CLK;
}
void Control_7seg(unsigned int numled)
{
switch(numled)
{
case 0: // nghin
en0=0;en1=1;en2=1;en3=1;
break;
case 1: // tram
en0=1;en1=0;en2=1;en3=1;
break;
case 2:// chuc
en0=1;en1=1;en2=0;en3=1;
break;
case 3: // dvi
en0=1;en1=1;en2=1;en3=0;
break;
case 4:
en0=1;en1=1;en2=1;en3=1;
break;
}
}
void display_7seg(unsigned short dat)
{
unsigned int tram=0,chuc =0 ,dvi=0;
dvi = dat%10;
chuc=(dat/10)%10;
tram = (dat/100);
Control_7seg(4);
Control_7seg(2);
P0=font[dvi];
delay_us(80);
Control_7seg(4);
Control_7seg(1);
P0=font[chuc];
delay_us(80);
Control_7seg(4);
Control_7seg(0);
P0=font[tram];
delay_us(80);
Control_7seg(4);
Control_7seg(3);
P0=0xC6;
delay_us(80);
//Control_7seg(4);
}
void adc0808Init(void)