标题:
基于51单片机电流电压采集
[打印本页]
作者:
啄木鸟
时间:
2016-5-17 00:07
标题:
基于51单片机电流电压采集
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');
}
}
}
复制代码
作者:
chjx0132
时间:
2016-10-16 14:18
有谁做出来过没?
作者:
多一点执念
时间:
2018-4-26 23:37
请问这是测直流还是交流呀
作者:
smartphone
时间:
2018-5-25 20:06
慢慢学习
作者:
dai文轩
时间:
2018-7-20 16:22
学习一下
作者:
oplink
时间:
2018-9-15 08:07
发个电路图看看
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1