蓝桥杯51单片机-常用函数

1.锁存器选通函数

void SelectHC573(unsigned char n)
{
	switch(n)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
		case 0:
			P2 = (P2 & 0x1f) | 0x00;		//所有锁存器不选择
		break;
	}
}
2.初始化开发板函数
void InitSystem()
{
	SelectHC573(5);
	P0 = 0x00;
	SelectHC573(4);
	P0 = 0xff;
	SelectHC573(0);
}
3.数码管显示函数
//#include "intrins.h"
unsigned char code SMG_duanma[19]=
		{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
         0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
         0xbf,0x7f,0xff};//16->-,17->.,18->null

unsigned char SMG[]={18,18,18,18,18,18,18,18};

void DelaySMG(unsigned char t)		
{
    while(t--);
}

void ShowSMG_Bit(unsigned char dat, unsigned pos)
{
    P0=0XFF;
	SelectHC573(6);			//数码管的位置
	P0 = 0x01 << pos;
	SelectHC573(7);			//数码管的内容
	P0 = dat;
}

void DisplaySMG()
{
	SMG[0]=;
	SMG[1]=;
	SMG[2]=;
	SMG[3]=;
	SMG[4]=;
    SMG[5]=;
	SMG[6]=;
	SMG[7]=;
	
	ShowSMG_Bit(SMG_duanma[SMG[0]], 0);
	DelaySMG(500);
	ShowSMG_Bit(SMG_duanma[SMG[1]], 1);
	DelaySMG(500);
	ShowSMG_Bit(SMG_duanma[SMG[2]], 2);
	DelaySMG(500);
	ShowSMG_Bit(SMG_duanma[SMG[3]], 3);
	DelaySMG(500);
	ShowSMG_Bit(SMG_duanma[SMG[4]], 4);
	DelaySMG(500);
	ShowSMG_Bit(SMG_duanma[SMG[5]], 5);
	DelaySMG(500);
	ShowSMG_Bit(SMG_duanma[SMG[6]], 6);
	DelaySMG(500);
	ShowSMG_Bit(SMG_duanma[SMG[7]], 7);
	DelaySMG(500);
    ShowSMG_Bit(0xff, 7);
    DelaySMG(500);
}
4.独立按键函数
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

void DelayK(unsigned char t)
{
	while(t--);
}
 
void ScanKeys_Alone()
{
	if(S7 == 0)
	{
		DelayK(100);
		if(S7 == 0)
		{

			while(S7 == 0);

		}
	}
	if(S6 == 0)
	{
		DelayK(100);
		if(S6 == 0)
		{
			state++;
			while(S6 == 0);

		}
	}
	if(S5 == 0)
	{
		DelayK(100);
		if(S5 == 0)
		{

			while(S5 == 0);

		}
	}
	if(S4 == 0)
	{
		DelayK(100);
		if(S4 == 0)
		{

			while(S4 == 0);

		}
	}
}
5.矩阵键盘函数
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
 
sbit C1=P4^4;
sbit C2=P4^2;
sbit C3=P3^5;
sbit C4=P3^4;
 
void Delay1ms(unsigned char x)
{
    while(x--)
    {
        unsigned char i,j;
        i=12;
        j=169;
        do
        {
            while(--j);
        } while(--i);
    }
}
void ScanKeysMulti()//ROW行/column列
{
    R1=0;
    R2=R3=R4=1;
    C1=C2=C3=C4=1;
    if(C1==0)
    {
        Delay1ms(5);
        if(C1==0)
        {
            while(C1==0);
            key=0;
            
        }
    }
    else if(C2==0)
    {
        Delay1ms(5);
        if(C2==0)
        {
            while(C2==0);
            key=1;
            
        }
    }
    else if(C3==0)
    {
        Delay1ms(5);
        if(C3==0)
        {
            while(C3==0);
            key=2;
            
        }
    }
    else if(C4==0)
    {
        Delay1ms(5);
        if(C4==0)
        {
            while(C4==0);
            key=3;
            
        }
    }
		
}
6.外部中断函数
void Init_INT0()
{
	IT0 = 1;//下降沿触发
	EX0 = 1;//打开外部中断0
	EA = 1;//打开总中断
}
 
 
void ServiceINT0() interrupt 0
{
	//当触发外部中断0,会执行此函数
}
 
 
 
7.定时器函数
void init(void)
{
    TMOD = 0x01;                //<1>
    TH0 = (65535 - 50000) / 256;
    TL0 = (65535 - 50000) % 256;//<2>
    ET0 = 1;                    //<3>
    EA = 1;                     //<4>
    TR0=1;                     //<5>
}
 
void Time0() interrupt 1
{
    TL0 = (65535-50000) % 256;
    TH0 = (65535-50000) / 256;//非重载模式,重新赋值
   
}

void init1(void)
{
    TMOD = 0x20;                //<1>
    TH1 = (65535 - 50000) / 256;
    TL1 = (65535 - 50000) % 256;//<2>
    ET1 = 1;                    //<3>
    EA = 1;                     //<4>
    TR1=1;                     //<5>
}
 
void Time1() interrupt 3
{
    TL1 = (65535-50000) % 256;
    TH1 = (65535-50000) / 256;//非重载模式,重新赋值
   
}
8.串口通信函数
sfr AUXR = 0X8e;
void InitUart()
{
	TMOD = 0x20;
	TH1 = 0xfd;
	TL1 = 0xfd;
	TR1 = 1;
	
	SCON = 0x50;
	AUXR = 0x00;
	
	ES = 1;
	EA = 1;
}

void ServiceUart() interrupt 4
{
	if(RI == 1)
	{
		RI = 0;
		urdat = SBUF; 
		SendByteUart(urdat + 1);
	}
}

void SendByteUart(uchar dat)
{
	SBUF = dat;
	while(TI == 0);
	TI = 0;
}

void SendStringUart(uchar *str)
{
	while(*str != '\0')
	{
		SendByteUart(*str);
		str++;
	}
}
9.PWM发生
unsigned char count = 0;
unsigned char pwm_duty = 0;
void InitTimer0()
{
	TMOD = 0x01;
	TH0 = (65535 - 100) / 256;
	TL0 = (65535 - 100) % 256;
	
	ET0 = 1;
	EA = 1;
}
 
void ServiceTimer0() interrupt 1
{
	TH0 = (65535 - 100) / 256;
	TL0 = (65535 - 100) % 256;
	
	count++;
	if(count == pwm_duty)
	{
		L1 = 1;
	}
	else if(count == 100)
	{
		L1 = 0;
		count = 0;
	}
}
10.AT24C02

字节读

void Write_24C02(unsigned char addr, unsigned char dat)
{
	IIC_Start();		//IIC总线起始信号					
	IIC_SendByte(0xa0); 	//24C02的写设备地址
	IIC_WaitAck();		//等待从机应答	
	IIC_SendByte(addr); 	//内存字节字节
	IIC_WaitAck(); 		//等待从机应答	
	IIC_SendByte(dat); 	//写入目标数据
	IIC_WaitAck();		//等待从机应答	
	IIC_Stop();		//IIC总线停止信号		
}

字节写

unsigned char Read_24C02(unsigned char addr)
{
	unsigned char tmp;
	//进行一个伪写操作
	IIC_Start();		//IIC总线起始信号					
	IIC_SendByte(0xa0); 	//24C02写设备地址
	IIC_WaitAck();		//等待从机应答	
	IIC_SendByte(addr); 	//内存自己地址
	IIC_WaitAck(); 		//等待从机应答	
	//进行字节读操作
	IIC_Start();		//IIC总线起始信号					
	IIC_SendByte(0xa1); 	//24C02读设备地址
	IIC_WaitAck();		//等待从机应答	
	tmp = IIC_RecByte();	//读取目标数据
	IIC_Ack(0); 		//产生非应答信号		
	IIC_Stop();		//IIC总线停止信号			
	return tmp;
}
11.PCF8591
unsigned char Ad_Read(unsigned char addr)
{
    unsigned char temp;
    IIC_Start();
    IIC_SendByte(0x90);
    IIC_WaitAck();
    IIC_SendByte(addr);
    IIC_WaitAck();
	IIC_Stop(); 	
		
    IIC_Start();
    IIC_SendByte(0x91);
    IIC_WaitAck();
    temp = IIC_RecByte();
    IIC_Ack(0);
    IIC_Stop();
    return temp;
}
12.常用延时函数
#include "intrins.h"

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
13.读取温度函数
unsigned int T_dat=0;

void Read_Temperature()
{
	unsigned char LSB,MSB ;
	
	Init_DS18B20();		      //DS18B20复位	
	Write_DS18B20(0xCC);	      //跳过ROM操作指令
	Write_DS18B20(0x44);          //开始温度转换
	Delay(1000);                  //延时700ms左右,等待温度转换完成
	Init_DS18B20();		      //DS18B20复位
	Write_DS18B20(0xCC);	      //跳过ROM操作指令	
	Write_DS18B20(0xBE);	      //开始读取高速暂存器		
	LSB = Read_DS18B20();	      //读取温度数据的低8位
	MSB = Read_DS18B20();	      //读取温度数据的高8位
	Init_DS18B20();		      //DS18B20复位,停止暂存器数据读取

	T_dat=MSB;//不带小数点
	T_dat=(T_dat<<8)|LSB;
	T_dat>>=4;
	
// 	T_dat = 0x0000;
// 	T_dat = MSB;
// 	T_dat <<= 8;
// 	T_dat = T_dat | LSB;         //将LSB和MSB整合成为一个16位的整数
// 	//首先通过温度数据的高5位判断采用结果是正温度还是负温度
// 	if((T_dat & 0xf800) == 0x0000)    //正温度的处理办法
// 	{
// 		T_dat >>= 4;         //取出温度结果的整数部分
// 		T_dat = T_dat*10;    //放大10倍,然后加上小数部分
// 		T_dat = T_dat + (LSB&0x0f)*0.625;
// 	}
	
	
}
14.2*2矩阵键盘
sbit R1=P3^2;
sbit R2=P3^3;
sbit C1=P4^4;
sbit C2=P4^2;

void DelayK(uchar t)
{
	while(t--);
}

void Scankey()
{
	R1=0;
	R2=C1=C2=1;

	if(C1==0)//S5
	{
		DelayK(100);
		if(C1==0)
		{
			SelectHC138(4);
			key_num=0;
			while(C1==0);
		}
	}
	
	if(C2==0)//S9
	{
		DelayK(100);
		if(C2==0)
		{
			SelectHC138(4);
			key_num=1;
			while(C2==0);
		}
	}
	
	R2=0;
	R1=C1=C2=1;
	if(C1==0)//S4
	{
		DelayK(100);
		if(C1==0)
		{
			SelectHC138(4);
			key_num=2;
			while(C1==0);
		}
	}
	if(C2==0)//S8
	{
		DelayK(100);
		if(C2==0)
		{
			SelectHC138(4);
			key_num=3;
			
			while(C2==0);
		}
	}
}
15.ds1302
//注意BCD码
/*什么是BCD码?
   就是用十六进制来表示十进制。什么意思?怎么理解?
   例如,十六进制数0x13的值为整数19,但BCD码表示的是整数13。
*/
unsigned char code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
 
unsigned char code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
 
// unsigned char TIME[7] = {0x30, 0x50, 0x23, 0x17, 0x02, 0x06, 0x18};
//2018/周六/2.17/23:50:30
unsigned char TIME[7] = {0x14, 0x45, 0x11, 0x17, 0x03, 0x07, 0x24};

