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

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2792|回復(fù): 0
收起左側(cè)

用普中的51單片機(jī)完成藍(lán)橋杯第六屆題目的源代碼與上位機(jī)

[復(fù)制鏈接]
ID:435055 發(fā)表于 2018-11-28 16:29 | 顯示全部樓層 |閱讀模式
如題,這是之前在學(xué)校寫的,用的是普中科技的51單片機(jī)板,完成藍(lán)橋杯第六屆題目,現(xiàn)發(fā)出源代碼,給有需要的同學(xué)參考一下,為了直觀,自己加了485通信,并用C#寫了個(gè)對(duì)應(yīng)485上位機(jī)實(shí)時(shí)檢測(cè),連同藍(lán)橋杯第六屆題目都一起附上,

上位機(jī)界面(附件內(nèi)含源碼):
0.png

單片機(jī)源程序如下:
  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};         //存放設(shè)置參數(shù)設(shè)定數(shù)值
  21. //unsigned char wei_0[8] = {11,10,10,10,10,11,10,10};         //        設(shè)置參數(shù)初始化
  22. //unsigned char wei_1[8] = {11,10,11,10,10,10,10,10};         // 溫度檢測(cè)顯示數(shù)值
  23. //unsigned char wei_2[4] = {1,2,6,7};                                         // 指向設(shè)置參數(shù)設(shè)定需改變的地址
  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;                  //溫度讀取標(biāo)志
  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;                 //設(shè)定工作參數(shù)錯(cuò)誤標(biāo)志
  41. int pinFlag = 0;                //L1閃爍標(biāo)志,決定L1是否閃爍
  42. int L1_Flag = 0;                //L1閃爍標(biāo)志,決定L1是否閃爍


  43. //設(shè)置參數(shù)設(shè)定界面掃描函數(shù)
  44. //void display()
  45. //{
  46. //        P0=0x00;//消隱
  47. //
  48. //                switch(dspcom)         //位選,選擇點(diǎn)亮的數(shù)碼管,
  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]];//發(fā)送段碼
  68. //                if(++dspcom == 8)
  69. //                {
  70. //        dspcom = 0;
  71. //            }
  72. //}
  73. //
  74. //
  75. ////檢測(cè)溫度顯示區(qū)間界面掃描函數(shù)
  76. //void display_1()
  77. //{
  78. //        P0=0x00;//消隱
  79. //
  80. //                switch(dspcom)         //位選,選擇點(diǎn)亮的數(shù)碼管,
  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]];//發(fā)送段碼
  100. //                if(++dspcom == 8)
  101. //                {
  102. //        dspcom = 0;
  103. //            }
  104. //}

  105. //延時(shí)函數(shù)
  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. //設(shè)置參數(shù)設(shè)定函數(shù)
  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))                //保存設(shè)置參數(shù)
  164.                                         {
  165.                                                 intr1 = 0;
  166.                                                 L1_Flag = 0;
  167.                                                 break;
  168.                                         }
  169.                                         if((key!=10) && (key!=11) && (ming !=4))         //修改參數(shù)
  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)                   //計(jì)算上限溫度和下限溫度
  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)                 //設(shè)置錯(cuò)誤,L2點(diǎn)亮
  188.                                                 {
  189.                                                                
  190.                                                         L2 = 0;
  191.                                                         FallFlag = 0;       
  192.                                                 }
  193.                                                 else                                 //反之熄滅
  194.                                                 {
  195.                                                         FallFlag = 1;
  196.                                                 }
  197.                                         }

  198.                                 }                 
  199.                 }

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

  203.         }
  204. }


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

  216.         if(pinFlag == 1 && FallFlag == 1)
  217.         {
  218.                 if(++intr1 == pinlv)  //10ms執(zhí)行一次
  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接受中斷標(biāo)志
  238. {
  239.         RI = 0;                    //清除RI接受中斷標(biāo)志
  240.         ReData = SBUF;  //SUBF接受/發(fā)送緩沖器
  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. //主函數(shù)
  313. void main()
  314. {       
  315.    
  316.         TMOD = 0x21;                //設(shè)置定時(shí)器模式  
  317.         SCON = 0x50;      //REN=1允許串行接受狀態(tài),串口工作模式1                                                 
  318.                 PCON|= 0x80;                                                         
  319.                 TH1  = 0xF3;     //baud*2  /* reload value 19200、數(shù)據(jù)位8、停止位1。效驗(yàn)位無(wú)   
  320.                                                  // //baud*2  /*  波特率4800、數(shù)據(jù)位8、停止位1。效驗(yàn)位無(wú) (12M)
  321.             TL1 = 0xF3;      

  322.         TH0 = (65536 - 10000)/256;                //設(shè)置定時(shí)初值
  323.         TL0 = (65535 - 10000)%256;                //設(shè)置定時(shí)初值
  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為接受狀態(tài)  DE=1為發(fā)送狀態(tài)(參考MAX485芯片管腳)
  334.                      {
  335.                       RS485E=1;           //                              RS5485E=0為接收狀態(tài)  RS5485E=1為發(fā)送狀態(tài)
  336.                           for(cnt = 0;cnt<4;cnt++)
  337.                       {
  338.                                   SBUF=wendu[cnt];//SenData;           //發(fā)送數(shù)據(jù)
  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;              //接收狀態(tài)
  349.                   }

  350.                 if((P2 & 0x10) == 0)   //有按鍵按下
  351.                 {
  352.                         delay(1200);           //消抖
  353.                         if((P2 & 0x10) == 0)
  354.                         {
  355.                                 P2=0x0f;       
  356.                                 if((P2 & 0x04) == 0)                    //判斷是否是 設(shè)置 按鍵按下
  357.                             {
  358.                                        
  359.                                         while((P2 & 0x04) == 0);   //等待按鍵釋放
  360.                                         L1_Flag = 1;
  361.                                         L1 = 1;
  362.                                         key_du();                   //進(jìn)入?yún)?shù)設(shè)置函數(shù)
  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)         //區(qū)間0
  381.                         {       
  382.                                 wei_1[1]=0;
  383.                                 qujian = 0;
  384. ……………………

  385. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
485后臺(tái).zip (33.52 KB, 下載次數(shù): 14)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本公妇乱淫xxxⅹ 国产在线不卡 | 亚洲一区二区三区久久久 | 成人精品福利 | 久夜精品 | 激情六月天 | 欧美精品在线一区二区三区 | 激情影院久久 | 中文字幕av中文字幕 | 国产成人精品一区二区三区在线 | 成人无遮挡毛片免费看 | 玖玖玖av| 欧美成人精品激情在线观看 | 亚洲色在线视频 | 狠狠综合网 | 男女污污动态图 | 综合久久av | 日韩中文字幕在线观看 | 亚洲国产aⅴ精品一区二区 免费观看av | japan21xxxxhd美女 日本欧美国产在线 | 国产精品99久久久久久久vr | 黄色精品视频网站 | 欧美一区二区三区视频 | 久久精品在线播放 | 丁香婷婷综合激情五月色 | 成人av网站在线观看 | 黄网站在线播放 | 日韩欧美在线播放 | 日本午夜免费福利视频 | 国产精品免费小视频 | 成人不卡在线 | 国产精品欧美一区二区三区 | 亚洲欧美一区二区三区国产精品 | 懂色中文一区二区在线播放 | 99色综合 | 国产日韩欧美精品一区二区 | 成人高清在线视频 | 欧美激情久久久 | 自拍偷拍亚洲一区 | 亚洲一区二区日韩 | 天堂综合网久久 | 成人在线视频一区 |