【头条】造风扇技术那家强,码农为自己的翔代言

码农自己制作小风扇,妈妈再也用不担心我们夏天晚上被热醒了。

简要描述: 
硬件线路连接=>硬件编程=>软件编程

实现功能 :

1、红外线遥控板 控制风扇开关 挡速

2、液晶显示器 显示风扇的工作情况

3、客户端 显示风扇工作情况

4、开启风扇时 记录上次的挡速 关键技术:         1、硬件中断         2、红外线通信         3、串口通信         4、FALSE存储

硬件截图:

客户端软件截图:

硬件编程源码:

  1 /********************************************************************
  2 * 文件名  : FanServer.c
  3 * 创建人  : wu_zhuojun,2014年2月23日 北京
  4 * 版本号  : 3.0
  5 ***********************************************************************/
  6
  7 #include <reg51.h>
  8 #include <intrins.h>
  9
 10 #define uchar unsigned char
 11 #define uint  unsigned int
 12
 13 uchar LCD_ID_1[16] = {"I have a dream!"};
 14 uchar LCD_ID_2[16] = {"Speed: 0"};
 15
 16 void delay(uchar x);  //x*0.14MS
 17 void delay1(int ms);
 18 void beep();
 19
 20 sbit IRIN = P3^3;         //红外接收器数据线
 21 sbit BEEP = P1^5;         //蜂鸣器驱动线
 22 sbit RELAY= P1^4;         //继电器驱动线
 23
 24 uchar IRCOM[7];
 25
 26 sbit E=P2^7;     //1602使能引脚
 27 sbit RW=P2^6;     //1602读写引脚
 28 sbit RS=P2^5;     //1602数据/命令选择引脚
 29
 30 //==========直流电机参数定义 begin
 31 sbit PWM = P1^0;     //定义直流电机的控制端口
 32 uchar PWM_ON = 0 ;     //风扇档数
 33 //==========直流电机参数定义 end
 34
 35
 36 //==========FLASH参数定义 begin
 37 sbit scl=P1^5;  //24c08 SCL
 38 sbit sda=P3^6;  //24c08 SDA
 39 //==========FLASH参数定义 End
 40
 41 /********************************************************************
 42 * 名称 : delay()
 43 * 功能 : 延时,延时时间大概为140US。
 44 * 输入 : 无
 45 * 输出 : 无
 46 ***********************************************************************/
 47 void Delay2()
 48 {
 49 int i,j;
 50 for(i=0; i<=10; i++)
 51 for(j=0; j<=2; j++)
 52 ;
 53 }
 54
 55
 56 /********************************************************************
 57 * 名称 : enable(uchar del)
 58 * 功能 : 1602命令函数
 59 * 输入 : 输入的命令值
 60 * 输出 : 无
 61 ***********************************************************************/
 62 void enable(uchar del)
 63 {
 64 P0 = del;
 65 RS = 0;
 66 RW = 0;
 67 E = 0;
 68 Delay2();
 69 E = 1;
 70 Delay2();
 71 }
 72
 73 /********************************************************************
 74 * 名称 : write(uchar del)
 75 * 功能 : 1602写数据函数
 76 * 输入 : 需要写入1602的数据
 77 * 输出 : 无
 78 ***********************************************************************/
 79 void write(uchar del)
 80 {
 81 P0 = del;
 82 RS = 1;
 83 RW = 0;
 84 E = 0;
 85 Delay2();
 86 E = 1;
 87 Delay2();
 88 }
 89
 90 /********************************************************************
 91 * 名称 : L1602_init()
 92 * 功能 : 1602初始化,请参考1602的资料
 93 * 输入 : 无
 94 * 输出 : 无
 95 ***********************************************************************/
 96 void L1602_init(void)
 97 {
 98 enable(0x01);
 99 enable(0x38);
100 enable(0x0c);
101 enable(0x06);
102 enable(0xd0);
103 }
104
105 /********************************************************************
106 * 名称 : L1602_char(uchar hang,uchar lie,char sign)
107 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
108 L1602_char(1,5,‘b‘)
109 * 输入 : 行,列,需要输入1602的数据
110 * 输出 : 无
111 ***********************************************************************/
112 void L1602_char(uchar hang,uchar lie,char sign)
113 {
114 uchar a;
115 if(hang == 1) a = 0x80;
116 if(hang == 2) a = 0xc0;
117 a = a + lie - 1;
118 enable(a);
119 write(sign);
120 }
121
122 /********************************************************************
123 * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
124 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
125 L1602_string(1,5,"ab cd ef;")
126 * 输入 : 行,列,需要输入1602的数据
127 * 输出 : 无
128 ***********************************************************************/
129 void L1602_string(uchar hang,uchar lie,uchar *p)
130 {
131 uchar a;
132 if(hang == 1) a = 0x80;
133 if(hang == 2) a = 0xc0;
134 a = a + lie - 1;
135 enable(a);
136 while(1)
137 {
138 if(*p == ‘\0‘) break;
139 write(*p);
140 p++;
141 }
142 }
143
144 /********************************************************************
145 * 名称 : Com_Init()
146 * 功能 : 初始化串口程序,晶振11.0592, 波特率9600
147 * 输入 : 无
148 * 输出 : 无
149 ***********************************************************************/
150 void Com_Init(void)
151 {
152 TMOD = 0x20;
153 PCON = 0x00;
154 SCON = 0x50;
155 TH1 = 0xFd;
156 TL1 = 0xFd;
157 TR1 = 1;
158 }
159
160 //风扇3档
161 void PWM_Speed3()
162 {
163 static uchar status = 0;
164 if(10 > status)
165 {
166 PWM = 1;//风扇转
167 }
168 else//(1000 == status)
169 {
170 PWM = 0;//风扇不转
171 status = 0;
172 }
173
174 status++;
175 }
176
177 //风扇2档
178 void PWM_Speed2()
179 {
180 static uchar status = 0;
181 if(4 > status)
182 {
183 PWM = 1;//风扇转
184 }
185 else//(1000 == status)
186 {
187 PWM = 0;//风扇不转
188 status = 0;
189 }
190
191 status++;
192 }
193
194 //风扇1档
195 void PWM_Speed1()
196 {
197 static uchar status = 0;
198 if(0 == status)
199 {
200 PWM = 1;
201 }
202 else if(1 == status)
203 {
204 PWM = 1;
205 }
206 else //2 == status
207 {
208 PWM = 0;
209 status = 0;
210 }
211 status++;
212 }
213
214 //风扇0档
215 void PWM_Speed0()
216 {
217 PWM = 0;//风扇不转
218 }
219
220 /********************************************************************
221 * 名称 : PWM_Contrl()
222 * 功能 : 控制风扇的档数
223 * 输入 :
224 * 输出 : 无
225 ***********************************************************************/
226 void PWM_Contrl()
227 {
228 switch(PWM_ON)
229 {
230 case 0:
231 PWM_Speed0();
232 break;
233 case 1:
234 PWM_Speed1();
235 break;
236 case 2:
237 PWM_Speed2();
238 break;
239 case 3:
240 PWM_Speed3();
241 break;
242 default:
243 PWM_Speed0();
244 break;
245 }
246 }
247
248
249 /********************************************************************
250 * 名称 : flash()
251 * 功能 : 延时,时间为2个NOP,大概为2US
252 * 输入 : 无
253 * 输出 : 无
254 ***********************************************************************/
255 void flash(void)
256 {
257 _nop_();
258 _nop_();
259 }
260
261 /********************************************************************
262 * 名称 : x24c02_init()
263 * 功能 : 24c02初始化子程序
264 * 输入 : 无
265 * 输出 : 无
266 ***********************************************************************/
267 void x24c02_init(void)
268 {
269 scl = 1;
270 flash();
271 sda = 1;
272 flash();
273 }
274
275 /********************************************************************
276 * 名称 : start(void)
277 * 功能 : 启动I2C总线
278 * 输入 : 无
279 * 输出 : 无
280 ***********************************************************************/
281 void start(void)
282 {
283 scl = 1;
284 flash();
285 sda = 1;
286 flash();
287 sda = 0;
288 flash();
289 scl = 0;
290 flash();
291 }
292
293 /********************************************************************
294 * 名称 : stop()
295 * 功能 : 停止I2C总线
296 * 输入 : 无
297 * 输出 : 无
298 ***********************************************************************/
299 void stop()
300 {
301 scl = 0;
302 flash();
303 sda = 0;
304 flash();
305 scl = 1;
306 flash();
307 sda = 1;
308 flash();
309 }
310
311 /********************************************************************
312 * 名称 : writex()
313 * 功能 : 写一个字节
314 * 输入 : j(需要写入的值)
315 * 输出 : 无
316 ***********************************************************************/
317 void writex(uchar j)
318 {
319 uchar i,temp;
320 temp = j;
321 for(i=0; i<8; i++)
322 {
323 scl = 0;
324 flash();
325 sda = (bit)(temp & 0x80);
326 flash();
327 scl = 1;
328 flash();
329 temp = temp << 1;
330 }
331 scl = 0;
332 flash();
333 }
334
335 /********************************************************************
336 * 名称 : readx()
337 * 功能 : 读一个字节
338 * 输入 : 无
339 * 输出 : 读出的值
340 ***********************************************************************/
341 uchar readx(void)
342 {
343 uchar i, j, k = 0;
344 for(i=0; i<8; i++)
345 {
346 scl = 0;
347 flash();
348 if(sda == 1)
349 {
350 j = 1;
351 }
352 else j = 0;
353 k = (k << 1) | j;
354 scl = 1;
355 flash();
356 }
357 return(k);
358 }
359
360 /********************************************************************
361 * 名称 : ack()
362 * 功能 : I2C总线时钟
363 * 输入 : 无
364 * 输出 : 无
365 ***********************************************************************/
366 void ack(void)
367 {
368 uchar i = 0;
369 scl = 1;
370 flash();
371 while((sda == 1) && (i < 255))
372 {
373 i++;
374 }
375 scl = 0;
376 flash();
377 }
378
379 /********************************************************************
380 * 名称 : x24c02_read()
381 * 功能 : 从24c02中读出值
382 * 输入 : address(要在这个地址读取值)
383 * 输出 : 从24c02中读出的值
384 ***********************************************************************/
385 uchar x24c02_read(uchar address)
386 {
387 uchar i;
388 start();
389 writex(0xa0);
390 ack();
391 writex(address);
392 ack();
393 start();
394 writex(0xa1);
395 ack();
396 i = readx();
397 stop();
398 return(i);
399 }
400
401 /********************************************************************
402 * 名称 : x24c02_write()
403 * 功能 : 想24c02中写入数据
404 * 输入 : address(地址) , info(值)
405 * 输出 : 无
406 ***********************************************************************/
407 void x24c02_write(uchar address, uchar info)
408 {
409 start();
410 writex(0xa0);
411 ack();
412 writex(address);
413 ack();
414 writex(info);
415 ack();
416 stop();
417 }
418
419
420 /********************************************************************
421 * 名称 : main()
422 * 功能 :
423 * 输入 : 无
424 * 输出 : 无
425 ***********************************************************************/
426 main()
427 {
428 //=========初始化红外线控制 Begin=======//
429 IE = 0x84;                 //允许总中断中断,使能 INT1 外部中断
430 TCON = 0x10;               //触发方式为脉冲负边沿触发
431
432 IRIN=1;                    //I/O口初始化
433 BEEP=1;
434 RELAY=1;
435 //=========初始化红外线控制 End=======//
436
437 delay1(10);                 //延时
438 L1602_init();               //初始化LCD
439
440
441 L1602_string(1, 1, LCD_ID_1);  //设置 液晶显示屏  显示LCD_ID_1的内容
442 L1602_string(2, 1, LCD_ID_2);  //设置 液晶显示屏  显示LCD_ID_2的内容
443
444
445 //=======初始化串口 Begin=======//
446 Com_Init();
447 //=======初始化串口 Begin=======//
448
449 //=======初始化FLASH Begin=======//
450 x24c02_init();            //初始化24C02
451 PWM_ON = x24c02_read(2);    //读出保存的数据赋于sec
452
453 L1602_char(2,8,PWM_ON+‘0‘);
454 //=======初始化FALSH End=======//
455
456 while(1)
457 {
458 PWM_Contrl();
459 }
460
461 } //end main
462
463
464 /********************************************************************
465 * 名称 : IR_IN interrupt 2 using 0
466 * 功能 : 接收红外线数据,并中断处理液晶屏显示
467 * 输入 : 无
468 * 输出 : 无
469 ***********************************************************************/
470 void IR_IN() interrupt 2 using 0
471 {
472 //======初始化串口发送数据 变量  Begin=======//
473 uchar code strSpeed[][4] = {"0", "1", "2", "3" };
474 uchar *p = strSpeed[0];  //初始化为 0 档
475 //======初始化串口发送数据 变量  End=======//
476
477 unsigned char j,k,N=0;
478 EX1 = 0;
479 delay(15);
480 if (IRIN==1)
481 {
482 EX1 =1;
483 return;
484 }
485 //确认IR信号出现
486 while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
487 {
488 delay(1);
489 }
490
491 for (j=0;j<4;j++)         //收集四组数据
492 {
493 for (k=0;k<8;k++)        //每组数据有8位
494 {
495 while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
496 {
497 delay(1);
498 }
499 while (!IRIN)          //等 IR 变为高电平
500 {
501 delay(1);
502 }
503 while (IRIN)           //计算IR高电平时长
504 {
505 delay(1);
506 N++;
507 if (N>=30)
508 {
509 EX1=1;
510 return;
511 } //if (N>=30)    //0.14ms计数过长自动离开。
512 } //while (IRIN)      //高电平计数完毕
513 IRCOM[j]=IRCOM[j] >> 1;            //数据最高位补“0”
514 if (N>=8)
515 {
516 IRCOM[j] = IRCOM[j] | 0x80;    //数据最高位补“1”
517 }  //if (N>=8)
518 N=0;
519 }//for (k=0;k<8;k++)
520 }//for (j=0;j<4;j++)
521
522 if (IRCOM[2]!=~IRCOM[3])
523 {
524 EX1=1;
525 return;
526 }
527
528 IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
529 IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
530
531 if(IRCOM[5]>9)
532 {
533 IRCOM[5]=IRCOM[5]+0x37;
534 }
535 else
536 IRCOM[5]=IRCOM[5]+0x30;
537
538 if(IRCOM[6]>9)
539 {
540 IRCOM[6]=IRCOM[6]+0x37;
541 }
542 else
543 IRCOM[6]=IRCOM[6]+0x30;
544
545 //=======控制 液晶显示屏显示数据 Begin=========//
546
547 if( (‘4‘ == IRCOM[6]) && (‘5‘ == IRCOM[5]))  //触发开关键
548 {
549 PWM_ON=0;//风扇关闭
550 //PWM_SLEEP = 0;
551
552 p = strSpeed[0];   //档速0
553 L1602_char(2,8,‘0‘);
554 }
555 else if( (‘0‘ == IRCOM[6]) && (‘C‘ == IRCOM[5]))  //触发1号键
556 {
557 PWM_ON=1;//风扇开启
558 //PWM_SLEEP=10;//风扇休眠时间
559
560 p = strSpeed[1];   //档速1
561 L1602_char(2,8,‘1‘);
562 }
563 else if( (‘1‘ == IRCOM[6]) && (‘8‘ == IRCOM[5]))  //触发2号键
564 {
565 PWM_ON=2;//风扇开启
566 //PWM_SLEEP=100;//风扇休眠时间
567
568 p = strSpeed[2];   //档速2
569 L1602_char(2,8,‘2‘);
570 }
571 else if( (‘5‘ == IRCOM[6]) && (‘E‘ == IRCOM[5]))  //触发3号键
572 {
573 PWM_ON=3;//风扇开启
574 //PWM_SLEEP=1000;//风扇休眠时间
575 p = strSpeed[3];   //档速3
576 L1602_char(2,8,‘3‘);
577 }
578 //=======控制 液晶显示屏显示数据 End=========//
579
580
581 //=======发送串口数据 Begin=========//
582 while(1)
583 {
584 SBUF = *p;
585 while(!TI)                   //如果发送完毕,硬件会置位TI
586 {
587 _nop_();
588 }
589 p++;
590 if(*p == ‘\0‘) break;     //在每个字符串的最后,会有一个‘\0‘
591 TI = 0;                     //TI清零
592 }
593 //=======发送串口数据 End=========//
594
595 //beep();
596 EX1 = 1;
597
598 //将风扇的档数记录
599 x24c02_write(2,PWM_ON);   //在24c08的地址2中写入数据sec
600 }
601
602 /**********************************************************/
603 void beep()
604 {
605 unsigned char i;
606 for (i=0;i<100;i++)
607 {
608 delay(4);
609 BEEP=!BEEP;                 //BEEP取反
610 }
611 BEEP=1;                      //关闭蜂鸣器
612 }
613 /**********************************************************/
614 void delay(unsigned char x)    //x*0.14MS
615 {
616 unsigned char i;
617 while(x--)
618 {
619 for (i = 0; i<13; i++) {}
620 }
621 }
622
623 /**********************************************************/
624 void delay1(int ms)
625 {
626 unsigned char y;
627 while(ms--)
628 {
629 for(y = 0; y<250; y++)
630 {
631 _nop_();
632 _nop_();
633 _nop_();
634 _nop_();
635 }
636 }
637 }

