CSSµÄÊ®°Ë°ã¼¼ÇÉ

本文总结了使用CSS布局时常见的问题及解决方法,包括选择器特异性、浮动清除、居中对齐等技巧,并提供了针对不同浏览器的优化建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    • Ô­ÎÄ×÷ÕߣºRoger Johansson
    • ×÷Õß¼ò½é£º×¡ÔÚÈðµä¸çµÂ±¤£¬1994Ä꿪ʼ½Ó´¥ºÍ²ÎÓëwebÉè¼Æ£¬456 Berea StreetÊÇËûµÄסַ£¬Òò´Ë²ÉÓÃÕâ¸öÃû×Ö×÷ΪËûµÄ¸öÈËÖ÷Ò³ÓòÃû
    • Ô­Îijö´¦£ºwww.456bereastreet.com
    • Ô­ÎÄ·¢±íʱ¼ä£º2005Äê3ÔÂ15ÈÕ
    • °¢½Ý˵Ã÷£º´ËÎÄÔ­Ãû"CSS tips and tricks"£¬ÓÐ2ƪ£¬ÎÒ½«ËüÃǺϲ¢·­ÒëÔÚ±¾ÎÄÖС£
  • rogerjohansson.jpg

    ×î½ü,¾­³£ÓÐÅóÓÑÎÊÎÒһЩ¹¤×÷ÖÐÓöµ½µÄCSSÎÊÌâ¡£ËûÃÇ×ÜÊDz»ÄܺܺõĿØÖÆCSS£¬Ó°ÏìCSSµÄЧÂÊ·¢»Ó¡£ÎÒÀ´·ÖÎö×ܽáһϴíÎóËùÔÚ£¬°ïÖú´ó¼Ò¸ü¼ÓÈÝÒ×ʹÓÃCSS¡£

    ±¾ÎÄ×ܽáÁËÎÒ¿ªÊ¼Ê¹ÓÃCSS²¼¾Ö·½·¨ÒÔÀ´ËùÓеļ¼ÇɺͼæÈÝ·½°¸£¬ÎÒÔ¸Òâ°ÑÕâЩÓëÄã·ÖÏí£¬ÎÒ»áÖØµã½âÊÍһЩÐÂÊÖÈÝÒ×·¸µÄ´íÎó(°üÀ¨ÎÒ×Ô¼ºÒ²·¸¹ýµÄ)£¬Èç¹ûÄãÒѾ­ÊÇCSS¸ßÊÖ£¬ÕâЩ¾­Ñé¼¼ÇÉ¿ÉÄÜÒѾ­¶¼ÖªµÀ£¬Èç¹ûÄãÓиü¶àµÄ£¬Ï£Íû¿ÉÒÔ°ïÎÒ²¹³ä¡£

    Ò».ʹÓÃcssËõд

    ʹÓÃËõд¿ÉÒÔ°ïÖú¼õÉÙÄãCSSÎļþµÄ´óС£¬¸ü¼ÓÈÝÒ×ÔĶÁ¡£cssËõдµÄÖ÷Òª¹æÔòÇë²Î¿´¡¶³£ÓÃcssËõдÓï·¨×ܽᡷ£¬ÕâÀï¾Í²»Õ¹¿ªÃèÊö¡£

    ¶þ.Ã÷È·¶¨Ò嵥룬³ý·ÇֵΪ0

    Íü¼Ç¶¨Òå³ß´çµÄµ¥Î»ÊÇCSSÐÂÊÖÆÕ±éµÄ´íÎó¡£ÔÚHTMLÖÐÄã¿ÉÒÔֻдwidth="100"£¬µ«ÊÇÔÚCSSÖУ¬Äã±ØÐë¸øÒ»¸ö׼ȷµÄµ¥Î»£¬±ÈÈ磺width:100px width:100em¡£Ö»ÓÐÁ½¸öÀýÍâÇé¿ö¿ÉÒÔ²»¶¨Ò嵥λ£ºÐиߺÍ0Öµ¡£³ý´ËÒÔÍ⣬ÆäËûÖµ¶¼±ØÐë½ô¸úµ¥Î»£¬×¢Ò⣬²»ÒªÔÚÊýÖµºÍµ¥Î»Ö®¼ä¼Ó¿Õ¸ñ¡£

    Èý.Çø·Ö´óСд

    µ±ÔÚXHTMLÖÐʹÓÃCSS£¬CSSÀﶨÒåµÄÔªËØÃû³ÆÊÇÇø·Ö´óСдµÄ¡£ÎªÁ˱ÜÃâÕâÖÖ´íÎó£¬ÎÒ½¨ÒéËùÓе͍ÒåÃû³Æ¶¼²ÉÓÃСд¡£

    classºÍidµÄÖµÔÚHTMLºÍXHTMLÖÐÒ²ÊÇÇø·Ö´óСдµÄ£¬Èç¹ûÄãÒ»¶¨Òª´óСд»ìºÏд£¬Çë×ÐϸȷÈÏÄãÔÚCSSµÄ¶¨ÒåºÍXHTMLÀïµÄ±êÇ©ÊÇÒ»Öµġ£

    ËÄ.È¡ÏûclassºÍidǰµÄÔªËØÏÞ¶¨

    µ±Äãд¸øÒ»¸öÔªËØ¶¨Òåclass»òÕßid£¬Äã¿ÉÒÔÊ¡ÂÔÇ°ÃæµÄÔªËØÏÞ¶¨£¬ÒòΪIDÔÚÒ»¸öÒ³ÃæÀïÊÇΨһµÄ£¬¶øclas s¿ÉÒÔÔÚÒ³ÃæÖжà´ÎʹÓá£ÄãÏÞ¶¨Ä³¸öÔªËØºÁÎÞÒâÒå¡£ÀýÈ磺div#content { /* declarations */ }

    fieldset.details { /* declarations */ }

    ¿ÉÒÔд³É#content { /* declarations */ }

    .details { /* declarations */ }

    ÕâÑù¿ÉÒÔ½ÚʡһЩ×Ö½Ú¡£

    Îå.ĬÈÏÖµ

    ͨ³£paddingµÄĬÈÏֵΪ0£¬background-colorµÄĬÈÏÖµÊÇtransparent¡£µ«ÊÇÔÚ²»Í¬µÄä¯ÀÀÆ÷ĬÈÏÖµ¿ÉÄܲ»Í¬¡£Èç¹ûÅÂÓгåÍ»£¬¿ÉÒÔÔÚÑùʽ±íÒ»¿ªÊ¼¾ÍÏȶ¨ÒåËùÓÐÔªËØµÄmarginºÍpaddingÖµ¶¼Îª0£¬ÏóÕâÑù£º* {

    margin:0;

    padding:0;

    }

    Áù.²»ÐèÒªÖØ¸´¶¨Òå¿É¼Ì³ÐµÄÖµ

    CSSÖУ¬×ÓÔªËØ×Ô¶¯¼Ì³Ð¸¸ÔªËصÄÊôÐÔÖµ£¬ÏóÑÕÉ«¡¢×ÖÌåµÈ£¬ÒѾ­ÔÚ¸¸ÔªËØÖж¨Òå¹ýµÄ£¬ÔÚ×ÓÔªËØÖпÉÒÔÖ±½Ó¼Ì³Ð£¬²»ÐèÒªÖØ¸´¶¨Òå¡£µ«ÊÇҪעÒ⣬ä¯ÀÀÆ÷¿ÉÄÜÓÃһЩĬÈÏÖµ¸²¸ÇÄãµÄ¶¨Òå¡£

    Æß.×î½üÓÅÏÈÔ­Ôò

    Èç¹û¶Ôͬһ¸öÔªËØµÄ¶¨ÒåÓжàÖÖ£¬ÒÔ×î½Ó½ü(×îСһ¼¶)µÄ¶¨ÒåΪ×îÓÅÏÈ£¬ÀýÈçÓÐÕâôһ¶Î´úÂë

    Update: Lorem ipsum dolor set

    ÔÚCSSÎļþÖУ¬ÄãÒѾ­¶¨ÒåÁËÔªËØp£¬ÓÖ¶¨ÒåÁËÒ»¸öclass"update"p {

    margin:1em 0;

    font-size:1em;

    color:#333;

    }

    .update {

    font-weight:bold;

    color:#600;

    }

    ÕâÁ½¸ö¶¨ÒåÖУ¬class="update"½«±»Ê¹Óã¬ÒòΪclass±Èp¸ü½ü¡£Äã¿ÉÒÔ²éÔÄW3CµÄ¡¶ Calculating a selector¡¯s specificity¡· Á˽â¸ü¶à¡£

    °Ë.¶àÖØclass¶¨Òå

    Ò»¸ö±êÇ©¿ÉÒÔͬʱ¶¨Òå¶à¸öclass¡£ÀýÈ磺ÎÒÃÇÏȶ¨ÒåÁ½¸öÑùʽ£¬µÚÒ»¸öÑùʽ±³¾°Îª#666£»µÚ¶þ¸öÑùʽÓÐ10 pxµÄ±ß¿ò¡£.one{width:200px;background:#666;}

    .two{border:10px solid #F00;}

    ÔÚÒ³Ãæ´úÂëÖУ¬ÎÒÃÇ¿ÉÒÔÕâÑùµ÷ÓÃ

    ÕâÑù×îÖÕµÄÏÔʾЧ¹ûÊÇÕâ¸ödiv¼ÈÓÐ#666µÄ±³¾°£¬Ò²ÓÐ10pxµÄ±ß¿ò¡£Êǵģ¬ÕâÑù×öÊÇ¿ÉÒԵģ¬Äã¿ÉÒÔ³¢ÊÔһϡ£

    ¾Å.ʹÓÃ×ÓÑ¡ÔñÆ÷(descendant selectors)

    CSS³õѧÕß²»ÖªµÀʹÓÃ×ÓÑ¡ÔñÆ÷ÊÇÓ°ÏìËûÃÇЧÂʵÄÔ­ÒòÖ®Ò»¡£×ÓÑ¡ÔñÆ÷¿ÉÒÔ°ïÖúÄã½ÚÔ¼´óÁ¿µÄclass¶¨Òå¡£ÎÒÃÇÀ´¿´ÏÂÃæÕâ¶Î´úÂ룺

Item 1

Item 1

Õâ¶Î´úÂëµÄCSS¶¨ÒåÊÇ£ºdiv#subnav ul { /* Some styling */ }

div#subnav ul li.subnavitem { /* Some styling */ }

div#subnav ul li.subnavitem a.subnavitem { /* Some styling */ }

div#subnav ul li.subnavitemselected { /* Some styling */ }

div#subnav ul li.subnavitemselected a.subnavitemselected { /* Some styling */ }

Äã¿ÉÒÔÓÃÏÂÃæµÄ·½·¨Ìæ´úÉÏÃæµÄ´úÂë

Item 1

Item 1

Item 1

Ñùʽ¶¨ÒåÊÇ£º#subnav { /* Some styling */ }

#subnav li { /* Some styling */ }

#subnav a { /* Some styling */ }

#subnav .sel { /* Some styling */ }

#subnav .sel a { /* Some styling */ }

ÓÃ×ÓÑ¡ÔñÆ÷¿ÉÒÔʹÄãµÄ´úÂëºÍCSS¸ü¼Ó¼ò½à¡¢¸ü¼ÓÈÝÒ×ÔĶÁ¡£

Ê®.²»ÐèÒª¸ø±³¾°Í¼Æ¬Â·¾¶¼ÓÒýºÅ

ΪÁ˽ÚÊ¡×Ö½Ú£¬ÎÒ½¨Òé²»Òª¸ø±³¾°Í¼Æ¬Â·¾¶¼ÓÒýºÅ£¬ÒòΪÒýºÅ²»ÊDZØÐëµÄ¡£ÀýÈ磺background:url("images/***.gif") #333;

¿ÉÒÔдΪbackground:url(images/***.gif) #333;

Èç¹ûÄã¼ÓÁËÒýºÅ£¬·´¶ø»áÒýÆðһЩä¯ÀÀÆ÷µÄ´íÎó¡£

ʮһ.×éÑ¡ÔñÆ÷(Group selectors)

µ±Ò»Ð©ÔªËØÀàÐÍ¡¢class»òÕßid¶¼Óй²Í¬µÄһЩÊôÐÔ£¬Äã¾Í¿ÉÒÔʹÓÃ×éÑ¡ÔñÆ÷À´±ÜÃâ¶à´ÎµÄÖØ¸´¶¨Òå¡£Õâ¿ÉÒÔ½ÚÊ¡²»ÉÙ×Ö½Ú¡£

?

ÀýÈ磺¶¨ÒåËùÓбêÌâµÄ×ÖÌå¡¢ÑÕÉ«ºÍmargin£¬Äã¿ÉÒÔÕâÑùд£ºh1,h2,h3,h4,h5,h6 {

font-family:"Lucida Grande",Lucida,Arial,Helvetica,sans-serif;

color:#333;

margin:1em 0;

}

Èç¹ûÔÚʹÓÃʱ£¬Óиö±ðÔªËØÐèÒª¶¨Òå¶ÀÁ¢Ñùʽ£¬Äã¿ÉÒÔÔÙ¼ÓÉÏÐµĶ¨Ò壬¿ÉÒÔ¸²¸ÇÀϵ͍Ò壬ÀýÈ磺h1 { font-size:2em; }

h2 { font-size:1.6em; }

Ê®¶þ.ÓÃÕýÈ·µÄ˳ÐòÖ¸¶¨Á´½ÓµÄÑùʽ

µ±ÄãÓÃCSSÀ´¶¨ÒåÁ´½ÓµÄ¶à¸ö״̬Ñùʽʱ£¬Òª×¢ÒâËüÃÇÊéдµÄ˳Ðò£¬ÕýÈ·µÄ˳ÐòÊÇ£º:link :visited :hover :active¡£³éÈ¡µÚÒ»¸ö×ÖĸÊÇ"LVHA"£¬Äã¿ÉÒÔ¼ÇÒä³É"LoVe HAte"(ϲ»¶ÌÖÑá)¡£ÎªÊ²Ã´Õâô¶¨Ò壬¿ÉÒԲο¼Eric MeyerµÄ¡¶Link Specificity¡·¡£

Èç¹ûÄãµÄÓû§ÐèÒªÓüüÅÌÀ´¿ØÖÆ£¬ÐèÒªÖªµÀµ±Ç°Á´½ÓµÄ½¹µã£¬Ä㻹¿ÉÒÔ¶¨Òå:focusÊôÐÔ¡£:focusÊôÐÔµÄЧ¹ûҲȡ¾öÓëÄãÊéдµÄλÖã¬Èç¹ûÄãÏ£Íû¾Û½¹ÔªËØÏÔʾ:hoverЧ¹û£¬Äã¾Í°Ñ:focusдÔÚ:hoverÇ°Ãæ£»Èç¹ûÄãÏ£Íû¾Û½¹Ð§¹ûÌæ´ú:hoverЧ¹û£¬Äã¾Í°Ñ:focus·ÅÔÚ:hoverºóÃæ¡£

Ê®Èý.Çå³ý¸¡¶¯

Ò»¸ö·Ç³£³£¼ûµÄCSSÎÊÌ⣬¶¨Î»Ê¹Óø¡¶¯µÄʱºò£¬ÏÂÃæµÄ²ã±»¸¡¶¯µÄ²ãËù¸²¸Ç£¬»òÕß²ãÀïǶÌ×µÄ×Ӳ㳬³öÁËÍâ²ãµÄ·¶Î§¡£

ͨ³£µÄ½â¾ö°ì·¨ÊÇÔÚ¸¡¶¯²ãºóÃæÌí¼ÓÒ»¸ö¶îÍâÔªËØ£¬ÀýÈçÒ»¸ödiv»òÕßÒ»¸öbr£¬²¢ÇÒ¶¨ÒåËüµÄÑùʽΪclear: both¡£Õâ¸ö°ì·¨ÓÐÒ»µãǣǿ£¬ÐÒÔ˵ÄÊÇ»¹ÓÐÒ»¸öºÃ°ì·¨¿ÉÒÔ½â¾ö£¬²Î¿´ÕâÆªÎÄÕ¡¶How To Clear Floats Without Structural Markup¡·(×¢£º±¾Õ¾½«¾¡¿ì·­Òë´ËÎÄ)¡£

ÉÏÃæ2ÖÖ·½·¨¿ÉÒԺܺýâ¾ö¸¡¶¯³¬³öµÄÎÊÌ⣬µ«ÊÇÈç¹ûµ±ÄãÕæµÄÐèÒª¶Ô²ã»òÕß²ãÀïµÄ¶ÔÏó½øÐÐclearµÄʱºòÔõô°ì£¿Ò»ÖÖ¼òµ¥µÄ·½·¨¾ÍÊÇÓÃoverflowÊôÐÔ£¬Õâ¸ö·½·¨×î³õµÄ·¢±íÔÚ¡¶Simple Clearing of Floats¡·£¬ÓÖÔÚ¡¶Clearance¡·ºÍ¡¶Super simple clearing floats¡·Öб»¹ã·ºÌÖÂÛ¡£

ÉÏÃæÄÇÒ»ÖÖclear·½·¨¸üÊʺÏÄ㣬Ҫ¿´¾ßÌåµÄÇé¿ö£¬ÕâÀï²»ÔÙÕ¹¿ªÂÛÊö¡£ÁíÍâ¹ØÓÚfloatµÄÓ¦Óã¬Ò»Ð©ÓÅÐãµÄÎÄÕÂÒѾ­ËµµÃºÜÇå³þ£¬ÍƼöÄãÔĶÁ£º¡¶Floatutorial¡·¡¢¡¶Containing Floats¡·ºÍ¡¶Float Layouts¡·

Ê®ËÄ.ºáÏò¾ÓÖÐ(centering)

ÕâÊÇÒ»¸ö¼òµ¥µÄ¼¼ÇÉ£¬µ«ÊÇÖµµÃÔÙ˵һ±é£¬ÒòΪÎÒ¿´¼ûÌ«¶àµÄÐÂÊÖÎÊÌâ¶¼ÊÇÎÊÕâ¸ö£ºCSSÈçºÎºáÏò¾ÓÖУ¿ÄãÐèÒª¶¨ÒåÔªËØµÄ¿í£¬²¢ÇÒ¶¨ÒåºáÏòµÄmargin£¬Èç¹ûÄãµÄ²¼¾Ö°üº¬ÔÚÒ»¸ö²ã(ÈÝÆ÷)ÖУ¬¾ÍÏóÕâÑù£º

Äã¿ÉÒÔÕâÑù¶¨ÒåʹËüºáÏò¾ÓÖУº#wrap {

width:760px; /* ÐÞ¸ÄΪÄãµÄ²ãµÄ¿í¶È */

margin:0 auto;

}

µ«ÊÇIE5/Win²»ÄÜÕýÈ·ÏÔʾÕâ¸ö¶¨Ò壬ÎÒÃDzÉÓÃÒ»¸ö·Ç³£ÓÐÓõļ¼ÇÉÀ´½â¾ö£ºÓÃtext-alignÊôÐÔ¡£¾ÍÏóÕâÑù£ºbody {

text-align:center;

}

#wrap {

width:760px; /* ÐÞ¸ÄΪÄãµÄ²ãµÄ¿í¶È */

margin:0 auto;

text-align:left;

}

