0.png (61.43 KB, 下載次數: 94)
下載附件
2016-5-17 00:42 上傳
想做采集器的來看看吧
全部程序下載:
51單片機電流電壓采集.zip
(27.11 KB, 下載次數: 176)
2016-5-17 00:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
源碼預覽:
- # include <reg52.h>
- # include <intrins.h>
- sbit rs=P0^7;
- sbit rw=P0^6;
- sbit ep=P0^5;
- unsigned char dis1[4];
- unsigned char dis2[4];
- unsigned char chv=0x00;
- unsigned char cha=0x70;
- //unsigned char chv;
- unsigned int date_v=0;
- unsigned int date_a=0;
- sbit EOC=P1^0;
- sbit CS=P1^4;
- sbit IO_CLK=P1^1;
- sbit DAT_IN=P1^2;
- sbit DAT_OUT=P1^3;
- void init() //初始化uart
- {
-
-
- TMOD=0X20; //定時器1定時器方式 工作模式2,可自動重載的8位計數器常把定時/計數器1以模式2作為串行口波特率發生器
- SCON=0XD0; //選擇工作模式1使能接收,允許發送,允許接收
- EA=1; //開總中斷
- ES=1; //打開串口中斷
- ET1=0; //打開定時器中斷
- PCON=0X00; //8位自動重載,波特率加倍
- TH1=0Xfd; //用22.1184 mhz波特率
- TL1=0Xfd;
- TR1=1; //打開中時器
-
- }
- void UART_Putch(unsigned char dat) //輸出一個字符
- {
- SBUF=dat; //把數據送給sbuf緩存器中
- while(TI!=1);//發送標志位 TI如果發送了為1,沒發送為0,沒發送等待,到了退出循環
- TI=0; //到了,TI清為0
- }
- unsigned int read_tlc2543(unsigned char M)//M 為十六進制;
- {
- unsigned char i,ctrl_word;
- unsigned int ad_result=0;
- DAT_OUT=1;
- ctrl_word=M;
- CS=1;
- IO_CLK=0;
- CS=0;
- for(i=0;i<8;i++)
- {
- DAT_IN=ctrl_word&0x80;
- ctrl_word=ctrl_word<<1;
- IO_CLK=1;
- ad_result=ad_result<<1;
- if(DAT_OUT)
- ad_result=ad_result+1;
- IO_CLK=0;
- }
- for(i=8;i<12;i++)
- {
- IO_CLK=1;
- ad_result=ad_result<<1;
- if(DAT_OUT)
- ad_result=ad_result+1;
- IO_CLK=0;
- }
- CS=1;
- return ad_result;
- }
- void delay (int m)
- {
- unsigned char i,j;
- for (i=0;i<m;i++)
- for (j=0;j<253;j++);
- }
- bit lcd_bz()
- {
- bit result;
- rs=0; // 讀忙信號
- rw=1;
- ep=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- result = (bit)(P2&0x80);
- ep=0;
- return result;
- }
- void lcd_wcmd (unsigned char cmd)
- {
- while (lcd_bz());
- rs=0;
- rw=0;
- ep=0;
- _nop_();
- _nop_();
- P2=cmd ;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- ep=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- ep=0;
- }
- void lcd_pos (unsigned char pos)
- {
- lcd_wcmd (pos|0x80);
- }
- void lcd_wdat (unsigned char dat)
- {
- while (lcd_bz());
- rs=1;
- rw=0;
- ep=0;
- _nop_();
- _nop_();
- P2=dat ;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- ep=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- ep=0;
- }
- void lcd_init ()
- {
- lcd_wcmd (0x38);
- delay (1);
- lcd_wcmd (0x0c);
- delay (1);
- lcd_wcmd (0x06);
- delay (1);
- lcd_wcmd (0x01);
- delay (1);
- }
- void lcd_dis(unsigned char pose,unsigned char *dis)
- {
- unsigned char i;
- //lcd_init ();
- delay (10);
- lcd_pos (pose);
- for(i=0;i<4;i++)
- {
- lcd_wdat(dis[i]+0x30);
- }
-
- }
- void convert(unsigned int a,unsigned char *dis1)//電流
- {
- unsigned int temp,b;
- b=a/1000;
- if(b!=0)
- dis1[0]=(unsigned char)b;
- else
- dis1[0]=0;
- temp=a%1000;
- b=temp/100;
- if(b!=0)
- dis1[1]=(unsigned char)b;
- else
- dis1[1]=0;
- temp=temp%100;
- b=temp/10;
- if(b!=0)
- dis1[2]=(unsigned char)b;
- else
- dis1[2]=0;
- b=temp%10;
- if(b!=0)
- dis1[3]=(unsigned char)b;
- else
- dis1[3]=0;
- }
- void main ()
- {
- init();
- lcd_init ();
- read_tlc2543(cha);
- delay(10);
- //read_tlc2543(cha);
- date_v=read_tlc2543(cha);
- convert(date_v,dis2);
- lcd_dis(0x00,dis2);
- while(1){}
- }
- void init1() interrupt 4 //uart中斷 ,4為串口中斷
- {
-
- if(RI==1) //收到數據
- {
- unsigned char m=SBUF; //m為計算機發送給串口的數據,例,open //總體思想是,計算機通知串口,我要發數據了
- RI=0; //收到清0
-
- if(m=='1') //判斷m這位數據有無\r
- {
- read_tlc2543(cha);
- delay(10);
- //read_tlc2543(cha);
- date_a=read_tlc2543(cha);
- convert(date_a,dis1);
- lcd_dis(0x00,dis1);
- UART_Putch(dis1[0]);
- UART_Putch(dis1[1]);
- UART_Putch(dis1[2]);
- UART_Putch(dis1[3]);
- UART_Putch('\n'); // 換行
-
- }
- else if(m=='2')
- {
- read_tlc2543(chv);
- delay(10);
- //read_tlc2543(cha);
- date_v=read_tlc2543(chv);
- convert(date_v,dis2);
- lcd_dis(0x00,dis2);
- UART_Putch(dis2[0]);
- UART_Putch(dis2[1]);
- UART_Putch(dis2[2]);
- UART_Putch(dis2[3]);
- UART_Putch('\n'); // 換行
- }
- else
- {
- UART_Putch('e');
- UART_Putch('r');
- UART_Putch('r');
- UART_Putch('o');
- UART_Putch('r');
- UART_Putch('!');
- UART_Putch('\r');
- UART_Putch('\n');
- }
-
- }
- }
復制代碼
|