软件编程部分源码:

  1 ===================================================================================================
  2 // FanDlg.h : 头文件
  3 //
  4
  5 #pragma once
  6
  7 #define COM_RECVDATA WM_USER+1000//自定义消息
  8
  9 // CFanDlg 对话框
 10 class CFanDlg : public CDialogEx
 11 {
 12 // 构造
 13 public:
 14 CFanDlg(CWnd* pParent = NULL);    // 标准构造函数
 15
 16 // 对话框数据
 17 enum { IDD = IDD_FAN_DIALOG };
 18
 19 protected:
 20 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
 21
 22 private:
 23 HANDLE hCom; //串口句柄
 24 HANDLE hCommThread; //串口线程
 25
 26 public:
 27 //获取串口句柄
 28 HANDLE GetComHandle();
 29
 30 // 实现
 31 protected:
 32 HICON m_hIcon;
 33
 34 // 生成的消息映射函数
 35 virtual BOOL OnInitDialog();
 36 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 37 afx_msg void OnPaint();
 38 afx_msg HCURSOR OnQueryDragIcon();
 39 DECLARE_MESSAGE_MAP()
 40
 41 //打开串口
 42 //返回值:TRUE 开启成功  FLASE 开启失败
 43 BOOL OpenCom(CString strPort);
 44
 45 //接收到数据响应消息
 46 afx_msg LRESULT OnRecvData(WPARAM wParam, LPARAM lParam);
 47
 48 public:
 49 afx_msg void OnClose();
 50 };
 51
 52 //声明 串口接收线程
 53 extern DWORD WINAPI SerialPort1ThreadProcess(CFanDlg *pFan); ===================================================================================================
 54
 55 // FanDlg.cpp : 实现文件
 56 //
 57
 58 #include "stdafx.h"
 59 #include "Fan.h"
 60 #include "FanDlg.h"
 61 #include "afxdialogex.h"
 62
 63 #ifdef _DEBUG
 64 #define new DEBUG_NEW
 65 #endif
 66
 67 // CFanDlg 对话框
 68
 69 CFanDlg::CFanDlg(CWnd* pParent /*=NULL*/)
 70 : CDialogEx(CFanDlg::IDD, pParent)
 71 {
 72 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 73 }
 74
 75 void CFanDlg::DoDataExchange(CDataExchange* pDX)
 76 {
 77 CDialogEx::DoDataExchange(pDX);
 78 }
 79
 80 BEGIN_MESSAGE_MAP(CFanDlg, CDialogEx)
 81 ON_WM_SYSCOMMAND()
 82 ON_WM_PAINT()
 83 ON_WM_QUERYDRAGICON()
 84 ON_MESSAGE(COM_RECVDATA, &CFanDlg::OnRecvData)
 85 ON_WM_CLOSE()
 86 END_MESSAGE_MAP()
 87
 88
 89 // CFanDlg 消息处理程序
 90
 91 BOOL CFanDlg::OnInitDialog()
 92 {
 93 CDialogEx::OnInitDialog();
 94
 95 this->SetWindowTextW(_T("风扇控制系统--客户端"));
 96
 97 // 将“关于...”菜单项添加到系统菜单中。
 98
 99 // IDM_ABOUTBOX 必须在系统命令范围内。
100 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
101 ASSERT(IDM_ABOUTBOX < 0xF000);
102
103 CMenu* pSysMenu = GetSystemMenu(FALSE);
104 if (pSysMenu != NULL)
105 {
106 BOOL bNameValid;
107 CString strAboutMenu;
108 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
109 ASSERT(bNameValid);
110 if (!strAboutMenu.IsEmpty())
111 {
112 pSysMenu->AppendMenu(MF_SEPARATOR);
113 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
114 }
115 }
116
117 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
118 //  执行此操作
119 SetIcon(m_hIcon, TRUE);     // 设置大图标
120 SetIcon(m_hIcon, FALSE);     // 设置小图标
121
122 // TODO: 在此添加额外的初始化代码
123 BOOL bStatu = OpenCom(_T("COM4"));
124
125 //启动串口监视线程
126 DWORD threadID;
127 hCommThread = ::CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0,
128   (LPTHREAD_START_ROUTINE)SerialPort1ThreadProcess,
129   this, 0, &threadID);
130 if (hCommThread == NULL)
131 {
132 ::AfxMessageBox(_T("创建串口1处理线程失败"));
133 ::PostQuitMessage(0);
134 }
135
136
137 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
138 }
139
140 BOOL CFanDlg::OpenCom(CString strPort)
141 {
142        hCom=CreateFile(strPort,
143               GENERIC_READ|GENERIC_WRITE, //允许读和写
144               0, //独占方式
145               NULL,
146               OPEN_EXISTING, //打开而不是创建
147               0, //同步方式
148               NULL);
149
150        if(hCom==(HANDLE)-1)
151        {
152             AfxMessageBox(_T("打开COM失败!"));
153             return FALSE;
154        }
155
156    DCB wdcb;
157    GetCommState (hCom, &wdcb);
158    wdcb.BaudRate=9600;//波特率:9600,其他:不变
159    if(!SetCommState (hCom, &wdcb))
160    {
161 MessageBox(_T("串口设置出错!"));
162 return FALSE;
163 }
164 PurgeComm(hCom, PURGE_TXCLEAR);
165
166        return TRUE;
167 }
168
169
170
171 void CFanDlg::OnSysCommand(UINT nID, LPARAM lParam)
172 {
173 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
174 {
175 CAboutDlg dlgAbout;
176 dlgAbout.DoModal();
177 }
178 else
179 {
180 CDialogEx::OnSysCommand(nID, lParam);
181 }
182 }
183
184 // 如果向对话框添加最小化按钮,则需要下面的代码
185 //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
186 //  这将由框架自动完成。
187
188 void CFanDlg::OnPaint()
189 {
190 if (IsIconic())
191 {
192 CPaintDC dc(this); // 用于绘制的设备上下文
193
194 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
195
196 // 使图标在工作区矩形中居中
197 int cxIcon = GetSystemMetrics(SM_CXICON);
198 int cyIcon = GetSystemMetrics(SM_CYICON);
199 CRect rect;
200 GetClientRect(&rect);
201 int x = (rect.Width() - cxIcon + 1) / 2;
202 int y = (rect.Height() - cyIcon + 1) / 2;
203
204 // 绘制图标
205 dc.DrawIcon(x, y, m_hIcon);
206 }
207 else
208 {
209 CDialogEx::OnPaint();
210 }
211 }
212
213 //当用户拖动最小化窗口时系统调用此函数取得光标
214 //显示。
215 HCURSOR CFanDlg::OnQueryDragIcon()
216 {
217 return static_cast<HCURSOR>(m_hIcon);
218 }
219
220 //接收数据后(通过监听线程发来的用户自定义消息)显示
221 LRESULT CFanDlg::OnRecvData(WPARAM wParam, LPARAM lParam)
222 {
223 CString recvStr((char *)wParam);
224 this->GetDlgItem(IDC_EDT_FAN_SPEED)->SetWindowTextW(recvStr + _T("级风速"));
225 UpdateData(false);
226 return TRUE;
227 }
228
229 HANDLE CFanDlg::GetComHandle()
230 {
231 return hCom; //串口句柄
232 }
233
234 //以一个线程不同监控串口行接收的数据
235 DWORD WINAPI SerialPort1ThreadProcess(CFanDlg *pFan)
236 {
237 char str[101];
238 DWORD wCount; //读取的字节数
239 while(TRUE)
240 {
241 ReadFile(pFan->GetComHandle(),str, 100, &wCount, NULL);
242         if(wCount > 0) //收到数据
243 {
244 //发送消息给对话框主窗口,以进行接收内容的显示
245 str[wCount] = ‘\0‘;
246 ::PostMessage(pFan->m_hWnd, COM_RECVDATA, (unsigned int) str, wCount);
247 }
248 Sleep((DWORD)0.1);
249 }
250 return TRUE;
251 }
252
253 void CFanDlg::OnClose()
254 {
255 // TODO: 在此添加消息处理程序代码和/或调用默认值
256 //CloseHandle(hCom);      //程序退出时关闭串口
257
258 CDialogEx::OnClose();
259 }