µÚÒ»¸öbodyµÄtext-align:center; ¹æÔò¶¨ÒåIE5/WinÖÐbodyµÄËùÓÐÔªËØ¾ÓÖÐ(ÆäËûä¯ÀÀÆ÷Ö»Êǽ«ÎÄ×Ö¾ÓÖÐ) £¬µÚ¶þ¸ötext-align:left;Êǽ«#warpÖеÄÎÄ×Ö¾Ó×ó¡£

Ê®Îå.µ¼Èë(Import)ºÍÒþ²ØCSS

ÒòΪÀϰ汾ä¯ÀÀÆ÷²»Ö§³ÖCSS£¬Ò»¸öͨ³£µÄ×ö·¨ÊÇʹÓÃ@import¼¼ÇÉÀ´°ÑCSSÒþ²ØÆðÀ´¡£ÀýÈ磺@import url("main.css");

È»¶ø£¬Õâ¸ö·½·¨¶ÔIE4²»Æð×÷Óã¬ÕâÈÃÎÒºÜÊÇÍ·ÌÛÁËÒ»Õó×Ó¡£ºóÀ´ÎÒÓÃÕâÑùµÄд·¨£º@import "main.css";

ÕâÑù¾Í¿ÉÒÔÔÚIE4ÖÐÒ²Òþ²ØCSSÁË£¬ºÇºÇ£¬»¹½ÚÊ¡ÁË5¸ö×Ö½ÚÄØ¡£ÏëÁ˽â@importÓï·¨µÄÏêϸ˵Ã÷£¬¿ÉÒÔ¿´ÕâÀï¡¶centricle¡¯s css filter chart¡·

