基于51单片机TLC2543的AD电压采集双通道12864显示程序

更新时间:2023-08-26 17:38:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于51单片机TLC2543的电压双通道12864显示程序带继电器保护控制(超出设定值继电器断开)冒泡法测量电压采集 50 次!

基于51单片机TLC2543的电压双通道12864显示程序 带继电器保护控制(超出设定值继电器断开)

冒泡法测量电压采集50次!

#include<reg52.h>

#include<intrins.h>

#include<stdlib.h>

#define uchar unsigned char

#define uint unsigned int

#define lcd_data P0

uchar table[5];

uint sda=8000;

sbit eoc=P1^3;

sbit clk=P1^4;

sbit sdi=P1^5;

sbit sdo=P1^6;

sbit cs=P1^7;

sbit lcd_rs=P2^4;

sbit lcd_rw=P2^5;

sbit lcd_en=P2^6;

sbit lcd_psb=P2^1;

sbit lcd_rst=P2^3;

sbit key1=P3^1;

sbit key2=P3^2;

sbit key3=P3^3;

sbit key4=P3^4;

sbit LED=P2^0;

void delay_ms(uchar t)

{

uint j,k;

for(k=t;k>0;k--)

for(j=110;j>0;j--);

}

void write_com(uchar com)

{

lcd_rs=0;

lcd_rw=0;

lcd_en=0;

基于51单片机TLC2543的电压双通道12864显示程序带继电器保护控制(超出设定值继电器断开)冒泡法测量电压采集 50 次!

P0=com;

delay_ms(5);

lcd_en=1;

delay_ms(5);

lcd_en=0;

}

void write_dat(uchar date)

{

lcd_rs=1;

lcd_rw=0;

lcd_en=0;

P0=date;

delay_ms(5);

lcd_en=1;

delay_ms(5);

lcd_en=0;

}

void clear()

{

write_com(0x01);

delay_ms(2);

}

void lcd_pos(uchar X,uchar Y)

{

uchar pos;

if(X==0)

{X=0x80;}

else if(X==1)

{X=0x90;}

else if(X==2)

{X=0x88;}

else if(X==3)

{X=0x98;}

pos=X+Y;

write_com(pos);

}

void display1(uchar x,uchar y,uchar *disp)

{

lcd_pos(x,y);

while(*disp) //显示函数

基于51单片机TLC2543的电压双通道12864显示程序带继电器保护控制(超出设定值继电器断开)冒泡法测量电压采集 50 次!

{

write_dat(*disp);

disp=disp+1;

delay_ms(1);

}

}

void lcd_init()

{

lcd_psb=1;

lcd_rst=0;

delay_ms(5);

lcd_rst=1;

delay_ms(5);

write_com(0x30); // 基本操作指令 delay_ms(5);

write_com(0x0c); // 显示开,关光标 delay_ms(5);

write_com(0x01); // 清除LCD的显示内容 delay_ms(5);

}

uint read(uchar port)

{

uchar ch,i,j;

uint ad;

ch=port;

for(j=0;j<3;j++)

{

ad=0;

ch=port;

eoc=1;

cs=1;

cs=0;

clk=0;

for(i=0;i<12;i++)

{

if(sdo) ad|=0x01;

sdi=(bit)(ch&0x80);

clk=1;

clk=0;

ch<<=1;

ad<<=1;

基于51单片机TLC2543的电压双通道12864显示程序带继电器保护控制(超出设定值继电器断开)冒泡法测量电压采集 50 次!

}

}

cs=1; /////////转换和读取数值

while(!eoc);

ad>>=1;

return(ad);

}

void display(uchar x,uchar y,uint temp) //温度显示函数 {

uchar i=0;

table[0]=temp/1000;

table[1]=-2;//显示小数点

table[2]=temp%1000/100;

table[3]=temp%1000%100/10;

table[4]=temp%1000%100%10;

lcd_pos(x,y);

for(i=0;i<5;i++)

{

write_dat('0'+table[i]);

}

}

void main()

{

int i,j,temp;

double AD1=0,AD2=0;

int xdata sum[50];

lcd_init();

clear();

display1(0,0,"测量电压值");

display1(1,0,"测量电流值");

display1(2,0,"设定电流值");

while(1)

{

for(j=0;j<50;j++)

{

sum[j]=read(0x00);//通道0用了冒泡算法 delay_ms(1);

}

AD2=read(0x10);//通道1没有用冒泡算法 for(i=0;i<50-1;i++)

{

基于51单片机TLC2543的电压双通道12864显示程序带继电器保护控制(超出设定值继电器断开)冒泡法测量电压采集 50 次!

} for(j=i+1;j<50;j++) { if(sum[i]>sum[j]) { temp=sum[i]; sum[i]=sum[j]; sum[j]=temp; } } } for(i=0;i<30;i++) { AD1=AD1+(sum[10+i]/30); } display(0,5,AD1); display(1,5,AD2); if(key1==0) {display(2,5,100);sda=100;} if(key2==0) {display(2,5,200);sda=200;} if(key3==0) {display(2,5,300);sda=300;} if(key4==0) {display(2,5,400);sda=400;} if(AD2>=sda) { delay_ms(100); if(AD2>=sda) { LED=0; display1(3,0,"电流超出设定值!"); delay_ms(2000); } } else { LED=1; display1(3,0," "); } AD1=0;AD2=0; }

本文来源:https://www.bwwdw.com/article/ef1i.html

Top