结束语: 快乐分享技术,每天进步一点。                                                                      2014.2.23  北京

不服?有本事你扫我啊!!!

原文出处:http://www.cnblogs.com/zhuojun/

时间: 2024-08-05 19:16:08

【头条】造风扇技术那家强,码农为自己的翔代言的相关文章

工作那些事(十一)谈谈码农与农民工区别和发展之路

今天看到帖子: (从这里开始引用,红色为批注) http://bbs.csdn.NET/topics/390610815?page=1#post-395774111 发表于: 2013-10-10 14:24:29 现在才感悟到,码农与农民工真正区别: 1.农民工晚上不加班,因为打扰居民生活会被告.  码农要加班.农民工也很辛苦,起的很早,并且也要有手艺. 2,农民工下班,想喝酒,去买,想吃烧鸡,买一只.  码农晚饭,快餐店,解决.想吃只鸡,要掂量掂量月底怎么办.农民工有说的那么好吗? 3.农民

管理与技术未必不可兼得,一个20年IT老兵的码农生涯

作者|康德胜 我是一个喜欢写代码但几乎不太有机会写代码的CTO,也是一个看得懂财务报表.通过所有CFA(金融特许分析师)考试并获得FRM(金融风险经理)认证的拿到金融MBA的CTO,如果我有幸被称作码农,我会幸福地唱起歌儿.——康德胜编者按 从普通码农到国内公司CTO是一段经历:放弃CTO优渥待遇转战美国技术底层,再次做到管理岗位又是一段经历:选择回国发展,先后加入工行.任职渣打,到现在的万惠集团副总裁兼CTO,是他最新的一段经历.人生就是各种各样的经历,他的经历丰富却有借鉴意义,也希望你能从中

