電腦控制臺(tái)燈(c# hook,顯示室溫,聯(lián)網(wǎng)校正時(shí)間)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
突發(fā)奇想,于是便寫了一個(gè)小程序用于控制臺(tái)燈,這幾天功能也在不斷的完善中,目前基本已經(jīng)完成.下面進(jìn)行功能的簡(jiǎn)述的代碼的分析.
整體設(shè)計(jì)包含下位機(jī)程序和上位機(jī)程序.下位機(jī)用的c語言,上位機(jī)用的c#
整個(gè)系統(tǒng)功能包括:定時(shí)采集室溫在電腦右下角顯示,可聯(lián)網(wǎng)校準(zhǔn)電子時(shí)鐘,可以電腦端快捷鍵控制臺(tái)燈.視頻中展示的順序?yàn)?/p>
1,自動(dòng)獲取溫度,圖標(biāo)動(dòng)態(tài)顯示室溫 2,手動(dòng)獲取溫度 3,按鈕控制臺(tái)燈 4 ,快捷鍵控制臺(tái)燈 5,聯(lián)網(wǎng)校準(zhǔn)電子時(shí)鐘 6最后展示
在任何界面只要按下快捷鍵便可以打開臺(tái)燈(windows hook).
下面進(jìn)行整個(gè)系統(tǒng)代碼和原理的介紹.
下位機(jī),
硬件上 ,包括 51單片機(jī),ds1302,18b20,uln2003,pl2303 .硬件連接圖如下:
下位機(jī)程序分析:
1 /************************************************************************/
2 // 本程序作者 HennSun ,轉(zhuǎn)載請(qǐng)表明出處.
3 //
4 /************************************************************************/
5 #include
6 #include "uart.h"
7 #include "18b20.h"
8 #include "ds1302.h"
9 #define buff_size 5
10 sbit jdq=P1^0;
11 sbit key_led=P3^3;
12 unsigned int num;
13 unsigned char control=0,set_time=0;
14 unsigned char time[buff_size]; //用于設(shè)定時(shí)間
15 extern unsigned int temp;
16 extern unsigned char flag_get;
17
18 /*----------初始化定時(shí)器---------*/
19
20 void init_timer()
21 {
22 TMOD =0x01;//定時(shí)器設(shè)置 T0工作于方式1 16位
23 TH0=0xef;
24 TL0=0xf0;
25 ET0=1; //定時(shí)器 0 中斷允許 .
26 TR0=1; // run the timer0 這個(gè)中斷會(huì)讓單片機(jī)查詢中斷向量表.
27 EA = 1; //打開總中斷
28 }
29
30 //顯示 open 字符
31 void disp_open()
32 {
33 unsigned int i=400;
34 while(i--)
35 {
36 P2=2;
37 P0=0x3f; //'O'
38 delay1(1);
39 P0=0X00;
40
41 P2=3;
42 P0=0x73; //'P'
43 delay1(1);
44 P0=0X00;
45
46 P2=4;
47 P0=0x79; //'E'
48 delay1(1);
49 P0=0X00;
50
51 P2=5;
52 P0=0x37; //'N'
53 delay1(1);
54 P0=0X00;
55 }
56
57 }
58 // 顯示close 字符
59 void disp_close()
60 {
61 unsigned int i=400;
62 while(i--)
63 {
64 P2=2;
65 P0=0x39; //'C'
66 delay1(1);
67 P0=0X00;
68
69 P2=3;
70 P0=0x38; //'L'
71 delay1(1);
72 P0=0X00;
73
74 P2=4;
75 P0=0x3f; //'O'
76 delay1(1);
77 P0=0X00;
78
79 P2=5;
80 P0=0x6d; //'S'
81 delay1(1);
82 P0=0X00;
83
84 P2=6;
85 P0=0x79; //'E'
86 delay1(1);
87 P0=0X00;
88 }
89
90 }
91
92
93 /*----------------------------------------------------------------------------------------
94 這是主函數(shù)部分
95 --------------------------------------------------------------------------------------*/
96 void main()
97 {
98 unsigned int TempH,TempL;
99 unsigned char H, L ;
100 jdq=0;
101 init_timer();
102 init_ds1302();
103 UARTinit();
104
105 while(1)
106 {
107 if(flag_get) //定時(shí)讀取當(dāng)前溫度
108 {
109
110 temp=ReadTemperature(); //這個(gè)函數(shù)8ms
111
112 if(temp&0x8000)
113 {
114 temp=~temp; // 取反加1
115 temp +=1;
116 }
117 TempH=temp>>4;
118 TempL=temp&0x0F;
119 TempL=TempL*6/10;//小數(shù)近似處理
120
121 H=(unsigned char)TempH;
122 L=(unsigned char)TempL;
123 /**/
124 send_char_com('a');
125 send_char_com(H);
126 send_char_com(L);
127 send_char_com('e');
128 flag_get=0;
129
130 } //這個(gè)循環(huán)用11ms
131 if(control)
132 {
133 jdq=~jdq;
134 if(jdq)
135 {
136 send_char_com('o');
137 send_char_com('e');
138 disp_open();
139 }
140 else
141 {
142 send_char_com('c');
143 send_char_com('e');
144 disp_close();
145 }
146 control=0;
147 }
148 if(set_time)
149 {
150 if((time[1]<0x60)||(time[2]<0x60)&&(time[3]<0x24))
151 {
152 set_ds1302(time[1],time[2],time[3]); // s , m ,h
153 //不知為何時(shí)間定時(shí)器自動(dòng)停止. ,數(shù)組越界
154 set_time=0;
155 }
156 }
157 if(!key_led)
158 {
159 control=1;
160 }
161 //添加時(shí)鐘顯示代碼
162 get_ds1302(); //2.23ms
163 } //不進(jìn)第一個(gè)if 時(shí)間為 2ms 進(jìn)入 13ms 這里指周期
164 }
165
166 /******************************************************************/
167 /* 定時(shí)器中斷 */
168 /******************************************************************/
169 void tim(void) interrupt 1 using 1//中斷用于溫度檢測(cè)
170 {
171 TR0=0; //關(guān)閉定時(shí)器
172 TH0=0x0f;//定時(shí)器重裝值 定時(shí)器有沒有中斷標(biāo)志位??,未清零?
173 TL0=0x00;
174 flag_get=1;//標(biāo)志位有效
175 }
176
177
178
179
180 void UART_SER() interrupt 4
181 {
182 unsigned char Temp;
183 static unsigned char flag=0;
184 if(RI)
185 {
186 RI=0;
187 Temp=SBUF;
188 switch(Temp)
189