久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4276|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

奇葩溫度計(jì)完工啦! 分享代碼給大家看看

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
前幾天做好了板子 最近幾天一直在寫程序
經(jīng)過幾天的奮斗(并不)  總算寫完了!
俗話說: 電路簡(jiǎn)單 程序就麻煩 我算是體會(huì)到了 555
以后再也不圖省事了 軟件可比硬件讓人頭大多啦!
這個(gè)溫度計(jì)所有的顯示部分都是一個(gè)IO來控制 用的型號(hào)是STC15W104  擴(kuò)展用的2片 74HC595
當(dāng)時(shí)看中它的程序空間大 結(jié)果其實(shí)也沒那么大,嘎嘎 結(jié)果EEPROM只有1K了



好了 進(jìn)入正題 我先自吹自擂一下 (啊?! 誰扔的臭雞蛋!)
從左到右 三個(gè)按鈕 1 2 3
按鈕1:短按 查看最大最小溫濕度 每按一次切換顯示1個(gè)  這些數(shù)據(jù)全部存儲(chǔ)在內(nèi)部的FlashRom中 會(huì)自動(dòng)更新
長按 清除內(nèi)部FlashRom存儲(chǔ)的數(shù)據(jù) 并用當(dāng)前的測(cè)量值全部填充
按鈕2:顯示模式輪換,三個(gè)模式:溫濕度自動(dòng)輪換 僅溫度 僅濕度
其中溫濕度自動(dòng)輪換時(shí)間可調(diào)  顯示的數(shù)值是每次切換溫濕度的時(shí)候測(cè)量的
僅溫度 僅濕度 這兩個(gè)的數(shù)據(jù)是 每半秒更新一次(不可調(diào) 但是可以在編譯前調(diào)好,我設(shè)置的是半秒)
這2個(gè)模式貌似每次更新的時(shí)候 LED會(huì)閃一下 沒辦法 設(shè)計(jì)缺陷555 誰叫他1個(gè)IO干完全部的顯示呢?
按鈕3:切換自動(dòng)輪換的時(shí)間 ,我設(shè)置了3個(gè)擋位 2.5s 5s 10s ,同時(shí)這個(gè)還會(huì)自動(dòng)存儲(chǔ)在FlashROM里,只需要設(shè)定時(shí)間一次~~

P.S 最后加點(diǎn)感想: 這次又學(xué)到了很多東西,還專門寫了2個(gè)C文件模塊,模塊化編程好啊~ 贊美C語言!
昨天晚上寫這個(gè)程序,寫的頭很大,來來回回刪了又寫寫了又刪 ,起碼刪了300行,可謂是絞盡腦汁,我那10毫升的大腦都要變成漿糊啦!
今晚折騰出來了 我甚開心,趕緊拍下照片發(fā)帖留念了,MCU的世界真是美妙....我永遠(yuǎn)喜歡單片機(jī)!

