Chia sẻ Mạch Ứng Dụng Cho PIC16F887 - SHT11 - DS1307 - LCD - UART

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • caddish12
    Đệ tử 1 túi
    • Apr 2010
    • 25

    #1

    Chia sẻ Mạch Ứng Dụng Cho PIC16F887 - SHT11 - DS1307 - LCD - UART



    Chào các bạn!

    Mình xin chia sẻ mạch dành cho những bạn mới làm quen với PIC16F887, Board ứng dụng nho nhỏ tích hợp sẵn ds1307+SHT11+UART+LCD16x2, mạch này thích hợp để ủi ^^
    Gồm schematic+layout (orcad)+firmware

    Main Code:
    Code:
    #include <htc.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include "lcd.h"
    #include "rtc.h"
    #include "i2c.h"
    #include "uart.h"
    #include "SHT.h"
    
    
    __CONFIG(HS & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT & BORDIS & IESODIS & FCMDIS & LVPDIS);
    
    void putch(char c)
    {
    	uart_putc(c);
    }
    
    char buf[50];
    unsigned char s,m,h,day,date,month,year;
    
    
    void ftoa(float value, char *string) 
     { 
         if (value < 0) { 
             *string++ = '-'; 
             value = -value; 
         } 
         sprintf(string, (far char *)"%d.%02u", 
                         (int) value, 
                         (int) ((value - (int) value) * 100. + 0.5));  //important
     }
     
     
    unsigned char bcd2dec(unsigned char a)
    {
    	unsigned char r,t;
       t = a & 0x0F;
       r = t;
       a = 0xF0 & a;
       t = a >> 4;
       t = 0x0F & t;
       r = t*10 + r;
       return r;
    }
    unsigned char dec2bcd(unsigned char a)
    {
       unsigned char t1, t2;
       t1 = a%10;
       t1 = t1 & 0x0F;
       t2 = a/10;
       t2 = t2 << 4;
       t2 = 0xF0 & t2;
       t1 = t1 | t2;
       return t1;
    }	
     
    void rtc_readdatetime(void)
    {	
    	s = rtc_read(0);
        m = rtc_read(1);
        h = rtc_read(2);
    	day = rtc_read(3);
        date = rtc_read(4);
        month = rtc_read(5);
        year = rtc_read(6);
        switch(bcd2dec(day))
        {
            case 0:
               	sprintf(buf,"Mon");
               	break;
            case 1:
               	sprintf(buf,"Tue");
               	break;
            case 2:
               	sprintf(buf,"Wed");
               	break;
            case 3:
               	sprintf(buf,"Thu");
               	break;
            case 4:
               	sprintf(buf,"Fri");
               	break;
            case 5:
               	sprintf(buf,"Sat");
               	break;
            case 6:
               	sprintf(buf,"Sun");
               	break;
       }
          			           			           		           	
        lcd_gotoxy(0,0);        
        sprintf(buf,"%s %02u-%02u-%02u",buf,bcd2dec(date),bcd2dec(month),bcd2dec(year));
        lcd_puts(buf);
        printf("\n\r%s %02u-%02u-%02u",buf,bcd2dec(date),bcd2dec(month),bcd2dec(year));
        printf("\n\rTime: %02u:%02u:%02u",bcd2dec(h),bcd2dec(m),bcd2dec(s));
    } 
     
    void main()
    {	
    	unsigned int a;
    	char i;
    	float tem,humi;
    	
    	ANSEL = 0;
    	ANSELH = 0;
    
    	TRISC0 = 0;
    	uart_init();        
        lcd_init(); 
        sht_init(SHT_14_12_BIT);  
    	i2c_init();
    //	rtc_write(0,dec2bcd(0));
    //	rtc_write(1,dec2bcd(53));
    //	rtc_write(2,dec2bcd(13));
    //	rtc_write(3,dec2bcd(4));
    //	rtc_write(4,dec2bcd(17));
    //	rtc_write(5,dec2bcd(1));
    //	rtc_write(6,dec2bcd(13));
    	
        
        printf("\n\r\n\rEmbedded RealTime System Project\n\r"); 
    	
    	rtc_readdatetime();
        __delay_ms(90);
        
    	a=0;
    	while(1)
            { 
               	a++;         
               	RC0 ^= 1;          	         
               	s = rtc_read(0);
               	m = rtc_read(1);
               	h = rtc_read(2);
               	lcd_gotoxy(1,0);         	
               	sprintf(buf,"Time: %02u:%02u:%02u",bcd2dec(h),bcd2dec(m),bcd2dec(s));
               	lcd_puts(buf);                          	
               	if (a==200)
    			{
    				
        			sht_readTemHumi(&tem,&humi);
        			//ftoa(tem,buf);   //enable if you use Hi-Tech PRO only			
        			printf("\n\rT: %s",buf);
        			//ftoa(humi,buf);  			
        			//printf(" H: %s\n\r",buf);   			
    				a = 0;
    			}
             
        }
    }
    Nếu bạn dùng bản Hi-Tech PRO thì hãy uncomment 3 dòng sau nhé{
    Code:
                            ftoa(tem,buf);			
        			ftoa(humi,buf);  			
        			printf(" H: %s\n\r",buf);
    lý do là vì bản lite không có optimize code nên sẽ không đủ bộ nhớ cho PIC16F887
    Attached Files
    Thanh Nguyen,
    International University, VNU
  • tbnbk
    Nhập môn đệ tử
    • Jul 2014
    • 5

    #2
    bạn còn cái code và mạch nào pic 16f887 hay hay và mạch bạn học rồi k cho xin vs.code bằng hitech c nha bạn.cảm ơn bạn nhiều

    Comment

    Working...