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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

用普中的51單片機完成藍橋杯第六屆題目的源代碼與上位機

[復制鏈接]
跳轉到指定樓層
樓主
如題,這是之前在學校寫的,用的是普中科技的51單片機板,完成藍橋杯第六屆題目,現發出源代碼,給有需要的同學參考一下,為了直觀,自己加了485通信,并用C#寫了個對應485上位機實時檢測,連同藍橋杯第六屆題目都一起附上,

上位機界面(附件內含源碼):


單片機源程序如下:
  1. #include <REGX51.H>       
  2. #include <cdm.h>
  3. #include <stdio.h>
  4. #include <display.h>
  5. //#include "intrins.h"       
  6. #define uchar unsigned char
  7. #define uint unsigned int

  8. sbit RS485E=P3^6;   //定義485的使能腳
  9. bit jian = 1;
  10. sbit L1=P1^3;
  11. sbit J1=P1^4;
  12. sbit L2=P1^5;
  13. sbit LSA=P1^2;
  14. sbit LSB=P1^1;
  15. sbit LSC=P1^0;
  16. bit SendFlag;
  17. unsigned int ReData,SenData;

  18.                                                         //  0        1          2           3        4         5          6          7           8         9         滅           -
  19. //code unsigned char duan[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
  20. //unsigned char wei[8] = {11,3,0,10,10,11,2,0};         //存放設置參數設定數值
  21. //unsigned char wei_0[8] = {11,10,10,10,10,11,10,10};         //        設置參數初始化
  22. //unsigned char wei_1[8] = {11,10,11,10,10,10,10,10};         // 溫度檢測顯示數值
  23. //unsigned char wei_2[4] = {1,2,6,7};                                         // 指向設置參數設定需改變的地址
  24. unsigned char wendu[4] = {0,0,0,0};
  25. unsigned char xiafa[2] = {0,0};
  26. int gewei = 0;
  27. int shiwei = 0;       
  28. int j = 0;
  29. unsigned char ming;//dspcom = 0,;
  30. char max = 30,min = 20;                  //上下限溫度初始值
  31. int intr1 = 0,intr2 = 0;
  32. uchar temperature = 0;
  33. bit temper_flag = 0;                  //溫度讀取標志
  34. int sendendFlag = 0;
  35. int cnt = 0;

  36. char data12 = 0;
  37. int pinlv = 4;                 //L1閃爍的頻率
  38. char qujian = 0;
  39. char jidianqi = 0;
  40. int FallFlag = 1;                 //設定工作參數錯誤標志
  41. int pinFlag = 0;                //L1閃爍標志,決定L1是否閃爍
  42. int L1_Flag = 0;                //L1閃爍標志,決定L1是否閃爍


  43. //設置參數設定界面掃描函數
  44. //void display()
  45. //{
  46. //        P0=0x00;//消隱
  47. //
  48. //                switch(dspcom)         //位選,選擇點亮的數碼管,
  49. //                {
  50. //                        case(0):
  51. //                                LSA=0;LSB=0;LSC=0; break;//顯示第0位
  52. //                        case(1):
  53. //                                LSA=1;LSB=0;LSC=0; break;//顯示第1位
  54. //                        case(2):
  55. //                                LSA=0;LSB=1;LSC=0; break;//顯示第2位
  56. //                        case(3):
  57. //                                LSA=1;LSB=1;LSC=0; break;//顯示第3位
  58. //                        case(4):
  59. //                                LSA=0;LSB=0;LSC=1; break;//顯示第4位
  60. //                        case(5):
  61. //                                LSA=1;LSB=0;LSC=1; break;//顯示第5位
  62. //                        case(6):
  63. //                                LSA=0;LSB=1;LSC=1; break;//顯示第6位
  64. //                        case(7):
  65. //                                LSA=1;LSB=1;LSC=1; break;//顯示第7位       
  66. //                }
  67. //                P0=duan[wei[dspcom]];//發送段碼
  68. //                if(++dspcom == 8)
  69. //                {
  70. //        dspcom = 0;
  71. //            }
  72. //}
  73. //
  74. //
  75. ////檢測溫度顯示區間界面掃描函數
  76. //void display_1()
  77. //{
  78. //        P0=0x00;//消隱
  79. //
  80. //                switch(dspcom)         //位選,選擇點亮的數碼管,
  81. //                {
  82. //                        case(0):
  83. //                                LSA=0;LSB=0;LSC=0; break;//顯示第0位
  84. //                        case(1):
  85. //                                LSA=1;LSB=0;LSC=0; break;//顯示第1位
  86. //                        case(2):
  87. //                                LSA=0;LSB=1;LSC=0; break;//顯示第2位
  88. //                        case(3):
  89. //                                LSA=1;LSB=1;LSC=0; break;//顯示第3位
  90. //                        case(4):
  91. //                                LSA=0;LSB=0;LSC=1; break;//顯示第4位
  92. //                        case(5):
  93. //                                LSA=1;LSB=0;LSC=1; break;//顯示第5位
  94. //                        case(6):
  95. //                                LSA=0;LSB=1;LSC=1; break;//顯示第6位
  96. //                        case(7):
  97. //                                LSA=1;LSB=1;LSC=1; break;//顯示第7位       
  98. //                }
  99. //                P0=duan[wei_1[dspcom]];//發送段碼
  100. //                if(++dspcom == 8)
  101. //                {
  102. //        dspcom = 0;
  103. //            }
  104. //}

  105. //延時函數
  106. void delay(uint i)
  107. {
  108.         uint k;
  109.         for(k=0;k<i;k++);
  110. }

  111. //void delay1(unsigned char i)
  112. //{
  113. //        unsigned char j;
  114. //        for(i; i > 0; i--)
  115. //                for(j = 200; j > 0; j--);
  116. //}


  117. //設置參數設定函數
  118. void key_du()
  119. {
  120.         uchar key,hang,i;//,cnt1;
  121.         ming=0;
  122.         P1_6 = 1;
  123.        
  124.         while(1)
  125.         {       
  126.                 P2 = 0x0f;
  127.                 //L1_Flag = 1;
  128.                 if(jian == 0)
  129.                 {
  130.                         ming = ming+1;
  131.                         jian=1;
  132.                 }
  133.             if(P2 != 0x0f) //有按鍵按下
  134.             {
  135.                     delay(1200);        //消抖
  136.        
  137.                         if(P2 != 0x0f)
  138.                         {       
  139.                             if(ming <5)
  140.                                 {
  141.                                         if((P2 & 0x08) == 0)                hang = 0;
  142.                                         if((P2 & 0x04) == 0)                hang = 1;
  143.                                         if((P2 & 0x02) == 0)                        hang = 2;               
  144.                                         P2=0xf0;
  145.                                         if((P2 & 0x80) == 0)        key = (hang+0);         while((P2 & 0x80) == 0);        //等待按鍵釋放
  146.                                         if((P2 & 0x40) == 0)        key = (hang+3);         while((P2 & 0x40) == 0);        //等待按鍵釋放         
  147.                                         if((P2 & 0x20) == 0)        key = (hang+6);         while((P2 & 0x20) == 0);        //等待按鍵釋放
  148.                                         if((P2 & 0x10) == 0)        key = (hang+9);         while((P2 & 0x10) == 0);        //等待按鍵釋放
  149.                                         if(key == 11)                 //等待消除鍵按下,初始化
  150.                                         {
  151.                                                 for(i=0;i<8;i++)
  152.                                                 {
  153.                                                 wei[i]=wei_0[i];
  154.                                                 }

  155.                                                 ming=0;
  156.                                         }
  157.                                         if((key == 10) && (ming == 0))
  158.                                         {       
  159.                                                 intr1 = 0;
  160.                                                 L1_Flag = 0;                                                               
  161.                                                 break;
  162.                                         }

  163.                                         if((key == 10) &&(ming == 4))                //保存設置參數
  164.                                         {
  165.                                                 intr1 = 0;
  166.                                                 L1_Flag = 0;
  167.                                                 break;
  168.                                         }
  169.                                         if((key!=10) && (key!=11) && (ming !=4))         //修改參數
  170.                                         {
  171.                                                 if(ming == 0)
  172.                                                 {
  173.                                                         for(i=1;i<8;i++)
  174.                                                         {
  175.                                                         wei[i]=wei_0[i];
  176.                                                         }
  177.                                                 }
  178.                                                 wei[wei_2[ming]]=key;
  179.                                                 jian=0;
  180.                                         }
  181.                                         if(ming == 3)                   //計算上限溫度和下限溫度
  182.                                         {
  183.                                                 max = wei[wei_2[0]] * 10 + wei[wei_2[1]];
  184.                                                 min = wei[wei_2[2]] * 10 + wei[wei_2[3]];
  185.                                                 //wendu[2] = (char)max/10;
  186.                                                 //wendu[2] = (char)min;
  187.                                                 if(max < min)                 //設置錯誤,L2點亮
  188.                                                 {
  189.                                                                
  190.                                                         L2 = 0;
  191.                                                         FallFlag = 0;       
  192.                                                 }
  193.                                                 else                                 //反之熄滅
  194.                                                 {
  195.                                                         FallFlag = 1;
  196.                                                 }
  197.                                         }

  198.                                 }                 
  199.                 }

  200.         }
  201.        
  202.         display();         //數碼管掃描

  203.         }
  204. }


  205. void isr_timer_0(void)  interrupt 1  //默認中斷優先級 1
  206. {        //uchar intr1,intr2;
  207.         TH0 = (65536 - 10000)/256;                //設置定時初值
  208.         TL0 = (65535 - 10000)%256;                //設置定時初值
  209.         //display_1();
  210.         if(++intr2 == 100)  //10ms執行一次
  211.         {       
  212.         intr2 = 0;
  213.                 temper_flag = 1;  //1s溫度讀取標志位置1
  214.                 pinFlag = 1;
  215.     }

  216.         if(pinFlag == 1 && FallFlag == 1)
  217.         {
  218.                 if(++intr1 == pinlv)  //10ms執行一次
  219.                 {       
  220.                 intr1 = 0;
  221.                         if(L1_Flag == 0)
  222.                         {
  223.                                 L1 = !L1;
  224.                         }
  225.                 }
  226.         }
  227.        
  228. }

  229. void ser_int (void) interrupt 4 using 1
  230. {
  231. // if(TI == 1&&sendendFlag == 1)
  232. // {
  233. //         TI = 0;
  234. //        SendFlag = 0;
  235. //        sendendFlag = 0;
  236. // }

  237. if(RI == 1)        //RI接受中斷標志
  238. {
  239.         RI = 0;                    //清除RI接受中斷標志
  240.         ReData = SBUF;  //SUBF接受/發送緩沖器
  241.         data12 = SBUF;
  242.         SenData=ReData;
  243.        
  244.         if(data12 == '1')
  245.         {
  246.                 wendu[0] = data12;
  247.                 wendu[1] = '0';
  248.                 wendu[2] = (max/10)+'0';
  249.                 wendu[3] = (max%10)+'0';               
  250.         }
  251.         if(data12 == '2')
  252.         {
  253.                 wendu[0] = data12;
  254.                 wendu[2] = (min/10)+'0';
  255.                 wendu[3] = (min%10)+'0';               
  256.         }
  257.         if(data12 == '3')
  258.         {
  259.                 wendu[0] = data12;
  260.                 wendu[2] = '0';
  261.                 wendu[3] = qujian+'0';               
  262.         }
  263.         if(data12 == '4')
  264.         {
  265.                 wendu[0] = data12;
  266.                 wendu[2] = '0';
  267.                 wendu[3] = jidianqi+'0';               
  268.         }
  269.         if(data12 == '5')
  270.         {
  271.                 wendu[0] = data12;
  272.                 wendu[2] = (pinlv/10)+'0';
  273.                 wendu[3] = (pinlv%10)+'0';               
  274.         }
  275.         if(data12 == '6')
  276.         {
  277.                 wendu[0] = data12;
  278.                 wendu[2] = (temperature/10)+'0';
  279.                 wendu[3] = (temperature%10)+'0';               
  280.         }
  281.         if(data12 == '7')
  282.         {               
  283.                 for(j = 0;j<2;j++)
  284.                 {
  285.                         while(RI == 0);
  286.                         RI = 0;
  287.                         xiafa[j] = SBUF;       
  288.                 }
  289.                 shiwei = xiafa[0] - '0';
  290.                 gewei = xiafa[1] - '0';
  291.                 wei[wei_2[0]] = shiwei;
  292.                 wei[wei_2[1]] = gewei;
  293.                 max = shiwei*10 + gewei;               
  294.         }
  295.         if(data12 == '8')
  296.         {               
  297.                 for(j = 0;j<2;j++)
  298.                 {
  299.                         while(RI == 0);
  300.                         RI = 0;
  301.                         xiafa[j] = SBUF;       
  302.                 }
  303.                 shiwei = xiafa[0] - '0';
  304.                 gewei = xiafa[1] - '0';
  305.                 wei[6] = shiwei;
  306.                 wei[7] = gewei;
  307.                 min = shiwei*10 + gewei;               
  308.         }
  309.     SendFlag = 1;
  310. }
  311. }


  312. //主函數
  313. void main()
  314. {       
  315.    
  316.         TMOD = 0x21;                //設置定時器模式  
  317.         SCON = 0x50;      //REN=1允許串行接受狀態,串口工作模式1                                                 
  318.                 PCON|= 0x80;                                                         
  319.                 TH1  = 0xF3;     //baud*2  /* reload value 19200、數據位8、停止位1。效驗位無   
  320.                                                  // //baud*2  /*  波特率4800、數據位8、停止位1。效驗位無 (12M)
  321.             TL1 = 0xF3;      

  322.         TH0 = (65536 - 10000)/256;                //設置定時初值
  323.         TL0 = (65535 - 10000)%256;                //設置定時初值
  324.         TR0 = 1;
  325.                 TR1  = 1;                                                            
  326.                 ES   = 1;
  327.         ET0 = 1;       
  328.         EA = 1;

  329.         while(1)
  330.         {                       
  331.                 P2=0xf0;       
  332.                 display_1();

  333.                 if (SendFlag==1)    // max485(半雙工通信) RE/DE定義 RE=0為接受狀態  DE=1為發送狀態(參考MAX485芯片管腳)
  334.                      {
  335.                       RS485E=1;           //                              RS5485E=0為接收狀態  RS5485E=1為發送狀態
  336.                           for(cnt = 0;cnt<4;cnt++)
  337.                       {
  338.                                   SBUF=wendu[cnt];//SenData;           //發送數據
  339.                                  while(TI == 0);//{display_1();}
  340.                                  TI = 0;
  341.                                 display_1();
  342.                           }

  343.                           SendFlag = 0;

  344.                           //sendendFlag = 1;
  345.               }
  346.                 else
  347.                   {       
  348.                       RS485E=0;              //接收狀態
  349.                   }

  350.                 if((P2 & 0x10) == 0)   //有按鍵按下
  351.                 {
  352.                         delay(1200);           //消抖
  353.                         if((P2 & 0x10) == 0)
  354.                         {
  355.                                 P2=0x0f;       
  356.                                 if((P2 & 0x04) == 0)                    //判斷是否是 設置 按鍵按下
  357.                             {
  358.                                        
  359.                                         while((P2 & 0x04) == 0);   //等待按鍵釋放
  360.                                         L1_Flag = 1;
  361.                                         L1 = 1;
  362.                                         key_du();                   //進入參數設置函數
  363.                             }
  364.                         }
  365.                 }
  366.                 if(FallFlag == 1)
  367.                 {
  368.                         L2 = 1;
  369.                 }
  370.                 else
  371.                 {
  372.                     L2 = 0;
  373.                 }

  374.                         if(temper_flag)
  375.                         {
  376.                                 temper_flag = 0;
  377.                                 temperature = rd_temperature();  //讀溫度        
  378.                 }
  379.        
  380.                         if((temperature <= min) && temperature != 0)         //區間0
  381.                         {       
  382.                                 wei_1[1]=0;
  383.                                 qujian = 0;
  384. ……………………

  385. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
485后臺.zip (33.52 KB, 下載次數: 14)
keil-C51源代碼.zip (62.16 KB, 下載次數: 18)
藍橋杯第六屆題目.zip (318.99 KB, 下載次數: 17)




評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久一二三区 | 成人av免费在线观看 | 日韩靠逼 | 中文字幕日韩欧美一区二区三区 | 午夜影院 | 亚洲一区二区三区在线免费 | 亚洲乱码一区二区三区在线观看 | 日韩图区 | 亚洲成人99 | h漫在线观看 | 欧美国产日韩在线 | 国产午夜精品一区二区三区 | 福利国产 | 四虎精品在线 | 日韩小视频在线 | 国产91久久精品一区二区 | 亚洲一区二区av | 亚洲精品久久久一区二区三区 | 户外露出一区二区三区 | 草草在线观看 | 午夜一级黄色片 | 伊大人久久 | 欧美精品一区在线观看 | 91久久电影 | 午夜男人的天堂 | 美女高潮网站 | 精品欧美一区免费观看α√ | 天天色天天色 | 中文字幕免费视频 | 99福利视频 | 亚洲二区精品 | 欧美成年人视频在线观看 | 国产精品一区二区av | 国产精品视频一区二区三区 | 一区二区免费 | 久久精品欧美电影 | 国产高清视频一区 | 欧美精品一二三 | 99久久国产精 | 久久免费精品 | 亚洲精品1区 |