📄 test.c
字号:
#include <reg51.h>
#include <intrins.h>
//TLC1543 A/D用转换用
sbit CLOCK =P2^3;
sbit D_IN =P2^4;
sbit D_OUT =P2^5;
sbit _CS =P2^6;
char v3,v2,v1,v0;
sbit LCD_RS = P2^2;
sbit LCD_RW = P2^1;
sbit LCD_EP = P2^0;
int key,i,j;
unsigned char k,channel;
code unsigned char tab[] = {'0','1','2','3','4','5','6','7','8','9'};
code unsigned char tab0[]={"You press CR"};
code unsigned char tab1[]={"Select channel "};
code unsigned char tab2[]={"Volt is "};
bit KeyFlag;
bit read_flag= 0 ;
unsigned char timecnt=0;
delay(int ms)
{ // 延时子程序
int i;
while(ms--)
{
for(i = 0; i< 20; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
bit lcd_bz()
{ // 测试LCD忙碌状态
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0 & 0x80);
LCD_EP = 0;
return result;
}
lcd_wcmd(char cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
LCD_RS = 0;
LCD_RW = 0;
LCD_EP = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
lcd_pos(char pos) //设定显示位置
{
lcd_wcmd(pos | 0x80);
}
lcd_wdat(char dat) //写入字符显示数据到LCD
{
while(lcd_bz());
LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay(1);
lcd_wcmd(0x0c); //显示开,关光标
delay(1);
lcd_wcmd(0x06); //移动光标
delay(1);
//lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
void displayCR(void) //按下CR键,则清屏
{lcd_wcmd(0x01);
lcd_pos(0);
for(i=0;i<12;i++)
{lcd_wdat(tab0[i]);}
delay(500);
lcd_wcmd(0x01);
}
void show(void)
{ lcd_init(); // 初始化LCD
delay(10);
lcd_wcmd(0x06); //向右移动光标
lcd_pos(0);
while(tab1[j]!='\0')
{
lcd_wdat(tab1[j]);
j++; } //显示字符
lcd_pos(0x40);
while(tab2[i]!='\0')
{
lcd_wdat(tab2[i]);
i++;
//delay(500);
}
}
void display(void)
{lcd_pos(0xf);
lcd_wdat(tab[k]);
}
void KeyServer(void)
{ switch (key)
{ case 0x0DBF: k=0;channel=0;display();break;
case 0x0D7F: k=1;channel=1;display();break;
case 0x0DEF: k=2;channel=2;display();break;
case 0x0DDF: k=3;channel=3;display();break;
case 0x0DFB: k=4;channel=4;display();break;
case 0x0DF7: k=5;channel=5;display();break;
case 0x0DFE: k=6;channel=6;display();break;
case 0x0DFD: k=7;channel=7;display();break;
case 0x0EBF: displayCR(); break;
}
}
unsigned int keyscan(void)
{
unsigned char tmp1,tmp2;
P1=0x00;
P3|=0xf0;
tmp1=P3&0xf0;
P3&=0x0f;
P1=0xff;
tmp2=P1;
if((tmp1!=0xf0)||(tmp2!=0xff) )
key=tmp1*16+tmp2;
else
key=0;
return key;
}
void initTimer(void)
{
TMOD|=0x1;
TH0=0x4c;
TL0=0xf7;
}
/*void delayMS(unsigned int i)
{ unsigned int j,k;
for(k=0;k<i;k++)
for(j=0;j<60;j++);
}*/
/*void initUART(void)
{
SCON=0x50; //串口方式1,允许接收
TMOD|=0x20; //定时器1定时方式2
TCON=0x40; //设定时器1开始计数
TH1=0xFD; //11.0592MHz 9600波特率
TL1=0xFD;
TI=1;
TR1=1; //启动定时器
}*/
//timer0/counter0 interrupt
void timer0(void) interrupt 1
{
TH0=0x4c;//50ms@11.0592
TL0=0xf7;
TR0=0;
ET0=0;
if (timecnt++==3)
{ timecnt=0;
if (KeyFlag==0) key=keyscan();
if (key!=0) KeyFlag=1;
}
TR0=1;
ET0=1;
}
unsigned int read1543(unsigned char port) //从TLC1543读取采样值,形参port是采样的通道号
{
unsigned int data ad;
unsigned char data i,al=0,ah=0;
CLOCK=0;
_CS=0;
port<<=4;
for (i=0;i<4;i++) //把通道号打入1543
{
D_IN=(bit)(port&0x80);CLOCK=1;CLOCK=0;
port<<=1;
}
for (i=0;i<6;i++) //填充6个CLOCK
{
CLOCK=1;CLOCK=0;
}
_CS=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_CS=0; //等待AD转换
for (i=0;i<2;i++) //取D9,D8
{
D_OUT=1;
CLOCK=1;
ah<<=1;
if (D_OUT) ah|=0x01;
CLOCK=0;
}
for (i=0;i<8;i++) //取D7--D0
{
D_OUT=1;
CLOCK=1;
al<<=1;
if (D_OUT) al|=0x01;
CLOCK=0;
}
_CS=1;
ad=(unsigned int)ah;ad<<=8;ad|=al; //得到AD值
return (ad);
}
void main()
{
unsigned int ADValue[15],SumMiddle5,Average,hhh;
float ADD,temp;
char n,i,j,min;
// initUART();
initTimer();
TR0=1;
ET0=1;
ES=1;
EA=1;
while(1)
{
if (KeyFlag==1)
{
KeyServer();
KeyFlag=0;
}
Average=0;
for (n=0;n<15;n++) //15次采样
{
ADValue[n]=read1543(channel)&0x03FF;
}
n=15; //排序
for (i=0;i<n-1;i++)
{ min=i;
for (j=i+1;j<n;j++)if(ADValue[min]>ADValue[j])min=j;
temp=ADValue[i];
ADValue[i]=ADValue[min];
ADValue[min]=temp;
}
//对中间5个值求和
SumMiddle5=0;
for (i=5;i<10;i++) SumMiddle5=SumMiddle5+ADValue[i];
Average= SumMiddle5/5; //对中间5个值求平均
ADD = ((float)SumMiddle5)/5;
/* SBUF=Average/256;
while(TI==0);
TI=0;
SBUF= (Average%256) ;
while(TI==0);
TI=0;*/
delay(1000);
show();
temp=((float)ADD*2.5)/1024.0;
v3= (int)temp; //取最高位电压值
hhh = (temp - (int)temp)*1000;
v2= hhh/100; //取次高位电压值
v1= hhh/10-v2*10; //取最低位电压值
v0= hhh%10;
lcd_pos(0x48);
lcd_wdat(tab[v3]);
lcd_wdat('.');
lcd_wdat(tab[v2]);
lcd_wdat(tab[v1]);
lcd_wdat(tab[v0]);
lcd_wdat('V');
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -