关于蓝桥杯重要程序整理

学习蓝桥杯的同学们不像学习其他更难的板子那样可以使用库函数,因为考试的性质,也要求大家从底层写起,所以我在这里整理了一些常见的蓝桥杯程序,方便大家考试前的记忆,蓝桥杯主要就是个背程序的比赛

                                                                                                                                                作者:山东协和学院   陆舜尧

                                                                                                                                            

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--);

}


 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值