蓝桥杯单片机笔记

1.定时器

void TM0()
{
	TH0 = (65535-50000) / 256;
	TL0 = (65535-50000) % 256;
	TMOD = 0x01;     //选择定时器
	TR0 = 1;
	EA = 1;
	ET0 = 1;
}

在这里插入图片描述在这里插入图片描述

1.1定时器中断

在这里插入图片描述

2.串口

sfr AUXR = 0x8e;	//at89c52头文件中没有,要自己加
void uart_init()
{
	TMOD = 0x20;
	TH1 = 0xfd;
	TL1 = 0xfd;		//设置波特率,只能用定时器1
	TR1 = 1;
	ET1 = 1;
	
	
	SCON = 0x50;	//设置串口
	AUXR = 0x00;	//蓝桥杯单片机特有
	ES = 1;
	EA = 1;
}

unsigned char receive()		//串口接收
{
	unsigned char temp;
	while(RI==0);  			//接收到R1==1
	RI = 0;		   			//软件清0
	temp = SBUF;
	return temp;
}

void send_bit(unsigned char str)	//串口发送字符
{
	SBUF = str;
	while(TI ==0);					//发送完I1==1
	TI = 0;							//软件清0
}

void send_String(unsigned char *string)	//串口发送字符串
{
	while(*string != '\0')		//不是最后一位,一直发送字符
	{
		send_bit(*string++);
	}
}

在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述

3.时钟

//提前设置要读、写的地址和时间
unsigned char write_add[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char read_add[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char time[7] = {0x35,0x49,0x19,0x02,0x01,0x01,0x23};
		//23年1月2日 周一 19时49分35秒,可直接写

在这里插入图片描述

//提供的源码
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );

void ds_write()	//写入时间
{
	unsigned char i;
	Write_Ds1302_Byte(0x8e,0x00);	//打开保护
	for(i=0;i<7;i++)    //把时间按顺序一个个写入
	{
		Write_Ds1302_Byte(write_add[i],time[i]);
	}
	Write_Ds1302_Byte(0x8e,0x80);	//关闭保护
}


void ds_read()	//读出时间
{
	unsigned char i;
	for(i=0;i<7;i++)
	{
		time[i] = Read_Ds1302_Byte(read_add[i]);
	}
}

	smg_show(1,smg[time[2]/16]);	//读时间
	Delay();
	smg_show(2,smg[time[2]%16]);
	Delay();

4.555振荡器

同时用两个定时器,一个计数,一个定时,获取1秒的脉冲数。
void init_TM()
{
	TMOD = 0x16;			
	TH1 = (65535-50000) / 256;		//定时器1计时,定时器0计数
	TL1 = (65535-50000) % 256;
	
	TH0 = 0xff;			//满的,一次就进中断
	TL0 = 0xff;
	
	TR1 = 1;
	TR0 = 1;
	ET0 = 1;
	ET1 = 1;
	EA = 1;
}

在这里插入图片描述

void TM0_routine() interrupt 1
{
	count_f++;			//计脉冲
}

void TM1_routine() interrupt 3
{
	TH1 = (65535-50000) / 256;
	TL1 = (65535-50000) % 256;
	count_t++;
	if(count_t == 20)		
	{
		f = count_f;		//计1秒的脉冲数
		count_t = 0;
		count_f = 0;
	}
}

5. PCF8591(IIC)

void read_rd1()			//读光敏电阻
{
	IIC_Start();			//读时要,先伪写
	IIC_SendByte(0x90); 
	IIC_WaitAck();
	IIC_SendByte(0x01);		//光敏电阻地址(0x03读可调电阻,测电压)
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91); 
	IIC_WaitAck();
	rd1 = IIC_RecByte();
	IIC_SendAck(1); 
	IIC_Stop();	
}

6. 24C02 (IIC) (存数据)(EEPROM)

unsigned char read(unsigned char add)
{
	unsigned char r;
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);		//要读的地址
	IIC_WaitAck();
	IIC_Stop(); 
	
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	r = IIC_RecByte(); 
	IIC_SendAck(1); 
	IIC_Stop(); 
	return r;
}

void write(unsigned char add,unsigned char value)
{
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);		//要写的地址
	IIC_WaitAck();
	IIC_SendByte(value);	//要写入的数据
	IIC_WaitAck();
	IIC_Stop(); 
}

7. DS18B20(温度测量)

void read_temp()
{
	unsigned char h,l;
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	
	smg_delay(2);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	l = Read_DS18B20();
	h = Read_DS18B20();
	init_ds18b20();
	
	temp = (h << 8) | l;
	temp = temp*0.625;

}

常用代码

uchar smg_nodot[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc1,0x8e,0xc8,0x8c,0xbf};
										//   0    1    2    3    4    5		6     7    8    9    U   F     N   P    -
uchar smg_dot[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
									//   0    1    2    3    4    5		6     7    8    9


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值