码农技术炒股之路——数据源选择

在给本系列博文拟定标题时,我原先写下的是<股票交易信息获取及分析系统>.之后感觉这个名字过于高大上,又不自觉的在草稿中写下<码农技术炒股之路>.这个名称让我会心一笑,因为它即突出了我的身份,又点名了本系列博文要介绍的东西--技术炒股.最后"之路"一词可以让我好好介绍下这个项目的前因后果,希望大家也感受下这个项目的温度,因为它的产生并非我一人杜撰出来的愿景.(转载请指明出于breaksoftware的csdn博客) 首先回忆下我入市的经历.我非常荣幸的于15年5月

《演讲之禅:一位技术演讲家的自白》读书笔记

<演讲之禅:一位技术演讲家的自白>读书笔记 第1章 其实我看不到裸露的你 要知道你怎么对待错误,听众就会怎样对待错误: 你可以泰然处之,大家也就一笑而过:如果你大惊失色,大家同样会将注意力集中到这件事上: 因此,如果我在费城的下一个演讲时鞋子着火了,或者上楼梯时摔倒了,还在走道上摔了个嘴啃泥,我就可以将这些变成机遇. 以后要是发生什么还不及这个故事尴尬的事情时,我就可以拿这个故事说事了.我可以以一个灾难作为逃脱另一个灾难的衔接点了:"你认为这很令人尴尬吗?呃,以前我在费城的时候--&

