学习蓝桥杯的同学们不像学习其他更难的板子那样可以使用库函数,因为考试的性质,也要求大家从底层写起,所以我在这里整理了一些常见的蓝桥杯程序,方便大家考试前的记忆,蓝桥杯主要就是个背程序的比赛
作者:山东协和学院 陆舜尧
LED 流水灯
unsigned char tab[8]={ 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}
P2=((P2&0x1f)|0x80);
P0=tab[i ];
P2&=0x1f;
数码管显示
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf(-),0XC6(C)};
void display()
{
P0=0xff; //消隐
P2=(P2&0X1F)|0XE0;
P2&=0X1F;
P0=1<<dspcom; //位选
P2=(P2&0X1F)|0Xc0;
P2&=0X1F;
P0=tab[buf[dspcom]]; //段选
P2=(P2&0X1F)|0XE0;
P2&=0X1F;
if(++dspcom==8)
dspcom=0;
}
独立按键框架
sbit s4=P3^3;
sbits5=P3^2;
sbits6=P3^1;
sbits7=P3^0;
void key ( )
{
if(s4==0)
{
delay10ms();
if(s4==0)
{
while(!s4) ;
需要改变的变量;
}
}
}
关闭外设
sbit Buzz = P0^6;
sbit Relay = P0^4;
void close( )
{
P2 =((P2&0x1F)|0xA0); //使能573
Buzz = 0; //关闭蜂鸣器
Relay = 0; //关闭继电器
P2= P2 & 0x1F; //禁止573
}
定时器中断
sfr AUXR=0x8e;
voidTimer0Init(void) //2毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x9A; //设置定时初值
TH0 = 0xA9; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1;
ET0=1;
}
voidtime( )interrupt 1
{
}
矩阵按键例程
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
sbit KEY_OUT_1 = P3^0;
sbit KEY_OUT_2 = P3^1;
sbit KEY_OUT_3 = P3^2;
sbit KEY_OUT_4 = P3^3;
sbit KEY_IN_4 = P3^4;
sbit KEY_IN_3 = P3^5;
sbit KEY_IN_2 = P4^2;
sbit KEY_IN_1 = P4^4;
u8 code LedChar1[] = { 0x7f, 0x3f, 0x1f, 0x0f, 0x07,0x03, 0x01, 0x00};
u8 code LedChar2[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99,0x92, 0x82, 0xf8};
u8 LedBuff1[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF};
u8 LedBuff2[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF};
u8 KeySta[4][4] = {{1, 1, 1, 1}, {1, 1, 1, 1,}, {1, 1,1, 1}, {1, 1, 1, 1}};
u8 KeyCodeMap[4][4] = {
{0x00,0x01, 0x02, 0x03},
{0x04,0x05, 0x06, 0x07},
{0x08,0x09, 0x0a, 0x0b},
{0x0c,0x0d, 0x0e, 0x0f}
};
void main()
{
while(1)
{
KeyDriver();
}
}
void KeyDriver()
{
u8 i, j;
static u8backup[4][4] = {
{1, 1, 1,1}, {1, 1, 1, 1,}, {1, 1, 1, 1}, {1, 1, 1, 1}
};
for(i=0;i<4; i++)
{
for(j=0;j<4; j++)
{
if(KeySta[i][j] != backup[i][j])
{
if(backup[i][j] != 0)
{
KeyAction(KeyCodeMap[i][j]);
}
backup[i][j] = KeySta[i][j];
}
}
}
}
void KeyAction(u8 keycode)
{
if((keycode>= 0x00) && (keycode <= 0x07))
{
ShowNumber1(keycode );
}
else
ShowNumber2(keycode);
}
void ShowNumber1(u8 dat)
{
char i;
u8 buf[8];
for(i=0;i<8; i++)
{
buf[i] =dat % 10;
dat /=10;
}
for(i=7;i>0; i--)
{
if(buf[i]== 0)
LedBuff1[i] = 0xFF;
else
break;
}
for( ;i>=0; i--)
{
LedBuff1[i] = LedChar1[buf[i]];
}
}
void ShowNumber2(u8 dat)
{
char i;
u8 buf[8];
for(i=0;i<8; i++)
{
buf[i] =dat % 10;
dat /=10;
}
for(i=7;i>0; i--)
{
if(buf[i]== 0)
LedBuff2[i] = 0xFF;
else
break;
}
for( ;i>=0; i--)
{
LedBuff2[i] = LedChar2[buf[i]];
}
}
void LedScan() //放到中断中
{
static u8index = 0;
P0 = LedBuff1[index];
P2 = (P2& 0x1F) | 0x80;
P2 = P2 &0x1F;
if(index <7)
index++;
else
index =0;
}
void smgScan() //放到中断中
{
static u8index = 0;
P2 = (P2& 0x1F) | 0xE0;
P0 = 0xFF;
P2 = P2 &0x1F;
P2 = (P2& 0x1F) | 0xC0;
P0 = 0x80>> index;
P2 = P2 &0x1F;
P2 = (P2& 0x1F) | 0xE0;
P0 =LedBuff2 [index];
P2 = P2 &0x1F;
if(index <7)
index++;
else
index =0;
}
void KeyScan() //放到定时器中
{
u8 i;
static u8keyout = 0;
static u8keybuff[4][4] = {
{0xFF,0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF},
{0xFF,0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}
};
switch(keyout)
{
case 0:KEY_OUT_1 = 0; KEY_OUT_4 = 1; break;
case 1:KEY_OUT_2 = 0; KEY_OUT_1 = 1; break;
case 2:KEY_OUT_3 = 0; KEY_OUT_2 = 1; break;
case 3:KEY_OUT_4 = 0; KEY_OUT_3 = 1; break;
default :break;
}
keybuff[keyout][0] = (keybuff[keyout][0] << 1) | KEY_IN_1;
keybuff[keyout][1] = (keybuff[keyout][1] << 1) | KEY_IN_2;
keybuff[keyout][2] = (keybuff[keyout][2] << 1) | KEY_IN_3;
keybuff[keyout][3] = (keybuff[keyout][3] << 1) | KEY_IN_4;
for(i=0;i<4; i++)
{
if((keybuff[keyout][i] & 0x0F) == 0x0F)
KeySta[keyout][i] = 1;
elseif((keybuff[keyout][i] & 0x0F) == 0x00)
KeySta[keyout][i] = 0;
else
{}
}
keyout++;
keyout &=0x03;
}
void interruptTimer0() interrupt 1
{
TH0 = T0RH;
TL0 = T0RL;
LedScan();
smgScan();
KeyScan();
}
DS18B20
sbit DQ = P1^4;
void Delay_OneWire(unsigned int t) //延时函数
{
while(t--);
}
//DS18B20初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80); // 延时大于480us
DQ = 1;
Delay_OneWire(10); // 14
initflag = DQ; // initflag等于1初始化失败
Delay_OneWire(5);
return initflag;
}
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsignedchar 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)
{
unsignedchar i;
unsignedchar dat;
for(i=0;i<8;i++)
{
DQ= 0;
dat >>= 1;
DQ= 1;
if(DQ)
{
dat|= 0x80;
}
Delay_OneWire(5);
}
returndat;
}
//DS18B20温度采集程序:整数
unsigned char rd_temperature(void)
{
unsigned charlow,high;
char temp;
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<<4;
temp |= (low>>4);
return temp;
}
DS1302
#include "ds1302.h"
sbit SCK=p1^7;
sbit SD=P2^3;
sbit RST=P1^3;
void Write_Ds1302_Byte(unsigned char dat)
{
unsignedchar i;
SCK =0;
for(i=0;i<8;i++)
{
if(dat & 0x01)
{
SD=1;
}
else
{
SD=0;
}
SCK=1;
SCK=0;
dat= dat >> 1;
}
}
unsigned char Read_Ds1302_Byte(void)
{
unsignedchar i, dat=0;
for(i=0;i<8;i++)
{
dat= dat >> 1;
if(SD)
{
dat|= 0x80;
}
else
{
dat&= 0x7F;
}
SCK=1;
SCK=0;
}
returndat;
}
void Ds1302_Single_Byte_Write(unsigned char addr,unsigned char dat)
{
RST=0;
SCK=0;
RST=1;
addr =addr & 0xFE;
Write_Ds1302_Byte(addr);
Write_Ds1302_Byte(dat);
RST=0;
}
unsigned char Ds1302_Single_Byte_Read(unsigned charaddr)
{
unsignedchar temp;
RST=0;
SCK=0;
RST=1;
addr =addr | 0x01;
Write_Ds1302_Byte(addr);
temp=Read_Ds1302_Byte();
RST=0;
SD=0;
returntemp;
}
void Init_Ds1302()
{
Ds1302_Single_Byte_Write(0x8e,0x01);
Ds1302_Single_Byte_Write(0x84,0x23); //初始时
Ds1302_Single_Byte_Write(0x82,0x59); //初始分
Ds1302_Single_Byte_Write(0x80,0x50); //初始秒
Ds1302_Single_Byte_Write(0x8e,0x00);
}
超声波
#include "reg52.h" //定义51单片机特殊功能寄存器
#include "intrins.h"
#include "absacc.h"
#define somenop{_nop_();_nop_();_nop_();_nop_();_nop_();\
_nop_();_nop_();_nop_();_nop_(); _nop_();}
sbit TX = P1^0; //发射引脚
sbit RX = P1^1; //接收引脚
code unsigned char tab[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
unsigned char dspbuf[8] ={10,10,10,10,10,10,10,10}; //显示缓冲区
unsigned char dspcom = 0;
unsigned int intr = 0;
bit s_flag;
unsigned int t = 0;
void send_wave(void);
void display(void);
void main(void)
{
unsigned intdistance;
TMOD |=0x11; //配置定时器工作模式
TH0 =(65536-2000)/256;
TL0 =(65536-2000)%256;
TH1 = 0;
TL1 =0;
EA = 1;
ET0 =1; //打开定时器0中断
TR0 =1; //启动定时器
while(1)
{
/** 200毫秒更新一次数据 */
if(s_flag)
{
s_flag = 0;
/** 关闭定时器0中断:计算超声波发送到返回的时间 */
// ET0= 0;
send_wave(); //发送方波信号
TR1= 1; //启动计时
while((RX== 1) && (TF1 == 0)); //等待收到脉冲
TR1= 0; //关闭计时
//发生溢出
if(TF1== 1)
{
TF1= 0;
distance = 9999; //无返回
}
else
{
/** 计算时间 */
t= TH1;
t<<= 8;
t|= TL1;
distance= (unsigned int)(t*0.017); //计算距离
}
TH1= 0;
TL1= 0;
}
/**数据处理 */
dspbuf[5]= distance/100;
dspbuf[6]= distance%100/10;
dspbuf[7]= distance%10;
}
}
//定时器0中断服务函数
void isr_timer_0(void) interrupt 1 //默认中断优先级 1
{
TH0 =(65536-2000)/256;
TL0 =(65536-2000)%256; //定时器重载
display(); //2ms执行一次
if(++intr== 200)
{
s_flag =1;
intr =0;
}
}
//显示函数
void display(void)
{
自己写
}
//TX引脚发送40KHz方波信号驱动超声波发送探头
//使用软件延时注意RC振荡器频率
void send_wave(void)
{
unsignedchar i = 8; //发送8个脉冲
do
{
TX= 1;
somenop;somenop;somenop;somenop;somenop;somenop;
somenop;somenop;somenop;somenop;
TX= 0;
somenop;somenop;somenop;somenop;somenop;somenop;
somenop;somenop;somenop;somenop;
}
while(i--);
}