Thông báo

Collapse
No announcement yet.

Xin Giúp đỡ về đồng hô thời gian thực

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Xin Giúp đỡ về đồng hô thời gian thực

    Em chào các bác!!!
    Em đang bị bí bởi bài tập thầy giáo đưa các bác giúp em vs
    Đề tài là : Ứng dụng đồng hồ thời gian thực để bật tắt công tắc của máy bơm nước. Em nghĩ nó gần giống như báo chuông hết tiết học ấy ạ..
    Bác nào giúp em Phần nguyên lý vs. em mới học nên bí quá
    các bác giúp em vs. em xin các bác gửi vào mail nkquan.ictu@gmail.com vs
    Em chân thành cảm ơn các bác

  • #2
    Bạn dùng đồng hồ treo tường, loại có đánh chuông ý, mua về gỡ đằng hộp mạch đằng sau ra bên trong nó có một công tắc cơ khí, dùng nó mà chế tác thành mạch điều khiển bật tắt máy bơm theo giờ
    Bạn SV nào có nhu cầu thưc tập thì pm mình nhé. Thông tin liên hệ xem của mình nhé!

    Comment


    • #3
      Em chỉ mô phỏng trên proteus thôi...chứ chưa phải làm mô hình thật ạ

      Comment


      • #4
        Nguyên văn bởi nkquan.ictu Xem bài viết
        Em chỉ mô phỏng trên proteus thôi...chứ chưa phải làm mô hình thật ạ
        proteus đâu post lên mọi người xem thử mới tư vấn đc chớ
        Bạn SV nào có nhu cầu thưc tập thì pm mình nhé. Thông tin liên hệ xem của mình nhé!

        Comment


        • #5
          đây là mạch đồng hồ thời gian thực e sưu tầm dc,có báo thức,ở phầN báo thức thay vì ngắt hoạt động tạo chuổi xung 10s thì bác sửa lại cho setb và clr 1 bit nào đó điều khiển máy bơm thông qua mạch động lực,chúc bác thành công ko up file lên dc sr bác.

          Comment


          • #6
            bác có thể gửi vào mail nkquan.ictu@gmail.com giùm em vs...

            Comment


            • #7
              Nguyên văn bởi nkquan.ictu Xem bài viết
              Em chào các bác!!!
              Em đang bị bí bởi bài tập thầy giáo đưa các bác giúp em vs
              Đề tài là : Ứng dụng đồng hồ thời gian thực để bật tắt công tắc của máy bơm nước. Em nghĩ nó gần giống như báo chuông hết tiết học ấy ạ..
              Bác nào giúp em Phần nguyên lý vs. em mới học nên bí quá
              các bác giúp em vs. em xin các bác gửi vào mail nkquan.ictu@gmail.com vs
              Em chân thành cảm ơn các bác
              bạn qua đây này tui cũng thắc mắc mấy anh trả lời gần đúng với yêu cầu của bãn rùi ấy
              http://www.dientuvietnam.net/forums/...ut-coi-162932/

              Comment


              • #8
                Nguyên văn bởi nkquan.ictu Xem bài viết
                Em chào các bác!!!
                Em đang bị bí bởi bài tập thầy giáo đưa các bác giúp em vs
                Đề tài là : Ứng dụng đồng hồ thời gian thực để bật tắt công tắc của máy bơm nước. Em nghĩ nó gần giống như báo chuông hết tiết học ấy ạ..
                Bác nào giúp em Phần nguyên lý vs. em mới học nên bí quá
                các bác giúp em vs. em xin các bác gửi vào mail nkquan.ictu@gmail.com vs
                Em chân thành cảm ơn các bác
                Cái món đồng hồ này thì mình làm nhiều rồi, hôm nay mình chỉ sơ cho bạn làm, vì ko có thời gian viết chi tiết nên bữa khác làm chi tiết hơn rồi bàn sau.
                Đầu tiên bạn cần mua 1 bo mạch chạy led ở chợ nhật tảo bán rất nhiều loại dành cho dân quảng cáo biễn vẫy led nếu bạn thích làm loại led siêu sáng, còn bạn làm led hộp thì bạn tự mày mò chân cẳng

                bạn cần 1 mạch chạy con ds1307, bạn search trên mạng hoặc trong diễn đàn này để tìm sơ đồ chân và sơ đồ ráp mạch, và còn tìm thông tin datasheet của con ds1307 để tra cứu sơ đồ RAM của nó.

                Các phần hoạt động

                Phần hiển thị, hẹn giờ, đọc thời gian từ chip ds1307 và xử lý các tác vụ khác sẽ do con 89C51 hoặc 52 đảm nhận, sau này bạn nghiên cứu nâng cao dùng chíp họ AVR để làm sẽ tốt hơn nhiều so với dùng họ 89
                Phần thời gian sẽ do con chip ds1307 đảm nhận, con này sẽ gửi dữ liệu về cho con 89 thông qua giao tiếp 2 dây (I2C), bạn cần tìm hiểu thêm cách giao tiếp này hiện người ta dùng dạng này cũng phổ biến vì chỉ tốn 2 sợi dây điện để đọc và ghi dữ liệu thôi.

                Ở đây tôi đề cập vấn đề dùng led 7 đoạn, vì bạn có chức năng hẹn giờ nên tôi khuyên bạn dùng học 89s52 còn nếu chỉ hiện thị giờ không thôi thì dùng con 89c2051 là đủ rồi, tôi đã làm và đang sử dụng ở nhà

                cách đấu dây led hộp: bạn tra cứu thứ tự chân cho con led, nên làm theo thứ tự của led 7 đoạn và port của 89. ví dụ nếu bạn muốn dùng port 1 làm giao tiếp với led 7 đoạn thì bạn nối chân p1.0 với chân a , p1.1 với chân b của led 7 đoạn, cứ thế cho tuần tự để dễ viết mã hiển thị cho led. chân cuối cùng của port dư ra thì bỏ không sử dụng.

                Sơ đồ đấu đại khái như sau: 7 dây của led 7 đoạn sẽ nối với 7 chân của VXL (port nào cũng được), 4 chân dương chung của led 7 đoạn thì nối với 1 port khác của VXL, còn các chân dư của VXL khác thì tùy ý bạn sử dụng làm nút nhấn, kết nối với thiết bị khác, ...

                Còn chip ds1307 thì nối vào port khác của VXL, nối port nào cũng được hoặc chung với port nối với chân dương của led 7 đoạn cũng được.

                Nguyên lý truyền dữ liệu:
                7 dây nối với led 7 đoạn và VXL sẽ luôn truyền giá trị từ 0 đến 9 lên đó.
                4 chân dương dùng để tắt mở từng led 7 đoạn, ví dụ bạn muốn led số 1 hiện thị số 1 hay 3, hay 5 thì bạn cho thông dương của led này tắt các led khác, tương tự muốn led 2 hiển thị số nào đó thì tắt các led khác mở led 2 cho thông điện. cứ thế, lập trình cho thực hiện công việc này 100 lần trong 1 giây là bạn đã có thể hiển thị 4 số khác nhau trên 4 led 7 đoạn.

                phần sơ đồ: tôi tìm 1 sơ đồ trên mạng, nhưng đây là sơ đồ không dùng chip thời gian thực nên tôi đã cải tiển lại phần thời gian, bạn có thể lắp theo sơ đồ này.

                đây là sơ đồ và code C cho đồng hồ, sơ đồ này bạn có thể thay chip khác cho phù hợp và thêm phần ds1307 vào
                http://dientu.pro.vn/hoi-dap/70-H%E1...9c2051/96.html

                Tôi cho bạn đoạn code tham khảo như sau:

                #include <REGX52.H>
                #include <MATH.H>

                #define SCL P2_0
                #define SDA P2_1
                //dinh nghia cho led 7 thanh
                #define SEC 0x00
                #define MIN 0x01
                #define HOUR 0x02

                //code hiển thị cho led 7 đoạn, mã này có thể thay đổi tùy theo phần giao tiếp với led 7 đoạn bên ngoài
                code unsigned char Display_Number[]={
                0xD7,//0
                0x44,//1
                0xD3,//2
                0xD5,//3
                0x74,//4
                0xB5,//5
                0xB7,//6
                0xC4,//7
                0xF7,//8
                0xF5//9
                };

                // đoạn code khởi tạo, ghi, đọc ds1307
                static unsigned char ds1307_started = 0;

                static char sec,hour,min; //cac bien dem gio phut giay....
                static char key;// luu gia tri phim nhan
                static char buffer[4], digit[4];

                void delay_us(unsigned int us)
                {
                unsigned int i;
                for(i=0;i<us;i++);
                }
                void delay_ms(unsigned int ms) //ham delay
                {
                unsigned int i,j;
                for(i=0;i<ms;i++)
                for(j=0;j<121;j++);
                }

                void I2C_delay(){
                delay_us(1);
                }

                void _I2C_Init() {
                // must do following in one go else port takes time to do it so R-M-F stops it.
                SDA=1; // release data (high).
                SCL=1; // release clock (high).
                }
                void I2C_start() //ham khoi dong I2C
                {
                SDA=1;
                SCL=1;
                I2C_delay();

                SDA=0;
                I2C_delay();

                SCL=0;
                I2C_delay();


                }
                void I2C_stop()
                {
                SCL = 0;
                I2C_delay();
                SDA = 0;
                I2C_delay();

                SCL = 1;
                I2C_delay();

                SDA = 1;
                I2C_delay();
                }

                //////////////////////////////////////////////////////////////////////
                // Returns 0 for no errors = the ACK bit from the slave
                unsigned char _I2C_Wr(unsigned char dat) {
                unsigned char ret=0,i;

                // grab the data
                for(i=0;i<8;i++) {

                SCL=0; // Clock low
                SDA = (dat & 0x80) ? 1:0;
                //if (data & 0x80) I2C_SDA_1;
                //else I2C_SDA_0; // Data output
                dat <<= 1; // Next data bit.
                //I2C_delay(); // low T/2.
                SCL=1; // Clock released to high.
                I2C_delay(); // high T/2.
                }

                // get ACK or NACK
                SCL=0;
                SDA=1; // Release the data line
                I2C_delay(); // low T/2.

                SCL=1;
                // Sample the ACK
                ret = SDA;
                //I2C_delay(); // high T/2.

                SCL=0; // Return clock to safe state

                return ret;
                }

                //////////////////////////////////////////////////////////////////////
                unsigned char _I2C_Rd(unsigned char ack) {
                unsigned char i;
                char dat=0;

                SDA = 1; // Release the data pin

                // grab the data
                for(i=0;i<8;i++) {

                SCL = 1; // Clock released to high.
                dat <<=1;
                while (SCL==0) {;} // Wait here if clock is pulled low by slave
                dat = (dat | SDA);//if (I2C_SDA_IN) {data |= 1;} // Sample the data
                SCL = 0; // Clock is low
                I2C_delay();
                }
                // I2C_SCL_0; // Clock released low
                // Send ACK or NACK
                if (ack) SDA = 0; // send ACK
                else SDA = 1; // send NACK

                I2C_delay(); // low T/w.
                SCL = 1;
                I2C_delay(); // high T/2.

                SCL = 0; // Return clock to safe state.
                return dat;
                }


                //////////////////////////////////////////////////////////////////////
                unsigned char DS1307_Rd(unsigned char address) {
                unsigned char dat;

                I2C_start();
                _I2C_Wr(0xd0);
                _I2C_Wr(address);
                I2C_start();
                _I2C_Wr(0xd1); // b0 is read
                dat=_I2C_Rd(0); // Read with NACK.
                I2C_stop();
                return (((dat/16)*10)+ (dat & 0x0f)); /*for Led 7seg*/
                }

                void DS1307_wr(unsigned char address, unsigned char dat) {
                unsigned char i;
                unsigned char temp;
                temp = (((dat/10)*16)|(dat %10));
                I2C_start();
                _I2C_Wr(0xd0);
                _I2C_Wr(address);
                _I2C_Wr(temp);
                I2C_stop();

                I2C_start();

                // Get an ACK from the slave but give up after 3 goes don't hang waiting.
                for(i=0;i<3;i++) {
                if (_I2C_Wr(0xd0)==1) { // Check for NACK
                I2C_start();
                } else break; // found ACK
                }
                I2C_stop();
                }

                void Ds1307_Start() {
                unsigned char sec;

                if (ds1307_started) return;

                sec = DS1307_Rd (0) & ~0x80; // CH = 0 - start.
                DS1307_wr(0,sec);
                ds1307_started = 1;
                }
                void Ds1307_Stop() {
                unsigned char sec;
                sec = DS1307_Rd(0) | 0x80; // CH = 1 - stop.
                DS1307_wr(0,sec);

                ds1307_started = 0;
                }


                void Read_DS1307()
                {
                //sec = DS1307_Rd(SEC);
                //min = DS1307_Rd(MIN); //doc phut tu DS1307
                //hour = DS1307_Rd(HOUR); //doc gio tu DS1307
                hour = 0x0C;
                min = 0x22;
                }

                void Write_DS1307()
                {
                DS1307_wr(SEC,sec);
                DS1307_wr(MIN,min); //ghi du lieu vao thanh ghi phut
                DS1307_wr(HOUR,hour); //ghi du lieu vao thanh ghi gio
                }
                // hàm tính toán để hiện thị ra led 7 đoạn
                void Convert_Number()
                {
                buffer[0] = Display_Number[hour/10];
                buffer[1] = Display_Number[hour%10];
                buffer[2] = Display_Number[min/10];
                buffer[3] = Display_Number[min%10];

                }
                // xuất led 7 đoạn kiêm luôn quét phím
                void scanLED()
                {
                unsigned char i;
                key = -1;
                for( i = 0; i < 4; i++) /* 4-DIGIT scanning */
                {
                P1 = ~buffer[i]; /* send complement[segment] */
                P3 = 0; /* send complement[digit] */
                delay_ms(5); /* delay a while */
                if ((P3 & 0x80) == 0) /* if key pressed P2.7 became low */
                key = i; /* save key position to key variable */
                }
                }

                các phần còn lại bạn nghiên cứu thêm sơ đồ đồng hồ tôi đã cho ở trên

                chúc bạn làm có nhiều lỗi. có lỗi mới nâng cao tay nghề được
                Last edited by nhtrung1980; 20-02-2013, 09:18.

                Comment

                Về tác giả

                Collapse

                nkquan.ictu Tìm hiểu thêm về nkquan.ictu

                Bài viết mới nhất

                Collapse

                Đang tải...
                X