Dientuchiase chia sẻ code và mạch đồng hồ Giờ - Phút - Nhiệt độ 2 IN 1, nhiều bạn hỏi để làm..Nên Post lên các bạn xem nhé..
Code mã nguồn C:
#include <REGX52.H>
#include <MATH.H>
//Dinh nghia cac chan phim dieu chinh
#define Mode_Menu P3_2 //phim Mode de chon doi tuong dieu chinh
#define Mode_Up P3_1 //phim Up de tang doi tuong
#define Mode_Down P3_3 //phim Down de giam doi tuong
//dinh nghia cac chan dieu khien Anode Led
#define Led_ampm_Sang P1_0=0; //Led chi thi am_pm, sang la pm.
#define Led_ampm_Tat P1_0=1;
#define GioHangChuc_Sang P1_1=0;
#define GioHangDonVi_Sang P1_2=0;
#define PhutHangChuc_Sang P1_4=0;
#define PhutHangDonVi_Sang P1_3=0;
#define Led_C_Sang P1_5=0; //Led phan cach gio va phut
#define Led_C_Tat P1_5=1;
#define OffLed P1=0xFF;
#define DQ P0_0
#define SCL P0_6
#define SDA P0_5
//dinh nghia cac chan dieu khien 7 doan
#define CLK P2_0
#define STR P2_1
#define SDI P2_2
//dinh nghia dia chi cac thanh ghi trong DS1307
#define SEC 0x00
#define MIN 0x01
#define HOUR 0x02
//cac ham dung cho DS1307
void I2C_Start(); //khoi dong cho DS1307
void I2C_stop();
unsigned char I2C_write(unsigned char dat); //ham ghi 1 byte du kieu vao DS1307
unsigned char I2C_read(); //ham doc 1 byte du kieu vao DS1307
unsigned char DS1307_read(unsigned char addr); //ham doc du lieu tu 1 thanh ghi bat ky
void DS1307_write(unsigned char addr,unsigned char dat); //ham ghi du lieu tu 1 thanh ghi bat ky
void Init_DS1307();
void Write_DS1307(); //ham cai dat thoi gian vao DS1307
void Read_DS1307(); //ham doc thoi gian vao DS1307
void Convert_Number(); //ham chuyen doi tach so de hien thi tren led 7 thanh
void GHI_7DOAN(unsigned char addr);
void Display_Gio_Phut_Giay(); //ham hien thi gio phut giay tren led 7 thanh
void Display_Gio();
void Display_Phut();
void Display_Temp();
void ScanKey(); //ham quet phim nhan
//khai bao bien //0 1 2 3 4 5 6 7 8 9 temp C
unsigned char Display_Number[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x1C,0x46};//khai bao mang chua cac gia tri gom 10 phan tu
unsigned char SoGioHangChuc,SoGioHangDonVi,SoPhutHangChuc,SoPhutHangDonVi,SoGiayHangChuc,SoGiayHangDonVi;
unsigned int dem_timer,Millisec,Millisec1; //bien dem ms
unsigned char sec,hour,min,min_temp,hour_temp; //cac bien dem gio phut giay....
char sec2,count;
unsigned int Nhiet_Do,NhietDoHangChuc,NhietDoHangDonVi;
unsigned char kt_sec; //bien kiem tra xem RTC co hoat dong khong
unsigned char kt_sec2;
unsigned char ampm,Mode,Chop_Tat,Chop_Tat1; //bien vao cac che do chinh thoi gian
static bit presence;
//cac ham khai bao
void delay_us(unsigned int Time)
{
unsigned int i,j;
for(i=0;i<Time;i++)
for(j=0;j<2;j++);
}
void delay_ms(unsigned int ms) //ham delay
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<121;j++);
}
bit DS18B20_Init()
{
DQ = 1 ;
Display_Temp();
//delay_us(8);
DQ = 0 ;
Display_Temp();
//delay_us(90) ;
DQ = 1 ;
Display_Temp();
//delay_us(8) ;
presence = DQ ;
Display_Temp();
Display_Temp();
//delay_us(100) ;
DQ = 1 ;
return(presence) ;
}
//-------------------------------------------------
// Ham doc 1 byte tu DS18b20 ra ngoai
//-------------------------------------------------
unsigned char ds18b20_readbyte(void)
{
unsigned char i = 0 ;
unsigned char Data = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
Data >>= 1 ;
DQ = 1 ;
if(DQ)
Data |= 0x80 ;
Display_Temp();
//delay_us(4) ;
}
return (Data) ;
}
//-------------------------------------------------
// Ham viet 1 byte vao DS18b20
//-------------------------------------------------
void ds18b20_writebyte(unsigned char Data)
{
unsigned char i = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
DQ = Data&0x01 ;
//Display_Temp();
delay_us(5) ;
DQ = 1 ;
Data>>=1 ;
}
}
//-------------------------------------------------
// Ham chuyen doi va tra ve gia tri nhiet do do duoc
//-------------------------------------------------
float ds18b20_readtemp(void)
{
float temp;
unsigned char a,b;
DS18B20_Init(); // Khoi tao DS18b20
ds18b20_writebyte(0xCC) ; // Cho phep VDK truy cap thang den cac lenh bo nho cua DS18b20
ds18b20_writebyte(0x44) ; // Khoi dong qua trinh do va chuyen doi nhiet do ra so nhi phan
Display_Temp();
DS18B20_Init() ;
ds18b20_writebyte(0xCC) ;
ds18b20_writebyte(0xBE) ; // Cho phep doc du lieu tu bo nho DS18b20 ra ngoai
Display_Temp();
a = ds18b20_readbyte();
temp=((float)(a&0x0f))/16; // Lay phan thuc cua gia tri nhiet do
b = ds18b20_readbyte();
a =((a&0xf0)>>4)|((b&0x0f)<<4) ; // Lay phan nguyen cua gia tri nhiet do
temp=temp+a;
return temp; // Tra ve gia tri nhiet do
}
void timer0_ISR(void) interrupt 1 // ham ngat timer 0 :1ms
{
TF0 = 0;//xoa co tran
TH0 =0x00; // nap du lieu vao thanh ghi timer
TL0 =0x00;
TR0=1;
Millisec++;
if(Millisec==160)Millisec=0;
if (Millisec<100)
Chop_Tat=0;
else Chop_Tat=1;
}
void timer1_ISR(void) interrupt 3 // ham ngat timer 1 :1ms
{
dem_timer++;
if(dem_timer>=100)
{dem_timer=0;
Nhiet_Do=ds18b20_readtemp();}
TR1 = 0;
TH1 = 0xc3; // 50ms
TL1 = 0x50;
TR1 = 1;
}
//chuong trinh chinh
void main(void)
{
//khoi tao cho bo dem timer
TCON = 0x11; // che do 16 bit tu nap lai
TH0=0x00;
TL0=0x00; //nap gia tri dem cho thanh ghi timer 0
TH1 = 0xc3; // 50ms
TL1 = 0x50;
ET0 = 1; // Enable Timer 0 Interrupts
TR0 = 1; // Start Timer 0 Running
EA=1; //cho phep ngat
count=0;
sec=DS1307_read(0);
if(sec&0x80==1) //kiem tra bit CH
{DS1307_write(0,sec&0x7f); }
while (1)
{
if(Mode==3)
{//Nhiet_Do=ds18b20_readtemp();
ET1 = 1; // Enable Timer 1 Interrupts
TR1 = 1; // Start Timer 1 Running
NhietDoHangChuc=Nhiet_Do/10;
NhietDoHangDonVi=Nhiet_Do%10;
EA=0;
Display_Temp();
EA=1;}
else
{ET1 = 0;
TR1 = 0;
Read_DS1307();}
ScanKey();
}
}
//******************************************************************************
// CAC CHUONG TRINH CON CHO I2C
//******************************************************************************
void I2C_start() //ham khoi dong I2C
{
SCL = 1;
SCL = 0;
SDA = 1;
SCL = 1;
SDA = 0;
SCL = 0;
}
void I2C_stop()
{
SCL = 1; //keo chan SCL len 1
SCL = 0;
SDA = 0;
SCL = 1;
SDA = 1;
}
unsigned char I2C_write(unsigned char dat)//ham ghi 1 byte du lieu vao DS1307
{
unsigned char i;
for (i=0;i<8;i++)
{
SDA = (dat & 0x80); ///? 1:0;
SCL=1;SCL=0;
dat<<=1;
}
SCL = 1;
SCL = 0;
return dat;
}
unsigned char I2C_read(void)
{
bit rd_bit;
unsigned char i, dat;
dat = 0x00;
for(i=0;i<8;i++) /* For loop read data 1 byte */
{
SCL = 1;
rd_bit = SDA; /* Keep for check acknowledge */
dat = dat<<1;
dat = dat | rd_bit; /* Keep bit data in dat */
SCL = 0; /* Clear SCL */
}
return dat;
}
// CAC CHUONG TRINH CON CHO DS1307
//******************************************************************************
unsigned char DS1307_read(unsigned char addr)
{
unsigned int temp,ret;
I2C_start(); /* Start i2c bus */
I2C_write(0xD0); /* Connect to DS1307 */
I2C_write(addr); /* Request RAM address on DS1307 */
I2C_start(); /* Start i2c bus */
I2C_write(0XD1); /* Connect to DS1307 for Read */
ret = I2C_read(); /* Receive data */
I2C_stop();
//**********************************************************
temp = ret; /*BCD to HEX*/
ret = (((ret/16)*10)+ (temp & 0x0f)); /*for Led 7seg*/
//**********************************************************
return ret;
}
void DS1307_write(unsigned char addr,unsigned char dat)
{
unsigned int temp;
//**********************************************
temp = dat ; /*HEX to BCD*/
dat = (((dat/10)*16)|(temp %10)); /*for Led 7seg*/
//**********************************************
I2C_start(); /* Start i2c bus */
I2C_write(0XD0); /* Connect to DS1307 */
I2C_write(addr); /* Request RAM address on DS1307 */
I2C_write(dat); /* Connect to DS1307 for Read */
I2C_stop();
}
void Init_DS1307()
{
sec = 8; //doc giay tu DS1307
min = 5; //doc phut tu DS1307
//hour = 7; //doc gio tu DS1307
}
void Read_DS1307()
{
sec = DS1307_read(SEC); //doc giay tu DS1307
min = DS1307_read(MIN); //doc phut tu DS1307
hour = DS1307_read(HOUR); //doc gio tu DS1307
}
void Write_DS1307()
{
DS1307_write(SEC,sec); //ghi du lieu vao thanh ghi giay
DS1307_write(MIN,min); //ghi du lieu vao thanh ghi phut
DS1307_write(HOUR,hour); //ghi du lieu vao thanh ghi gio
}
//ham quet led hien thi gio phut giay
void Display_Gio_Phut_Giay()
{
switch (Mode)
{
case 0:
{Display_Gio();
Display_Phut();
break;}
case 1:
{if (Chop_Tat==0)Display_Gio();
Display_Phut();
break;}
case 2:
{Display_Gio();
if (Chop_Tat==0)Display_Phut();
break;}
}
OffLed;
if (ampm==1)Led_ampm_Sang
else Led_ampm_Tat;
delay_ms(1);
OffLed;
if (Chop_Tat==0)Led_C_Sang;
delay_ms(1);
}
void Display_Gio()
{
unsigned int Data;
if (SoGioHangChuc!=0)
{OffLed;
Data=Display_Number[SoGioHangChuc];
GHI_7DOAN(Data);
GioHangChuc_Sang;
delay_ms(1);}
OffLed;
Data=Display_Number[SoGioHangDonVi];
GHI_7DOAN(Data);
GioHangDonVi_Sang;
delay_ms(1);
}
void Display_Phut()
{
unsigned int Data;
OffLed;
Data=Display_Number[SoPhutHangChuc];
GHI_7DOAN(Data);
PhutHangChuc_Sang;
delay_ms(1);
OffLed;
Data=Display_Number[SoPhutHangDonVi];
GHI_7DOAN(Data);
PhutHangDonVi_Sang;
delay_ms(1);
}
void Display_Temp()
{
unsigned int Data;
if (NhietDoHangChuc!=0)
{OffLed;
Data=Display_Number[NhietDoHangChuc];
GHI_7DOAN(Data);
GioHangChuc_Sang;
delay_ms(1);}
OffLed;
Data=Display_Number[NhietDoHangDonVi];
GHI_7DOAN(Data);
GioHangDonVi_Sang;
delay_ms(1);
OffLed;
Data=Display_Number[10];
GHI_7DOAN(Data);
PhutHangChuc_Sang;
delay_ms(1);
OffLed;
Data=Display_Number[11];
GHI_7DOAN(Data);
PhutHangDonVi_Sang;
delay_ms(1);
}
void Convert_Number()
{
if (hour>12)
{hour_temp=hour-12;
ampm=1;}
if(hour==0)
{hour_temp=12;
ampm=1;}
if ((hour>=1)&(hour<=12))
{hour_temp=hour;
ampm=0;}
SoGiayHangChuc=sec/10;
SoGiayHangDonVi=sec%10;
SoPhutHangChuc=min/10;
SoPhutHangDonVi=min%10;
SoGioHangChuc=hour_temp/10;
SoGioHangDonVi=hour_temp%10;
}
void GHI_7DOAN(unsigned char addr)
{
unsigned char temp,i;
temp=addr;
for(i=0;i<8;i++)
{
SDI=temp&0x01;
CLK=0;
CLK=1;
temp>>=1;
} // truyen duoc 1 byte
STR=0;
STR=1;
}
void ScanKey() //ham quet phim nhan
{
if(Mode_Menu==0)
{Convert_Number();
Display_Gio_Phut_Giay();
Mode++;
if(Mode==4)Mode=0;//Mode =0 la che do binh thuong, 1 la dieu chinh gio, 2 la dieu chinh phut, 3 la hien thi nhiet do
while(Mode_Menu==0)
{Convert_Number();
Display_Gio_Phut_Giay();}
}
else if(Mode_Up==0)
{
switch (Mode)
{
case 0:
{Convert_Number();
Display_Gio_Phut_Giay();
break;}
case 1:
{Convert_Number();
Display_Gio_Phut_Giay();
hour++;;
if(hour>23)hour=0;
while(Mode_Up==0)
{Convert_Number();
Display_Gio_Phut_Giay();}
DS1307_write(2,hour);
break;}
case 2:
{Convert_Number();
Display_Gio_Phut_Giay();
min++;;
if(min>59)min=0;
while(Mode_Up==0)
{Convert_Number();
Display_Gio_Phut_Giay();}
DS1307_write(1,min);
break;}
}
}
else if(Mode_Down==0)
{
switch (Mode)
{
case 0:
{Convert_Number();
Display_Gio_Phut_Giay();
break;}
case 1:
{Convert_Number();
Display_Gio_Phut_Giay();
hour--;;
if(hour<0)hour=23;
while(Mode_Down==0)
{Convert_Number();
Display_Gio_Phut_Giay();}
DS1307_write(2,hour);
break;}
case 2:
{Convert_Number();
Display_Gio_Phut_Giay();
min--;;
if(min<0)min=59;
while(Mode_Down==0)
{Convert_Number();
Display_Gio_Phut_Giay();}
DS1307_write(1,min);
break;}
}
}
if (Mode!=3)
{Convert_Number();
Display_Gio_Phut_Giay();}
}
( Mạch + Code)
Khi nhấn nút "Tải Về Máy", bạn sẽ vào trang quảng cáo, vui lòng chờ 5 giây. Nút hiện ra ở góc phải phía trên, nhấn vào để đến trang download
ĐIỆN TỬ CHIA SẺ
Phạm Văn Ngọc Anh- 01644326695