單片機(jī)源程序如下:
  1. #include "stc15f2k60s2.h"
  2. #include "dht11.h"
  3. #include "iaprom.h"

  4. #define u8 unsigned char
  5. #define u16 unsigned int

  6. u8 code SMGtable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//最后這個(gè)是負(fù)號(hào)

  7. void IOinit();
  8. void LEDsDisplay(u8 Number,u8 position);
  9. void Timer0Init();
  10. void hc595activate();
  11. void hc595send (u8 sbyte);
  12. void Delay10ms();
  13. void AllDisplay(u8 Integer,u8 Decimal);
  14. void keyscan();
  15. void CheckMaxMin();
  16. void NormalMode();
  17. void TemponlyMode();
  18. void HumionlyMode();
  19. void ModeInit();

  20. void ModeSelect();                   //選擇3種模式
  21. void ViewMaxMin();         //查看最大最小溫濕度

  22. sbit LCHCK=P3^2;                   //595的時(shí)鐘
  23. sbit SFTCK=P3^3;

  24. sbit sb1=P3^4;                        //MaxMin按鈕1          檢查max min,4 組數(shù)據(jù)切換,長按清空flash存儲(chǔ)區(qū)
  25. sbit sb2=P3^5;                        //mode按鈕sb2   切換模式 濕度溫度自動(dòng)切換 長溫度 長濕度
  26. sbit sb3=P3^0;                        //切換時(shí)間sb3        自動(dòng)切換時(shí)間調(diào)整   2.5S  5S 10S 三檔 50 100 200

  27. extern bit TempPoOrNe;         //溫度正負(fù)位
  28. bit TempHumiSelect=1; //1=Temp 0=Humi

  29. int Temp,Humi;

  30. u8 Time50ms=0;                 //50ms標(biāo)志位
  31. u8 SetTimes=50;                 //設(shè)定的時(shí)間 分別是 50(默認(rèn)) 100 200
  32. u8 SetMode=0x00;        //模式標(biāo)志位 分別為 0x00 0x11 0x22   自動(dòng)切換 長溫度 長濕度
  33. u8 ConditionLeds=0x0f;          //后4位控制4個(gè)LED燈泡的亮滅 0x01 MAX ,0x02 Min ,0x04 Temp ,0x08 Humi


  34. void main()
  35. {
  36.         IOinit();
  37.         Delay1000ms();//延時(shí)1s 等待傳感器就位
  38.         Timer0Init();          //定時(shí)器0初始化
  39.         EA=1;ET0=1;                  //開中斷,開定時(shí)器0中斷
  40.         GetTempAndHumi();  // 先讀取一次溫濕度
  41.         ModeInit();       //從ROM中讀取mode 進(jìn)行初始化
  42.         while(1)
  43.         {
  44.                 ModeSelect();                //選擇模式 每個(gè)模式也負(fù)責(zé)讀取溫度
  45.                 CheckMaxMin();
  46.                 keyscan();
  47.         }       
  48. }

  49. void keyscan()
  50. {
  51.         if(sb1==0||sb2==0||sb3==0)
  52.         {
  53.                 Delay10ms();
  54.                 if(sb1==0)
  55.                 {
  56.                         Timer0Init();
  57.                         Time50ms=0;
  58.                         while(!sb1);
  59.                         Delay10ms();
  60.                         if(Time50ms>20)          //>1000ms
  61.                         {
  62.                                 IapEraseSector(0x0000);
  63.                                 IapProgramWord(0x0000,Temp);
  64.                                 IapProgramWord(0x0002,Humi);
  65.                                 IapProgramWord(0x0004,Temp);
  66.                                 IapProgramWord(0x0006,Humi);
  67.                         }
  68.                         else
  69.                         {
  70.                                 ViewMaxMin();        //短按操作
  71.                         }
  72.                         Timer0Init();                 //復(fù)位中斷
  73.                         Time50ms=0;
  74.                 }
  75.                 if(sb2==0)                                         //切換模式
  76.                 {
  77.                         if(SetMode==0x00) SetMode=0x11;
  78.                         else if(SetMode==0x11) SetMode=0x22;
  79.                         else if(SetMode==0x22) SetMode=0x00;
  80.                         else SetMode=0x00;
  81.                         while(!sb2);
  82.                         Delay10ms();
  83.                         IapEraseSector(0x0200);                    //擦除扇區(qū)
  84.                         IapProgramByte(0x0200,SetMode);        //寫入更改后的模式
  85.                         Time50ms=0;
  86.                 }
  87.                 if(sb3==0&&SetMode==0x00)                                 //調(diào)整自動(dòng)切換時(shí)間 2.5s 5s 10s
  88.                 {
  89.                         while(!sb3);
  90.                         Delay10ms();
  91.                         if(SetTimes==50) SetTimes=100;
  92.                         else if(SetTimes==100) SetTimes=200;
  93.                         else if(SetTimes==200) SetTimes=50;
  94.                         else SetTimes=50;
  95.                 }
  96.         }
  97. }
  98. void CheckMaxMin()         //將讀取到的溫度濕度和存儲(chǔ)的最大最小值對(duì)比,如果有更大/更小的,就寫入
  99. {
  100.         int MaxTemp,MaxHumi,MinTemp,MinHumi;
  101.         Temp=TempInteger*10+TempDecimal;                //把溫度轉(zhuǎn)化帶正負(fù)的Int 如24.4 -> 244
  102.         if(TempPoOrNe!=1) Temp=Temp*-1;                        //判斷溫度正負(fù)
  103.         Humi=HumiInteger*10+HumiDecimal;                //濕度轉(zhuǎn)化 ,其實(shí)可以用無符號(hào) 因?yàn)闈穸仁遣豢赡苁秦?fù)數(shù).但是我偷懶了
  104.         MaxTemp=IapReadWord(0x0000);                        //從Rom中讀取一些參數(shù)        做個(gè)留存保護(hù)
  105.         MaxHumi=IapReadWord(0x0002);
  106.         MinTemp=IapReadWord(0x0004);
  107.         MinHumi=IapReadWord(0x0006);
  108.         if(Temp>MaxTemp||Temp<MinTemp||Humi>MaxHumi||Humi<MinHumi) //如果需要更新
  109.         {
  110.                 IapEraseSector(0x0000);
  111.                 if(Temp>MaxTemp) IapProgramWord(0x0000,Temp); else IapProgramWord(0x0000,MaxTemp);
  112.                 if(Temp<MinTemp) IapProgramWord(0x0004,Temp); else IapProgramWord(0x0004,MinTemp);
  113.                 if(Humi>MaxHumi) IapProgramWord(0x0002,Humi); else IapProgramWord(0x0002,MaxHumi);
  114.                 if(Humi<MinHumi) IapProgramWord(0x0006,Humi); else IapProgramWord(0x0006,MinHumi);
  115.         }

  116.                
  117. }
  118. void ModeInit()
  119. {
  120.          SetMode=IapReadByte(0x0200);
  121. }
  122. void ViewMaxMin()                        //查看最大最小
  123. {
  124.          int cache;
  125.          u8 cache1,cache2;
  126.          Time50ms=0;
  127.          while(sb1)                        //有按下就會(huì)繼續(xù)往下執(zhí)行 否則return
  128.          {
  129.                  ConditionLeds=0x05;                                           //最大溫度燈亮
  130.                 cache=IapReadWord(0x0000);
  131.                 if(cache<0)
  132.                 {
  133.                 TempPoOrNe=0;
  134.                 cache=cache*-1;
  135.                 }
  136.                 else TempPoOrNe=1;
  137.                 cache1=cache/10;cache2=cache%10;
  138.                 AllDisplay(cache1,cache2);//這是最大溫度
  139.                 if(Time50ms>100)
  140.                 {
  141.                         Time50ms=0;
  142.                         GetTempAndHumi();
  143.                         TempHumiSelect=1;
  144.                         return;     //五秒不再按按鈕就會(huì)自動(dòng)退出
  145.                 }
  146.          }
  147.          Delay10ms(); //按鍵消抖
  148.          while(!sb1); //等你松手
  149.          Delay10ms(); //按鍵消抖
  150.          Time50ms=0;
  151.          while(sb1)        //等你繼續(xù)按下
  152.          {
  153.                 ConditionLeds=0x09;                           //最大濕度燈亮
  154.                 cache=IapReadWord(0x0002);
  155.                 cache1=cache/10;cache2=cache%10;
  156.                 AllDisplay(cache1,cache2);//這是最大溫度
  157.                 if(Time50ms>100)
  158.                 {
  159.                         Time50ms=0;
  160.                         GetTempAndHumi();
  161.                         TempHumiSelect=1;
  162.                         return;     //五秒不再按按鈕就會(huì)自動(dòng)退出
  163.                 }
  164.          }
  165.          Delay10ms(); //按鍵消抖
  166.          while(!sb1); //等你松手
  167.          Delay10ms(); //按鍵消抖
  168.          Time50ms=0;
  169.          while(sb1)        //等你繼續(xù)按下
  170.          {
  171.                 ConditionLeds=0x06;                                          //最小溫度
  172.                 cache=IapReadWord(0x0004);
  173.                 if(cache<0)
  174.                 {
  175.                 TempPoOrNe=0;
  176.                 cache=cache*-1;
  177.                 }
  178.                 else TempPoOrNe=1;
  179.                 cache1=cache/10;cache2=cache%10;
  180.                 AllDisplay(cache1,cache2);//這是最小溫度
  181.                 if(Time50ms>100)
  182.                 {
  183.                         Time50ms=0;
  184.                         GetTempAndHumi();
  185.                         TempHumiSelect=1;
  186.                         return;     //五秒不再按按鈕就會(huì)自動(dòng)退出
  187.                 }
  188.          }
  189.          Delay10ms(); //按鍵消抖
  190.          while(!sb1); //等你松手
  191.          Delay10ms(); //按鍵消抖
  192.          Time50ms=0;
  193.          while(sb1)        //等你繼續(xù)按下
  194.          {
  195.                 ConditionLeds=0x0a;
  196.                 cache=IapReadWord(0x0006);
  197.                 cache1=cache/10;cache2=cache%10;
  198.                 AllDisplay(cache1,cache2);//這是最小濕度
  199.                 if(Time50ms>100)
  200.                 {
  201.                         Time50ms=0;
  202.                         GetTempAndHumi();
  203.                         TempHumiSelect=1;
  204.                         return;     //五秒不再按按鈕就會(huì)自動(dòng)退出
  205.                 }
  206.          }
  207.          Delay10ms(); //按鍵消抖
  208.          while(!sb1); //等你松手
  209.          GetTempAndHumi();
  210.          Delay10ms(); //按鍵消抖
  211.          TempHumiSelect=1;
  212.          Time50ms=0;
  213. }
  214. void NormalMode()                        //常規(guī)模式
  215. {
  216.         if(TempHumiSelect)
  217.         {
  218.                 ConditionLeds=0x04;                //亮溫度燈
  219.                 AllDisplay(TempInteger,TempDecimal);       
  220.         }
  221.         else
  222.         {
  223.                 ConditionLeds=0x08;          //亮濕度燈
  224.                 AllDisplay(HumiInteger,HumiDecimal);
  225.         }
  226.         if(Time50ms>SetTimes)
  227.         {
  228.                 Time50ms=0;
  229.                 TempHumiSelect=~TempHumiSelect;
  230.                 GetTempAndHumi();//每次切換時(shí)讀取一次溫濕度
  231.         }
  232. }
  233. void TemponlyMode()                   //僅溫度
  234. {
  235.         ConditionLeds=0x04;                //亮溫度燈
  236.         AllDisplay(TempInteger,TempDecimal);
  237.         if(Time50ms>10)                   //500ms
  238.         {
  239.                 Time50ms=0;
  240.                 GetTempAndHumi();//每次切換時(shí)讀取一次溫濕度
  241.         }
  242. }
  243. void HumionlyMode()                        //僅濕度
  244. {
  245.         ConditionLeds=0x08;          //亮濕度燈
  246.         AllDisplay(HumiInteger,HumiDecimal);
  247.         if(Time50ms>10)                 //500ms
  248.         {
  249.                 Time50ms=0;
  250.                 GetTempAndHumi();//每次切換時(shí)讀取一次溫濕度
  251.         }
  252. }
  253. void ModeSelect()
  254. {
  255.         if(SetMode==0x00) NormalMode();
  256.         else if(SetMode==0x11) TemponlyMode();
  257.         else if(SetMode==0x22) HumionlyMode();
  258.         else NormalMode();
  259. }
  260. void IOinit(void)
  261. {
  262. //P3 0  1  2  3  4  5  x  x
  263. //         阻 默 默 默 阻 阻 x  x
  264. //M1 1  0  0  0  1  1  x  x
  265. //M0 0  0  0  0  0  0  x  x
  266. P3M1=0x31;
  267. P3M0=0x00;       
  268. }

  269. void LEDsDisplay(u8 Number,u8 position)         //在單個(gè)數(shù)碼管和所有l(wèi)ed燈珠顯示內(nèi)容 ,會(huì)自動(dòng)在第三位上加上小數(shù)點(diǎn)
  270. {
  271.         u8 i=0,j=0xf0;
  272.         i=(clrbit(j,position+3))+ConditionLeds;         //        計(jì)算需要輸出的位選+led指示燈亮滅情況
  273.         hc595send(i);           //發(fā)送位選和狀態(tài)顯示燈狀態(tài)位
  274.         if(position==3) hc595send(SMGtable[Number]|0x80);           //第三位加個(gè)小數(shù)點(diǎn)
  275.         else hc595send(SMGtable[Number]);
  276.         hc595activate();                       
  277. }

  278. void AllDisplay(u8 Integer,u8 Decimal)                 //掃描顯示所有4個(gè)數(shù)碼管和led燈珠        //也進(jìn)行顯示正負(fù)
  279. {
  280.         if(TempPoOrNe!=1)
  281.         {
  282.         LEDsDisplay(10,1);         //顯示負(fù)號(hào)位 ,否則不顯示
  283.         }
  284.         if(Integer/10%10!=0)          //判斷十位是否需要消隱
  285.         {
  286.         LEDsDisplay(Integer/10%10,2);         //十位
  287.         }
  288.         LEDsDisplay(Integer/1%10,3);         //個(gè)位
  289.         LEDsDisplay(Decimal/1%10,4);         //小數(shù)點(diǎn)后1位
  290. }

  291. void Timer0Init()                //        50ms @12Mhz 計(jì)時(shí)器0初始化
  292. {
  293.         AUXR &= 0x7F;                //12T
  294.         TMOD &= 0xF0;       
  295.         TL0 = 0xB0;               
  296.         TH0 = 0x3C;               
  297.         TF0 = 0;               
  298.         TR0 = 1;
  299. }

  300. void Timer0 () interrupt 1          //計(jì)時(shí)器0中斷
  301. {
  302.         Time50ms++;
  303. }

  304. void hc595send (u8 sbyte)        //移位輸出8位數(shù)據(jù)至移位寄存器中          高位先進(jìn)入移位寄存器
  305. {
  306.         u8 i=0;
  307.         for(i=0;i<8;i++)
  308.         {
  309.                 SFTCK=0;
  310.                 dat11=getbit(sbyte,7-i);
  311.                 SFTCK=1;
  312.         }
  313. }

  314. void hc595activate()                //讓595輸出寄存器輸出移位寄存器保存的結(jié)果
  315. {
  316.         LCHCK=0;
  317.         LCHCK=1;
  318.         LCHCK=0;       
  319. }


  320. void Delay10ms()                //@12.000MHz  軟延時(shí)10ms
  321. {
  322.         unsigned char i, j;

  323.         i = 117;
  324.         j = 184;
  325.         do
  326.         {
  327.                 while (--j);
  328.         } while (--i);
  329. }
