BÁO CÁO TÌM HIỂU TIMER
I/ SƠ ĐỒ KẾT NỐI
II/GIẢI THÍCH CODE
[Link] ĐỒNG HỒ
#include<reg51.h>
#include"lcd.h"
sbit K1=P3^0;//CHUYEN
sbit K2=P3^1;//TANG
sbit K3=P3^2;//dung va chay
sbit K4=P3^3;
unsigned char Time;
void Delay1ms(unsigned int c);
void TimerConfiguration();
void Int0Configuration();
unsigned char SetPlace;
void main(void)
unsigned char hour,minit,second;
unsigned int i;
TimerConfiguration();
Int0Configuration();
LcdInit();
hour=12;
LcdWriteData('0'+hour/10); //lay hour chia cho 10 lay nguyen roi cong voi 0 là ki tu so 48
LcdWriteData('0'+hour%10); //lay hour chia cho 10 lay phan du roi cong voi 0
LcdWriteData('-');
LcdWriteData('0'+minit/10);
LcdWriteData('0'+minit%10);
LcdWriteData('-');
LcdWriteData('0'+second/10);
LcdWriteData('0'+second%10);
while(1)
if(TR0==0)
if(K1==0) //K1 duoc nhan
Delay1ms(10); //delay 10ms
if(K1==0) // ktra lai K1 xem dc nhan hay k neu dc nhan thì thuc hien
cac cau lenh ben trong
{
SetPlace++;
if(SetPlace>=3)
SetPlace=0;
while((i<50)&&(K1==0)) //lap lai 50 lan va k1 dc nhan
Delay1ms(1);
i++;
i=0;
if(K2==0) //k2 dc nhan
Delay1ms(10); //delay 10ms
if(K2==0) //ktra lai K2 xem dc nhan hay k neu dc nhan thì thuc hien cac
cau lenh ben trong
if(SetPlace==0)//neu setpalce la 0 thi tang gia tri second
second++;
if(second>=60)
second=0;
else if(SetPlace==1)//neu setplace la 1 thì tang gia tri minit
minit++;
if(minit>=60)
minit=0;
else
hour++; // neu k phai 0 hay 1 thi tang gia tri hour
if(hour>=24)
hour=0;
while((i<50)&&(K2==0)) // lap lai 50 lan va k2 dc nhan
Delay1ms(1);
i++;
i=0;
if(Time>=20) //dem tran thuong la 50ms*20
Time=0; //dat lai gia tri time
second++;
if(second==60)// neu second = 60 thi tang minit them ,neu minit=60 thi tang
hour them 1,neu hour = 24 thi dat lai =0
second=0;
minit++;
if(minit==60)
{
minit=0;
hour++;
if(hour==24)
hour=0;
//gui len lcd
LcdWriteCom(0x80);
LcdWriteData('0'+hour/10);
LcdWriteData('0'+hour%10);
LcdWriteCom(0x83);
LcdWriteData('0'+minit/10);
LcdWriteData('0'+minit%10);
LcdWriteCom(0x86);
LcdWriteData('0'+second/10);
LcdWriteData('0'+second%10);
void Delay1ms(unsigned int c) //ham delay
unsigned char a,b;
for (; c>0; c--)
{
for(b=199;b>0;b--)
for(a=1;a>0;a--);
void TimerConfiguration()// cau hinh timer 0 hoat dong o che do 1
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0x0B0;
EA = 1;
ET0 = 1;
TR0 = 1;
void Timer0() interrupt 1
TH0 = 0x3C; //dat lai bit cao
TL0 = 0x0B0;//dat lai bi thap
Time++;//dem so lan tran
void Int0Configuration()
{
IT0=1;
EX0=1;
EA=1;
void Int0() interrupt 0
Delay1ms(10);
if(K3==0)
TR0=~TR0; // khi k3 dc nhan dao trang thai chay va dung
SetPlace=0;
[Link] ĐƠN
#include<reg51.h>
#include<intrins.h>
#define GPIO_LED P2//gan led vao chan p2
void TimerConfiguration();
unsigned char Time;
void main(void)
Time=0; //dat gia tri ban dau cho time
GPIO_LED=0XFE; //da
TimerConfiguration();
while(1)
if(Time==10)
GPIO_LED=_crol_(GPIO_LED,1);//dich tu cao xuong thap sang trai 1 don vi moi
khi time=10
Time=0; //dat lai gia tri time
void TimerConfiguration()
TMOD = 0x01; //Ñ¡Ôñ¹¤×÷·½Ê½1
TH0 = 0x3C; //ÉèÖóõʼֵ,¶¨Ê±50MS
TL0 = 0xB0;
EA = 1; //´ò¿ª×ÜÖжÏ
ET0 = 1; //´ò¿ª¶¨Ê±Æ÷0ÖжÏ
TR0 = 1; //Æô¶¯¶¨Ê±Æ÷0
void Timer0() interrupt 1
TH0 = 0x3C; //ÉèÖóõʼֵ
TL0 = 0xB0;
Time++;
}
[Link] 1602
#include"lcd.h"
void Lcd1602_Delay1ms(uint c) //DELAY 10ms
uchar a,b;
for (; c>0; c--)
for (b=199;b>0;b--)
for(a=1;a>0;a--);
#ifndef LCD1602_4PINS //kiem tra xem dc dinh nghia hay khong neu chua thì thuc hien bên duoi
void LcdWriteCom(uchar com) //gui lenh den man lcd1602
LCD1602_E = 0; //Tat chân kích hoat (Enable)
LCD1602_RS = 0; //Chon che do ghi lenh.
LCD1602_RW = 0; //Chon che do ghi (không doc).
LCD1602_DATAPINS = com; //Gui byte lenh den chân du lieu cua màn hình.
Lcd1602_Delay1ms(1); //delay1ms
LCD1602_E = 1; //Bat chân kích hoat de day du lieu vào màn hình
Lcd1602_Delay1ms(5); //delay5ms
#else
void LcdWriteCom(uchar com) //дÈëÃüÁî
LCD1602_E = 0; //Tat chân kích hoat (Enable), làm cho màn hình LCD không san sàng de nhan
du lieu.
LCD1602_RS = 0; //Chon che do gui lenh (dt chân RS ve 0).
LCD1602_RW = 0; //Chon che do ghi (dat chân RW ve 0)
LCD1602_DATAPINS = com; // Ghi du lieu vào chân du lieu cua màn hình,su dung 4 chân du
lieu (4 bits) cua màn hình LCD1602
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //Bat chân kích hoat de day lenh vào màn hình.
Lcd1602_Delay1ms(5);
LCD1602_E = 0; //tat chan kich hoat(eneble)
Lcd1602_Delay1ms(1);
LCD1602_DATAPINS = com << 4; //Gui 4 bitt cao cua byte lenh bang cách chuyen "com" sang trái
4 bitt.
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //дÈëʱÐò
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
#endif
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat) //dinh nghia ham co tham so dau vao la "dat"
{
LCD1602_E = 0
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
#else
void LcdWriteData(uchar dat)
LCD1602_E = 0;
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4;
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
#endif
#ifndef LCD1602_4PINS
void LcdInit()
LcdWriteCom(0x38); // Thiet lap chuc nang: che do 8-bitt, 2 dòng, 5x8 cham
LcdWriteCom(0x0c); //Ðieu khien bat/tet hien thi: Bat hien thi, Tat con tro, Tat nhap nháy
LcdWriteCom(0x06); //Thiet lap che do nhap: Tang vi trí con tro, Không dich hien thi
LcdWriteCom(0x01); //Xóa hien thi
LcdWriteCom(0x80); //Thiet lap dia chi DDRAM toi 0x80 (dòng dau tiên)
#else
void LcdInit()
LcdWriteCom(0x32); //Thiet lap chuc nang: che do 4-bitt, 2 dòng, 5x8 cham
LcdWriteCom(0x28); //Thiet lap chuc nang: che do 4-bitt, 2 dòng, 5x8 cham¯
LcdWriteCom(0x0c); //Ðieu khien bat/tet hien thi: Bat hien thi, Tat con tro, Tat nhap nháy
LcdWriteCom(0x06); //Thiet lap che do nhap: Tang vi trí con tro, Không dich hien thi
LcdWriteCom(0x01); //Xóa hien thi
LcdWriteCom(0x80); //Thiet lap dia chi DDRAM toi 0x80 (dòng dau tiên)
#endif