⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 51单片机
💻 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 + -