📄 text2.c
字号:
#include <reg52.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
uchar code welcome[]={" voltage! "};
uchar idata lcdtimer[16]={" 0.0000 V "};
uchar timecount;
bit timeflag;
sbit e=P2^1;
sbit rs=P2^0;
sbit CS=P1^4; //TLC1543与89c52的接口连接线路
sbit DOUT=P1^3;
sbit ADIN=P1^2;
sbit CLOCK=P1^1;
sbit EOC=P1^0;
uint readTLC1543(uchar port);
//void deley ();
/*sbit sdo=p1^0;
sbit addr=p1^1;
sbit cs=p1^2;
sbit clk=p1^3;
sbit eoc=p1^4;*/
//void delay();
//void display();
uint a;
void delay(uint del1)
{
uchar del2;
for(;del1>0;del1--)
for(del2=100;del2>0;del2--);
}
//void delay(uint time);
//uint a; //a为全局变量
/*void main()
{
while(1)
{
a=readTLC1543(0x00);
display();
}
}*/
uint readTLC1543(uchar port)
{
uint i ,ad;
uchar datah,datal;
CLOCK=0; //根据时序图分别设置CS,CLOCK,EOC
CS=0;
EOC=1;
port<<=4; //用port的值来选择是哪个AD芯片的哪个通道,实验板上接的是A0和A1,因此port的值可以选择0000或0001
for(i=0;i<4;i++)//把通道写入TLC1543芯片中
{
ADIN=(bit)(port&0x80);
CLOCK=1;
CLOCK=0; //只需要CLOCK一个下降沿就能写入,其他接口的电平不变化
port<<=1; //根据时序图,先写入MSB即最高位,需要左移,然后继续写下一位
}
for(i=0;i<6;i++)//填充6个CLOCK
{
CLOCK=1;
CLOCK=0;
}
CS=1;
delay(100);
CS=0; //等待AD转换
for(i=0;i<2;i++) //取D9和D8位,
{
DOUT=1;
CLOCK=1;
datah<<=1;
if(DOUT)
datah|=0x01;
CLOCK=0;
}
for(i=0;i<8;i++)//取D7~D0位
{
DOUT=1;
CLOCK=1;
datal<<=1;
if(DOUT)
datal|=0x01;
CLOCK=0;
}
EOC=0;
CS=1;
ad=(uint)datah;
ad<<=8;
ad|=datal;//处理高位和低位数据,同时把char型转化为了int型,此处对数值的处理算法,参考“温度传感器”
ad=(ad*0.4887)*100;
//ad=(float)( ad*5/1023)*100000;
return(ad);
}
/*void display()
{
uint i,temp;
//uint shu0,shu1,shu2,shu3,shu4;
temp=a;
lcdtimer[2]=0x30+temp/10000;
lcdtimer[3]=0x30+temp%10000/1000;
lcdtimer[4]=0x30+temp%1000/100;
lcdtimer[5]=0x30+temp%100/10;
lcdtimer[6]=0x30+temp%10;
disp_lcd(0xc0,lcdtimer);
}
/*void delay(uint time)
{
uint i;
for(i=time;i>0; i--)
{;}
}*/
/*void delay(uint del1)
{
uchar del2;
for(;del1>0;del1--)
for(del2=10;del2>0;del2--);
}*/
//液晶显示器判忙函数
//*****************
void busy()
{
uchar temp;
temp=0x00;
rs=0;
//rw=1;
while((temp&0x80)==0x80)
{
P0=0xff;
e=1;
temp=P0;
e=0;
}
}
//*************************
//向液晶显示器写命令函数
//***********************
void write_com(uchar temp)
{
busy();
rs=0;
//rw=0;
P0=temp;
e=1;
e=0;
}
//********************
//向液晶显示器写数据函数
//*********************
void write_data(uchar num)
{
busy();
rs=1;
//rw=0;
P0=num;
e=1;
e=0;
}
//*****************************
//*******向液晶显示器写入显示数据函数
//*********************
void disp_lcd(uchar addr,uchar *temp1)
{
uchar i;
write_com(addr);
delay(100);
for(i=0;i<16;i++)
{
write_data(temp1[i]);
delay(100);
}
}
//************************
//液晶显示器初始化函数
//***********************
void lcd_ini()
{
char i;
for(i=3;i>0;i--)
{
P0=0x30;
rs=0;
//rw=0;
e=1;
e=0;
delay(100);
}
P0=0x38;
rs=0;
//rw=0;
e=1;
e=0;
delay(100);
}
//****************
//液晶显示器复位函数
//***************
void lcd_reset()
{
write_com(0x01);
delay(100);
write_com(0x06);
delay(100);
write_com(0x0c);
delay(100);
}
//*********************
//定时器、计时器中断函数
//*********************
void timer0() interrupt 1
{
TH0=0xdc;
TL0=0x23;
if(--timecount==0)
{
timecount=100;
timeflag=1;
}
}
void main()
{
lcd_ini();
lcd_reset();
disp_lcd(0x80,welcome);
disp_lcd(0xc0,lcdtimer);
TMOD=0x01;
TH0=0xdc;
TL0=0x23;
TR0=1;
IE=0x82;
timeflag=0;
timecount=100;
/* while(1)
{
if(timeflag==1)
{
timeflag=0;
lcdtimer[11]+=1;
if(lcdtimer[11]>=0x3a)
{
lcdtimer[11]=0x30;
lcdtimer[10]+=1;
if(lcdtimer[10]>=0x36)
{
lcdtimer[10]=0x30;
lcdtimer[8]+=1;
if(lcdtimer[8]>=0x3a)
{
lcdtimer[8]=0x30;
lcdtimer[7]+=1;
if(lcdtimer[7]>=0x36)
{
lcdtimer[7]=0x30;
}
}
}
}
disp_lcd(0xc0,lcdtimer);
}
}*/
while(1)
{
uint temp;
a=readTLC1543(0x00);
temp=a;
lcdtimer[1]=0x30+temp/10000;
lcdtimer[3]=0x30+temp%10000/1000;
lcdtimer[4]=0x30+temp%1000/100;
lcdtimer[5]=0x30+temp%100/10;
lcdtimer[6]=0x30+temp%10;
disp_lcd(0xc0,lcdtimer);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -