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

📄 mainkey1.c

📁 在Quick51实验开发板上51单片机在Keil编译环境下
💻 C
字号:
#include <absacc.h>    
#include "Disp.h"
#include "I2C.h"
#include <reg51.h>
#include <string.h>


//定义TLC549操作接口
sbit CS = P3^2;
sbit DAT = P3^3;
sbit CLK = P3^4;
char key;


/*
函数:ReadAdc()
功能:读取A/D转换结果
返回:8位ADC代码
*/
unsigned char ReadAdc()
{
	unsigned char d;
	unsigned char n;
	CS = 0;
	n = 5;
	while ( --n != 0 );
	n = 8;
	do
	{
		d <<= 1;
		if ( DAT ) d++;
		CLK = 1;
		CLK = 0;
	}while ( --n != 0 );
	CS = 1;
	return d;
}


/*
函数:AdcInit()
功能:初始化ADC接口
*/
void AdcInit()
{
	CS = 1;
	CLK = 0;
	DAT = 1;
	ReadAdc();
}
/*
函数:DispVol()
功能:将ADC值转换成电压值,并显示
参数:
	v:8位ADC结果
*/
void DispVol(unsigned char v)
{
       unsigned char x100,x10,x;
       
        v=v*250/256;
        x100=v/100;
        
        DispChar(0,x100+48);
        x10=(v-x100*100)/10;
        DispChar(1,x10+48);
        x=(v-x100*100)%10;
        DispChar(2,x+48);
        DispDotOn(0);
}


/*
函数:Delay()
功能:延时1ms~65.536s
参数:
	t>0时,延时(t*0.001)s
	t=0时,延时65.536s
*/
void Delay(unsigned int t)
{
	do
	{
		TH0 = 0xFC;
		TL0 = 0x66;
		TR0 = 1;
		while ( !TF0 );
		TR0 = 0;
		TF0 = 0;
	} while ( --t != 0 );
}


/*
函数:SysInit()
功能:系统初始化
*/
void SysInit()
{
	TMOD &= 0xF0;
	TMOD |= 0x01;	//设置T0为16位定时器
	DispInit();		//数码管扫描显示初始化
	I2C_Init();		//初始化I2C总线
        AdcInit();
        Delay(200);
        DispP();
}


/*
函数:LM75A_GetTemp
功能:读出LM75A的温度值
返回:LM75A温度寄存器的数值(乘以0.125可得到摄氏度值)
*/
int LM75A_GetTemp()
{
	unsigned char buf[2];
	int t;
	I2C_Gets(0x90,0x00,2,buf);
	t = buf[0];
	t <<= 8;
	t += buf[1];
	t >>= 5;	//去掉无关位
	return t;
}


/*
函数:ByteToStr()
功能:字节型变量c转换为十进制字符串
*/
void ByteToStr(unsigned char idata *s, unsigned char c)
{
	code unsigned char Tab[] = {100,10};
	unsigned char i;
	unsigned char t;
	for ( i=0; i<2; i++ )
	{
		t = c / Tab[i];
		*s++ = '0' + t;
		c -= t * Tab[i];
	}
	*s++ = '0' + c;
	*s = '\0';
}


/*
函数:DispTemp()
功能:显示出温度值
参数:
	t:补码,除以8以后才是真正温度值
*/
void DispTemp(int t)
{
	code unsigned char Tab[8][4] =
	{
		"000",
		"125",
		"250",
		"375",
		"500",
		"625",
		"750",
		"875"
	};
	unsigned char buf[4];
	bit s;	//符号位
	unsigned char i;	//整数部分
	unsigned char d;	//小数部分
	unsigned char x;	//临时变量
//分离出符号
	s = 0;
	if ( t < 0 )
	{
		s = 1;
		t = -t;
	}
//分离出整数和小数部分
	i = t / 8;
	d = t % 8;
//整数部分转换成字符串
	ByteToStr(buf,i);
	x = 4 - strlen(buf);//调整光标
//清除所有显示
	DispClear();
//显示符号
	if ( s )
          { DispChar(x,'-');}
	x++;
//显示整数部分
	DispStr(x,buf);
//显示小数点
	DispDotOn(4);
//显示小数部分
	DispStr(5,Tab[d]);
}
//按键识别
 int keyvalue()
{
   switch(XBYTE[0XE000])
              {case ~0x01: key=1;break;
               case ~0x02: key=2;break;
               case ~0x04: key=3;break;
               case ~0x80: key=8;break;
               default:    key=0;
              }
             return key;  
}
void main(void)
{      unsigned char keyv;//键值
       unsigned char v;  //voltage
       int t;   //temperature 
       SysInit();
       Delay(100);


      
    
     
	   Delay(300);  

     for(;;)
       { if(XBYTE[0XE000]!=0xff)
	  keyv=keyvalue();
        switch(keyv)
         {
           case 1:              
            {
             v=ReadAdc();
             DispClear();  
             DispVol(v);
             Delay(250);
             if(XBYTE[0XE000]!=0xff) //检测键盘状态并延时1秒
               {keyv=keyvalue();break;}
             Delay(250);
             if(XBYTE[0XE000]!=0xff)
               {keyv=keyvalue();break;}
             Delay(250);
             if(XBYTE[0XE000]!=0xff)
               {keyv=keyvalue();break;}
             Delay(250);
             if(XBYTE[0XE000]!=0xff)
               {keyv=keyvalue();break;}
             t = LM75A_GetTemp();
             DispClear();		
             DispTemp(t);
             Delay(250);
             if(XBYTE[0XE000]!=0xff) //检测键盘状态并延时1秒
               {keyv=keyvalue();break;}
             Delay(250);
             if(XBYTE[0XE000]!=0xff)
               {keyv=keyvalue();break;}
             Delay(250);
             if(XBYTE[0XE000]!=0xff)
               {keyv=keyvalue();break;}
             Delay(250);
             if(XBYTE[0XE000]!=0xff)
               {keyv=keyvalue();break;}
             break;
            }
           case 2:
            { 		
	     v=ReadAdc();
             DispClear(); 
             DispVol(v);
             Delay(300);
             break;
            }
           case 3:
            {
             t = LM75A_GetTemp();
             DispClear(); 		
             DispTemp(t);
             Delay(300);
             break;
            }
           case 8:
            {DispClear();
             DispP();
             break;}
           default:
             break;
           }
      }
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -