|
Tài trợ cho PIC Vietnam |
PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip |
|
Ðiều Chỉnh | Xếp Bài |
|
24-05-2007, 10:32 PM | #1 |
Đệ tử 4 túi
|
Đồng hồ + Đo nhiệt độ => LCD Ai quan tâm thì zô nhé
Mình định làm một bộ bao gồm việc đo nhiệt độ, đồng hồ có lịch âm dương, báo thức, báo chuông có kết nối với máy tính và mọi thông tin được hiển thị ra LCD.
Về cơ bản thì các công việc này ko khó khăn j cả nếu ta hiểu và nắm vững về ĐK. Với những j tôi biết để đầu tư cho một hệ thống này ước chừng phải bỏ ra > 200K cho tiền linh kiện cơ bản và chưa tính đến hỏng hóc. Nếu bạn nào biết cách nào đó để giảm bớt chi phí thì post lên cho tui với nhé Hệ thống tôi định dùng các IC sau làm chủ yếu Pic 16F877 DS 12C887 LM35 LCD 16x2 Vì 16F877 có chân AD nên ko cần dùng AD. Còn việc giao tiếp với LCD thì đã có nhiều bài nói đến rồi tiếp đến là cách kết nối với 12C887 Còn mạch nguyên lý và code mình xin dành lại cho các thành viên của diễn đàn. Hi vọng anh em sẽ cùng hợp sức lại để làm một sản phẩm ngon, bổ, rẻ. |
25-05-2007, 01:14 AM | #2 |
Đệ tử 7 túi
|
cái này nhắc tới là mình tức ơi là tức hồi đó mình có làm một cái chạy tất nhiên là tạm thui, mình để đó ngắm chơi được nửa tháng, tự nhiên trong một ngày "đẹp trời thơ mộng" mình thức giấc nhìn vào LCD thấy một hàng ô đen thui mình nghĩ rùi chắc là mình phải "chia tay" một trong hai "em yêu" LCD hoặc PIC (kết quả là em PIC "đã xa anh") , mình tức quá dùng PIC khác nạp lại code gắn vào lại chạy tốt nhưng thấy ghê quá nên dẹp "bọn ác" qua một bên luôn, hic chả hiểu vì sao "em xa anh" luôn
__________________
_____________________________Tri nhân tri tự bất tri tâm_____________________________ _ _ _ _ _ _ _ _ Yêu mến tất cả anh em Picvietnam.com _ _ _ _ _ _ _ _ . . . . . . . . . . . . . . . . Để post đuợc một câu hỏi rõ ràng xin tham khảo link sau : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . http://www.picvietnam.com/forum/showthread.php?t=1263. . . . . . . . . . . . . . . . |
25-05-2007, 10:35 AM | #3 |
Đệ tử 4 túi
|
Chuyện chết bất đắc kỳ tử thì ko có j cả đồ china là vậy đó hihi
Quan trọng là mình làm được theo như những j mình đề ra hay ko thôi. Vậy bạn đã làm được những j rồi?có thể chia xẻ lên được ko? ---------------------------------------- Mất một ngày để tìm trên NET cách connect DS12C887 với PIC nhưng ko thành công nên tôi thử viết Soucre để thực hiện việc kết nối với con này xem thế nào.(Nếu ai biết cách connect thì share cho tui với) Theo như trong DataSheet thì quá trình đọc và ghi dữ liệu được thể hiện thông qua giản đồ thời gian. Tôi mạo nguội đưa ra cách lập trình để kết nối với con DS như sau. Code:
(Quá trình ghi dữ liệu) B1. RD, RW =>1 delay. B2. ALE => 1, Out DATA1 ra B3. CS => 0 B4. Delay rồi cho ALE => 0 Delay B5. RW => 0 và out DATA2 ra B6. RW => 1 Delay B7. CS => 1, ALE => 1. Trong đó Data1 có thể là Address và Data2 là giá trị (Đoán vậy ko biết có đúng ko) Còn với việc đọc Data thì cũng tương tự như vậy. Ko biết có chính xác ko các bạn cho ý kiến nhé. Có một đoạn nhầm lẫn trong ảnh là ở B3 CS=0 chứ ko phải là 1
__________________
Today Not Tomorow .... YM: hoangcuong2k <= Ai rảnh thì chat nhé thay đổi nội dung bởi: zero, 25-05-2007 lúc 11:21 AM. Lý do: Nhầm lẫn trong ảnh |
25-05-2007, 02:04 PM | #4 |
Nhập môn đệ tử
Tham gia ngày: Oct 2006
Bài gửi: 1
: |
Mình cũng đã làm như vậy rùi, OK luôn. Chạy mấy tháng nay rùi ma vẫn chưa xỉu. Bác zero cứ tự tin mà làm đi.
Chúc thành công! |
25-05-2007, 09:10 PM | #5 |
Đệ tử 4 túi
|
vậy à.
thế bác làm như thế nào? dùng VĐK j? mà dùng chuẩn kết nối của nó hay viết code như trên.Có thể sharre cho tui được ko? có j nhắn theo YM nhé
__________________
Today Not Tomorow .... YM: hoangcuong2k <= Ai rảnh thì chat nhé |
27-05-2007, 12:48 PM | #6 |
Đệ tử 4 túi
Tham gia ngày: Aug 2006
Bài gửi: 61
: |
Em cũng muốn làm 1 cái như vậy nhưng làm sao để tính lịch âm dương?? DS12C887 làm được không? trong datasheet không thấy nói> Mong mọi người giúp
|
27-05-2007, 01:25 PM | #7 |
Đệ tử 4 túi
|
DS ko làm được.
Muốn tính lịch âm dương thì cần sử dụng thuật toán để chuyển. Đây là thuật toán dùng VB để đổi Các bạn nghiên cứu thử nhé! Code:
Private Can(10), Chi(12) Function jdFromDate(dd, mm, yy) Dim a, y, M, jd a = Int((14 - mm) / 12) y = yy + 4800 - a M = mm + 12 * a - 3 jd = dd + Int((153 * M + 2) / 5) + 365 * y + Int(y / 4) - Int(y / 100) + Int(y / 400) - 32045 If (jd < 2299161) Then jd = dd + Int((153 * M + 2) / 5) + 365 * y + Int(y / 4) - 32083 End If jdFromDate = jd End Function Function getNewMoonDay(k, timeZone) Dim T, T2, T3, dr, Jd1, M, Mpr, F, C1, deltat, JdNew T = k / 1236.85 '' Time in Julian centuries from 1900 January 0.5 T2 = T * T T3 = T2 * T dr = PI / 180 Jd1 = 2415020.75933 + 29.53058868 * k + 0.0001178 * T2 - 0.000000155 * T3 Jd1 = Jd1 + 0.00033 * Math.Sin((166.56 + 132.87 * T - 0.009173 * T2) * dr) ' Mean new moon M = 359.2242 + 29.10535608 * k - 0.0000333 * T2 - 0.00000347 * T3 ' Sun's mean anomaly Mpr = 306.0253 + 385.81691806 * k + 0.0107306 * T2 + 0.00001236 * T3 ' Moon's mean anomaly F = 21.2964 + 390.67050646 * k - 0.0016528 * T2 - 0.00000239 * T3 ' Moon's argument of latitude C1 = (0.1734 - 0.000393 * T) * Math.Sin(M * dr) + 0.0021 * Math.Sin(2 * dr * M) C1 = C1 - 0.4068 * Math.Sin(Mpr * dr) + 0.0161 * Math.Sin(dr * 2 * Mpr) C1 = C1 - 0.0004 * Math.Sin(dr * 3 * Mpr) C1 = C1 + 0.0104 * Math.Sin(dr * 2 * F) - 0.0051 * Math.Sin(dr * (M + Mpr)) C1 = C1 - 0.0074 * Math.Sin(dr * (M - Mpr)) + 0.0004 * Math.Sin(dr * (2 * F + M)) C1 = C1 - 0.0004 * Math.Sin(dr * (2 * F - M)) - 0.0006 * Math.Sin(dr * (2 * F + Mpr)) C1 = C1 + 0.001 * Math.Sin(dr * (2 * F - Mpr)) + 0.0005 * Math.Sin(dr * (2 * Mpr + M)) If (T < -11) Then deltat = 0.001 + 0.000839 * T + 0.0002261 * T2 - 0.00000845 * T3 - 0.000000081 * T * T3 Else deltat = -0.000278 + 0.000265 * T + 0.000262 * T2 End If JdNew = Jd1 + C1 - deltat getNewMoonDay = Int(JdNew + 0.5 + timeZone / 24) End Function Function getSunLongitude(jdn, timeZone) Dim T, T2, dr, M, L0, DL, L PI = 3.14 T = (jdn - 2451545.5 - timeZone / 24) / 36525 ' Time in Julian centuries from 2000-01-01 12:00:00 GMT T2 = T * T dr = PI / 180 ' degree to radian M = 357.5291 + 35999.0503 * T - 0.0001559 * T2 - 0.00000048 * T * T2 ' mean anomaly, degree L0 = 280.46645 + 36000.76983 * T + 0.0003032 * T2 ' mean longitude, degree DL = (1.9146 - 0.004817 * T - 0.000014 * T2) * Math.Sin(dr * M) DL = DL + (0.019993 - 0.000101 * T) * Math.Sin(dr * 2 * M) + 0.00029 * Math.Sin(dr * 3 * M) L = L0 + DL ' true longitude, degree L = L * dr L = L - PI * 2 * (Int(L / (PI * 2))) ' Normalize to (0, 2*PI) getSunLongitude = Int(L / PI * 6) End Function Function getLunarMonth11(yy, timeZone) Dim k, off, nm, sunLong off = jdFromDate(31, 12, yy) - 2415021 k = Int(off / 29.530588853) nm = getNewMoonDay(k, timeZone) sunLong = getSunLongitude(nm, timeZone) ' sun longitude at local midnight If (sunLong >= 9) Then nm = getNewMoonDay(k - 1, timeZone) End If getLunarMonth11 = nm End Function Function getLeapMonthOffset(a11, timeZone) Dim k, Last, arc, i k = Int((a11 - 2415021.07699869) / 29.530588853 + 0.5) Last = 0 i = 1 ' We start with the month following lunar month 11 arc = getSunLongitude(getNewMoonDay(k + i, timeZone), timeZone) While (arc <> Last And i < 14) Last = arc i = i + 1 arc = getSunLongitude(getNewMoonDay(k + i, timeZone), timeZone) Wend getLeapMonthOffset = i - 1 End Function Function convertSolar2Lunar(dd, mm, yy, timeZone) Dim k, dayNumber, monthStart, a11, b11, lunarDay, lunarMonth, lunarYear, lunarLeap dayNumber = jdFromDate(dd, mm, yy) k = Int((dayNumber - 2415021.07699869) / 29.530588853) monthStart = getNewMoonDay(k + 1, timeZone) If (monthStart > dayNumber) Then monthStart = getNewMoonDay(k, timeZone) End If a11 = getLunarMonth11(yy, timeZone) b11 = a11 If (a11 >= monthStart) Then lunarYear = yy a11 = getLunarMonth11(yy - 1, timeZone) Else lunarYear = yy + 1 b11 = getLunarMonth11(yy + 1, timeZone) End If lunarDay = dayNumber - monthStart + 1 diff = Int((monthStart - a11) / 29) lunarLeap = 0 lunarMonth = diff + 11 If (b11 - a11 > 365) Then leapMonthDiff = getLeapMonthOffset(a11, timeZone) If (diff >= leapMonthDiff) Then lunarMonth = diff + 10 If (diff = leapMonthDiff) Then lunarLeap = 1 End If End If End If If (lunarMonth > 12) Then lunarMonth = lunarMonth - 12 End If If (lunarMonth >= 11 And diff < 4) Then lunarYear = lunarYear - 1 End If Text1.Text = lunarDay & "/" & lunarMonth & "/" & lunarYear End Function Private Sub Form_Load() Can(1) = "Giap" Can(2) = "At" Can(3) = "Binh" Can(4) = "Dinh" Can(5) = "Mau" Can(6) = "Ky" Can(7) = "Canh" Can(8) = "Tan" Can(9) = "Nham" Can(10) = "Quy" Chi(1) = "Ty" Chi(2) = "Suu" Chi(3) = "Dan" Chi(4) = "Mao" Chi(5) = "Thin" Chi(6) = "Ty" Chi(7) = "Ngo" Chi(8) = "Mui" Chi(9) = "Than" Chi(10) = "Dau" Chi(11) = "Tuat" Chi(12) = "Hoi" timeZone = 7 convertSolar2Lunar 19, 5, 2007, 7 Me.Caption = Can((2007 + 6) Mod 10) & " " & Chi((2007 + 8) Mod 12) End Sub
__________________
Today Not Tomorow .... YM: hoangcuong2k <= Ai rảnh thì chat nhé |
29-05-2007, 09:28 PM | #8 |
Đệ tử 4 túi
|
Chán nhỉ chẳng có mấy người hào hứng với cái ứng dụng này.
Về cái mạch kết nối với con 12C887 thì tôi chưa có thời gian nghiên cứu được. Nhưng tôi sẽ Post phần dùng mạch đo nhiệt độ. Vì mạch này tôi chỉ đưa ra để test cho mọi người thấy nên chưa quan tâm đến bố trí và tối ưu về cách sử dụng chân. Dùng Port B để nối đến 8 Led báo (Hiển thị Giá trị đo được) Kết nối con LM35: 1 => VDD 2 => PA0 (AN0) số 2 3 => VSS Dùng một biến trở 10K mắc vào chân số 5 (RA3 Vref) chỉnh điện áp khoảng 2,5V Code:
#include <16F877A.h> #DEVICE ADC=8 #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=12000000) void main() { int i, value, min, max; setup_adc_ports(ALL_ANALOG); setup_adc( ADC_CLOCK_INTERNAL ); set_adc_channel(0); set_tris_b(0); while(1){ value = Read_ADC(); delay_ms(800);//Lâu lâu một tý để nhìn xem thấy nó có nhẩy giá trị lên ko output_b(value); } } Lần sau có dịp tôi sẽ post chương trình cải tiến sử dụng INT_ADC để báo trạng thái chuyển đổi AD
__________________
Today Not Tomorow .... YM: hoangcuong2k <= Ai rảnh thì chat nhé |
13-11-2008, 09:21 AM | #9 |
Nhập môn đệ tử
Tham gia ngày: Oct 2008
Bài gửi: 10
: |
cam bien
huynh oi co the cho de cai mach nguyen li duoc ko.de cung dang tim toi chu de nay.ah huynh co biet ve con PIR (D203S) chi giup de voi.dang lam cai mach tu dong bat den ma chua hieu nguyen li cua no j het.mong huynh giup do.
|
30-05-2007, 07:46 AM | #10 |
Trưởng lão PIC bang
Tham gia ngày: Dec 2005
Bài gửi: 315
: |
"Mình định làm một bộ bao gồm việc đo nhiệt độ, đồng hồ có lịch âm dương, báo thức, báo chuông có kết nối với máy tính và mọi thông tin được hiển thị ra LCD"
Mình có góp ý là: trong thực tế ứng dụng này không nên đưa phần ghép nối với máy tính vào làm gì. Về chi phí, chắc bạn không thể làm rẻ hơn bọn China được đâu. Minh thấy ngay ở Hà Nội. một cài đồng hồ như thế này có mặt kính rất đẹp, giá cũng chỉ 200k chưa mặc cả Mua ở Lạng Sơn chắc chỉ 150k, qua biên giới chắc chỉ còn 100k. Không hiểu bọn China làm cách nào mà rẻ thế lol
__________________
Sống là động nhưng lòng luôn bất động, Sống là thương nhưng lòng chẳng vấn vương, Sống yên vui danh lợi vẫn coi thường, Tâm bất biến giữa dòng đời vạn biến. Chú ý: đề nghị các thành viên đọc luồng dưới đây trước khi post bài: http://www.picvietnam.com/forum//showthread.php?t=1263 |
30-05-2007, 12:16 PM | #11 |
Đệ tử 4 túi
Tham gia ngày: Aug 2006
Bài gửi: 61
: |
Phần đo nhiệt độ thì chỉ dùng ADC có sẵn trong PIC chỉ tốn 1 chân RA/AN thôi. Còn xuất ra thì có LCD rồi.
Cái này làm hồi mới tập tành ADC: Code:
#include <16F877.h> #device 16F877*=16 ADC=10 #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=1000000) #define use_portd_lcd TRUE #include<lcd.c> long adc,nhietdo; long adc1,adc2,adc3,adc4,adc5,adc6,adc7,adc8,adc9,adc10,value; int8 a,b,c,d; void tachhang(int&a,int&b,int&c,int&d); char so[11] ="0123456789"; void main() { setup_adc(adc_clock_internal); setup_adc_ports(AN0); set_adc_channel(0); delay_ms(100); while(true) { value = read_adc(); /*adc1=read_adc();// doc 10 gia tri adc trong 1s delay_ms(100); adc2=read_adc(); delay_ms(100); adc3=read_adc(); delay_ms(100); adc4=read_adc(); delay_ms(100); adc5=read_adc(); delay_ms(100); adc6=read_adc(); delay_ms(100); adc7=read_adc(); delay_ms(100); adc8=read_adc(); delay_ms(100); adc9=read_adc(); delay_ms(100); adc10=read_adc(); delay_ms(100); value =adc1+adc2+adc3+adc4+adc5+adc6+adc7+adc8+adc9+adc10;// lay gia tri trung binh adc*/ nhietdo = (value-559)/0.2024; tachhang(a,b,c,d); lcd_init(); delay_ms(100); lcd_putc(so[a]); lcd_putc(so[b]); lcd_putc(so[c]); lcd_putc('.'); lcd_putc(so[d]); } } void tachhang(int&a,int&b,int&c,int&d) { a=nhietdo/1000; b=(nhietdo%1000)/100; c=(nhietdo%100)/10; d=nhietdo%10; } /* 5V = 1024 muc => 10mV tuong ung voi 2.048 muc ADC 0oC = 273oK => 0oC ung voi muc dien the 2.73V ung voi 559 muc ADC Nhiet do = dien the Analog/10 - 273 Tuong ung Nhiet do = (adc -559)/2.024 Xuat gia tri nhiet do ra LED 7 doan hay LCD*/ |
13-11-2008, 09:10 AM | #12 |
Nhập môn đệ tử
Tham gia ngày: Oct 2008
Bài gửi: 10
: |
huynh oi co the cho de cai mach nguyen li ko.dau nam hoc toi gio gap thay moi 2 lan.xap toi bao cao ve ket noi lm35 + led 7 doan +pic.cam on huynh nhiu.cho phuc dap cua huynh.
|
30-05-2007, 09:26 PM | #13 |
Nhập môn đệ tử
Tham gia ngày: Feb 2007
Bài gửi: 3
: |
cho đệ hỏi hiển cái,đệ muốn hiện h lên LCD nhưng hiện ko đúng,đệ dùng 1307.Đệ đã đọc được dữ liệu ra máy tính.Huynh nào làm rồi cho đệ cái hàm chuyển đổi nhỉ.
|
31-05-2007, 11:31 PM | #14 |
Đệ tử 4 túi
|
To Mecha: Việc kết nối với máy tính thì mình nghĩ là ko thêm chi phí đáng là bao nhiêu (1 cái Cáp LPT or COM)việc kết nối với máy tính có thể làm các việc sau.
Hẹn giờ báo => có chú thích và đổ chuông tùy ý (Kiểu như cái calenda của điện thoại) Cái LCD để làm gì? cốt là để làm cái này. Cập nhật giờ từ máy tính để dễ dàng cho việc Config lại nếu có sai. Đây là làm đơn chiếc thủ công và rất nhiều lý do khác nữa nên việc giá thành có thể cao hơn. Và còn lý do khác mà ta chưa biết. Mình nghĩ so sánh cái đồng hồ của TQ thì cái của mình có rất nhiều lợi điểm đấy chứ và cũng có thể ứng dụng vào việc báo chuông định kỳ ............... Hi vọng có người ủng hộ!
__________________
Today Not Tomorow .... YM: hoangcuong2k <= Ai rảnh thì chat nhé |
31-05-2007, 11:50 PM | #15 |
Đệ tử 4 túi
|
Mà cái này làm cho vui thôi <= để cảm thấy hạnh phúc khi làm một sản phẩm nào đó để trong nhà. Với lại cái này cũng có thể đưa lên cao hơn chút để kinh doanh mà <= Làm hệ thống báo chuông ấy.
À tiện cho hỏi chút (Mecha) Trong 8051 có hỗ trợ giao tiếp với Ram ngoài theo chuẩn Intel vậy PIC có hỗ trợ ko?nếu có thì làm hay tìm tài liệu nào. Em xem chuẩn giao tiếp PSP nhưng chỉ thấy nó dùgn 3 chân CS,RD,WR chứ ko thấy dùng chân ALE!
__________________
Today Not Tomorow .... YM: hoangcuong2k <= Ai rảnh thì chat nhé |
|
|