Hoc Pic Qua Lich Van Lien

30
Chào các bạn! Hiện mình đã làm xong mạch Lịch Vạn niên sử dụng PIC16F877A. Mình sẽ lần lượt post các chương trình thử nghiệm trên mạch này. Qua Project này các bạn sẽ làm chủ được con PIC16F877A và trình dịch MikroC, một trình biên dịch rất dễ sử dụng cho người mới bắt đầu học. Đây là sơ đồ mạch nguyên lý: Dùng PIC16F877A với chuẩn nạp chương trìng bootloader-ICSP của Picvietnam. Thạch anh 20MHz, tụ 1uF lọc nhiễu.

description

bvb kjggggggg dhjdkug

Transcript of Hoc Pic Qua Lich Van Lien

Cho cc bn

Cho cc bn!Hin mnh lm xong mch Lch Vn nin s dng PIC16F877A. Mnh s ln lt post cc chng trnh th nghim trn mch ny. Qua Project ny cc bn s lm ch c con PIC16F877A v trnh dch MikroC, mt trnh bin dch rt d s dng cho ngi mi bt u hc.y l s mch nguyn l:Dng PIC16F877A vi chun np chng trng bootloader-ICSP ca Picvietnam. Thch anh 20MHz, t 1uF lc nhiu.

C 4 nt bm Mode, Set, Up, Down dng ci t v xem thng tin ca lch vn nin. Hin th bng mn hnh LCD 16x2 cm qua hng Jump LCDDISPLAY. C nt gt chn backlight ca LCD. 3 LED n mc cng E dng ch th cc ch .

Nhit mi trng c ly t con LM335. Thng qua vic s dng LM335 bn s hiu c cch s dng modul ADC ca PIC. Thi gian thc c ly t con DS1307, m rng thm b nh ngoi bng con 24C04 vi 256B, qua cch giao tip vi 2 con IC ny bn hc thm c cch dng giao tip I2C. Gn thm ci loa Speaker vo chn PWM hc cch s dng m ul PWM ca PIC. Nh vy n y mch ca ta hon chnh c th lm mt ci lch vn nin hin th ngy thng nm, gi pht giy, nhit mi trng, bo gi chung. Cn li l kh nng bay bng ca cc bn bng phn mm.

Cn nt ci ngun cho mch chy. Ngun u vo l mt ci adapter 9V DC rt ph bin , cm vo ci ngun ny u ra s l 5VDC cho mch chy.

Project1: I/O PORT

Chng trnh u tin ta hc v cch lm vic vi cc cng I/O. y ta c cng E mc vi cc Led n. Ta lm chng trnh nhy Led n theo th t nh sau: 100,010,001,100.... Mi ln nhy cch nhau 250ms.