与技术无关,但却值得码农们好好读一读的怪书:禅与摩托车维修艺术

最近在读<禅与摩托车维修艺术>这本书,说它很奇怪,其实是因为觉得书名很有意思.看书名,很容易被误解成是一本教人修摩托车的教程,事实上它是一本非常经典的哲学书籍,很多大牛都有推介过这本书. 著名的物理学家 霍金 曾这样评价这本书: “我因为写了一部人们把它和<禅与摩托车维修艺术>相比较的书而感到甚受恭维,我希望拙作(<时间简史>)和<禅与摩托车维修艺术>一样使人们觉得他们不必自处于伟大的智慧及哲学的问题之外” 其实不单单是霍金,乔布斯也曾经极力的推崇过这本书.

【知乎】怎么成为一个优秀的程序员,而不是一个优秀的码农?

怎么成为一个优秀的程序员,而不是一个优秀的码农? 9 条评论 分享 默认排序按时间排序 98 个回答 3844赞同反对,不会显示你的姓名 萧井陌 微信公众号:炼瓜研究所 技术社区 - 3844 人赞同 优秀的程序员会告诉你打根基的重要性,会劝你在厚积薄发前要隐忍. 优秀的码农会告诉你学啥底层.啥啥啥一拖就好了,学了python还要啥自行车啊,数据结构排序函数二分搜索这不都内置了吗?工作中永远用不到,学算法有啥用啊?成为高手有很多种方法汇编是个屁啊? +++基础的分割线+++ 列举几个我认为比较重

