找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2416|回复: 0
收起左侧

用普中的51单片机完成蓝桥杯第六届题目的源代码与上位机

[复制链接]
ID:435055 发表于 2018-11-28 16:29 | 显示全部楼层 |阅读模式
如题,这是之前在学校写的,用的是普中科技的51单片机板,完成蓝桥杯第六届题目,现发出源代码,给有需要的同学参考一下,为了直观,自己加了485通信,并用C#写了个对应485上位机实时检测,连同蓝桥杯第六届题目都一起附上,

上位机界面(附件内含源码):
0.png

单片机源程序如下:
  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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表