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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4093|回復: 4
打印 上一主題 下一主題
收起左側

單片機計算器加溫度報警器制作(仿真代碼PCB)全新版本

[復制鏈接]
跳轉到指定樓層
樓主
                    仿真  代碼  原理圖 PCB實物已設計整理好!各位下載可直接使用

      這是本人做的關于51單片機的一個小設計,主要將論壇里的溫度報警器和計算器代碼進行了整合,簡單的說可以當做計算器使用也可以當做溫度報警器使用。PCB也對各個版本進行了優化,原理圖劃分了功能塊方便看不懂的小伙伴,這主要針對一些不會做手工PCB的小伙伴,而且現在立創和捷配的打樣活動也比自己手工做PCB成本低很多,鑒于能白嫖就白嫖的原則,請大家不要錯過。
      功能簡單介紹:
      一、溫度報警器功能
      插電后打開開關(開關可直接短接)初始化完成后LCD1602第一行居中顯示實時溫度,第二行顯示HT:60 LT:2表示默認設置的溫度上限以及下限,若溫度超過上限或者低于下限值,對應led發光以提示用戶。按下k2鍵,可進入溫度報警器的設置模式,此時lcd顯示屏幕上第一行最末尾出現H或者L,表示此時可按K3,K4對對應的HT或者LT的上下限值進行加減來改變報警閾值,并且這三個按鍵按下時蜂鳴器會有響聲提醒。
     二、計算器功能
     按下K1鍵可切換為計算器模式,此時矩陣鍵盤生效,lcd顯示屏幕清空,進入計算器模式,矩陣鍵盤上PCB絲印字體對應按鍵按下的值。其余不多做解釋,按照正常計算器玩法操作。再按下K1鍵可切換回溫度報警器模式。
     代碼篇幅有限,這里不做介紹,上傳文件中可自行查閱。有其他建議聯系我哈。