Ê®Áù.Õë¶ÔIEµÄÓÅ»¯

ÓÐЩʱºò£¬ÄãÐèÒª¶ÔIEä¯ÀÀÆ÷µÄbug¶¨ÒåÒ»Ð©ÌØ±ðµÄ¹æÔò£¬ÕâÀïÓÐÌ«¶àµÄCSS¼¼ÇÉ(hacks)£¬ÎÒֻʹÓÃÆäÖеÄÁ½ÖÖ·½·¨£¬²»¹Ü΢ÈíÔÚ¼´½«·¢²¼µÄIE7 beta°æÀïÊÇ·ñ¸üºÃµÄÖ§³ÖCSS£¬ÕâÁ½ÖÖ·½·¨¶¼ÊÇ×ȫµÄ¡£

  • 1.×¢Ê͵ķ½·¨
    • (a)ÔÚIEÖÐÒþ²ØÒ»¸öCSS¶¨Ò壬Äã¿ÉÒÔʹÓÃ×ÓÑ¡ÔñÆ÷(child selector):

      html>body p {

      /* ¶¨ÒåÄÚÈÝ */

      }

    • (b)ÏÂÃæÕâ¸öд·¨Ö»ÓÐIEä¯ÀÀÆ÷¿ÉÒÔÀí½â(¶ÔÆäËûä¯ÀÀÆ÷¶¼Òþ²Ø)

      * html p {

      /* declarations */

      }

    • (c)»¹ÓÐЩʱºò£¬ÄãÏ£ÍûIE/WinÓÐЧ¶øIE/MacÒþ²Ø£¬Äã¿ÉÒÔʹÓÃ"·´Ð±Ïß"¼¼ÇÉ£º

      /* \*/

      * html p {

      declarations

      }

      /* */

  • 2.Ìõ¼þ×¢ÊÍ(conditional comments)µÄ·½·¨

    ÁíÍâÒ»ÖÖ·½·¨£¬ÎÒÈÏΪ±ÈCSS¡¡Hacks¸ü¼Ó¾­µÃÆð¿¼Ñé¾ÍÊDzÉÓÃ΢ÈíµÄ˽ÓÐÊôÐÔÌõ¼þ×¢ÊÍ(conditional comments)¡£ÓÃÕâ¸ö·½·¨Äã¿ÉÒÔ¸øIEµ¥¶À¶¨ÒåһЩÑùʽ£¬¶ø²»Ó°ÏìÖ÷Ñùʽ±íµÄ¶¨Òå¡£¾ÍÏóÕâÑù£º

Ê®Æß.µ÷ÊÔ¼¼ÇÉ£º²ãÓжà´ó£¿

µ±µ÷ÊÔCSS·¢Éú´íÎó£¬Äã¾ÍÒªÏóÅŰ湤ÈË£¬ÖðÐзÖÎöCSS´úÂë¡£ÎÒͨ³£ÔÚ³öÎÊÌâµÄ²ãÉ϶¨ÒåÒ»¸ö±³¾°ÑÕÉ«£¬ÕâÑù¾ÍÄܺÜÃ÷ÏÔ¿´µ½²ãÕ¼¾Ý¶à´ó¿Õ¼ä¡£ÓÐЩÈ˽¨ÒéÓÃborder£¬Ò»°ãÇé¿öÒ²ÊÇ¿ÉÒԵ쬵«ÎÊÌâÊÇ£¬ÓÐʱºòborder »áÔö¼ÓÔªËØµÄ³ß´ç£¬border-topºÍboeder-bottom»áÆÆ»µ×ÝÏòmarginµÄÖµ£¬ËùÒÔʹÓÃbackground¸ü¼Ó°²È«Ð©¡£

ÁíÍâÒ»¸ö¾­³£³öÎÊÌâµÄÊôÐÔÊÇoutline¡£outline¿´ÆðÀ´Ïóboeder£¬µ«²»»áÓ°ÏìÔªËØµÄ³ß´ç»òÕßλÖá£Ö»ÓÐÉÙÊýä¯ÀÀÆ÷Ö§³ÖoutlineÊôÐÔ£¬ÎÒËùÖªµÀµÄÖ»ÓÐSafari¡¢OmniWeb¡¢ºÍOpera¡£

Ê®°Ë.CSS´úÂëÊéдÑùʽ

ÔÚдCSS´úÂëµÄʱºò£¬¶ÔÓÚËõ½ø¡¢¶ÏÐС¢¿Õ¸ñ£¬Ã¿¸öÈËÓÐÿ¸öÈ˵ÄÊéдϰ¹ß¡£ÔÚ¾­¹ý²»¶Ïʵ¼ùºó£¬ÎÒ¾ö¶¨²ÉÓÃÏÂÃæÕâÑùµÄÊéдÑùʽ£ºselector1,

selector2 {

property:value;

}

µ±Ê¹ÓÃÁªºÏ¶¨Òåʱ£¬ÎÒͨ³£½«Ã¿¸öÑ¡ÔñÆ÷µ¥¶ÀдһÐУ¬ÕâÑù·½±ãÔÚCSSÎļþÖÐÕÒµ½ËüÃÇ¡£ÔÚ×îºóÒ»¸öÑ¡ÔñÆ÷ºÍ´óÀ¨ºÅ{Ö®¼ä¼ÓÒ»¸ö¿Õ¸ñ£¬Ã¿¸ö¶¨ÒåÒ²µ¥¶ÀдһÐУ¬·ÖºÅÖ±½ÓÔÚÊôÐÔÖµºó£¬²»Òª¼Ó¿Õ¸ñ¡£

ÎÒϰ¹ßÔÚÿ¸öÊôÐÔÖµºóÃæ¶¼¼Ó·ÖºÅ£¬ËäÈ»¹æÔòÉÏÔÊÐí×îºóÒ»¸öÊôÐÔÖµºóÃæ¿ÉÒÔ²»Ð´·ÖºÅ£¬µ«ÊÇÈç¹ûÄãÒª¼ÓÐÂÑùʽʱÈÝÒ×Íü¼Ç²¹ÉϷֺŶø²úÉú´íÎó£¬ËùÒÔ»¹ÊǶ¼¼Ó±È½ÏºÃ¡£

×îºó£¬¹Ø±ÕµÄ´óÀ¨ºÅ}µ¥¶ÀдһÐС£

¿Õ¸ñºÍ»»ÐÐÓÐÖúÓëÔĶÁ¡£

