蓝桥杯 知识点总结
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;
}