蓝桥杯 知识点总结

蓝桥杯 知识点总结

1.基本模板:

#include<common.h>

dsp_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
dsp_show[8];

void system_init()
{
	P0=0xff;P2=0x80;P2=0;
	P0=0x00;P2=0xa0;P2=0;
	
	Timer0Init();
}

void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xCD;		//设置定时初值
	TH0 = 0xD4;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	EA=1;
	ET0=1;
}

void tm0(void) interrupt 1
{
	static uint bit_com=0;
	
	P0=0;P2=0xc0;P2=0;
	P0=dsp_show[bit_com];P2=0xe0;P2=0;
	P0=1<<bit_com;P2=0xc0;P2=0;
	
	if(bit_com==7)
		bit_com=0;
	else
		bit_com++;
	
}

void scan_button()
{
	
}

2.控制LED:

P0=~(8*L4+4*L3+2*L2+L1);P2=0x80;P2=0;  //控制LED

3.独立按键

void scan_button(void)
{
	uchar readdat=P3^0xff;
	trg=readdat&(readdat^cnt);
	cnt=readdat;
	
	if(trg&0x08)   //S4
	{
		
	}
	else if(trg&0x04) //S5
	{
		
	}
	else if(trg&0x02) //S6
	{
		
	}
	else if(trg&0x01) //S7
	{
		
	}
}

3.矩阵按键

void scan_button(void)
{
	static uint key_stat=0;
	uchar key_val=0,key_x=0,key_y=0;
	
	P3=0x0f;P4=0x00;
	if(!P30) key_x=3;
	else if(!P31) key_x=2;
	else if(!P32) key_x=1;
	else if(!P33) key_x=0;
	
	P3=0xf0;P4=0xff;
	if(!P34) key_y=4;
	else if(!P35) key_y=3;
	else if(!P42) key_y=2;
	else if(!P44) key_y=1;
	
	key_val=key_x+key_y*4;
	
	switch(key_stat)   //按键防抖
	{
		case 0:

				break;
			
		case 1:
			if(key_val==0) key_stat=0;  //认为为抖动,清零
			else
			{
					key_stat=2;    //进入阶段2
				
					switch(key_val)
					{
						case 4:      //模式切换,1,2,3对应三种模式
							
							break;         //记住要写break!!!
							
						case 5:     //定时按键
							
							break;    //记得要写break!!!
							
						case 6:     //停止按键
							break;   //记得要写break!!!
						
						case 7:     //室温按键
							
							break;    //记得要写break!!!
							
						}
			}
			
			case 2:
				if(key_val==0) key_stat=0;
				
	}	
}

4.读取温度

/*
  程序说明: 单总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
  日    期: 2011-8-9
*/
#include "reg52.h"
#include "onewire.h"
#include "intrins.h"

sbit DQ = P1^4;  //单总线接口

//单总线延时函数
void Delay_OneWire(unsigned int t);   //先声明


//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

//添加部分*************************************************
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	t*=11;     //修改延时,增加到原来的11倍
	while(t--);
}

float read_temp()
{
	float temp;
	unsigned char low,high;
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(200);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	low=Read_DS18B20();
	high=Read_DS18B20();
	temp=(high<<8|low)*0.0625;
	
	return temp;
}

上一篇:DS18B20使用方法(以STM32为例)


下一篇:【单片机学习】高级外设和项目篇一:温度传感器DS18B20