Giới thiệu
Trong bài viết này mình sẽ hướng dẫn các bạn làm một dự án nho nhỏ hiển thị thời gian thực lên LCD sử dụng ic DS1307 và vi xử lí 8051 .việc thay đổi thời gian các bạn sẽ thực hiện thông qua việc giao tiếp với máy tính.Nội dung này nhằm mục đích giúp cho các bạn hiểu sâu hơn vì giao tiếp truyền thông UART.
Code chương trình
ở đây mình sử dụng sẵn thư viện DS1307 và LCD mà mình đã tạo trước .các bạn muốn chỉnh sửa chỉ cần dùng các hàm mình đã viết sẵn để code lại cho phù hợp với nội dung mình thích
code chương trình :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
#include"main.h" //goi ham main.h//
#include"lcd8.h" //thu vien lcd//
#include"..\lib\Rtc_Ds1307.h" //thu vien ds1307//
#include"..\lib\Soft_I2C.h" //thu vien khoi tao ds1307//
#include"..\lib\delay.h" //thu vien delay//
unsigned char * code Day[] = {"SUN","MON","TUE","WED","THU","FRI","SAT"}; //mang hien thi thu//
bit ch;
unsigned char gio,phut,giay,mode,thu,ngay,thang,nam,giayold; //bien hien thi lcd
unsigned char gio1,phut1,giay1,mode1,thu1,ngay1,thang1,nam1; //bien truyen Uart//
//**************************************************//
void Com_Init()
{
EA=0;
/* Dung timer1 de tao toc do baud=9600 */
TR1 = 0; /* stop timer 1 */
ET1 = 0; /* disable timer 1 interrupt */
PCON = 0x00; /* SMOD=0 serial baudrate not doubled */
TMOD &= ~0xf0; /* clear timer 1 mode bits */
TMOD |= 0x20; /* put timer 1 into MODE 2 - 8 bit auto-reload*/
TH1=0xFD; /* baud rate= 9600 */
TL1 = TH1; /* TL se load data tu TH */
SM0 = 0;
SM1 = 1; /* serial port MODE 1 - 8bit UART*/
SM2 = 0; // Khong kich hoat RI neu nhu khong thay stop bit
REN = 1; /* enable serial receiver */ //cho phep nhan du lieu//
TI = 0; /* clear transmit interrupt */
RI = 0; /* clear receiver interrupt */
ES = 1; /* enable serial interrupts */
PS = 0; /* set serial interrupts to low priority */
TR1 = 1; /* start timer 1 */
EA=1;
}
//***************************************************************//
void Hien_Thi_Lcd() //ham hien thi Lcd//
{
Ds1307_Read_Time(&gio,&phut,&giay,&mode); //hien thi gio/phut/giay
if(giayold!=giay)
{
giayold=giay; //chong rung Lcd
GoToXY(2,0); //ham con tro//
lcd_text("Time:"); //ham in text//
GoToXY(2,6); //dua con tro toi dong 2 o 7
WriteNum(gio/10);
WriteNum(gio%10);
lcd_text(":");
WriteNum(phut/10);
WriteNum(phut%10);
lcd_text(":");
WriteNum(giay/10);
WriteNum(giay%10);
//***************************//
Ds1307_Read_Date(&thu,&ngay,&thang,&nam); //hien thi thu/ngay/thang/nam
GoToXY(1,0);
lcd_text(Day[thu-1]);
GoToXY(1,4);
WriteNum(ngay/10);
WriteNum(ngay%10);
lcd_text("/");
WriteNum(thang/10);
WriteNum(thang%10);
lcd_text("/");
WriteNum(nam/10);
WriteNum(nam%10);
}
}
//*******************************************//
void main()
{
Com_Init(); //khoi tao ngat uart
Ds1307_Init();
SetupLcd();
Soft_I2c_Init();
while(1)
{
if(ch==1) //kiem tra xem gui xong chua
{
Ds1307_Write_Date(thu1,ngay1,thang1,nam1); /*khi nhan du lieu thi ghi lai ds1307*/
Ds1307_Write_Time(gio1,phut1,giay1,mode1);
ch=0; //xoa trang thai gui uart
}
else
{
Hien_Thi_Lcd(); //ham hien thi LCD
}
}
}
/******************************************/
unsigned char i;
void Uart_Send()//ham nhan du lieu
{
switch(i) //chuong trinh phuc vu nhan du lieu
{
case 1: {gio1=SBUF;break;} //nhan gio
case 2: {phut1=SBUF;break;} //nhan phut
case 3: {giay1=SBUF;break;} //nhan giay
case 4: {mode1=SBUF;break;} //nhan mode 12h hay 24h
case 5: {thu1=SBUF;break;} //nhan thu
case 6: {ngay1=SBUF;break;} //nhan ngay
case 7: {thang1=SBUF;break;} //nahn thnag
case 8:
{
nam1=SBUF;//truyen du lieu vao thanh ghi SBUF
ch=1; //da gui xong
i=0; //xoa bien dem
break;
}
}
}
/***************************************************/
void Comm_int(void) interrupt 4 using 2 //ngat uart
{
if (RI == 1) //Ngat nhan
{
RI = 0; //da nhan xong xoa ve khong chuan bi nhan du lieu tiep theo
i++;
}
Uart_Send();
}
|
No comments:
Post a Comment