|
//主機的一部分程序如下
單片機源程序如下:
- #include <reg51.h>
- #include <stdio.h>
- #include <string.h>
- #include "key.h"
- #include "LCD.H"
- #include <intrins.h>
- unsigned char sendchar[20]; //發送數據數組
- unsigned char code table[10]={48,49,50,51,52,53,54,55,56,57}; //字符數組
- unsigned char RXDdata[20]; //接收總數據數組
- unsigned char save[8]={0,0,0,0,0,0,0,0};
- unsigned char count=0; //計數位
- unsigned char rx_flag;
- sbit RS485E=P3^7; //485使能端
- void delay(unsigned char i);
- void send_case(); //發送數據存儲功能
- void main()
- {
- unsigned char num_counter=0;
- unsigned char j=0;
- unsigned char i=0;
- unsigned char playflag=0; //判斷標志位
- // unsigned char redata;
- unsigned char temdata[10]; //接收溫度數據數組
- unsigned char anadata1[10]; //接收模擬量1數據數組
- unsigned char anadata2[10]; //接收模擬量2數據數組
- LCD_Init();
- SCON=0x50; //設定串口工作方式
- PCON=0x00; //波特率不倍增
- TMOD=0x20; //定時器1工作于8位自動重載模式, 用于產生波特率
- EA=1;
- ES=1; //允許串口中斷
- TL1=0xe8;
- TH1=0xe8; //波特率1200
- TR1=1;
- RS485E=0;
- LCD_WriteStr(2,1,"長春工業大學"); //列8,行4
- LCD_WriteStr(3,3,"電氣學院");
- while(1)
- {
- KeyValue=0;
- KeyDown();
- if(KeyValue==34) //接收數據
- {
- KeyValue=0;
- LCD_Clear();
- LCD_WriteStr(1,1,"請選擇分機");
- while(KeyValue==0)
- KeyDown();
- if(KeyValue==11)
- {
- LCD_Clear();
- LCD_WriteDBC(1,1,save[0]/100+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(2,1,'.');
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(3,1,save[0]/10%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(4,1,save[0]%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(5,1,save[1]/100+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(6,1,'.');
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(7,1,save[1]/10%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(8,1,save[1]%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(1,2,save[2]/100+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(2,2,'.');
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(3,2,save[2]/10%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(4,2,save[2]%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(5,2,save[3]/100+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(6,2,'.');
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(7,2,save[3]/10%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(8,2,save[3]%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(1,3,save[4]/100+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(2,3,'.');
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(3,3,save[4]/10%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(4,3,save[4]%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(5,3,save[5]/100+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(6,3,'.');
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(7,3,save[5]/10%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(8,3,save[5]%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(1,4,save[6]/100+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(2,4,'.');
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(3,4,save[6]/10%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(4,4,save[6]%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(5,4,save[7]/100+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(6,4,'.');
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(7,4,save[7]/10%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- LCD_WriteDBC(8,4,save[7]%10+0x30);
- _nop_();
- _nop_();
- _nop_();
- }
- if(KeyValue==41) //接收1號分機數據
- {
- KeyValue=0;
- LCD_WriteStr(1,2,"選擇1#分機");
- ES=0;
- RS485E=1;
- SBUF=0X11;
- while(!TI);
- RS485E=0;
- TI=0;
- ES=1;
- LCD_WriteStr(1,3,"#1機故障");
- while(count!=14);
- for(i=0;i<6;i++)
- {
- temdata[i]= RXDdata[i];
- }
- for(i=0;i<4;i++)
- {
- anadata1[i]=RXDdata[i+6];
- }
- for(i=0;i<4;i++)
- {
- anadata2[i]=RXDdata[i+10];
- }
- LCD_Clear();
- LCD_WriteStr(1,1,"當前溫度:");
- LCD_WriteStr(1,2,temdata);
- LCD_WriteStr(1,3,"模擬量1 :");
- LCD_WriteStr(6,3,anadata1);
- save[0]=(anadata1[0]-0x30)*100+(anadata1[2]-0x30)*10+(anadata1[3]-0x30);
- LCD_WriteStr(1,4,"模擬量2 :");
- LCD_WriteStr(6,4,anadata2) ;
- save[1]=(anadata2[0]-0x30)*100+(anadata2[2]-0x30)*10+(anadata2[3]-0x30);
- count=0;
- }
- if(KeyValue==42)
- {
- KeyValue=0;
- LCD_WriteStr(1,2,"選擇2#分機");
- ES=0;
- RS485E=1;
- SBUF=0X12;
- while(!TI);
- RS485E=0;
- TI=0;
- ES=1;
- LCD_WriteStr(1,3,"#2機故障");
- while(count!=14);
- for(i=0;i<6;i++)
- {
- temdata[i]= RXDdata[i];
- }
- for(i=0;i<4;i++)
- {
- anadata1[i]=RXDdata[i+6];
- }
- for(i=0;i<4;i++)
- {
- anadata2[i]=RXDdata[i+10];
- }
- LCD_Clear();
- LCD_WriteStr(1,1,"當前溫度:");
- LCD_WriteStr(1,2,temdata);
- LCD_WriteStr(1,3,"模擬量1 :");
- LCD_WriteStr(6,3,anadata1);
- save[2]=(anadata1[0]-0x30)*100+(anadata1[2]-0x30)*10+(anadata1[3]-0x30);
- LCD_WriteStr(1,4,"模擬量2 :");
- LCD_WriteStr(6,4,anadata2) ;
- save[3]=(anadata2[0]-0x30)*100+(anadata2[2]-0x30)*10+(anadata2[3]-0x30);
- count=0;
- }
- if(KeyValue==43)
- {
- KeyValue=0;
- LCD_WriteStr(1,2,"選擇3#分機");
- ES=0;
- RS485E=1;
- SBUF=0X13;
- while(!TI);
- RS485E=0;
- TI=0;
- ES=1;
- LCD_WriteStr(1,3,"#3機故障");
- while(count!=14);
- for(i=0;i<6;i++)
- {
- temdata[i]= RXDdata[i];
- }
- for(i=0;i<4;i++)
- {
- anadata1[i]=RXDdata[i+6];
- }
- for(i=0;i<4;i++)
- {
- anadata2[i]=RXDdata[i+10];
- }
- LCD_Clear();
- LCD_WriteStr(1,1,"當前溫度:");
- LCD_WriteStr(1,2,temdata);
- LCD_WriteStr(1,3,"模擬量1 :");
- LCD_WriteStr(6,3,anadata1);
- save[4]=(anadata1[0]-0x30)*100+(anadata1[2]-0x30)*10+(anadata1[3]-0x30);
- LCD_WriteStr(1,4,"模擬量2 :");
- LCD_WriteStr(6,4,anadata2) ;
- save[5]=(anadata2[0]-0x30)*100+(anadata2[2]-0x30)*10+(anadata2[3]-0x30);
- count=0;
- }
- if(KeyValue==44)
- {
- KeyValue=0;
- LCD_WriteStr(1,2,"選擇4#分機");
- ES=0;
- RS485E=1;
- SBUF=0X14;
- while(!TI);
- RS485E=0;
- TI=0;
- ES=1;
- LCD_WriteStr(1,3,"#4機故障");
- while(count!=14);
- for(i=0;i<6;i++)
- {
- temdata[i]= RXDdata[i];
- }
- for(i=0;i<4;i++)
- {
- anadata1[i]=RXDdata[i+6];
- }
- for(i=0;i<4;i++)
- {
- anadata2[i]=RXDdata[i+10];
- }
- LCD_Clear();
- LCD_WriteStr(1,1,"當前溫度:");
- LCD_WriteStr(1,2,temdata);
- LCD_WriteStr(1,3,"模擬量1 :");
- LCD_WriteStr(6,3,anadata1);
- save[6]=(anadata1[0]-0x30)*100+(anadata1[2]-0x30)*10+(anadata1[3]-0x30);
- LCD_WriteStr(1,4,"模擬量2 :");
- LCD_WriteStr(6,4,anadata2) ;
- save[7]=(anadata2[0]-0x30)*100+(anadata2[2]-0x30)*10+(anadata2[3]-0x30);
- count=0;
- }
- }
- if(KeyValue==41)
- {
- LCD_Clear();
- LCD_WriteStr(1,1,"1#分機");
- LCD_WriteStr(1,2,"請輸入8 位data");
- sendchar[0]=0x21;
- send_case();
- }
- if(KeyValue==42)
- {
- LCD_Clear();
- LCD_WriteStr(1,1,"2#分機");
- LCD_WriteStr(1,2,"請輸入8 位data");
- sendchar[0]=0x22;
- send_case();
- }
- if(KeyValue==43)
- {
- LCD_Clear();
- LCD_WriteStr(1,1,"3#分機");
- LCD_WriteStr(1,2,"請輸入8 位data");
- sendchar[0]=0x23;
- send_case();
- }
- if(KeyValue==44)
- {
- LCD_Clear();
- LCD_WriteStr(1,1,"4#分機");
- LCD_WriteStr(1,2,"請輸入8 位data");
- sendchar[0]=0x24;
- send_case();
- }
- if(KeyValue==33)
- {
- RS485E=1;
- LCD_WriteStr(3,3,"please wait...");
- do
- {
- SBUF=sendchar[j]; // 發送數據
- while(!TI);
- TI=0;
- j++;
- }while(j<9);
- j=0;
- RS485E=0;
- LCD_Clear();
- LCD_WriteStr(3,3,"發送成功");
- }
- }
- }
- void send_case()
- {
- unsigned char sendnum;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
分機源碼:
- #include <reg52.h>
- #include <intrins.h>
- #include <math.h>
- #include <lcd.h>
- #include "ds18b20.h"
- #define adc0809_data P1 //模擬量采集總線
- sbit sda=P2^0; //IO口定義
- sbit scl=P2^1;
- bit playflag=0;
- sbit ADDA = P3^2;
- sbit STR =P3^3; //單片機P3.4接模塊STR引腳, 啟動轉換信號
- sbit EOC =P3^5; //單片機P3.5接模塊EOC, 轉換結束信號,高電平有效
- sbit OE =P3^6; //單片機P3.6接模塊OE,輸出允許信號,高電平有效
- sbit RS485=P3^4;
- void chushihua(void);
- void display(int v);
- void play();
- void AD(void );
- void Conut(void);
- void chuanshu(void);
- unsigned int tmp;
- unsigned char temp,buf,count,counts,mn;
- unsigned char datas1[] = {0, 0, 0, 0, 0, 0, 0};
- unsigned char data RXDdata[ ] = { 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
- unsigned char code AD1[] = {"newwendu "}; //顯示標準框架
- unsigned char code AD2[] = {" "}; //顯示標準框架
- unsigned char AD_DATA[2]; //保存IN0通道轉換后的數據
- unsigned char AD_DATA1[14]; //保存IN0通道轉換后的數據
- unsigned char disbuff[5] ={ 0,0,0,0,0};
- unsigned char disbuff1[14];
- void nop()
- {
- _nop_();
- _nop_();
- }
- void delay1(unsigned char m)
- { unsigned int n;
- for(n=0;n<m;n++);
- }
- void init24() //24c02初始化子程序
- {
- scl=1;
- nop();
- sda=1;
- nop();
- }
- void start24() //啟動I2C總線
- {
- sda=1;
- nop();
- scl=1;
- nop();
- sda=0;
- nop();
- scl=0;
- nop();
- }
- void stop24() //停止I2C總線
- {
- sda=0;
- nop();
- scl=1;
- nop();
- sda=1;
- nop();
- }
- void writebyte24(unsigned char j) //寫一個字節
- {
- unsigned char i,temp;
- temp=j;
- for (i=0;i<8;i++)
- {
- temp=temp<<1;
- scl=0;
- nop();
- sda=CY; //temp左移時,移出的值放入了CY中
- nop();
- scl=1; //待sda線上的數據穩定后,將scl拉高
- nop();
- }
- scl=0;
- nop();
- sda=1;
- nop();
- }
- unsigned char readbyte24() //讀一個字節
- {
- unsigned char i,j,k=0;
- scl=0; nop(); sda=1;
- for (i=0;i<8;i++)
- {
- nop(); scl=1; nop();
- if(sda==1)
- j=1;
- else
- j=0;
- k=(k<<1)|j;
- scl=0;
- }
- nop();
- return(k);
- }
- void clock24() //I2C總線時鐘
- {
- unsigned char i=0;
- scl=1;
- nop();
- while((sda==1)&&(i<255))
- i++;
- scl=0;
- nop();
- }
- ////////從24c02的地址address中讀取一個字節數據/////
- unsigned char read24c02(unsigned char address)
- {
- unsigned char i;
- start24();
- writebyte24(0xa0);
- clock24();
- writebyte24(address);
- clock24();
- start24();
- writebyte24(0xa1);
- clock24();
- i=readbyte24();
- stop24();
- delay1(10);
- return(i);
- }
- //////向24c02的address地址中寫入一字節數據info/////
- void write24c02(unsigned char address,unsigned char info)
- {
- start24();
- writebyte24(0xa0);
- clock24();
- writebyte24(address);
- clock24();
- writebyte24(info);
- clock24();
- stop24();
- delay1(50);
- }
- /**********************************************主函數**********************************************/
- void main()
- {
- unsigned char ff;
- init24(); //初始化24C02
-
- sendChangeCmd();
- init();
- writeComm(0x80);
- writeString(AD1,16);
- chushihua();
-
- writeComm(0x80);
- for(ff=1;ff<9;ff++)
- {
- writeData(read24c02(ff+1)); //顯示字符
- delay1(50);
- }
-
-
-
- while(1)
- {
- delayMs(1000); //溫度轉換時間需要750ms以上
- writeComm(0xc0);
- display(getTmpValue());
- play();
- AD(); //ADC控制轉換
- Conut(); //計算---顯示
- chuanshu();
- delayMs(10); //80MS
- sendChangeCmd();
-
- }
- }
- void display(int v)
- {
- unsigned char count;
- unsigned char datas[] = {0, 0, 0, 0, 0,0};
- tmp = abs(v);
- datas[0] = tmp / 10000; //最高位
- datas[1] = tmp % 10000 / 1000; //次高位
- datas[2] = tmp % 1000 / 100; //第三位
- datas[3] = '.';
- datas[4] = tmp % 100 / 10;
- datas[5] = tmp % 10;
- writeComm(0xc0);
- if(v < 0)
- {
- datas1[0] = '-';
- }
- else
- {
- datas1[0] = '+';
- }
- for(count = 1; count != 6; count++)
- {
- if(count == 3)
- datas1[count] = datas[count];
- else
- datas1[count] ='0'+datas[count];
- }
- writeString(datas1, 6);
- }
- void serial() interrupt 4
- {
- ES = 0; //關閉串行中斷
- RI = 0; //清除串行接受標志位
- temp = SBUF;
- if(counts<9)
- {
- RXDdata[counts] = temp; //從串口緩沖區取得數據
- counts++;
- if(counts==9)
- {
- playflag=1;
- }
- }
- if(temp == 0x14)
- {
- RS485 = 1;
- for(count=0;count<14;count++)
- {
- SBUF = AD_DATA1[count];
- while(!TI);
- TI=0;
- }
- RS485 = 0;
- }
- ES = 1; //允許串口中斷
- }
- void chushihua(void)
- {
- SCON=0x50; //設定串口工作方式
- PCON=0x00; //波特率不倍增
-
- TMOD=0x20; //定時器1工作于8位自動重載模式, 用于產生波特率
- EA=1;
- ES = 1; //允許串口中斷
- TL1=0xe8;
- TH1=0xe8; //波特率1200
- TR1=1;
- RS485=0;
- }
- /*********************************************************
- 數據顯示函數
- *********************************************************/
- void play()
- {
- if(playflag)
- {
- writeComm(0x80); //設置位置為第1
- writeString(AD2, 16);
- writeComm(0x80);
- for(mn=1;mn<9;mn++)
- {
- if(RXDdata[0]!=0x24)
- break;
- writeData(RXDdata[mn]+48); //顯示字符
- write24c02(mn+1,RXDdata[mn]+48);
- delay1(50);
- }
- playflag=0;
- counts=0x00;
- }
- }
- /***********AD轉換函數**********/
- void AD(void )
- {
- _nop_();
- ADDA=0;
- _nop_();
- STR=0;
- _nop_();
- STR=1;
- _nop_();
- STR=0;
- while(0==EOC);
- OE=1;
- AD_DATA[0]=adc0809_data;
- _nop_();
- OE=0;
-
- _nop_();
- ADDA=1;
- _nop_();
- STR=0;
- _nop_();
- STR=1;
- _nop_();
- STR=0;
- while(0==EOC);
- OE=1;
- AD_DATA[1]=adc0809_data;
-
- _nop_();
- OE=0;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
程序.rar
(388.75 KB, 下載次數: 86)
2018-6-13 17:31 上傳
點擊文件名下載附件
遠距離485多機通信+LCD顯示
|
|