屌丝码农该怎么过周末

忙忙碌碌的一周终于完了,辛辛苦苦的等到了周末,程序员是否如愿的轻松过个周末呢?尤其是在这个北京极其寒冷的冬天,肯定是每个程序员各有各的过法.我小手一抖,心肝一颤,不禁想问:周末你敲代码了吗?周末加班去了吗? 帝都的程序员是真心不容易啊,这一周在经历了暴雪的侵袭,寒风的骚扰之后,据说冻的都跟2B青年似的.好不容易到了周末,风走了,北京的常客雾霾大哥又来串门了,而且有想常住的意思,要想送客不容易啊,老话说的好啊,请神容易送神难,虽然雾霾不是请来的,我好像说错了,雾霾是我们人类自己造出来的,但是它说:

年薪50万码农转行卖凉皮,互联网思维又一次颠覆?

我出生在陕西西安农村家庭,从小学习也一般,记得我们上幼儿园的时候,学生们都背着家里给自己用布缝制的书包,教室的窗口是用农村的白色蛇皮袋子,到了冬天北风呼啸,教室里因为没有桌子板凳而风从窗口呼啸. 从小学开始我就特别羡慕那些学习特好的同学,羡慕他们快速的解题速度,每次有很多和我一样的人都拼命非常努力,但是总是成绩平平,所以我们每天的生活都是做题,解题,高分数,你每天都得跟别人比,渐渐让我感觉从此你的人生就只能平庸,学习好的学生上好的学习,找好的工作,挣高的工资,尤其在我们印象最深的是高考,三天一大

37岁老码农现身说法:青春饭怎么吃?

程序员第一考虑的当然是技术,但现在真不知道学什么了:干了三四年的开发,手头的工作马马虎虎都没什么问题了.就算有问题,也是业务逻辑上的问题,系统太复杂,吃不透;或者系统里一些过时的/生僻的技术,真心觉得没必要花时间花精力去研究,能对付就行了,是不是?反正下家单位99.99%的几率是不会用到这些东西的的. 那么就是一些新技术了.新技术杂得很,不知道学什么,框架类库啥的其实没什么技术含量,一两个星期就可以上手,上手了之后呢?往深里学?其实和老旧技术一样的问题,谁知道下一份工作用不用得上呢!而且没趣,大