void MAIN() {PORTE = 0; // Xa d liu cng ETRISE = 0; // nh ngha cng E l OutputADCON1 = 0xE; // nh ngha cng E l I/O Port.

Loop: // Nhn vng lpPORTE.F0 = 1; // Bt Led 1 PORTE.F1 = 0; // Tt Led 2PORTE.F2 = 0; // Tt Led 3Delay_ms(250); // Tr 250msPORTE.F0 = 0; // Tt Led 1PORTE.F1 = 1; // Bt Led 2PORTE.F2 = 0; // Tt Led 3Delay_ms(250); // Tr 250msPORTE.F0 = 0; // Tt Led 1PORTE.F1 = 0; // Tt Led 2PORTE.F2 = 1; // Bt Led 3Delay_ms(250); // Tr 250msgoto Loop; // Lp li chu trnh nhy.}

Sau khi vit xong cc bn dch sang file hex bng cch n t hp phm Ctrl + F9. Ri em file hex ny np vo PIC16F877A l mch chy ngon lnh.

By gi cc bn li mun c 3 n nhp nhy cng mt lc, khong thi gian nhp nhy l 250ms th chng trnh s nh th ny:

void MAIN() {PORTE = 0; // Xa d liu cng ETRISE = 0; // nh ngha cng E l OutputADCON1 = 0xE; // nh ngha cng E l I/O Port.

Loop: // Nhn vng lpPORTE = ~PORTE; // o trng thi cng E Delay_ms(250); // Tr 250msgoto Loop; // Lp li chu trnh nhy.}

Tip theo chng ta lm bi ton c phm bm. Ta c tt c 4 phm bm l MODE, SET, UP, DOWN tng ng nm cc chn RB1, RB2, RB3 v RB4. Bi ton ln ny nh sau: Bm phm RB1 th LED 1 sng...Bm phm RB3 th LED3 sng, bm phm RB4 th tt ht cc n. Chng trnh s nh sau:

void MAIN() {PORTB = 0; // Xo d liu cng BTRISB = 0xFF; // nh ngha cng B l input

PORTE = 0; TRISE = 0;ADCON1 = 0xE;

Loop:if (PORTB.F1 == 0) { // Kim tra nt n RB1 c bm khng? Nu bm thPORTE = 0x00; // Tt ht n cng EPORTE.F0 = 1; // Bt n LED1}if (PORTB.F2 == 0) { // Kim tra nt n RB2 c bm khng? Nu bm thPORTE = 0x00; // Tt ht n cng EPORTE.F1 = 1; // Bt n LED2}if (PORTB.F3 == 0) { // Kim tra nt n RB3 c bm khng? Nu bm thPORTE = 0x00; // Tt ht n cng EPORTE.F2 = 1; // Bt n LED3}if (PORTB.F3 == 0) PORTE = 0x00; // Kim tra nt n RB3 c bm khng? Nu bm th Tt ht n cng Egoto Loop; // Lp li vng lp kim tra nt bm

}

S dng cc hm I2C ca MikroC

Tham gia "Hc PIC6F877A qua ti lch vn nin" ca Tinhthanthep, thy c s dng cc hm ghi v c d liu vi ds1307 theo giao tip I2C:- I2C_Wr(0xD0): gi a ch ca ds1307 ln ng truyn- I2C_Wr(0x90): cu hnh cho thanh iu khin ds1307, s dng xung 1hz- I2C_Rd(1u): c d liu t ds1307Mnh khng bit cc tham s ca cc hm trn nh : 0xD0, 0x90, 1u ... th c th tham kho ti liu no, mnh c trong Hepl ca MikroC m khng r ?

Xin nh cc Huynh ch gip, xin cm n !

Nhng thng tin nm trong datasheet ca DS1307. Mi thit b I2C c nhng quy nh ring v a ch, cc lnh iu khin, thao tc d liu. iu khin thit b no th bn phi tun theo nhng quy c ca thit b , nu khng th thit b ch l i cc yu cu ca bn thi.

mnh cng ang lm ci ng h ny hin th trn LED7seg .nhng ang gp vn v cch thit lp gi ,chng trinh thit lp gi mnh cho vo ngt ngoi . bn c th hng dn cho minh ko. Ah cho minh hi thm l chng trnh c thi gian thi nn a vo ngt timer hay dung delay.gip mnh nh.

Trn con IC thi gian thc Ds1307 c chn SQW/INTB pht ra xung c tn s 1Hz (tc l 1s n on 1 ln) , mc chn ny vo chn ngt ngoi RB0 ca PIC c 1s th n kch cho ngt ngoi hot ng. Theo suy ngh thng thng cc bn hay chng trnh hin th trong ngt nhng nh th MikroC n s bo li "ko c dng chng trnh con trong ngt" nn bn chng trnh hin th trong chng trnh chnh.

C mt vn v ci nt bm l hin tng rung phm. Ci ny ai hiu ri ko ni lm g , cn bn no cha hiu th phi bit. Khi bn n mt nt bm th cc l ng tip xc trong phm bm n khng dnh vo nhau ngay lp tc m n bt i bt li vi ln mi tip xc hn (do tnh n hi ca vt liu ng l xo). Khong thi gian lp bp ny tuy ngn nhng so vi tc x l ca PIC th cn phi chy di. Vi chng trnh troc th hin tng rung phm ny khng nh hng g, nhng vi bi ton nh: Bm phm 1 Led 1 sng, bm pht na n tt th s c vn . Nhiu khi bn bm 1 ci n vn tt l bi v phm bm n rung nn thc ra l pic n tng bn bm nhiu ln nn lc sng lc tt kt qu l tt. x l vn ny th ta cho chng trnh khi pht hin c bm nt th tr i mt khong thoi gian di hn hin tng rung phm l ok. Khi bm nt RB1 PIC to tr 1 khong thi gian 50ms sau kim tra xem RB1 cn c bm khng? nu cn th cho sng LED.

Vy ta lm nt bi ton sau l xong hn v ci nt bm: Bi ton l ta bm phm RB1 th LEd1 sng, bm pht na th n tt....Chng trng nh sau:

Code:

void MAIN() {

PORTB = 0; // Xo d liu cng BTRISB = 0xFF; // nh ngha cng B l input

PORTE = 0;

TRISE = 0;

ADCON1 = 0xE;

Loop:

if (PORTB.F1 == 0) { // Kim tra nt n RB1 c bm khng? Nu bm thif (PORTE.F0 == 0) PORTE.F0 = 1 // kim tra xem n ang tt khng? nu ng th bt lnelse PORTE.F0 = 0; // nu sai th tt n iDelay_ms(50); // To tr 50ms kh ht hin tng rung phmLoop1:

if (PORTB.F1 == 0) goto Loop1; // chy lng vng i n khi tay ngi nh hn nt bm ra}

goto Loop; // Lp li vng lp kim tra nt bm}

Tip theo ta lm sang ci LCD nh. Bn no mi lm quen vi LCD m vit bng assembly th chc mt vi ngy qu. Nu vit bng MikroC bn no km lm cng ch 30 pht l xong. Ni th cc bn thy rng vit ng dng m dng MikroC th thi ri, vit nhanh v ng dng nhanh i vo cuc sng, ch c ta tt bng assem th khi sn phm ra th trng th i th cnh tranh ra my phin bn khc nhau mt roi. Gi ta vit chng trnh hin th dng ch Hello Picvietnam nh. Chng trnh nh sau:

Code:

void INIT_MAIN() {

// Khoi tao cong B

PORTB = 0;

TRISB = 0xFF;

// Khoi tao cong D

PORTD = 0; // Xa d liu ang tn ti sn trn cng D TRISD = 0; // nh ngha cng D l digital Output// Khoi tao cong E

PORTE = 0;

TRISE = 0;

ADCON1 = 0xE;

// Khoi tao LCD

Lcd_Config(&PORTD,4,7,6,3,2,1,0); // cc bn xem s mch hiu c cch khai cc tham s ca hm ny Lcd_Cmd(Lcd_CLEAR); // xa mn hnh

Lcd_Cmd(Lcd_CURSOR_OFF); // tt con tr nhp nhy ca LCDvoid LCD_DISPLAY() {

LCD_Out(1,1,"Hello"); // hin ch Hello bt u dng 1 ct 1 LCD_Out(2,1,"Picvietnam"); // hin ch Picvietnam bt u dng 2 ct 1}

void MAIN() {

INIT_MAIN();

LCD_DISPLAY();

}

Chng trnh y y

Code:

/* KHAI BAO BIEN **************************************************************/

unsigned short second, minute, hour, day, date, month, year;

unsigned short minute_al, hour_al, type_al, count_al;

unsigned short flag_time, delay10s_1 = 0, delay10s_2 = 0;

unsigned short mode;

char *day_txt;

/* KHOI TAO *******************************************************************/

void INIT_MAIN() {

/* Khoi tao cong A -----------------------------------------------------------*/

TRISA = 0xFF; // Dinh nghia cong A la Digital Input

PORTA = 0x00;

/* Khoi tao cong B -----------------------------------------------------------*/

TRISB = 0xFF; // Dinh nghia cong B la Digital Input

PORTB = 0x00;

/* Khoi tao cong C -----------------------------------------------------------*/

TRISC = 0x00;

PORTC = 0x00;

/* Khoi tao cong D -----------------------------------------------------------*/

TRISD = 0x00; // Dinh nghia cong D la Digital Output

PORTD = 0x00;

/* Khoi tao cong E -----------------------------------------------------------*/

ADCON1 = 0x0E; // Dinh nghia cong E la Digital + su dung A/D channel AN0

TRISE = 0x00; // Dinh nghia cong E la Output

PORTE = 0x00; // Xoa du lieu cu tren cong E

/* Khoi tao LCD --------------------------------------------------------------*/

Lcd_Config(&PORTD,4,7,6,3,2,1,0);

Lcd_Init(&PORTD);

Lcd_Cmd(Lcd_CLEAR);

Lcd_Cmd(Lcd_CURSOR_OFF);

/* Khoi tao truyen thong I2C -------------------------------------------------*/

I2C_Init(100000);

/* Khoi tao DS1307 -----------------------------------------------------------*/

/* I2C_Start();

I2C_Wr(0xD0);

I2C_Wr(0x00); // Khoi tao cac gia tri ban dau cho cac thanh ghi thoi gian

I2C_Wr(0x13); // chi lam 1 lan.

I2C_Wr(0x03);

I2C_Wr(0x02);

I2C_Wr(0x03);

I2C_Wr(0x05);

I2C_Wr(0x03);

I2C_Wr(0x03);

I2C_Wr(0x90);

I2C_Stop(); */

/* Khoi tao ngat ngoai va Timer0 ---------------------------------------------*/

INTCON = 0x90; // Mo ngat toan cuc, mo ngat ngoai, xoa co ngat ngoai, xoa co ngat Timer0

OPTION_REG = 0x87; // Chon suon len cho ngat ngoai va Timer0, bo chia ti le 1:256 cho Timer0

TMR0 = 0x00;

/* Khoi tao cac bien luu trong EEPROM*/

hour_al = Eeprom_Read(0x00);

minute_al = Eeprom_Read(0x01);

type_al = Eeprom_Read(0x02);

}

/* CHUONG TRINH CON ***********************************************************/

/* Doc du lieu RTC tu DS1307 -------------------------------------------------*/

void READ_RTC() {

I2C_Start();

I2C_Wr(0xD0);

I2C_Wr(0x00);

I2C_Repeated_Start();

I2C_Wr(0xD1);

second = I2C_Rd(1u);

minute = I2C_Rd(1u);

hour = I2C_Rd(1u);

day = I2C_Rd(1u);

date = I2C_Rd(1u);

month = I2C_Rd(1u);

year = I2C_Rd(1u);

I2C_Stop();

}

/* Xu ly du lieu Date RTC ----------------------------------------------------*/

void TRANSFORM_RTC() {

switch (day) {

case 1: day_txt = "ERO"; break;

case 2: day_txt = "T.2"; break;

case 3: day_txt = "T.3"; break;

case 4: day_txt = "T.4"; break;

case 5: day_txt = "T.5"; break;

case 6: day_txt = "T.6"; break;

case 7: day_txt = "T.7"; break;

case 8: day_txt = "C.N"; break;

}

}

/* Xu ly du lieu RTC ---------------------------------------------------------*/

void BCD(unsigned short x, unsigned short y,unsigned short var) {

unsigned short var1, var2;

var1 = (var >> 4) + 0x30;

LCD_Chr(x,y,var1);

var2 = (var & 0x0F) + 0x30;

LCD_Chr_Cp(var2);

}

/* Hien thi ra LCD -----------------------------------------------------------*/

void LCD_DISPLAY() {

LCD_Out(1,1,day_txt);

BCD(1,7,date);

LCD_Chr_Cp('/');

BCD(1,10,month);

LCD_Out_Cp("/20");

BCD(1,15,year);

if (type_al == 1) Lcd_Out(2, 1,"Chuong");

else Lcd_Out(2, 1," ");

BCD(2,9,hour);

LCD_Chr_Cp(':');

BCD(2,12,minute);

LCD_Chr_Cp(':');

BCD(2,15,second);

}

/* Cap nhat thoi gian --------------------------------------------------------*/

void UPDATE_TIME() {

READ_RTC();

TRANSFORM_RTC();

LCD_DISPLAY();

PORTE.F0 = ~PORTE.F0;

}

/* Xu ly Du lieu Nhiet do tu LM335 -------------------------------------------*/

void TEMPERATURE() {

unsigned short temp1, temp2;

char degree[5];

temp1 = Adc_Read(0);

temp2 = (temp1 - 558)/2;

ByteToStr(temp2, degree);

LCD_Out_CP(degree);

LCD_Chr_Cp(223);

LCD_Chr_Cp('C');

}

/* XOA TIMER0 ----------------------------------------------------------------*/

void CLEAR_TIMER0() {

delay10s_1 = 0;

delay10s_2 = 0;

TMR0 = 0;

}

/* Tinh so ngay Julius -------------------------------------------------------*/

unsigned long jdFromDate(char dd, char mm, char yy) {

char a, m;

unsigned y;

unsigned long jd;

a = (14 - mm)/12;

y = (2000 + yy) + 4800 - a;

m = mm + 12*a - 3;

jd = dd + (153*m + 2)/5 + 365*y + y/4 - y/100 + y/400 - 32045;

if (jd < 2299161) jd = dd + (153*m + 2)/5 + 365*y + y/4 - 32083;

return jd;

}

/* Tinh ngay soc -------------------------------------------------------------*/

char getNewMoonDay(unsigned long k) {

double T, T2, T3, dr, Jd1, M, Mpr, F, C1, deltat, JdNew;

T = k/1236.85;

T2 = T * T;

T3 = T2 * T;

dr = 3.1415926/180;

Jd1 = 2415020.75933 + 29.53058868*k + 0.0001178*T2 - 0.000000155*T3;

Jd1 = Jd1 + 0.00033*sin((166.56 + 132.87*T - 0.009173*T2)*dr);

M = 359.2242 + 29.10535608*k - 0.0000333*T2 - 0.00000347*T3;

Mpr = 306.0253 + 385.81691806*k + 0.0107306*T2 + 0.00001236*T3;

F = 21.2964 + 390.67050646*k - 0.0016528*T2 - 0.00000239*T3;

C1=(0.1734 - 0.000393*T)*sin(M*dr) + 0.0021*sin(2*dr*M);

C1 = C1 - 0.4068*sin(Mpr*dr) + 0.0161*sin(dr*2*Mpr);

C1 = C1 - 0.0004*sin(dr*3*Mpr);

C1 = C1 + 0.0104*sin(dr*2*F) - 0.0051*sin(dr*(M+Mpr));

C1 = C1 - 0.0074*sin(dr*(M-Mpr)) + 0.0004*sin(dr*(2*F+M));

C1 = C1 - 0.0004*sin(dr*(2*F-M)) - 0.0006*sin(dr*(2*F+Mpr));

C1 = C1 + 0.0010*sin(dr*(2*F-Mpr)) + 0.0005*sin(dr*(2*Mpr+M));

if (T < -11) 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;

JdNew = Jd1 + C1 - deltat;

return (JdNew + 0.5 + 7/24);

}

/* Tinh toa do mat troi ------------------------------------------------------*/

char getSunLongitude(unsigned long jdn) {

double T, T2, dr, M, L0, DL, L;

T = (jdn - 2451545.5 - 7/24) / 36525;

T2 = T*T;

dr = 3.1415926/180;

M = 357.52910 + 35999.05030*T - 0.0001559*T2 - 0.00000048*T*T2;

L0 = 280.46645 + 36000.76983*T + 0.0003032*T2;

DL = (1.914600 - 0.004817*T - 0.000014*T2)*sin(dr*M);

DL = DL + (0.019993 - 0.000101*T)*sin(dr*2*M) + 0.000290*sin(dr*3*M);

L = L0 + DL;

L = L*dr;

L = L - 3.1415926*2*(L/(3.1415926*2));

return (L / 3.1415926 * 6);

}

/* Tim ngay bat dau thang 11 am lich -----------------------------------------*/

char getLunarMonth11(char yy) {

unsigned long k, off, nm, sunLong;

off = jdFromDate(31, 12, (2000 + yy)) - 2415021;

k = (off / 29.530588853);

nm = getNewMoonDay(k);

sunLong = getSunLongitude(nm);

if (sunLong >= 9) nm = getNewMoonDay(k-1);

return nm;

}

/* Xac dinh thang nhuan ------------------------------------------------------*/

char getLeapMonthOffset(unsigned long a11) {

unsigned long k, last, arc, i;

char tmp;

k = (a11 - 2415021.076998695) / 29.530588853 + 0.5;

last = 0;

i = 1;

tmp = getNewMoonDay(k+i);

arc = getSunLongitude(tmp);

do {

last = arc;

i++;

arc = getSunLongitude(tmp);

}

while (arc != last && i < 14);

return i-1;

}

/* Tinh am lich --------------------------------------------------------------*/

void AM_LICH() {

unsigned long k, dayNumber, monthStart, a11, b11, lunarDay, lunarMonth, lunarYear, lunarLeap, diff, leapMonthDiff;

char dd, mm, yy;

unsigned short ld, lm, ly;

dd = Bcd2Dec(date);

mm = Bcd2Dec(month);

yy = Bcd2Dec(year);

dayNumber = jdFromDate(dd, mm, (2000+yy));

k = (dayNumber - 2415021.076998695) / 29.530588853;

monthStart = getNewMoonDay(k+1);

if (monthStart > dayNumber) monthStart = getNewMoonDay(k);

a11 = getLunarMonth11(2000+yy);

b11 = a11;

if (a11 >= monthStart) {

lunarYear = 2000+yy;

a11 = getLunarMonth11(2000+yy-1);

}

else {

lunarYear = 2000+yy+1;

b11 = getLunarMonth11(2000+yy+1);

}

lunarDay = dayNumber-monthStart+1;

diff = (monthStart - a11)/29;

lunarLeap = 0;

lunarMonth = diff+11;

if (b11 - a11 > 365) {

leapMonthDiff = getLeapMonthOffset(a11);

if (diff >= leapMonthDiff) {

lunarMonth = diff + 10;

if (diff == leapMonthDiff) lunarLeap = 1;

}

}

if (lunarMonth > 12) lunarMonth = lunarMonth - 12;

if (lunarMonth >= 11 && diff < 4) lunarYear -= 1;

ld = Dec2Bcd (lunarDay);

lm = Dec2Bcd (lunarMonth);

BCD(1,10,ld);

Lcd_Chr_Cp(':');

BCD(1,13,lm);

}

/* MODE BUTTON ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

/* Hien thi lich am ----------------------------------------------------------*/

void MODE_1() {

Lcd_Cmd(Lcd_CLEAR);

Lcd_Out(1, 1, "AM LICH: SORRY");

Lcd_Out(2, 1, "Next Update");

// AM_LICH();

mode = 1;

Mode_1l:

if (PORTB.F1 == 0) goto Mode_1l;

}

/* Hien thi nhiet do moi truong ----------------------------------------------*/

void MODE_2() {

Lcd_Cmd(Lcd_CLEAR);

Lcd_Out(1, 1, "NHIET DO:");

TEMPERATURE();

mode = 2;

Mode_2l:

if (PORTB.F1 == 0) goto Mode_2l;

}

/* Hien thi cai dat chuong bao thuc ------------------------------------------*/

void MODE_3() {

Lcd_Cmd(Lcd_CLEAR);

Lcd_Out(1, 1, "CHUONG BAO THUC");

if (type_al == 0) Lcd_Out(2, 1,"Khong su dung");

else {

BCD(2,6,hour_al);

LCD_Chr_Cp(':');

BCD(2,9,minute_al);

}

mode = 3;

Mode_3l:

if (PORTB.F1 == 0) goto Mode_3l;

}

/* Hien thi thong tin ve Version thiet ke ------------------------------------*/

void MODE_4() {

Lcd_Cmd(Lcd_CLEAR);

Lcd_Out(1, 3, "PIC VIET NAM");

Lcd_Out(2, 1, "Version 1 - 2007");

mode = 4;

Mode_4l:

if (PORTB.F1 == 0) goto Mode_4l;

}

/* Xu ly phim bam Mode -------------------------------------------------------*/

void MODE_BUTTON() {

INTCON.INTE = 0; // OFF ngat ngoai

PORTE = 0x02; // Bat LED 2

MODE_1(); // Vao man hinh MODE 1

INTCON.T0IE = 1; // Kich hoat Timer0 dem thoi gian tre man hinh 10s

while (delay10s_2 < 5) { // Quet phim MODE

Delay_ms(200); // Khu rung phim

if (PORTB.F1 == 0) {

mode++;

CLEAR_TIMER0();

switch (mode) {

case 1 : MODE_1(); break;

case 2 : MODE_2(); break;

case 3 : MODE_3(); break;

case 4 : MODE_4(); break;

case 5 : goto OUT_MODE;

}

}

}

OUT_MODE: // Ra khoi vong quet

PORTE = 0x00; // OFF LED 2

Lcd_Cmd(Lcd_CLEAR); // Xoa man hinh

CLEAR_TIMER0(); // Xoa bo dem thoi gian tre man hinh

}

/* SET BUTTON ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

/* Cap nhat du lieu cai dat --------------------------------------------------*/

void SET_DATA() {

I2C_Start();

I2C_Wr(0xD0);

I2C_Wr(0x00);

I2C_Wr(second);

I2C_Wr(minute);

I2C_Wr(hour);

I2C_Wr(day);

I2C_Wr(date);

I2C_Wr(month);

I2C_Wr(year);

I2C_Stop();

EEprom_Write(0x00, hour_al);

EEprom_Write(0x01, minute_al);

EEprom_Write(0x02, type_al);

}

/* Up data -------------------------------------------------------------------*/

unsigned short UP_BUTTON(unsigned short var) {

Delay_ms(200);

CLEAR_TIMER0();

var = Bcd2Dec(var);

var++;

var = Dec2Bcd(var);

return var;

}

/* Down data -----------------------------------------------------------------*/

unsigned short DOWN_BUTTON(unsigned short var) {

Delay_ms(200);

CLEAR_TIMER0();

var = Bcd2Dec(var);

if (var == 0) var = 101;

else var--;

var = Dec2Bcd(var);

return var;

}

/* Nhap nhay underline cursor ------------------------------------------------*/

void BLINK_CURSOR() {

Lcd_Cmd(LCD_MOVE_CURSOR_LEFT);

Lcd_Cmd(LCD_UNDERLINE_ON);

}

/* Hieu chinh gio ------------------------------------------------------------*/

void SET_HOUR() {

Delay_ms(200);

hour_lb:

if (PORTB.F2 == 0) {

CLEAR_TIMER0();

goto hour_lb;

}

while ((delay10s_2 < 5) && (PORTB.F2)) {

Delay_ms(100);

if (PORTB.F3 == 0) hour = UP_BUTTON(hour);

if (Bcd2Dec(hour) == 24) hour = Dec2Bcd(0);

if (PORTB.F4 == 0) hour = DOWN_BUTTON(hour);

if (Bcd2Dec(hour) == 101 ) hour = Dec2Bcd(23);

Lcd_Cmd(LCD_CURSOR_OFF);

BCD(2,5,hour);

BLINK_CURSOR();

}

}

/* Hieu chinh phut -----------------------------------------------------------*/

void SET_MINUTE() {

Delay_ms(100);

minute_lb:

if (PORTB.F2 == 0) {

CLEAR_TIMER0();

goto minute_lb;

}

while ((delay10s_2 < 5) && (PORTB.F2)) {

Delay_ms(200);

if (PORTB.F3 == 0) minute = UP_BUTTON(minute);

if (Bcd2Dec(minute) == 60) minute = Dec2Bcd(0);

if (PORTB.F4 == 0) minute = DOWN_BUTTON(minute);

if (Bcd2Dec(minute) == 101 ) minute = Dec2Bcd(59);

Lcd_Cmd(LCD_CURSOR_OFF);

BCD(2,8,minute);

BLINK_CURSOR();

}

}

/* Hieu chinh giay -----------------------------------------------------------*/

void SET_SECOND() {

Delay_ms(200);

second_lb:

if (PORTB.F2 == 0) {

CLEAR_TIMER0();

goto second_lb;

}

while ((delay10s_2 < 5) && (PORTB.F2)) {

Delay_ms(100);

if (PORTB.F3 == 0) second = UP_BUTTON(second);

if (Bcd2Dec(second) == 60) second = Dec2Bcd(0);

if (PORTB.F4 == 0) second = DOWN_BUTTON(second);

if (Bcd2Dec(second) == 101 ) second = Dec2Bcd(59);

Lcd_Cmd(LCD_CURSOR_OFF);

BCD(2,11,second);

BLINK_CURSOR();

}

}

/* Cai dat thoi gian CLOCK ---------------------------------------------------*/

void SET_1() {

Lcd_Cmd(Lcd_CLEAR);

LCD_Out(1,1,"Cai dat dong ho:");

BCD(2,5,hour);

LCD_Chr_Cp(':');

BCD(2,8,minute);

LCD_Chr_Cp(':');

BCD(2,11,second);

Delay_ms(200);

Set_1l:

if (PORTB.F2 == 0) goto Set_1l;

SET_HOUR();

SET_MINUTE();

SET_SECOND();

}

/* Cai dat Thu (DAY) ---------------------------------------------------------*/

void SET_DAY() {

Delay_ms(200);

day_lb:

if (PORTB.F2 == 0) {

CLEAR_TIMER0();

goto day_lb;

}

while ((delay10s_2 < 5) && (PORTB.F2)) {

Delay_ms(100);

if (PORTB.F3 == 0) day = UP_BUTTON(day);

if (Bcd2Dec(day) == 9) day = Dec2Bcd(2);

if (PORTB.F4 == 0) day = DOWN_BUTTON(day);

if (Bcd2Dec(day) == 1) day = Dec2Bcd(8);

TRANSFORM_RTC();

Lcd_Cmd(LCD_CURSOR_OFF);

LCD_Out(2,1,day_txt);

BLINK_CURSOR();

}

}

/* Cai dat ngay (DATE) -------------------------------------------------------*/

void SET_DATE() {

Delay_ms(200);

date_lb:

if (PORTB.F2 == 0) {

CLEAR_TIMER0();

goto date_lb;

}

while ((delay10s_2 < 5) && (PORTB.F2)) {

Delay_ms(100);

if (PORTB.F3 == 0) date = UP_BUTTON(date);

if (Bcd2Dec(date) == 32) date = Dec2Bcd(1);

if (PORTB.F4 == 0) date = DOWN_BUTTON(date);

if (Bcd2Dec(date) == 0 ) date = Dec2Bcd(31);

Lcd_Cmd(LCD_CURSOR_OFF);

BCD(2,7,date);

BLINK_CURSOR();

}

}

/* Cai dat thang (MONTH) -----------------------------------------------------*/

void SET_MONTH() {

Delay_ms(100);

month_lb:

if (PORTB.F2 == 0) {

CLEAR_TIMER0();

goto month_lb;

}

while ((delay10s_2 < 5) && (PORTB.F2)) {

Delay_ms(200);

if (PORTB.F3 == 0) month = UP_BUTTON(month);

if (Bcd2Dec(month) == 13) month = Dec2Bcd(1);

if (PORTB.F4 == 0) month = DOWN_BUTTON(month);

if (Bcd2Dec(month) == 0 ) month = Dec2Bcd(12);

Lcd_Cmd(LCD_CURSOR_OFF);

BCD(2,10,month);

BLINK_CURSOR();

}

}

/* Cai dat nam (YEAR) --------------------------------------------------------*/

void SET_YEAR() {

Delay_ms(200);

year_lb:

if (PORTB.F2 == 0) {

CLEAR_TIMER0();

goto year_lb;

}

while ((delay10s_2 < 5) && (PORTB.F2)) {

Delay_ms(100);

if (PORTB.F3 == 0) year = UP_BUTTON(year);

if (Bcd2Dec(year) == 100) year = Dec2Bcd(0);

if (PORTB.F4 == 0) year = DOWN_BUTTON(year);

if (Bcd2Dec(year) == 101) year = Dec2Bcd(99);

Lcd_Cmd(LCD_CURSOR_OFF);

BCD(2,15,year);

BLINK_CURSOR();

}

}

/* Cai dat lich duong CALENDAR ---------------------------------------------- */

void SET_2() {

Lcd_Cmd(Lcd_CLEAR);

LCD_Out(1,1,"Cai dat Lich:");

LCD_Out(2,1,day_txt);

BCD(2,7,date);

LCD_Chr_Cp('/');

BCD(2,10,month);

LCD_Out_Cp("/20");

BCD(2,15,year);

Delay_ms(200);

Set_2l:

if (PORTB.F2 == 0) goto Set_2l;

SET_DAY();

SET_DATE();

SET_MONTH();

SET_YEAR();

}

/* Cai dat gio bao thuc ------------------------------------------------------*/

void TIME_ALARM() {

Lcd_Cmd(Lcd_CLEAR);

Lcd_Out(1,1,"Gio rung Chuong:");

BCD(2,6,hour_al);

Lcd_Out(2,8,":");

BCD(2,9,minute_al);

Delay_ms(200);

Set_4l:

if (PORTB.F2 == 0) goto Set_4l;

Delay_ms(200);

hour_al_lb:

if (PORTB.F2 == 0) {

CLEAR_TIMER0();

goto hour_al_lb;

}

Delay_ms(200);

while ((delay10s_2 < 5) && (PORTB.F2)) {

Delay_ms(100);

if (PORTB.F3 == 0) hour_al = UP_BUTTON(hour_al);

if (Bcd2Dec(hour_al) == 24) hour_al = Dec2Bcd(0);

if (PORTB.F4 == 0) hour_al = DOWN_BUTTON(hour_al);

if (Bcd2Dec(hour_al) == 101 ) hour_al = Dec2Bcd(23);

Lcd_Cmd(LCD_CURSOR_OFF);

BCD(2,6,hour_al);

BLINK_CURSOR();

}

Delay_ms(200);

minute_al_lb:

if (PORTB.F2 == 0) {

CLEAR_TIMER0();

goto minute_al_lb;

}

while ((delay10s_2 < 5) && (PORTB.F2)) {

Delay_ms(100);

if (PORTB.F3 == 0) minute_al = UP_BUTTON(minute_al);

if (Bcd2Dec(minute_al) == 60) minute_al = Dec2Bcd(0);

if (PORTB.F4 == 0) minute_al = DOWN_BUTTON(minute_al);

if (Bcd2Dec(minute_al) == 101 ) minute_al = Dec2Bcd(59);

Lcd_Cmd(LCD_CURSOR_OFF);

BCD(2,9,minute_al);

BLINK_CURSOR();

}

}

/* Cai dat bao thuc ----------------------------------------------------------*/

void SET_3() {

Lcd_Cmd(Lcd_CLEAR);

Lcd_Cmd(LCD_CURSOR_OFF);

Lcd_Out(1,1,"Cai dat Chuong:");

Delay_ms(200);

Set_3l:

if (PORTB.F2 == 0) goto Set_3l;

Delay_ms(200);

while ((delay10s_2 < 5) && (PORTB.F2)) {

Delay_ms(200);

if ((PORTB.F3 == 0) || (PORTB.F4 == 0)) {

if (type_al == 0) type_al = 1;

else type_al =0;

CLEAR_TIMER0();

}

if (type_al == 0) Lcd_Out(2, 1,"Khong");

if (type_al == 1) Lcd_Out(2, 1,"Co ");

}

if (type_al == 1) TIME_ALARM();

}

/* Xu ly nut bam Set ---------------------------------------------------------*/

void SET_BUTTON() {

INTCON.INTE = 0; // OFF ngat ngoai

PORTE = 0x04; // Bat LED 3

INTCON.T0IE = 1; // Kich hoat Timer0 dem thoi gian tre man hinh 30s

SET_1();

SET_2();

SET_3();

PORTE = 0x00; // OFF LED 3

Lcd_Cmd(Lcd_CLEAR); // Xoa man hinh

Lcd_Cmd(Lcd_CURSOR_OFF); // OFF con tro man hinh

CLEAR_TIMER0(); // Xoa bo dem thoi gian tre man hinh

SET_DATA(); // Cap nhat du lieu

}

/* Nhay bao chuong -----------------------------------------------------------*/

void BLINK_ALARM() {

INTCON.INTE = 0; // OFF ngat ngoai

PORTE = 0x00;

Lcd_Cmd(Lcd_CLEAR);

Lcd_Cmd(Lcd_CURSOR_OFF);

Lcd_Out(1,1,"Bay gio la ");

BCD(1,12,hour_al);

Lcd_Out(1,14,":");

BCD(1,15,minute_al);

LCD_Out(2,1,day_txt);

BCD(2,7,date);

LCD_Chr_Cp('/');

BCD(2,10,month);

LCD_Out_Cp("/20");

BCD(2,15,year);

while ((count_al < 100) && (PORTB.F1 == 1) && (PORTB.F2 == 1) && (PORTB.F3 == 1) && (PORTB.F4 == 1)) {

Delay_ms(200);

PORTE = ~PORTE;

count_al++;

}

Lcd_Cmd(Lcd_CLEAR);

PORTE = 0x00;

}

/* Quet phim -----------------------------------------------------------------*/

void CYCLE_BUTTON() {

while(1) {

INTCON.T0IE = 0;

INTCON.INTE = 1;

if (flag_time == 1) {

UPDATE_TIME();

flag_time = 0;

}

Delay_ms(200);

if (PORTB.F1 == 0) MODE_BUTTON();

if (PORTB.F2 == 0) SET_BUTTON();

if ((hour == hour_al) && (minute == minute_al) && (second == 0x00)) BLINK_ALARM();

count_al = 0;

}

}

/* XU LY NGAT *****************************************************************/

void interrupt() {

if (INTCON.T0IF) {

delay10s_1++;

if (delay10s_1 == 200) {

delay10s_2++;

delay10s_1 = 0;

}

INTCON.T0IF = 0;

}

if (INTCON.INTF) {

flag_time = 1;

INTCON.INTF = 0; // Xoa co ngat ngoai

}

}

/* CHUONG TRINH CHINH *********************************************************/

void MAIN() {

INIT_MAIN();

CYCLE_BUTTON();

}

/* KET THUC *******************************************************************/

Hm nay ta tip tc vo mc chnh ca bi ton l lm vic vi con IC thi gian thc ds1307. Trc khi tip tc ta phi tm hiu qua v con IC ny. ds1307 dng mt thch anh 32.768kHz to dao ng tnh thi gian, 1 pin V nuii khi mt ngun nui ngoi. 1307 c tt c 64 thanh ghi c a ch t 00h n 3FH. 7 thanh ghi u tin cha d liu v giy, pht, gi, th, nga, thng, nm doi dng m ha BCD. thanh ghi th 8 l thanh ghi iu khin. 56 thanh ghi cn li l b nh RAM. ds1307 giao tip vi th gii bn ngoi bng kiu giao tip ni tip I2C. I2C dng 2 ng truyn SCL v SDA. Ngoi ra ds1307 c chn SQW/OUT pht ra cc xung c tn s 1Hz, 4.096kHz, 8.192kHz, 32.768 kHz. Ta s s dng tn s 1Hz c sau 1 s th vi iu khin phi cp nht thng tin li mt ln v hin th ln mn hnh. V vy ta ni chn ny ca ds1307 vo chn ngt ngoi INT ca PIC16F877A. Vic hiu th no l I2C cc bn sang lung giao tip I2C c, nu khng hiu cng chng sao, vi trnh dch MikroC ny th cc bn c vic vit theo mu sn c l ok. Tt nhin chng ta thng c tham vng phi hiu ci g n phi tn gc r, nhng cng nn bit rng sc ngi c hn khng th cho c th gii vo ci u nh b ca mnh c nn nhng g m thng khc n chun ha, mddun ha ri th c vic dng ng ln tn xem c ch hot ng ca n th no lm g cho mt cng. Ci sau i, i khi bn lm xong ri quay li c nhng ci trc kia cha hiu li thy hiu nhanh hn. Th nn cc bn c theo di chng trnh nu c ch no ko hiu phi pht biu nh.

Ban u, ds1307 cha c gi tr no c trong cc thanh ghi. V vy, vic u tin l phi np mt gi tr bt k cho cc thanh ghi. Chng trnh sau s thc hin cng vic ny. Sau ny , bn c th dng 4 nt bm hiu chnh li thi gian cho ng vi thc t.

Code:

void INIT_MAIN() {

// Khoi tao truyen thong I2C

I2C_Init(100000); // Kch hot mddun truyn thng i2c vi tc baud l 100kHz// Khoi tao DS1307

I2C_Start(); // iu kin start I2C_Wr(0xD0); // truyn a ch ca ds1307 v chn ghi d liu ln ds1307 I2C_Wr(0x00); // Truyn a ch nh u tin ca ds1307 I2C_Wr(0x13); // Khoi tao gia tri ban dau cho thanh ghi giy

I2C_Wr(0x03); // Khoi tao gia tri ban dau cho thanh ghi pht

I2C_Wr(0x02); // Khoi tao gia tri ban dau cho thanh ghi gi I2C_Wr(0x03); // Khoi tao gia tri ban dau cho thanh ghi th I2C_Wr(0x05); // Khoi tao gia tri ban dau cho thanh ghi ngy

I2C_Wr(0x03); // Khoi tao gia tri ban dau cho thanh ghi thng

I2C_Wr(0x03); // Khoi tao gia tri ban dau cho thanh ghi nm I2C_Wr(0x90); // t cu hnh cho thanh ghi iu khin, s dng xung 1Hz. I2C_Stop(); // iu kin stop}

Chng trnh chnh

Code:

void MAIN() {

INIT_MAIN();

}

vy l t by gi con ds1307 bt u hot ng v t cp nht d liu v thi gian. ch khi no ht pin n mi ngng hot ng. Tip theo ta vit mt chng trnh c d liu t ds1307 ri xut ra mn hnh LCD. C 1s th d liu c cp nht mt ln v gi ra mn hnh LCD. Chng trnh s nh sau:

Code:

/* KHAI BAO BIEN */

unsigned short second, minute, hour, day, date, month, year, flag_time;

char *day_txt;

/* KHOI TAO */

void INIT_MAIN() {

// Khoi tao cong A

PORTA = 0;

TRISA = 0xFF;

// Khoi tao cong B

PORTB = 0;

TRISB = 0xFF;

// Khoi tao cong D

PORTD = 0;

TRISD = 0;

// Khoi tao cong E

PORTE = 0;

TRISE = 0;

ADCON1 = 0xE;

// Khoi tao LCD

Lcd_Config(&PORTD,4,7,6,3,2,1,0);

Lcd_Cmd(Lcd_CLEAR);

Lcd_Cmd(Lcd_CURSOR_OFF);

// Khoi tao truyen thong I2C

I2C_Init(100000);

// Khoi tao ngat ngoai

INTCON = 0x90; // Mo ngat toan cuc, mo ngat ngoai, xoa co ngat ngoai, OPTION_REG = 0x87; // Chon suon len cho ngat ngoai

}

/* DOC DU LIEU RTC TU DS1307 */

void READ_RTC() {

I2C_Start();

I2C_Wr(0xD0);

I2C_Wr(0x00);

I2C_Repeated_Start();

I2C_Wr(0xD1);

second = I2C_Rd(1u);

minute = I2C_Rd(1u);

hour = I2C_Rd(1u);

day = I2C_Rd(1u);

date = I2C_Rd(1u);

month = I2C_Rd(1u);

year = I2C_Rd(1u);

I2C_Stop();

}

/* XU LY DU LIEU RTC */

void TRANSFORM_RTC() {

switch (day) {

case 1: day_txt = "ERO"; break;

case 2: day_txt = "T.2"; break;

case 3: day_txt = "T.3"; break;

case 4: day_txt = "T.4"; break;

case 5: day_txt = "T.5"; break;

case 6: day_txt = "T.6"; break;

case 7: day_txt = "T.7"; break;

case 8: day_txt = "C.N"; break;

}

}

/* HIEN THI LCD */

void BCD(unsigned short x, unsigned short y,unsigned short var) {

unsigned short var1, var2;

var1 = (var >> 4) + 0x30;

LCD_Chr(x,y,var1);

var2 = (var & 0x0F) + 0x30;

LCD_Chr_Cp(var2);

}

void LCD_DISPLAY() {

LCD_Out(1,1,day_txt);

BCD(1,5,date);

LCD_Chr_Cp('/');

BCD(1,8,month);

LCD_Out_Cp("/20");

BCD(1,13,year);

BCD(2,1,hour);

LCD_Chr_Cp(':');

BCD(2,4,minute);

LCD_Chr_Cp(':');

BCD(2,7,second);

LCD_Out(2,10,"T=");

BCD(2,12,temp);

LCD_Chr_Cp(223);

LCD_Chr_Cp('C');

}

void DISPLAY_TIME() {

READ_RTC();

TRANSFORM_RTC();

LCD_DISPLAY();

PORTE.F0 = ~PORTE.F0;

}

/* XU LY NGAT */

void interrupt() {

flag_time = 1;

INTCON.INTF = 0; // Xoa co ngat ngoai

}

/* CHUONG TRINH CHINH */

void MAIN() {

INIT_MAIN();

while(1) {

INTCON.INTE = 1;

if (flag_time == 1) {

DISPLAY_TIME();

flag_time = 0;

}

}

}

Ngt trong MikroC

Mnh mi hc PIC, cng mi tm hiu v CCS, ri MikroC. Mnh thy MikroC cng d p dng, phn Help ca n vit d hiu.Mnh ngh cn phn bit s khc nhau gia 2 trnh dch ny cho d hc, d nh, trnh nhm ln gia 2 trnh dch:1. V NGT: (Phn ny MikroC c v km hn CCS)- CCS cho php lp ring tng hm ngt, n t nhn bit ngt no xy ra, t ng thc thi hm ngt tng ng, ng thi t ng xo c ngt.- MikroC ch cho lp mt hm ngt chung, trong ta phi t kim tra xem ngt no xy ra x l cho ph hp, v phi lo xo c ngt (mnh ngh nhng vic ny khng kh khn g, c ci n st vi phn cng - PIC ch c 1 vc t ngt, cng tt vy).

Trao i "lch vn nin":

Phn o nhit dng ADC 10 bt (MikroC ch c lnh c ADC 10 bt), x l hin th d liu bng 8 bt -> kt qu khng ng (thay v bin thin t 0 - 1023, kt qu ch bin thin t 0-255, lp li 4 ln) ?Khng bit x l th no y, nh cc huynh ch gip !--------------------------------------12/4/2008: H h ! vn kiu d liu: dng cc kiu 1 byte cha gi tr ADC 10 bit l khng n.C th, phn o nhit ca "lch vn nin" lp hm nh sau l n:NHIETDO() {char degree[7];int temp1, temp2; temp1 = Adc_Read(0); //Doc nhiet do tu cong ADC, 10 bittemp2 = (temp1 - 558)/2; //Doi ra do CIntToStr(temp2, degree); //Chuyen sang stringLCD_Out_CP(degree); //Hien thi LCD}