#include "sys.h" #include "delay.h" #include "led.h" #include "usart.h" #include "adc.h" #include "mb85rs256a.h" #include "uart2_3.h" //-------------- u8 R_data_1[50]; u8 W_data_1[50]; #define MAX_TEMP_RECORDS 10 float tempRecords[MAX_TEMP_RECORDS]; // ´æ´¢Î¶ȼǼµÄÊý×é u8 tempRecordCount = 0; // µ±Ç°´æ´¢µÄ¼Ç¼Êý float lastStoredTemp = 0.0; // Éϴδ洢µÄÎÂ¶È u8 isOverThreshold = 0; // ±ê¼ÇÊÇ·ñÒѾ­´¦ÓÚ³¬ãÐֵ״̬ int main(void) { float fmIz; int i; // Ñ­»·±äÁ¿ delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); Off_JTG_fc(); //¹ØJTG¹¦ÄÜ uart_init(9600); //´®¿Ú³õʼ»¯Îª115200 LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú Config_18bit_SCL(); IWDG_Configuration(); //¶ÀÁ¢¿´ÃŹ·ÅäÖã¬4s CLEAR_LED=0; //¹Øµô74HC595 off_PWM=0;//¹ØµôPWM LCD_BL=0;//¹ØLCD±³¹â LED1=1; LED2=1; FMQ=1; iWr_I2Data(0x1d);//18bit,x2=0x1d&iexcl;¾Éè·Å´ó±¶ÊýΪx2&iexcl;¿ printf("ѧϰÓõçÇŲɼ¯Î¶ȵķ½·¨£&iexcl;\r\n"); delay_ms(100); while(1) { fmIz= minfI();//²É¼¯Î¶ÈÐźŠdelay_ms(500); LED1=~LED1; printf("µ±Ç°ÎÂ¶È = %2.1f &iexcl;ãC\r\n",fmIz); if(fmIz >= 22.0 && fmIz <= 23.0) { LED2 = 0; } else { LED2 = 1; } if(fmIz > 24.0) { FMQ = 0; } else { FMQ = 1; } // ζȳ¬¹ý20.0&iexcl;æÊ±µÄ´¦ÀíÂß¼­ if(fmIz > 20.0) { if(!isOverThreshold) // Èç¹û֮ǰ²»ÔÚ³¬ãÐֵ״̬ { isOverThreshold = 0.1; // ±ê¼ÇΪ³¬ãÐֵ״̬ // ¼ì²éÊÇ·ñÊÇеIJ»Í¬Î¶ÈÖµ if(fmIz != lastStoredTemp && tempRecordCount < MAX_TEMP_RECORDS) { tempRecords[tempRecordCount] = fmIz; tempRecordCount++; lastStoredTemp = fmIz; printf("ÒѴ洢ζÈ: %2.1f &iexcl;ãC (×ÜÊý: %d)\r\n", fmIz, tempRecordCount); } } } else { isOverThreshold = 0; // ζȻص½ãÐÖµÒÔÏ£¬ÖØÖÃ״̬ } // µ±´æÂú10¸öֵʱ·¢ËÍÊý¾Ý if(tempRecordCount == MAX_TEMP_RECORDS) { printf("----- ǰ10¸ö³¬¹ý20.0&iexcl;ãCµÄζȼǼ -----\r\n"); for(i = 0; i < MAX_TEMP_RECORDS; i++) { printf("¼Ç¼%d: %2.1f &iexcl;ãC\r\n", i+1, tempRecords[i]); } printf("----- ¼Ç¼·¢ËÍÍê³É -----\r\n"); // ÖØÖüÆÊýÒÔ±ã¼ÌÐø¼Ç¼ tempRecordCount = 0; lastStoredTemp = 0.0; } Feed_Dog(); //ι¹· } }
07-09
#include "dcmi_ov2640.h" #include "dcmi_ov2640_cfg.h" DCMI_HandleTypeDef hdcmi; // DCMI¾ä±ú DMA_HandleTypeDef DMA_Handle_dcmi; // DMA¾ä±ú volatile uint8_t DCMI_FrameState = 0; // DCMI״̬±êÖ¾£¬µ±Êý¾ÝÖ&iexcl;´«ÊäÍê³Éʱ£¬»á±» HAL_DCMI_FrameEventCallback() Öжϻص÷º¯ÊýÖà 1 volatile uint8_t OV2640_FPS ; // Ö&iexcl;ÂÊ /************************************************************************************************* * º¯ Êý Ãû: HAL_DCMI_MspInit * Èë¿Ú²ÎÊý: hdcmi - DCMI_HandleTypeDef¶¨ÒåµÄ±äÁ¿£¬¼´±íʾ¶¨ÒåµÄ DCMI ¾ä±ú * ·µ »Ø Öµ: ÎÞ * º¯Êý¹¦ÄÜ: ³õʼ»¯ DCMI Òý½Å * ˵ Ã÷: ÎÞ *************************************************************************************************/ void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(hdcmi->Instance==DCMI) { __HAL_RCC_DCMI_CLK_ENABLE(); // ʹÄÜ DCMI ÍâÉèʱÖÓ __HAL_RCC_GPIOE_CLK_ENABLE(); // ʹÄÜÏàÓ¦µÄGPIOʱÖÓ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); GPIO_OV2640_PWDN_CLK_ENABLE; // ʹÄÜPWDN Òý½ÅµÄ GPIO ʱÖÓ /**************************************************************************** Êý¾ÝÒý½Å ʱÖÓºÍͬ²½Òý½Å PH9 ------> DCMI_D0 PG9 ------> DCMI_VSYNC PH10 ------> DCMI_D1 PH8 ------> DCMI_HSYNC PH11 ------> DCMI_D2 PA6 ------> DCMI_PIXCLK PH12 ------> DCMI_D3 PH14 ------> DCMI_D4 SCCB ¿ØÖÆÒý½Å£¬³õʼ»¯ÔÚ camera_sccb.c Îļþ PD3 ------> DCMI_D5 PH7 ------> SCCB_SCL PE5 ------> DCMI_D6 PH13 ------> SCCB_SDA PE6 ------> DCMI_D7 µôµç¿ØÖÆÒý½Å PH15 ------> PWDN ******************************************************************************/ GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); // ³õʼ»¯ PWDN Òý½Å OV2640_PWDN_ON; // ¸ßµçƽ£¬½øÈëµôµçģʽ£¬ÉãÏñÍ·Í£Ö¹¹¤×÷£¬´Ëʱ¹¦ºÄ½µµ½×îµÍ GPIO_InitStruct.Pin = OV2640_PWDN_PIN; // PWDN Òý½Å GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // ÍÆÍìÊä³öģʽ GPIO_InitStruct.Pull = GPIO_PULLUP; // ÉÏÀ­ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Ëٶȵȼ¶µÍ HAL_GPIO_Init(OV2640_PWDN_PORT, &GPIO_InitStruct); // ³õʼ»¯ } } /*************************************************************************************************************************************** * º¯ Êý Ãû: MX_DCMI_Init * * º¯Êý¹¦ÄÜ: ÅäÖÃDCMIÏà¹Ø²ÎÊý * * ˵ Ã÷: 8λÊý¾Ýģʽ£¬È«Êý¾Ý&iexcl;¢È«Ö&iexcl;²¶×½£¬¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ void MX_DCMI_Init(void) { hdcmi.Instance = DCMI; hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; // Ó²¼þͬ²½Ä£Ê½£¬¼´Ê¹ÓÃÍⲿµÄVS&iexcl;¢HSÐźŽøÐÐͬ²½ hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; // ÏñËØÊ±ÖÓÉÏÉýÑØÓÐЧ hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW; // VSµÍµçƽÓÐЧ hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW; // HSµÍµçƽÓÐЧ hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME; // ²¶»ñµÈ¼¶£¬ÉèÖÃÿһÖ&iexcl;¶¼½øÐв¶»ñ hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; // 8λÊý¾Ýģʽ hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE; // ²»Ê¹ÓÃDCMIµÄJPEGģʽ hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL; // DCMI½Ó¿Ú²¶×½ËùÓÐÊý¾Ý hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD; // Ñ&iexcl;Ôñ¿ªÊ¼×Ö½Ú£¬´Ó Ö&iexcl;/ÐÐ µÄµÚÒ»¸öÊý¾Ý¿ªÊ¼²¶»ñ hdcmi.Init.LineSelectMode = DCMI_LSM_ALL; // ²¶»ñËùÓÐÐÐ hdcmi.Init.LineSelectStart = DCMI_OELS_ODD; // Ñ&iexcl;Ôñ¿ªÊ¼ÐÐ,ÔÚÖ&iexcl;¿ªÊ¼ºó²¶»ñµÚÒ»ÐÐ HAL_DCMI_Init(&hdcmi) ; HAL_NVIC_SetPriority(DCMI_IRQn, 0 ,5); // ÉèÖÃÖжÏÓÅÏȼ¶ HAL_NVIC_EnableIRQ(DCMI_IRQn); // ¿ªÆôDCMIÖÐ¶Ï //// ÔÚJPGģʽÏ£¬Ò»¶¨Òªµ¥¶ÀʹÄܸÃÖÐ¶Ï // __HAL_DCMI_ENABLE_IT(&hdcmi, DCMI_IT_FRAME); // ʹÄÜ FRAME ÖÐ¶Ï } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Init * * º¯Êý¹¦ÄÜ: ÅäÖà DMA Ïà¹Ø²ÎÊý * * ˵ Ã÷: ʹÓõÄÊÇDMA2£¬ÍâÉèµ½´æ´¢Æ÷ģʽ&iexcl;¢Êý¾Ýλ¿í32bit&iexcl;¢²¢¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ void OV2640_DMA_Init(void) { __HAL_RCC_DMA2_CLK_ENABLE(); // ʹÄÜDMA2ʱÖÓ DMA_Handle_dcmi.Instance = DMA2_Stream7; // DMA2Êý¾ÝÁ÷7 DMA_Handle_dcmi.Init.Request = DMA_REQUEST_DCMI; // DMAÇëÇóÀ´×ÔDCMI DMA_Handle_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY; // ÍâÉèµ½´æ´¢Æ÷ģʽ DMA_Handle_dcmi.Init.PeriphInc = DMA_PINC_DISABLE; // ÍâÉèµØÖ·½ûÖ¹×ÔÔö DMA_Handle_dcmi.Init.MemInc = DMA_MINC_ENABLE; // ´æ´¢Æ÷µØÖ·×ÔÔö DMA_Handle_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; // DCMIÊý¾Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; // ´æ´¢Æ÷Êý¾Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR; // Ñ­»·Ä£Ê½ DMA_Handle_dcmi.Init.Priority = DMA_PRIORITY_LOW; // ÓÅÏȼ¶µÍ DMA_Handle_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE; // ʹÄÜfifo DMA_Handle_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; // È«fifoģʽ£¬4*32bit´óÐ&iexcl; DMA_Handle_dcmi.Init.MemBurst = DMA_MBURST_SINGLE; // µ¥´Î´«Êä DMA_Handle_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE; // µ¥´Î´«Êä HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA __HAL_LINKDMA(&hdcmi, DMA_Handle, DMA_Handle_dcmi); // ¹ØÁªDCMI¾ä±ú HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 0); // ÉèÖÃÖжÏÓÅÏȼ¶ HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); // ʹÄÜÖÐ¶Ï } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Delay * Èë¿Ú²ÎÊý: Delay - ÑÓʱʱ¼ä£¬µ¥Î» ms * º¯Êý¹¦ÄÜ: ¼òµ¥ÑÓʱº¯Êý£¬²»ÊǺܾ«È· * ˵ Ã÷: ΪÁËÒÆÖ²µÄ¼ò±ãÐÔ,´Ë´¦²ÉÓÃÈí¼þÑÓʱ£¬Êµ¼ÊÏîÄ¿ÖпÉÒÔÌæ»»³ÉRTOSµÄÑÓʱ»òÕßHAL¿âµÄÑÓʱ *****************************************************************************************************************************************/ void OV2640_Delay(volatile uint32_t Delay) { volatile uint16_t i; while (Delay --) { for (i = 0; i < 20000; i++); } // HAL_Delay(Delay); // ¿ÉʹÓÃHAL¿âµÄÑÓʱ } /*************************************************************************************************************************************** * º¯ Êý Ãû: DCMI_OV2640_Init * * º¯Êý¹¦ÄÜ: ³õʼSCCB&iexcl;¢DCMI&iexcl;¢DMAÒÔ¼°ÅäÖÃOV2640 * *****************************************************************************************************************************************/ int8_t DCMI_OV2640_Init(void) { uint16_t Device_ID; // ¶¨Òå±äÁ¿´æ´¢Æ÷¼þID SCCB_GPIO_Config(); // SCCBÒý½Å³õʼ»¯ MX_DCMI_Init(); // ³õʼ»¯DCMIÅäÖÃÒý½Å OV2640_DMA_Init(); // ³õʼ»¯DMAÅäÖà OV2640_Reset(); // Ö´ÐÐÈí¼þ¸´Î» Device_ID = OV2640_ReadID(); // ¶ÁÈ&iexcl;Æ÷¼þID if( (Device_ID == 0x2640) || (Device_ID == 0x2642) ) // ½øÐÐÆ¥Å䣬ʵ¼ÊµÄÆ÷¼þID¿ÉÄÜÊÇ 0x2640 »òÕß 0x2642 { printf ("OV2640 OK,ID:0x%X\r\n",Device_ID); // Æ¥Åäͨ¹ý OV2640_Config( OV2640_SVGA_Config ); // ÅäÖà SVGAģʽ ------> 800*600£¬ ×î´óÖ&iexcl;ÂÊ30Ö&iexcl; // OV2640_Config( OV2640_UXGA_Config ); // ÅäÖà UXGAģʽ ------> 1600*1200£¬×î´óÖ&iexcl;ÂÊ15Ö&iexcl; OV2640_Set_Framesize(OV2640_Width,OV2640_Height); // ÉèÖÃOV2640Êä³öµÄͼÏñ´óÐ&iexcl; OV2640_DCMI_Crop(Display_Width, Display_Height, OV2640_Width, OV2640_Height ); // ½«OV2640Êä³öͼÏñ²Ã¼ô³ÉÊÊÓ¦ÆÁÄ»µÄ´óÐ&iexcl; return OV2640_Success; // ·µ»Ø³É¹¦±êÖ¾ } else { printf ("OV2640 ERROR!!!!! ID:%X\r\n",Device_ID); // ¶ÁÈ&iexcl;ID´íÎó return OV2640_Error; // ·µ»Ø´íÎó±êÖ¾ } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Continuous * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA½«Òª´«ÊäµÄµØÖ·£¬¼´ÓÃÓÚ´æ´¢ÉãÏñÍ·Êý¾ÝµÄ´æ´¢ÇøµØÖ· * DMA_BufferSize - ´«ÊäµÄÊý¾Ý´óÐ&iexcl;£¬32λ¿í * * º¯Êý¹¦ÄÜ: Æô¶¯DMA´«Ê䣬Á¬ÐøÄ£Ê½ * * ˵ Ã÷: 1. ¿ªÆôÁ¬ÐøÄ£Ê½Ö®ºó£¬»áÒ»Ö±½øÐд«Ê䣬³ý·Ç¹ÒÆð»òÕßÍ£Ö¹DCMI * 2. OV2640ʹÓÃRGB565ģʽʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö½ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý¾ÝΪ32λ¿í£¬¼ÆËã DMA_BufferSize ʱ£¬ÐèÒª³ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ&iexcl; 240*240·Ö±æÂÊ µÄͼÏñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö½ÚµÄÊý¾Ý£¬ * Ôò DMA_BufferSize = 115200 / 4 = 28800 &iexcl;£ *LXB *****************************************************************************************************************************************/ void OV2640_DMA_Transmit_Continuous(uint32_t DMA_Buffer,uint32_t DMA_BufferSize) { DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR; // Ñ­»·Ä£Ê½ HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA // ʹÄÜDCMI²É¼¯Êý¾Ý,Á¬Ðø²É¼¯Ä£Ê½ HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)DMA_Buffer,DMA_BufferSize); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Snapshot * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA½«Òª´«ÊäµÄµØÖ·£¬¼´ÓÃÓÚ´æ´¢ÉãÏñÍ·Êý¾ÝµÄ´æ´¢ÇøµØÖ· * DMA_BufferSize - ´«ÊäµÄÊý¾Ý´óÐ&iexcl;£¬32λ¿í * * º¯Êý¹¦ÄÜ: Æô¶¯DMA´«Ê䣬¿ìÕÕģʽ£¬´«ÊäÒ»Ö&iexcl;ͼÏñºóÍ£Ö¹ * * ˵ Ã÷: 1. ¿ìÕÕģʽ£¬Ö»´«ÊäÒ»Ö&iexcl;µÄÊý¾Ý * 2. OV2640ʹÓÃRGB565ģʽʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö½ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý¾ÝΪ32λ¿í£¬¼ÆËã DMA_BufferSize ʱ£¬ÐèÒª³ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ&iexcl; 240*240·Ö±æÂÊ µÄͼÏñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö½ÚµÄÊý¾Ý£¬ * Ôò DMA_BufferSize = 115200 / 4 = 28800 &iexcl;£ * 4. ʹÓøÃģʽ´«ÊäÍê³ÉÖ®ºó£¬DCMI»á±»¹ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ÐèÒªµ÷Óà OV2640_DCMI_Resume() »Ö¸´DCMI * *****************************************************************************************************************************************/ void OV2640_DMA_Transmit_Snapshot(uint32_t DMA_Buffer,uint32_t DMA_BufferSize) { DMA_Handle_dcmi.Init.Mode = DMA_NORMAL; // Õý³£Ä£Ê½ HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, (uint32_t)DMA_Buffer,DMA_BufferSize); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Suspend * * º¯Êý¹¦ÄÜ: ¹ÒÆðDCMI£¬Í£Ö¹²¶»ñÊý¾Ý * * ˵ Ã÷: 1. ¿ªÆôÁ¬ÐøÄ£Ê½Ö®ºó£¬ÔÙµ÷Óøú¯Êý£¬»áÍ£Ö¹²¶»ñDCMIµÄÊý¾Ý * 2. ¿ÉÒÔµ÷Óà OV2640_DCMI_Resume() »Ö¸´DCMI * 3. ÐèҪעÒâµÄ£¬¹ÒÆðDCMIÆÚ¼ä£¬DMAÊÇûÓÐÍ£Ö¹¹¤×÷µÄ *LXB *****************************************************************************************************************************************/ void OV2640_DCMI_Suspend(void) { HAL_DCMI_Suspend(&hdcmi); // ¹ÒÆðDCMI } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Resume * * º¯Êý¹¦ÄÜ: »Ö¸´DCMI£¬¿ªÊ¼²¶»ñÊý¾Ý * * ˵ Ã÷: 1. µ±DCMI±»¹ÒÆðʱ£¬¿ÉÒÔµ÷Óøú¯Êý»Ö¸´ * 2. ʹÓà OV2640_DMA_Transmit_Snapshot() ¿ìÕÕģʽ£¬´«ÊäÍê³ÉÖ®ºó£¬DCMIÒ²»á±»¹ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ * ÐèÒªµ÷Óñ¾º¯Êý»Ö¸´DCMI²¶»ñ * *****************************************************************************************************************************************/ void OV2640_DCMI_Resume(void) { (&hdcmi)->State = HAL_DCMI_STATE_BUSY; // ±ä¸üDCMI±êÖ¾ (&hdcmi)->Instance->CR |= DCMI_CR_CAPTURE; // ¿ªÆôDCMI²¶»ñ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Stop * * º¯Êý¹¦ÄÜ: ½ûÖ¹DCMIµÄDMAÇëÇó£¬Í£Ö¹DCMI²¶»ñ£¬½ûÖ¹DCMIÍâÉè * *****************************************************************************************************************************************/ void OV2640_DCMI_Stop(void) { HAL_DCMI_Stop(&hdcmi); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Crop * * Èë¿Ú²ÎÊý: Displey_XSize &iexcl;¢Displey_YSize - ÏÔʾÆ÷µÄ³¤¿í * Sensor_XSize&iexcl;¢Sensor_YSize - ÉãÏñÍ·´«¸ÐÆ÷Êä³öͼÏñµÄ³¤¿í * * º¯Êý¹¦ÄÜ: ʹÓÃDCMIµÄ²Ã¼ô¹¦ÄÜ£¬½«´«¸ÐÆ÷Êä³öµÄͼÏñ²Ã¼ô³ÉÊÊÓ¦ÆÁÄ»µÄ´óÐ&iexcl; * * ˵ Ã÷: 1. ÒòΪÉãÏñÍ·Êä³öµÄ»­Ãæ±ÈÀý¹Ì¶¨Îª4:3£¬²»Ò»¶¨Æ¥ÅäÏÔʾÆ÷ * 2. ÐèҪעÒâµÄÊÇ£¬ÉãÏñÍ·Êä³öµÄͼÏñ³¤&iexcl;¢¿í±ØÐëÒªÄܱ»4Õû³ý£&iexcl;£¨ ʹÓÃOV2640_Set_Framesizeº¯Êý½øÐÐÉèÖà £© * 3. DCMIµÄˮƽÓÐЧÏñËØÒ²±ØÐëÒªÄܱ»4Õû³ý£&iexcl; * 4. º¯Êý»á¼ÆËãˮƽºÍ´¹Ö±Æ«ÒÆ£¬¾&iexcl;Á¿Èû­Ãæ¾ÓÖвüô *****************************************************************************************************************************************/ int8_t OV2640_DCMI_Crop(uint16_t Displey_XSize,uint16_t Displey_YSize,uint16_t Sensor_XSize,uint16_t Sensor_YSize ) { uint16_t DCMI_X_Offset,DCMI_Y_Offset; // ˮƽºÍ´¹Ö±Æ«ÒÆ£¬´¹Ö±´ú±íµÄÊÇÐÐÊý£¬Ë®Æ½´ú±íµÄÊÇÏñËØÊ±ÖÓÊý£¨PCLKÖÜÆÚÊý£© uint16_t DCMI_CAPCNT; // ˮƽÓÐЧÏñËØ£¬´ú±íµÄÊÇÏñËØÊ±ÖÓÊý£¨PCLKÖÜÆÚÊý£© uint16_t DCMI_VLINE; // ´¹Ö±ÓÐЧÐÐÊý if( (Displey_XSize>=Sensor_XSize)|| (Displey_YSize>=Sensor_YSize) ) { // printf("ʵ¼ÊÏÔʾµÄ³ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ·Êä³öµÄ³ß´ç£¬Í˳öDCMI²Ã¼ô\r\n"); return OV2640_Error; //Èç¹ûʵ¼ÊÏÔʾµÄ³ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ·Êä³öµÄ³ß´ç£¬ÔòÍ˳öµ±Ç°º¯Êý£¬²»½øÐвüô } // ÔÚÉèÖÃΪRGB565¸ñʽʱ£¬Ë®Æ½Æ«ÒÆ£¬±ØÐëÊÇÆæÊý£¬·ñÔò»­ÃæÉ«²Ê²»ÕýÈ·£¬ // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö½Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔ±ØÐë´ÓÆæÊýλ¿ªÊ¼£¬²»È»Êý¾Ý»á´íÂÒ£¬ // ÐèҪעÒâµÄÊÇ£¬¼Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ £&iexcl; DCMI_X_Offset = Sensor_XSize - Displey_XSize; // ʵ¼Ê¼ÆËã¹ý³ÌΪ£¨Sensor_XSize - LCD_XSize£©/2*2 // ¼ÆËã´¹Ö±Æ«ÒÆ£¬¾&iexcl;Á¿Èû­Ãæ¾ÓÖвüô£¬¸ÃÖµ´ú±íµÄÊÇÐÐÊý£¬ DCMI_Y_Offset = (Sensor_YSize - Displey_YSize)/2-1; // ¼Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ£¬ËùÒÔÒª-1 // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö½Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔÒª³Ë2 // ×îÖյõ½µÄ¼Ä´æÆ÷Öµ£¬±ØÐëÒªÄܱ»4Õû³ý£&iexcl; DCMI_CAPCNT = Displey_XSize*2-1; // ¼Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ£¬ËùÒÔÒª-1 DCMI_VLINE = Displey_YSize-1; // ´¹Ö±ÓÐЧÐÐÊý // printf("%d %d %d %d\r\n",DCMI_X_Offset,DCMI_Y_Offset,DCMI_CAPCNT,DCMI_VLINE); HAL_DCMI_ConfigCrop (&hdcmi,DCMI_X_Offset,DCMI_Y_Offset,DCMI_CAPCNT,DCMI_VLINE);// ÉèÖòüô´°¿Ú HAL_DCMI_EnableCrop(&hdcmi); // ʹÄܲüô return OV2640_Success; } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Reset * * º¯Êý¹¦ÄÜ: Ö´ÐÐÈí¼þ¸´Î» * * ˵ Ã÷: ÔÚÅäÖÃOV2640֮ǰ£¬ÐèÒªÖ´ÐÐÒ»´ÎÈí¼þ¸´Î» * *****************************************************************************************************************************************/ void OV2640_Reset(void) { OV2640_Delay(5); // µÈ´ýÄ£¿éÉϵçÎȶ¨£¬×îÉÙ5ms£¬È»ºóÀ­µÍPWDN OV2640_PWDN_OFF; // PWDN Òý½ÅÊä³öµÍµçƽ£¬²»¿ªÆôµôµçģʽ£¬ÉãÏñÍ·Õý³£¹¤×÷£¬´ËʱÉãÏñÍ·Ä£¿éµÄ°×É«LED»áµãÁÁ // ¸ù¾ÝOV2640µÄÉϵçʱÐò£¬Ó²¼þ¸´Î»µÄ³ÖÐøÊ±¼äÒª>=3ms£¬Â¹Ð&iexcl;°àµÄOV2640²ÉÓÃÓ²¼þRC¸´Î»£¬³ÖÐøÊ±¼ä´ó¸ÅÔÚ6ms×óÓÒ // Òò´Ë¼ÓÈëÑÓʱ£¬µÈ´ýÓ²¼þ¸´Î»Íê³É²¢Îȶ¨ÏÂÀ´ OV2640_Delay(5); SCCB_WriteReg( OV2640_SEL_Registers, OV2640_SEL_SENSOR); // Ñ&iexcl;Ôñ SENSOR ¼Ä´æÆ÷×é SCCB_WriteReg( OV2640_SENSOR_COM7, 0x80); // Æô¶¯Èí¼þ¸´Î» // ¸ù¾ÝOV2640µÄÈí¼þ¸´Î»Ê±Ðò£¬Èí¼þ¸´Î»Ö´Ðкó£¬Òª>=2ms·½¿ÉÖ´ÐÐSCCBÅäÖ㬴˴¦²ÉÓñ£ÊØÒ»µãµÄ²ÎÊý£¬ÑÓʱ10ms OV2640_Delay(10); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_ReadID * * º¯Êý¹¦ÄÜ: ¶ÁÈ&iexcl; OV2640 µÄÆ÷¼þID * * ˵ Ã÷: ʵ¼ÊµÄÆ÷¼þID¿ÉÄÜÊÇ 0x2640 »òÕß 0x2642£¬Åú´Î²»Í¬ID¿ÉÄܻ᲻һÑù * *****************************************************************************************************************************************/ uint16_t OV2640_ReadID(void) { uint8_t PID_H,PID_L; // ID±äÁ¿ SCCB_WriteReg( OV2640_SEL_Registers, OV2640_SEL_SENSOR); // Ñ&iexcl;Ôñ SENSOR ¼Ä´æÆ÷×é PID_H = SCCB_ReadReg(OV2640_SENSOR_PIDH); // ¶ÁÈ&iexcl;ID¸ß×Ö½Ú PID_L = SCCB_ReadReg(OV2640_SENSOR_PIDL); // ¶ÁÈ&iexcl;IDµÍ×Ö½Ú return(PID_H<<8)|PID_L; // ·µ»ØÍêÕûµÄÆ÷¼þID } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Config * * Èë¿Ú²ÎÊý: (*ConfigData)[2] - ÒªÅäÖõIJÎÊý£¬¿ÉÅäÖÃΪ OV2640_SVGA_Config »ò OV2640_UXGA_Config * * º¯Êý¹¦ÄÜ: ÅäÖà OV2640 ´«¸ÐÆ÷ºÍDSP²ÎÊý * * ˵ Ã÷: 1. ¿ÉÅäÖÃΪ SVGA »òÕß UXGAģʽ * 2. SVGA ·Ö±æÂÊΪ800*600£¬×î¸ßÖ§³Ö30Ö&iexcl; * 3. UXGA ·Ö±æÂÊΪ1600*1200£¬×î¸ßÖ§³Ö15Ö&iexcl; * 4. ²ÎÊý¶¨ÒåÔÚ dcmi_ov2640_cfg.h * *****************************************************************************************************************************************/ void OV2640_Config( const uint8_t (*ConfigData)[2] ) { uint32_t i; // ¼ÆÊý±äÁ¿ for( i=0; ConfigData[i][0]; i++) { SCCB_WriteReg( ConfigData[i][0], ConfigData[i][1]); // ½øÐвÎÊýÅäÖà } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Framesize * * Èë¿Ú²ÎÊý: pixformat - ÏñËØ¸ñʽ£¬¿ÉÑ&iexcl;Ôñ Pixformat_RGB565&iexcl;¢Pixformat_JPEG * * º¯Êý¹¦ÄÜ: ÉèÖÃÊä³öµÄÏñËØ¸ñʽ * *****************************************************************************************************************************************/ void OV2640_Set_Pixformat(uint8_t pixformat) { const uint8_t (*ConfigData)[2]; uint32_t i; // ¼ÆÊý±äÁ¿ switch (pixformat) { case Pixformat_RGB565: ConfigData = OV2640_RGB565_Config; break; case Pixformat_JPEG: ConfigData = OV2640_JPEG_Config; break; default: break; } for( i=0; ConfigData[i][0]; i++) { SCCB_WriteReg( ConfigData[i][0], ConfigData[i][1]); // ½øÐвÎÊýÅäÖà } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Framesize * * Èë¿Ú²ÎÊý: width - ʵ¼ÊÊä³öͼÏñµÄ³¤¶È£¬height - ʵ¼ÊÊä³öͼÏñµÄ¿í¶È * * º¯Êý¹¦ÄÜ: ÉèÖÃʵ¼ÊÊä³öµÄͼÏñ´óÐ&iexcl; * * ˵ Ã÷: 1. OV2640ÉèÖÃΪ SVGA£¨800*600£© »òÕß UXGA£¨1600*1200£©Ä£Ê½£¬Í¼Ïñ´óÐ&iexcl;ͨ³£Óëʵ¼ÊÓÃµÄÆÁÄ»·Ö±æÂʲ»Ò»Ñù£¬ * Òò´Ë¿ÉÒÔµ÷Óôκ¯Êý£¬ÉèÖÃʵ¼ÊÊä³öµÄͼÏñ´óÐ&iexcl; * 2. ÐèҪעÒâµÄÊÇ£¬ÒªÉèÖõÄͼÏñ³¤&iexcl;¢¿í±ØÐëÄܱ»4Õû³ý£&iexcl; * 3. ²¢²»ÊÇÉèÖÃÊä³öµÄͼÏñ·Ö±æÂÊÔ½Ð&iexcl;Ö&iexcl;ÂʾÍÔ½¸ß£¬Ö&iexcl;ÂÊÖ»ºÍÅäÖõÄģʽÓйأ¬ÀýÈçÅäÖÃΪSVGA×î¸ßÖ»ÄÜÖ§³Ö30Ö&iexcl; * *****************************************************************************************************************************************/ int8_t OV2640_Set_Framesize(uint16_t width,uint16_t height) { if( (width%4)||(height%4) ) // Êä³öͼÏñµÄ´óÐ&iexcl;Ò»¶¨ÒªÄܱ»4Õû³ý { return OV2640_Error; // ·µ»Ø´íÎó±êÖ¾ } SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ&iexcl;Ôñ DSP¼Ä´æÆ÷×é SCCB_WriteReg(0X5A, width/4 &0XFF); // ʵ¼ÊͼÏñÊä³öµÄ¿í¶È£¨OUTW£©£¬7~0 bit£¬¼Ä´æÆ÷µÄÖµµÈÓÚʵ¼ÊÖµ/4 SCCB_WriteReg(0X5B, height/4 &0XFF); // ʵ¼ÊͼÏñÊä³öµÄ¸ß¶È£¨OUTH£©£¬7~0 bit£¬¼Ä´æÆ÷µÄÖµµÈÓÚʵ¼ÊÖµ/4 SCCB_WriteReg(0X5C, (width/4>>8&0X03)|(height/4>>6&0x04) ); // ÉèÖÃZMHHµÄBit[2:0]£¬Ò²¾ÍÊÇOUTH µÄµÚ 8 bit£¬OUTW µÄµÚ 9~8 bit£¬ SCCB_WriteReg(OV2640_DSP_RESET,0X00); // ¸´Î» return OV2640_Success; // ³É¹¦ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Horizontal_Mirror * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í¼Ïñ»áˮƽ¾µÏñ£¬ÖÃ0ʱ»Ö¸´Õý³£ * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃÊä³öµÄͼÏñÊÇ·ñ½øÐÐˮƽ¾µÏñ * *****************************************************************************************************************************************/ int8_t OV2640_Set_Horizontal_Mirror( int8_t ConfigState ) { uint8_t OV2640_Reg; // ¼Ä´æÆ÷µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ&iexcl;Ôñ SENSOR ¼Ä´æÆ÷×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ&iexcl; 0x04 µÄ¼Ä´æÆ÷Öµ // REG04,¼Ä´æÆ÷×é4£¬¼Ä´æÆ÷µØÖ·Îª 0x04£¬¸Ã¼Ä´æÆ÷µÄBit[7]£¬ÓÃÓÚÉèÖÃˮƽÊÇ·ñ¾µÏñ if ( ConfigState == OV2640_Enable ) // Èç¹ûʹÄܾµÏñ { OV2640_Reg |= 0X80; // Bit[7]ÖÃ1Ôò¾µÏñ } else // È&iexcl;Ïû¾µÏñ { OV2640_Reg &= ~0X80; // Bit[7]ÖÃ0ÔòÊÇÕý³£Ä£Ê½ } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë¼Ä´æÆ÷ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Vertical_Flip * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í¼Ïñ»á´¹Ö±·­×ª£¬ÖÃ0ʱ»Ö¸´Õý³£ * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃÊä³öµÄͼÏñÊÇ·ñ½øÐд¹Ö±·­×ª * *****************************************************************************************************************************************/ int8_t OV2640_Set_Vertical_Flip( int8_t ConfigState ) { uint8_t OV2640_Reg; // ¼Ä´æÆ÷µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ&iexcl;Ôñ SENSOR ¼Ä´æÆ÷×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ&iexcl; 0x04 µÄ¼Ä´æÆ÷Öµ // REG04,¼Ä´æÆ÷×é4£¬¼Ä´æÆ÷µØÖ·Îª 0x04£¬¸Ã¼Ä´æÆ÷µÄµÚBit[6]£¬ÓÃÓÚÉèÖÃˮƽÊÇ´¹Ö±·­×ª if ( ConfigState == OV2640_Enable ) { // ´Ë´¦ÉèÖòο¼OpenMVµÄÇý¶¯ // Bit[4]¾ßÌåµÄ×÷ÓÃÊÇʲôÊÖ²áûÓÐ˵£¬Èç¹û´¹Ö±·­×ªÖ®ºó£¬¸Ãλ²»ÖÃ1µÄ»°£¬ÑÕÉ«»á²»¶Ô OV2640_Reg |= 0X40|0x10 ; // Bit[6]ÖÃ1ʱ£¬Í¼Ïñ»á´¹Ö±·­×ª } else // È&iexcl;Ïû·­×ª { OV2640_Reg &= ~(0X40|0x10 ); // ½«Bit[6]ºÍBit[4]¶¼Ð´0 } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë¼Ä´æÆ÷ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Saturation * * Èë¿Ú²ÎÊý: Saturation - ±¥ºÍ¶È£¬¿ÉÉèÖÃΪ5¸öµÈ¼¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2.±¥ºÍ¶ÈÔ½¸ß£¬É«²Ê¾ÍÔ½ÏÊÑÞ£¬µ«µ±ÏàÓ¦µÄÇåÎú¶È»áϽµ£¬Ôëµã±ä¶à * *****************************************************************************************************************************************/ void OV2640_Set_Saturation(int8_t Saturation) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ&iexcl;Ôñ DSP¼Ä´æÆ÷×é switch (Saturation) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x68); SCCB_WriteReg(OV2640_DSP_BPDATA,0x68); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x48); SCCB_WriteReg(OV2640_DSP_BPDATA,0x48); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x38); SCCB_WriteReg(OV2640_DSP_BPDATA,0x38); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x28); SCCB_WriteReg(OV2640_DSP_BPDATA,0x28); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Brightness * * Èë¿Ú²ÎÊý: Brightness - ÁÁ¶È£¬¿ÉÉèÖÃΪ5¸öµÈ¼¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2. ÁÁ¶ÈÔ½¸ß£¬»­Ãæ¾ÍÔ½Ã÷ÁÁ£¬µ«ÊÇ»á±äÄ£ºýһЩ * *****************************************************************************************************************************************/ void OV2640_Set_Brightness(int8_t Brightness) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ&iexcl;Ôñ DSP¼Ä´æÆ÷×é switch (Brightness) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x40); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x30); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x10); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Contrast * * Èë¿Ú²ÎÊý: Contrast - ¶Ô±È¶È£¬¿ÉÉèÖÃΪ5¸öµÈ¼¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2. ¶Ô±È¶ÈÔ½¸ß£¬»­ÃæÔ½ÇåÎú£¬ºÚ°×Ô½¼Ó·ÖÃ÷ * *****************************************************************************************************************************************/ void OV2640_Set_Contrast(int8_t Contrast) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ&iexcl;Ôñ DSP¼Ä´æÆ÷×é switch (Contrast) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x28); SCCB_WriteReg(OV2640_DSP_BPDATA,0x0c); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x24); SCCB_WriteReg(OV2640_DSP_BPDATA,0x16); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x1c); SCCB_WriteReg(OV2640_DSP_BPDATA,0x2a); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x18); SCCB_WriteReg(OV2640_DSP_BPDATA,0x34); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Effect * * Èë¿Ú²ÎÊý: effect_Mode - ÌØÐ§Ä£Ê½£¬¿ÉÑ&iexcl;Ôñ²ÎÊý OV2640_Effect_Normal&iexcl;¢OV2640_Effect_Negative&iexcl;¢ * OV2640_Effect_BW&iexcl;¢OV2640_Effect_BW_Negative * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃOV2640µÄÌØÐ§£¬Õý³£&iexcl;¢¸ºÆ¬&iexcl;¢ºÚ°×&iexcl;¢ºÚ°×+¸ºÆ¬µÈģʽ * * ˵ Ã÷: ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * *****************************************************************************************************************************************/ void OV2640_Set_Effect(uint8_t effect_Mode) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ&iexcl;Ôñ DSP¼Ä´æÆ÷×é switch (effect_Mode) { case OV2640_Effect_Normal: // Õý³£Ä£Ê½ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_Negative: // ¸ºÆ¬Ä£Ê½£¬Ò²¾ÍÊÇÑÕɫȫ²¿È&iexcl;·´ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x40); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_BW: // ºÚ°×ģʽ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x18); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_BW_Negative: // ºÚ°×+¸ºÆ¬Ä£Ê½ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: HAL_DCMI_FrameEventCallback * * º¯Êý¹¦ÄÜ: Ö&iexcl;»Øµ÷º¯Êý£¬Ã¿´«ÊäÒ»Ö&iexcl;Êý¾Ý£¬»á½øÈë¸ÃÖжϷþÎñº¯Êý * * ˵ Ã÷: ÿ´Î´«ÊäÍêÒ»Ö&iexcl;£¬¶ÔÏàÓ¦µÄ±ê־λ½øÐвÙ×÷£¬²¢¼ÆËãÖ&iexcl;ÂÊ *****************************************************************************************************************************************/ void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) { static uint32_t DCMI_Tick = 0; // ÓÃÓÚ±£´æµ±Ç°µÄʱ¼ä¼ÆÊýÖµ static uint8_t DCMI_Frame_Count = 0; // Ö&iexcl;Êý¼ÆÊý if(HAL_GetTick() - DCMI_Tick >= 1000) // ÿ¸ô 1s ¼ÆËãÒ»´ÎÖ&iexcl;ÂÊ { DCMI_Tick = HAL_GetTick(); // ÖØÐ»ñÈ&iexcl;µ±Ç°Ê±¼ä¼ÆÊýÖµ OV2640_FPS = DCMI_Frame_Count; // »ñµÃfps DCMI_Frame_Count = 0; // ¼ÆÊýÇå0 } DCMI_Frame_Count ++; // û½øÈëÒ»´ÎÖжϣ¨Ã¿´Î´«ÊäÍêÒ»Ö&iexcl;Êý¾Ý£©£¬¼ÆÊýÖµ+1 DCMI_FrameState = 1; // ´«ÊäÍê³É±ê־λÖÃ1 } /*************************************************************************************************************************************** * º¯ Êý Ãû: HAL_DCMI_ErrorCallback * * º¯Êý¹¦ÄÜ: ´íÎ󻨵÷º¯Êý * * ˵ Ã÷: µ±·¢ÉúDMA´«Êä´íÎó»òÕßFIFOÒç³ö´íÎó¾Í»á½øÈë *****************************************************************************************************************************************/ void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi) { // if( HAL_DCMI_GetError(hdcmi) == HAL_DCMI_ERROR_OVR) // { // printf("FIFOÒç³ö´íÎó£&iexcl;£&iexcl;£&iexcl;\r\n"); // } printf("error:0x%x£&iexcl;£&iexcl;£&iexcl;\r\n",HAL_DCMI_GetError(hdcmi)); } /*********************************************************************************************************************************************************************************************************************************************LXB*************/ // ¹Ð&iexcl;°à 代分析
05-12
////////////////////////////////////////////////////////////////////////////////// //±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾­×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ; //ÐÀÞ±µç×Ó // // ÎÄ ¼þ Ãû :yanwu.c // °æ ±¾ ºÅ : v1.0 // ×÷ Õß : ÐÀÞ±µç×Ó // Éú³ÉÈÕÆÚ : 20200101 // ×î½üÐÞ¸Ä : // ¹¦ÄÜÃèÊö :Ö÷º¯Êý // ÐÞ¸ÄÀúÊ· : // ÈÕ ÆÚ : // ×÷ Õß : ÐÀÞ±µç×Ó // ÐÞ¸ÄÄÚÈÝ : ´´½¨Îļþ //°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿&iexcl;£ //Copyright(C) ÐÀÞ±µç×Ó2020/3/16 //All rights reserved //******************************************************************************/. //³ÌÐòÍ·º¯Êý #include <reg52.h> #include <intrins.h> //°üº¬Í·Îļþ //ÏÔʾº¯Êý #include <display.h> //ºê¶¨Òå #define uint unsigned int #define uchar unsigned char //¹Ü½ÅÉùÃ÷ sbit LED_R= P2^2;//ºìµÆ sbit LED_G= P2^0;//ÂÌµÆ sbit FENG = P2^5;//·äÃùÆ÷ //sbit san=P3^4; //·çÉÈ¿ØÖÆ£¨Ñ&iexcl;Å䣩 sbit CS = P1^4; sbit Clk = P1^2; sbit DATI = P1^3; sbit DATO = P1^3; //ADC0832Òý½Å //°´¼ü sbit Key1=P2^6; //ÉèÖüü sbit Key2=P2^7; //¼Ó°´¼ü sbit Key3=P3^7; //¼õ°´¼ü bit bdata flag; //±¨¾¯±ê־λ uchar set; //ÉèÖÃ״̬ /*******************************¶¨ÒåÈ«¾Ö±äÁ¿********************************/ unsigned char dat = 0; //ADÖµ unsigned char CH=0; //ͨµÀ±äÁ¿ unsigned int sum=0; //ƽ¾ùÖµ¼ÆËãʱµÄ×ÜÊý unsigned char m=0; //º¯ÊýÉùÃ÷ extern uchar ADC0809(); extern void Key(); //¾Æ¾«º¬Á¿±äÁ¿ uchar temp=0; uchar WARNING=25; //±¨¾¯Öµ /**************************************************************************** º¯Êý¹¦ÄÜ:ADת»»×Ó³ÌÐò Èë¿Ú²ÎÊý:CH ³ö¿Ú²ÎÊý:dat ****************************************************************************/ unsigned char adc0832(unsigned char CH) { unsigned char i,test,adval; adval = 0x00; test = 0x00; Clk = 0; //³õʼ»¯ DATI = 1; _nop_(); CS = 0; _nop_(); Clk = 1; _nop_(); if ( CH == 0x00 ) //ͨµÀÑ&iexcl;Ôñ { Clk = 0; DATI = 1; //ͨµÀ0µÄµÚһλ _nop_(); Clk = 1; _nop_(); Clk = 0; DATI = 0; //ͨµÀ0µÄµÚ¶þλ _nop_(); Clk = 1; _nop_(); } else { Clk = 0; DATI = 1; //ͨµÀ1µÄµÚһλ _nop_(); Clk = 1; _nop_(); Clk = 0; DATI = 1; //ͨµÀ1µÄµÚ¶þλ _nop_(); Clk = 1; _nop_(); } Clk = 0; DATI = 1; for( i = 0;i < 8;i++ ) //¶ÁÈ&iexcl;ǰ8λµÄÖµ { _nop_(); adval <<= 1; Clk = 1; _nop_(); Clk = 0; if (DATO) adval |= 0x01; else adval |= 0x00; } for (i = 0; i < 8; i++) //¶ÁÈ&iexcl;ºó8λµÄÖµ { test >>= 1; if (DATO) test |= 0x80; else test |= 0x00; _nop_(); Clk = 1; _nop_(); Clk = 0; } if (adval == test) //±È½Ïǰ8λÓëºó8λµÄÖµ£¬Èç¹û²»ÏàͬÉáÈ¥&iexcl;£ÈôÒ»Ö±³öÏÖÏÔʾΪÁ㣬Ç뽫¸ÃÐÐÈ¥µô dat = test; nop_(); CS = 1; //ÊÍ·ÅADC0832 DATO = 1; Clk = 1; return dat; } void init() //³õʼ»¯º¯Êý { TMOD=0x01; //¹¤×÷·½Ê½ TL0=0xb0; TH0=0x3c; //¸³³õÖµ£¨12MHz¾§ÕñµÄ50ms£© EA=1; //´ò¿ªÖжÏ×Ü¿ª¹Ø ET0=1; //´ò¿ªÖжÏÔÊÐí¿ª¹Ø TR0=1; //´ò¿ª¶¨Ê±Æ÷¿ª¹Ø } void main() //Ö÷º¯Êý { Init1602();//³õʼ»¯ÏÔʾ init(); //³õʼ»¯¶¨Ê±Æ÷ while(1) //½øÈëÑ­»· { for(m=0;m<50;m++) //¶Á50´ÎADÖµ sum = adc0832(0)+sum; //¶Áµ½µÄADÖµ£¬½«¶Áµ½µÄÊý¾ÝÀÛ¼Óµ½sum temp=sum/50; //Ìø³öÉÏÃæµÄforÑ­»·ºó£¬½«ÀÛ¼ÓµÄ×ÜÊý³ýÒÔ50µÃµ½Æ½¾ùÖµtemp sum=0; //ƽ¾ùÖµ¼ÆËãÍê³Éºó£¬½«×ÜÊýÇåÁã if(set==0) //Ö»ÓÐÔÚ·ÇÉèÖÃ״̬ʱ£¬ Display_1602(temp,WARNING); //²ÅË¢ÐÂÏÔʾʵʱŨ¶ÈÖµ if(temp<WARNING&&set==0) //·ÇÉèÖÃʱµ±Å¨¶ÈÖµÐ&iexcl;ÓÚ±¨¾¯ÖµÊ± { flag=0; //±¨¾¯±ê־λÖÃ0£¬²»±¨¾¯ } else if(temp>WARNING&&set==0) //·ÇÉèÖÃʱµ±Å¨¶ÈÖµ´óÓÚ±¨¾¯ÖµÊ± { flag=1; //±¨¾¯±ê־λÖÃ1 } Key(); //ɨÃè°´¼ü } } void Key() //°´¼üº¯Êý { if(Key1==0) //ÉèÖüü°´ÏÂʱ { while(Key1==0); //¼ì²â°´¼üÊÇ·ñÊÍ·Å FENG=0; //·äÃùÆ÷Ïì set++; //ÉèÖÃ״̬±êÖ¾¼Ó flag=0; //Í£Ö¹±¨¾¯ // san=1; //·çÉÈֹͣת¶¯£¨Ñ&iexcl;Å䣩 TR0=0; //¶¨Ê±Æ÷Í£Ö¹ } if(set==1) //ÉèÖÃʱ { write_com(0x38);//ÆÁÄ»³õʼ»¯ write_com(0x80+0x40+13);//Ñ&iexcl;Öб¨¾¯ÖµµÄλÖà write_com(0x0f);//´ò¿ªÏÔʾ ÎÞ¹â±ê ¹â±êÉÁ˸ write_com(0x06);//µ±¶Á»òдһ¸ö×Ö·ûÊÇÖ¸Õëºóһһλ FENG=1; //·äÃùÆ÷Í£Ö¹ÃùÏì } else if(set>=2) //ÔÙ°´Ò»ÏÂÉèÖüüʱ£¬Í˳öÉèÖà { set=0; //ÉèÖÃ״̬ÇåÁã write_com(0x38);//ÆÁÄ»³õʼ»¯ write_com(0x0c);//´ò¿ªÏÔʾ ÎÞ¹â±ê ÎÞ¹â±êÉÁ˸ FENG=1; //·äÃùÆ÷Í£Ö¹Ïì flag=1; //±¨¾¯±ê־λÖÃ1 TR0=1; //¶¨Ê±Æ÷¿ªÊ¼¼ÆÊ± } if(Key2==0&&set!=0) //µ±ÔÚÉèÖÃ״̬ʱ£¬°´Ï¼Ӽüʱ { while(Key2==0); //°´¼üÊÍ·Å FENG=0; //·äÃùÆ÷ÃùÏì WARNING++; //±¨¾¯ãÐÖµ¼Ó if(WARNING>=255)//ãÐÖµ×î´ó¼Óµ½255 WARNING=0; //ÇåÁã write_com(0x80+0x40+11); //ÔÚãÐÖµµÄλÖÃдÈëÉèÖõÄÊý¾Ý write_data('0'+WARNING/100); //ÏÔʾ°Ù루½«123³ýÒÔ100µÃµ½µÄÉÌÊÇ1£¬¾ÍÊǰÙλÊý¾Ý£©123ΪÀý×Ó write_data('0'+WARNING/10%10);//ÏÔʾʮ루½«123³ýÒÔ10µÃµ½ÉÌÊÇ12£¬½«12³ýÒÔ10µÄÓàÊý¾ÍÊÇʮ룩 write_data('0'+WARNING%10); //ÏÔʾ¸ö루½«123³ýÒÔ10µÄÓàÊý3¾ÍÊǸöλÊý¾Ý£©123ΪÀý×Ó write_com(0x80+0x40+13);//λÖà FENG=1;//·äÃùÆ÷Í£Ö¹ } if(Key3==0&&set!=0) //¼õ°´¼ü×¢ÊͲο¼¼Ó°´¼ü²¿·Ö { while(Key3==0); FENG=0; WARNING--; if(WARNING<=0) WARNING=255; write_com(0x80+0x40+11); write_data('0'+WARNING/100); write_data('0'+WARNING/10%10); write_data('0'+WARNING%10); write_com(0x80+0x40+13);//λÖà FENG=1; } } void time1_int(void) interrupt 1 //¶¨Ê±Æ÷º¯Êý { uchar count; TL0=0xb0; TH0=0x3c; //ÖØÐ¸³³õÖµ count++; //¼ÆÊ±±äÁ¿¼Ó if(count==10)//¶¨Ê±Æ÷¶¨Ê±ÊÇ50ms£¬´Ë´¦¼ÆÊý10´Î£¬ÕýºÃÊÇ500ms£¬ÓÃÓÚ±¨¾¯Ê± µÆÁÁºÍ·äÃùÆ÷Ïì { if(flag==0) //±¨¾¯±ê־Ϊ0ʱ { LED_G=0; //Â̵ÆÁÁ LED_R=1; //ºìµÆÃð FENG=1; //·äÃùÆ÷²»Ïì // san=1; //·çÉȲ»×ª£¨Ñ&iexcl;Å䣩 } if(flag==1) //±¨¾¯±ê־λΪ1ʱ { LED_G=1; //Â̵ÆÃð LED_R=0; //ºìµÆÁÁ FENG=0; //·äÃùÆ÷Ïì // san=0; //·çÉÈת¶¯£¨Ñ&iexcl;Å䣩 } } if(count==20) //¼ÆÊýµ½20ʱ£¬ÕýºÃÊÇ1000ms£¬¾ÍÊÇ1s£¬ÕâÀï¾ÍÊÇÈõÆÃ𣬷äÃùÆ÷²»Ï죬´Ó¶ø×ö³öÉÁ˸µÄЧ¹û { count=0; //¼Æµ½1sʱ£¬½«countÇåÁ㣬׼±¸ÖØÐ¼ÆÊý if(flag==0) { LED_G=1; LED_R=1; FENG=1; // san=1; //È«²¿¹Ø±Õ } if(flag==1) { LED_G=1; LED_R=1; FENG=1; // san=0; //±¨¾¯Öµ£¬·çÉÈÊÇһֱת¶¯µÄ£¨Ñ&iexcl;Å䣩 } } } 修改为下限报警
07-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值