|
如題,這是之前在學(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)含源碼):
單片機(jī)源程序如下:
- #include <REGX51.H>
- #include <cdm.h>
- #include <stdio.h>
- #include <display.h>
- //#include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS485E=P3^6; //定義485的使能腳
- bit jian = 1;
- sbit L1=P1^3;
- sbit J1=P1^4;
- sbit L2=P1^5;
- sbit LSA=P1^2;
- sbit LSB=P1^1;
- sbit LSC=P1^0;
- bit SendFlag;
- unsigned int ReData,SenData;
- // 0 1 2 3 4 5 6 7 8 9 滅 -
- //code unsigned char duan[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
- //unsigned char wei[8] = {11,3,0,10,10,11,2,0}; //存放設(shè)置參數(shù)設(shè)定數(shù)值
- //unsigned char wei_0[8] = {11,10,10,10,10,11,10,10}; // 設(shè)置參數(shù)初始化
- //unsigned char wei_1[8] = {11,10,11,10,10,10,10,10}; // 溫度檢測(cè)顯示數(shù)值
- //unsigned char wei_2[4] = {1,2,6,7}; // 指向設(shè)置參數(shù)設(shè)定需改變的地址
- unsigned char wendu[4] = {0,0,0,0};
- unsigned char xiafa[2] = {0,0};
- int gewei = 0;
- int shiwei = 0;
- int j = 0;
- unsigned char ming;//dspcom = 0,;
- char max = 30,min = 20; //上下限溫度初始值
- int intr1 = 0,intr2 = 0;
- uchar temperature = 0;
- bit temper_flag = 0; //溫度讀取標(biāo)志
- int sendendFlag = 0;
- int cnt = 0;
- char data12 = 0;
- int pinlv = 4; //L1閃爍的頻率
- char qujian = 0;
- char jidianqi = 0;
- int FallFlag = 1; //設(shè)定工作參數(shù)錯(cuò)誤標(biāo)志
- int pinFlag = 0; //L1閃爍標(biāo)志,決定L1是否閃爍
- int L1_Flag = 0; //L1閃爍標(biāo)志,決定L1是否閃爍
- //設(shè)置參數(shù)設(shè)定界面掃描函數(shù)
- //void display()
- //{
- // P0=0x00;//消隱
- //
- // switch(dspcom) //位選,選擇點(diǎn)亮的數(shù)碼管,
- // {
- // case(0):
- // LSA=0;LSB=0;LSC=0; break;//顯示第0位
- // case(1):
- // LSA=1;LSB=0;LSC=0; break;//顯示第1位
- // case(2):
- // LSA=0;LSB=1;LSC=0; break;//顯示第2位
- // case(3):
- // LSA=1;LSB=1;LSC=0; break;//顯示第3位
- // case(4):
- // LSA=0;LSB=0;LSC=1; break;//顯示第4位
- // case(5):
- // LSA=1;LSB=0;LSC=1; break;//顯示第5位
- // case(6):
- // LSA=0;LSB=1;LSC=1; break;//顯示第6位
- // case(7):
- // LSA=1;LSB=1;LSC=1; break;//顯示第7位
- // }
- // P0=duan[wei[dspcom]];//發(fā)送段碼
- // if(++dspcom == 8)
- // {
- // dspcom = 0;
- // }
- //}
- //
- //
- ////檢測(cè)溫度顯示區(qū)間界面掃描函數(shù)
- //void display_1()
- //{
- // P0=0x00;//消隱
- //
- // switch(dspcom) //位選,選擇點(diǎn)亮的數(shù)碼管,
- // {
- // case(0):
- // LSA=0;LSB=0;LSC=0; break;//顯示第0位
- // case(1):
- // LSA=1;LSB=0;LSC=0; break;//顯示第1位
- // case(2):
- // LSA=0;LSB=1;LSC=0; break;//顯示第2位
- // case(3):
- // LSA=1;LSB=1;LSC=0; break;//顯示第3位
- // case(4):
- // LSA=0;LSB=0;LSC=1; break;//顯示第4位
- // case(5):
- // LSA=1;LSB=0;LSC=1; break;//顯示第5位
- // case(6):
- // LSA=0;LSB=1;LSC=1; break;//顯示第6位
- // case(7):
- // LSA=1;LSB=1;LSC=1; break;//顯示第7位
- // }
- // P0=duan[wei_1[dspcom]];//發(fā)送段碼
- // if(++dspcom == 8)
- // {
- // dspcom = 0;
- // }
- //}
- //延時(shí)函數(shù)
- void delay(uint i)
- {
- uint k;
- for(k=0;k<i;k++);
- }
- //void delay1(unsigned char i)
- //{
- // unsigned char j;
- // for(i; i > 0; i--)
- // for(j = 200; j > 0; j--);
- //}
- //設(shè)置參數(shù)設(shè)定函數(shù)
- void key_du()
- {
- uchar key,hang,i;//,cnt1;
- ming=0;
- P1_6 = 1;
-
- while(1)
- {
- P2 = 0x0f;
- //L1_Flag = 1;
- if(jian == 0)
- {
- ming = ming+1;
- jian=1;
- }
- if(P2 != 0x0f) //有按鍵按下
- {
- delay(1200); //消抖
-
- if(P2 != 0x0f)
- {
- if(ming <5)
- {
- if((P2 & 0x08) == 0) hang = 0;
- if((P2 & 0x04) == 0) hang = 1;
- if((P2 & 0x02) == 0) hang = 2;
- P2=0xf0;
- if((P2 & 0x80) == 0) key = (hang+0); while((P2 & 0x80) == 0); //等待按鍵釋放
- if((P2 & 0x40) == 0) key = (hang+3); while((P2 & 0x40) == 0); //等待按鍵釋放
- if((P2 & 0x20) == 0) key = (hang+6); while((P2 & 0x20) == 0); //等待按鍵釋放
- if((P2 & 0x10) == 0) key = (hang+9); while((P2 & 0x10) == 0); //等待按鍵釋放
- if(key == 11) //等待消除鍵按下,初始化
- {
- for(i=0;i<8;i++)
- {
- wei[i]=wei_0[i];
- }
- ming=0;
- }
- if((key == 10) && (ming == 0))
- {
- intr1 = 0;
- L1_Flag = 0;
- break;
- }
- if((key == 10) &&(ming == 4)) //保存設(shè)置參數(shù)
- {
- intr1 = 0;
- L1_Flag = 0;
- break;
- }
- if((key!=10) && (key!=11) && (ming !=4)) //修改參數(shù)
- {
- if(ming == 0)
- {
- for(i=1;i<8;i++)
- {
- wei[i]=wei_0[i];
- }
- }
- wei[wei_2[ming]]=key;
- jian=0;
- }
- if(ming == 3) //計(jì)算上限溫度和下限溫度
- {
- max = wei[wei_2[0]] * 10 + wei[wei_2[1]];
- min = wei[wei_2[2]] * 10 + wei[wei_2[3]];
- //wendu[2] = (char)max/10;
- //wendu[2] = (char)min;
- if(max < min) //設(shè)置錯(cuò)誤,L2點(diǎn)亮
- {
-
- L2 = 0;
- FallFlag = 0;
- }
- else //反之熄滅
- {
- FallFlag = 1;
- }
- }
- }
- }
- }
-
- display(); //數(shù)碼管掃描
- }
- }
- void isr_timer_0(void) interrupt 1 //默認(rèn)中斷優(yōu)先級(jí) 1
- { //uchar intr1,intr2;
- TH0 = (65536 - 10000)/256; //設(shè)置定時(shí)初值
- TL0 = (65535 - 10000)%256; //設(shè)置定時(shí)初值
- //display_1();
- if(++intr2 == 100) //10ms執(zhí)行一次
- {
- intr2 = 0;
- temper_flag = 1; //1s溫度讀取標(biāo)志位置1
- pinFlag = 1;
- }
- if(pinFlag == 1 && FallFlag == 1)
- {
- if(++intr1 == pinlv) //10ms執(zhí)行一次
- {
- intr1 = 0;
- if(L1_Flag == 0)
- {
- L1 = !L1;
- }
- }
- }
-
- }
- void ser_int (void) interrupt 4 using 1
- {
- // if(TI == 1&&sendendFlag == 1)
- // {
- // TI = 0;
- // SendFlag = 0;
- // sendendFlag = 0;
- // }
- if(RI == 1) //RI接受中斷標(biāo)志
- {
- RI = 0; //清除RI接受中斷標(biāo)志
- ReData = SBUF; //SUBF接受/發(fā)送緩沖器
- data12 = SBUF;
- SenData=ReData;
-
- if(data12 == '1')
- {
- wendu[0] = data12;
- wendu[1] = '0';
- wendu[2] = (max/10)+'0';
- wendu[3] = (max%10)+'0';
- }
- if(data12 == '2')
- {
- wendu[0] = data12;
- wendu[2] = (min/10)+'0';
- wendu[3] = (min%10)+'0';
- }
- if(data12 == '3')
- {
- wendu[0] = data12;
- wendu[2] = '0';
- wendu[3] = qujian+'0';
- }
- if(data12 == '4')
- {
- wendu[0] = data12;
- wendu[2] = '0';
- wendu[3] = jidianqi+'0';
- }
- if(data12 == '5')
- {
- wendu[0] = data12;
- wendu[2] = (pinlv/10)+'0';
- wendu[3] = (pinlv%10)+'0';
- }
- if(data12 == '6')
- {
- wendu[0] = data12;
- wendu[2] = (temperature/10)+'0';
- wendu[3] = (temperature%10)+'0';
- }
- if(data12 == '7')
- {
- for(j = 0;j<2;j++)
- {
- while(RI == 0);
- RI = 0;
- xiafa[j] = SBUF;
- }
- shiwei = xiafa[0] - '0';
- gewei = xiafa[1] - '0';
- wei[wei_2[0]] = shiwei;
- wei[wei_2[1]] = gewei;
- max = shiwei*10 + gewei;
- }
- if(data12 == '8')
- {
- for(j = 0;j<2;j++)
- {
- while(RI == 0);
- RI = 0;
- xiafa[j] = SBUF;
- }
- shiwei = xiafa[0] - '0';
- gewei = xiafa[1] - '0';
- wei[6] = shiwei;
- wei[7] = gewei;
- min = shiwei*10 + gewei;
- }
- SendFlag = 1;
- }
- }
- //主函數(shù)
- void main()
- {
-
- TMOD = 0x21; //設(shè)置定時(shí)器模式
- SCON = 0x50; //REN=1允許串行接受狀態(tài),串口工作模式1
- PCON|= 0x80;
- TH1 = 0xF3; //baud*2 /* reload value 19200、數(shù)據(jù)位8、停止位1。效驗(yàn)位無(wú)
- // //baud*2 /* 波特率4800、數(shù)據(jù)位8、停止位1。效驗(yàn)位無(wú) (12M)
- TL1 = 0xF3;
- TH0 = (65536 - 10000)/256; //設(shè)置定時(shí)初值
- TL0 = (65535 - 10000)%256; //設(shè)置定時(shí)初值
- TR0 = 1;
- TR1 = 1;
- ES = 1;
- ET0 = 1;
- EA = 1;
- while(1)
- {
- P2=0xf0;
- display_1();
- if (SendFlag==1) // max485(半雙工通信) RE/DE定義 RE=0為接受狀態(tài) DE=1為發(fā)送狀態(tài)(參考MAX485芯片管腳)
- {
- RS485E=1; // RS5485E=0為接收狀態(tài) RS5485E=1為發(fā)送狀態(tài)
- for(cnt = 0;cnt<4;cnt++)
- {
- SBUF=wendu[cnt];//SenData; //發(fā)送數(shù)據(jù)
- while(TI == 0);//{display_1();}
- TI = 0;
- display_1();
- }
- SendFlag = 0;
- //sendendFlag = 1;
- }
- else
- {
- RS485E=0; //接收狀態(tài)
- }
- if((P2 & 0x10) == 0) //有按鍵按下
- {
- delay(1200); //消抖
- if((P2 & 0x10) == 0)
- {
- P2=0x0f;
- if((P2 & 0x04) == 0) //判斷是否是 設(shè)置 按鍵按下
- {
-
- while((P2 & 0x04) == 0); //等待按鍵釋放
- L1_Flag = 1;
- L1 = 1;
- key_du(); //進(jìn)入?yún)?shù)設(shè)置函數(shù)
- }
- }
- }
- if(FallFlag == 1)
- {
- L2 = 1;
- }
- else
- {
- L2 = 0;
- }
- if(temper_flag)
- {
- temper_flag = 0;
- temperature = rd_temperature(); //讀溫度
- }
-
- if((temperature <= min) && temperature != 0) //區(qū)間0
- {
- wei_1[1]=0;
- qujian = 0;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
485后臺(tái).zip
(33.52 KB, 下載次數(shù): 14)
2018-11-28 16:30 上傳
點(diǎn)擊文件名下載附件
485上位機(jī)
keil-C51源代碼.zip
(62.16 KB, 下載次數(shù): 18)
2018-11-28 16:30 上傳
點(diǎn)擊文件名下載附件
單片機(jī)代碼
藍(lán)橋杯第六屆題目.zip
(318.99 KB, 下載次數(shù): 17)
2018-11-28 16:28 上傳
點(diǎn)擊文件名下載附件
題目
|
評(píng)分
-
查看全部評(píng)分
|