復(fù)制代碼

最后就是程序 僅供學(xué)習(xí)
禁止其他任何用途(如作業(yè)等)
不然與本人初衷不符
全部資料51hei下載地址:
溫濕度計(jì).zip (6.15 KB, 下載次數(shù): 31)

評(píng)分

參與人數(shù) 2黑幣 +115 收起 理由
1339337425 + 15 很給力!
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂3 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:915897 發(fā)表于 2021-6-15 22:09 | 只看該作者
木有電路圖嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:300473 發(fā)表于 2021-6-16 15:52 | 只看該作者
大佬厲害,真希望我也能做到!!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩国产三区 | 国产美女精品 | 国产三级精品三级在线观看四季网 | 美女爽到呻吟久久久久 | 男人的天堂久久 | 国产一区二区不卡 | 久久i | 久久精品视频在线播放 | 日韩欧美手机在线 | 精品九九 | 天堂av中文在线 | 黄免费观看 | 日韩精品成人免费观看视频 | 麻豆一区二区三区精品视频 | 欧美888| 精品视频在线一区 | 一区二区中文字幕 | 黄色片在线 | 久久久久久国产 | 国产精品高| 伊人焦久影院 | 亚洲1区 | 国内精品成人 | 欧美激情视频一区二区三区在线播放 | 国产精品一区二区在线 | 超碰婷婷 | 久久精品日产第一区二区三区 | 成年人在线观看 | 久久久观看 | 国产精品99久久久久久宅男 | 2018天天干天天操 | 天天操天天射综合网 | 国产午夜精品一区二区三区嫩草 | 一区二区三区在线播放 | 手机av网 | 一区二区三区亚洲 | 精品啪啪 | 欧美一区二区免费电影 | 风间由美一区二区三区在线观看 | 久久骚 | 黄色精品视频网站 |