hoc pic qua lich van lien
DESCRIPTION
bvb kjggggggg dhjdkugTRANSCRIPT
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}