制作出來的實物圖如下:

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機源程序如下:
  1. /*******************************************************************************
  2. *  標題:                       LCD1602簡易計算器                               *
  3. *                                                                                                                                                           *
  4. *  實驗說明:1602簡易計算器,可以實現四位數以內的加減乘除,                                     *                                                      
  5. ********************************************************************************
  6. * 實驗心得:當內部ram不夠用的時候,可以定義成xdata,使用外部ram,但是有一個問題*
  7. 就是在用proteus仿真的時候,如果有xdata的代碼,可能仿真會出現點問題,因為peoteus*
  8. 不支持外部擴展ram                                                               *
  9. ********************************************************************************/
  10. #include<reg52.h>        
  11. #include"lcd.h"
  12. #include"math.h"
  13. #include"temp.h"
  14. #include"intrins.h"
  15. //--定義使用的IO口--//        
  16. #define GPIO_KEY P1
  17. sbit K_set=P3^3;
  18. sbit K_up=P3^5;
  19. sbit K_down=P3^6;
  20. sbit bee_key=P3^7;
  21. sbit ledL=P2^3;
  22. sbit ledH=P2^4;


  23. unsigned char setting_flag=0,up_flag=0,down_flag=0;

  24. //--定義全局變量--//
  25. unsigned char code XuJian[16]="01470258=369+-x/";
  26. long value[16];
  27. unsigned char Num[8];//此處寫成unsigend char xdata Num[8]時,實物可以用,但是仿真有點問題,因為proteus不支持外部擴展ram.
  28. unsigned long result;//運算結果
  29. unsigned int flag=0;//標志位
  30. unsigned int  m;
  31. unsigned int c=0;
  32. long First=0;//輸入的第一位數
  33. long Second=0;//輸入的第二位數
  34. unsigned int Key;//符號判斷,如果key=12,為+,13,為-,14為×,15為/。
  35. unsigned char KeyValue=-1;
  36. //用來存放讀取到的鍵值

  37. //--聲明全局函數--//
  38. int KeyScan(void);//鍵值判斷函數
  39. void Delay10ms(unsigned int c);   //誤差 0us
  40. void RES();//結果運算函數
  41. //

  42. //模式切換標致
  43. unsigned char moshi_flag=0,temp_max=60,temp_min=2,lcd_flag=0;
  44. unsigned int temp=0;
  45. uchar code Init1[]="    DB:000   ";          //初始化時1行顯示
  46. uchar code Init2[]="  HT:000 LT:000  ";          //初始化時2行顯示
  47. void Init1602_temp()
  48. {
  49.   uchar i=0;
  50.   LcdWriteCom(0x38);//屏幕初始化
  51.   LcdWriteCom(0x0c);//打開顯示 無光標 無光標閃爍
  52.   LcdWriteCom(0x06);//當讀或寫一個字符是指針后一一位
  53.   LcdWriteCom(0x01);//清屏
  54.   LcdWriteCom(0x80);//設置位置

  55.   for(i=0;i<16;i++)                  
  56.   {
  57.                 LcdWriteData(Init1[i]); //1行初始化顯示
  58.   }
  59.   LcdWriteCom(0x80+0x40);
  60.   for(i=0;i<16;i++)
  61.   {
  62.                 LcdWriteData(Init2[i]);//2行初始化顯示
  63.   }
  64. }
  65.   //顯示實時溫度
  66. void display_temp(unsigned int temp)
  67. {         
  68.         unsigned char a,b,c;
  69.         
  70.   a=temp/1000%10;
  71.   b=temp/100%10;
  72.   c=temp/10%10;

  73.    LcdWriteCom(0x80+7);
  74.    LcdWriteData(a+0x30);
  75.     LcdWriteData(b+0x30);
  76.          LcdWriteData('.');
  77.          LcdWriteData(c+0x30);


  78. }
  79. //顯示溫度上下限

  80. void display_temp_M(unsigned char temp_max,unsigned char temp_min)
  81. {        
  82.         unsigned char a,b,c;
  83.         a=temp_max/100;
  84.         b=temp_max/10%10;
  85.         c=temp_max%10;
  86.           LcdWriteCom(0x80+0x40+5);
  87.            LcdWriteData(a+0x30);
  88.     LcdWriteData(b+0x30);
  89.         LcdWriteData(c+0x30);
  90.         a=temp_min/100;
  91.         b=temp_min/10%10;
  92.         c=temp_min%10;
  93.           LcdWriteCom(0x80+0x40+12);
  94.            LcdWriteData(a+0x30);
  95.     LcdWriteData(b+0x30);
  96.         LcdWriteData(c+0x30);


  97. }
  98. void Delay500us()                //@11.0592MHz
  99. {
  100.         unsigned char i, j;

  101.         _nop_();
  102.         _nop_();
  103.         i = 6;
  104.         j = 93;
  105.         do
  106.         {
  107.                 while (--j);
  108.         } while (--i);
  109. }
  110. void bee_anjian(unsigned int c )
  111. {        
  112.     unsigned char a, b;
  113.         bee_key=0;
  114.         //--c已經在傳遞過來的時候已經賦值了,所以在for語句第一句就不用賦值了--//
  115.     for (;c>0;c--)
  116.         {
  117.                  bee_key=!bee_key;
  118.                  Delay500us();        
  119.                  
  120.         }
  121.         bee_key=0;      
  122. }


  123. void temp_scan()//按鍵掃描
  124. {        unsigned char dis_play_flag=0;
  125. if(K_set==0)  //判斷設置是否按下
  126. {
  127. Delay10ms(1);
  128. if(K_set==0)
  129. { bee_key=0;
  130. setting_flag=setting_flag+1;
  131. dis_play_flag=1;
  132. if(setting_flag>2)
  133. {setting_flag=0;}
  134. //        bee_anjian(100);
  135. //bee_anjian(100);
  136. Delay10ms(50);

  137. }
  138. }
  139. if(dis_play_flag)
  140. {
  141.          
  142.         if(setting_flag==1)
  143.         {
  144.         LcdWriteCom(0x80+15);
  145.         LcdWriteData('H');
  146.         }
  147.         else if(setting_flag==2)
  148.         {
  149.         LcdWriteCom(0x80+15);
  150.         LcdWriteData('L');
  151.         }
  152.         else
  153.         {
  154.         LcdWriteCom(0x80+15);
  155.         LcdWriteData(' ');
  156.         }
  157.            dis_play_flag=0;


  158. }

  159. if(setting_flag)   //設置按下
  160. {        
  161.          if(K_up==0)
  162.         {
  163.         Delay10ms(1);
  164.         if(K_up==0)
  165.         {
  166.         bee_key=0;        
  167.          up_flag=1;
  168.         }
  169. }



  170. }
  171. if(setting_flag)
  172. {        
  173.          if(K_down==0)
  174.         {
  175.         Delay10ms(1);

  176.         if(K_down==0)
  177.         {
  178.         bee_key=0;        
  179.          down_flag=1;
  180.         }
  181. }

  182. }
  183. if(up_flag==1)
  184. {
  185. if(setting_flag==1)
  186. {
  187.         temp_max=temp_max+1;


  188.         if(temp_max>99)
  189.         {temp_max=99;}        

  190.         display_temp_M(temp_max,temp_min);        
  191.         
  192. //        bee_anjian(50);
  193. //bee_anjian(100);
  194. Delay10ms(50);
  195.         up_flag=0;

  196. }
  197. else if(setting_flag==2)
  198. {
  199.         temp_min=temp_min+1;


  200.         if(temp_min>99)
  201.         {temp_min=99;}        

  202.         display_temp_M(temp_max,temp_min);        
  203. //        bee_anjian(50);
  204. //bee_anjian(100);
  205. Delay10ms(50);
  206.         up_flag=0;


  207. }

  208. }
  209. if(down_flag==1)
  210. {
  211. if(setting_flag==1)
  212. {
  213. temp_max=temp_max-1;

  214. if(temp_max<1)
  215. {temp_max=1;}        
  216. display_temp_M(temp_max,temp_min);
  217. Delay10ms(50);
  218. // bee_anjian(100);

  219. down_flag=0;        
  220. }
  221. else if(setting_flag==2)
  222. {
  223. temp_min=temp_min-1;

  224. if(temp_min<1)
  225. {temp_min=1;}        
  226. display_temp_M(temp_max,temp_min);
  227. Delay10ms(50);
  228. //bee_anjian(100);
  229. down_flag=0;        
  230. }

  231. }

  232. bee_key=1;
  233. }



  234. //中斷函數初始化
  235. void Init_INT()
  236. {

  237.         IT0 = 1;                          //設置為下降沿觸發
  238.     EX0 = 1;                          //外部中斷0中斷允許位                    
  239.     EA = 1;

  240. }

  241. void EX0_ISR(void) interrupt 0                //中斷服務函數的書寫格式
  242. {
  243.    
  244.         moshi_flag=!moshi_flag;
  245.         lcd_flag=moshi_flag+1;
  246.          
  247.    
  248. }


  249. /*******************************************************************************
  250. * 函 數 名         : main
  251. * 函數功能                   : 主函數
  252. * 輸    入         : 無
  253. * 輸    出         : 無
  254. *******************************************************************************/
  255. void main(void)
  256. {
  257.         LcdInit();
  258. //        for(i=0;i<7;i++)
  259. //        {
  260. //                LcdWriteData(TiShi[i]);
  261. //        }
  262.         Init_INT();//開啟外部中斷
  263.         Init1602_temp();
  264.         bee_anjian();
  265.         while(1)
  266.         {         


  267.         if(lcd_flag==1)
  268.         {
  269.          Init1602_temp();
  270.          lcd_flag=0;
  271.         }
  272.         else if(lcd_flag==2)
  273.         {
  274.         LcdInit();
  275.         lcd_flag=0;
  276.         }
  277.         if(moshi_flag==1)
  278.         {
  279.             KeyValue=KeyScan();
  280.                 switch(KeyValue)
  281.                 {
  282.                         case(0):
  283.                         LcdWriteCom(0x01);
  284.                         KeyValue=-1;
  285.                         First=0;
  286.                         Second=0;
  287.                         c=0;
  288.                         break;

  289.                         case(1):                        
  290.                         if(flag==0)//flag為0時,正常計算
  291.                         {
  292.                         LcdWriteData(XuJian[1]);
  293.                         KeyValue=-1;
  294.                         if(c==0)
  295.                         First=10*First+1;
  296.                         else if(c==1)
  297.                         Second=10*Second+1;
  298.                         }

  299.                         else if(flag==1)//flag為1時,可以在第一次運算好后,繼續輸入數字,開始第二次計算
  300.                         {
  301.                     LcdWriteCom(0x01);
  302.                         LcdWriteData(XuJian[1]);
  303.                         KeyValue=-1;
  304.                         First=0;
  305.                         Second=0;
  306.                         c=0;
  307.                         flag=0;
  308.                         
  309.                         ................限于篇幅代碼請下載附件................

  310.         do
  311.         {
  312.         value[i]=result%10;
  313.         result/=10;
  314.         i++;
  315.         }while((result/10)!=0);

  316.         value[i]=result;
  317.         m=i;

  318.         for(j=0;j<=i;j++) //for循環如果是for(j=i;j>=0;j++)就會出現不同的結果,很奇怪
  319.         {
  320.                   Num[j]=value[j]+'0';
  321.         }

  322.         for(i=0;i<=m;i++)//這里的for循環也是和上面一樣的結果,改成for(i=m;i>=0;i--)就會出現奇怪的結果,有興趣的可以試試。
  323.     {
  324.                 LcdWriteData(Num[m-i]);
  325.         }
  326.         

  327. }


  328. /*******************************************************************************
  329. * 函 數 名         : KeyScan
  330. * 函數功能                   : 檢測有按鍵按下并讀取鍵值
  331. * 輸    入         : 無
  332. * 輸    出         : 無
  333. *******************************************************************************/

  334. int KeyScan(void)          //測試行(row)的時候就是線是豎著的的那一列為1,測試列(col)的時候就是線是橫著的那幾行為1
  335. {
  336.         char a = 0;
  337.         GPIO_KEY=0x0f;
  338.         if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
  339.         {
  340.                 Delay10ms(1);//延時10ms進行消抖
  341.                 if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
  342.                 {
  343.                         
  344.                         //測試列
  345.                         GPIO_KEY=0X0F;
  346.                         switch(GPIO_KEY)
  347.                         {
  348.                                 case(0X07):        KeyValue=0;break;
  349.                                 case(0X0b):        KeyValue=4;break;
  350.                                 case(0X0d): KeyValue=8;break;
  351.                                 case(0X0e):        KeyValue=12;break;
  352.                         }
  353.                         //測試行
  354.                         GPIO_KEY=0XF0;
  355.                         switch(GPIO_KEY)
  356.                         {
  357.                                 case(0X70):        KeyValue=KeyValue+3;break;
  358.                                 case(0Xb0):        KeyValue=KeyValue+2;break;
  359.                                 case(0Xd0): KeyValue=KeyValue+1;break;
  360.                                 case(0Xe0):        KeyValue=KeyValue;break;
  361.                         }
  362.                         while((a<50) && (GPIO_KEY!=0xf0))         //檢測按鍵松手檢測
  363.                         {
  364.                                 Delay10ms(1);
  365.                                 a++;
  366.                         }
  367.                 }
  368.         }
  369.         return KeyValue;

  370. }

  371. /*******************************************************************************
  372. * 函 數 名         : Delay10ms
  373. * 函數功能                   : 延時函數,延時10ms
  374. * 輸    入         : 無
  375. * 輸    出         : 無
  376. *******************************************************************************/

  377. void Delay10ms(unsigned int c)   //誤差 0us
  378. {
  379.     unsigned char a, b;

  380.         //--c已經在傳遞過來的時候已經賦值了,所以在for語句第一句就不用賦值了--//
  381.     for (;c>0;c--)
  382.         {
  383.                 for (b=38;b>0;b--)
  384.                 {
  385.                         for (a=130;a>0;a--);
  386.                 }         
  387.         }      
  388. }
復制代碼

所有資料51hei提供下載:
溫度報警加簡易計算器資料.7z (3.52 MB, 下載次數: 79)

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:315554 發表于 2021-4-22 15:00 | 只看該作者
謝謝分享,1620顯示很想學一下,
回復

使用道具 舉報

板凳
ID:430492 發表于 2021-4-24 20:17 | 只看該作者
這算是多功能計算器吧,增加了溫度顯示,不錯!還可以擴展其他應用啊!!
回復

使用道具 舉報

地板
ID:541089 發表于 2021-4-28 22:53 | 只看該作者
cooleaf 發表于 2021-4-24 20:17
這算是多功能計算器吧,增加了溫度顯示,不錯!還可以擴展其他應用啊!!

對對,按照小伙伴題目要求來的,只要性能夠用,啥都可以拓展
回復

使用道具 舉報

5#
ID:541089 發表于 2021-5-27 23:26 | 只看該作者
注意:代碼是和PCB完全對應的,仿真引腳有輕微變動,仿真時注意改一下代碼引腳
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 最新午夜综合福利视频 | 天天草天天操 | 天天草视频 | 久久久免费电影 | 欧美视频区| 超碰日本 | 欧美日韩电影一区 | 成人不卡 | 久久出精品 | 亚洲一区二区三区四区在线观看 | 精品久久久久一区二区国产 | www.毛片| 久久精品com | 久久国产视频播放 | 免费a网 | www.日韩系列 | 色婷婷亚洲国产女人的天堂 | 亚洲性视频在线 | 精品国产色 | 一区二区三区四区免费在线观看 | 6996成人影院网在线播放 | 国产精品久久久久久婷婷天堂 | 成人欧美日韩一区二区三区 | 91精品国产色综合久久 | 日韩高清一区 | 国产精品成人一区二区 | 日韩高清一区 | 中文字幕久久久 | 亚洲成人国产综合 | 精品国产伦一区二区三区观看体验 | 五月婷婷激情网 | 精品一二区 | 四色永久 | 亚洲成人动漫在线观看 | 精品一区二区三区电影 | 91精品国产综合久久婷婷香蕉 | 久久久久久国产精品免费 | 国产自产c区 | 日韩视频一区二区 | 日韩欧美亚洲综合 | 日韩在线一区二区 |