void DS1302_Config()
 
{
 
        unsigned char n;
 
       Ds1302_Single_Byte_Write(0x8E,0x00); 
 
        for (n=0; n<7; n++) 
 
        {
 
                Ds1302_Single_Byte_Write(WRITE_RTC_ADDR[n],TIME[n]);        
 
        }
 
       Ds1302_Single_Byte_Write(0x8E,0x80); 
 
}
 
 
void DS1302_ReadTime()
 
{
 
        unsigned char n;
 
        for (n=0; n<7; n++) 
 
        {
 
                TIME[n] = Ds1302_Single_Byte_Read(READ_RTC_ADDR[n]);
				Ds1302_Single_Byte_Write(0x00, 0x00);//必须得加,否则数据会混乱
 
        }                
 
}
 
void DisplaySMG()
{
	SMG[0]=TIME[2]/16;
	SMG[1]=TIME[2]%16;
	
	SMG[2]=SMG[5]=16;
	SMG[3]=TIME[1]/16;
	SMG[4]=TIME[1]%16;
	
	SMG[6]=TIME[0]/16;
	SMG[7]=TIME[0]%16;
	
	ShowSMG_Bit(SMG_duanma[SMG[0]], 0);
	Delay1ms();
	ShowSMG_Bit(SMG_duanma[SMG[1]], 1);
	Delay1ms();
	ShowSMG_Bit(SMG_duanma[SMG[2]], 2);
	Delay1ms();
	ShowSMG_Bit(SMG_duanma[SMG[3]], 3);
	Delay1ms();
	ShowSMG_Bit(SMG_duanma[SMG[4]], 4);
	Delay1ms();
	ShowSMG_Bit(SMG_duanma[SMG[5]], 5);
	Delay1ms();
	ShowSMG_Bit(SMG_duanma[SMG[6]], 6);
	Delay1ms();
	ShowSMG_Bit(SMG_duanma[SMG[7]], 7);
	Delay1ms();
	ShowSMG_Bit(0xff, 7);
}

 16.NE555

void DisplaySMG_F()
{
	DisplaySMG_Bit(0, SMG_DM_NoDot[15]);
	DelaySMG(500);
	
	if(dat_f > 9999)
		DisplaySMG_Bit(3, SMG_DM_NoDot[dat_f / 10000]);
	DelaySMG(500);
	if(dat_f > 999)
		DisplaySMG_Bit(4, SMG_DM_NoDot[(dat_f / 1000) % 10]);
	DelaySMG(500);
	if(dat_f > 99)
		DisplaySMG_Bit(5, SMG_DM_NoDot[(dat_f / 100) % 10]);
	DelaySMG(500);
	if(dat_f > 9)
		DisplaySMG_Bit(6, SMG_DM_NoDot[(dat_f / 10) % 10]);
	DelaySMG(500);
	DisplaySMG_Bit(7, SMG_DM_NoDot[dat_f % 10]);
	DelaySMG(500);
}
 
void Init_Timer()
{
	TH0 = 0xff;        
	TL0 = 0xff;
	
	TH1 = (65536 - 50000) / 256;        
	TL1 = (65536 - 50000) % 256;
	
	TMOD = 0x16;     //定时器1用方式1,定时;定时器0用方式2,计数
	
  ET0 = 1;
  ET1 = 1;
	EA = 1;
	
	TR0 = 1;
	TR1 = 1;
}
 
void Service_T0() interrupt 1
{
	count_f++;
}
 
void Service_T1() interrupt 3
{
        TH1 = (65536 - 50000) / 256;        
	TL1 = (65536 - 50000) % 256;
	count_t++;
	if(count_t == 20)
	{
		dat_f = count_f;
		count_f = 0;
		count_t = 0;
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值