基于51单片机、串口通信、ASP.NET的密码锁系统

发布者:yanfeng00最新更新时间:2017-01-20 来源: eefocus关键字:51单片机  串口通信  ASP.NET  密码锁系统 手机看文章 扫描二维码
随时随地手机看文章

实现的功能:密码锁,红外控制,温度计功能等

连线:键盘接P0,P2接数码管,接上LCD,P1.0接蜂鸣器,P1.2-P1.7接步进电机

C程序:

#include

#include

typedef unsigned int uint;

typedef unsigned char uchar;


bit FlagC=1;    //接受和发送的标志位

sbit P10=P1^0;   //控制蜂鸣器响

sbit IRIN = P3^2;         //红外接收器数据线

uchar IRCOM[7];

uint nn=11;//用来判断红外发送的信号是数字几

//////温度液晶////////////////

typedef bit BOOL;


sbit DQ = P3 ^ 7;


uchar Temp_Value[] = { 0x00, 0x00 };

uchar Display_Digit[] = { 0, 0, 0, 0 };


sbit LCD_RW = P2 ^ 5; //写数据?

sbit LCD_RS = P2 ^ 6;

sbit LCD_EP = P2 ^ 7; //使能?

uchar num;

int temper = 0;

int CurrentT = 0;

bit flag;


void delayT(uchar t) {

    while (t--)

        ;

}


void init_ds18b20() {

    //    uchar n;

DQ = 1;

    _nop_();

    DQ = 0;

    delayT(80);

    _nop_();

    DQ = 1;

    delayT(14);

    _nop_();

    _nop_();

    _nop_();


    if (DQ == 0)

        flag = 1; //detect 1820 success!

    else

        flag = 0; //detect 1820 fail!

    delayT(20); //20

    _nop_();

    _nop_();

    DQ = 1;

}


void write_byte(uchar dat) {

    uchar i;

    for (i = 0; i < 8; i++) {

        DQ = 0;

        _nop_();

        DQ = dat & 0x01; //从最低位开始写

        delayT(3);

        _nop_();

        _nop_();

        DQ = 1;

        dat >>= 1;

    }

    //    delay(4);

}


uchar read_byte() {

    uchar i, value = 0;

    for (i = 0; i < 8; i++) {

        DQ = 0;

        value >>= 1;

        DQ = 1;

        if (DQ)

            value |= 0x80;

        delayT(2);

        _nop_();

    }

    return value;

}


int readtemperature() {

    uchar templ, temph;

    //    int temp;

    init_ds18b20();

    write_byte(0xcc); //跳过ROM

    write_byte(0x44); //启动温度测量

    delayT(300);


    init_ds18b20();

    write_byte(0xcc);

    write_byte(0xbe);

    //    Temp_Value[0] = ReadOneByte();

    //    Temp_Value[1] = ReadOneByte();

    templ = read_byte();

    temph = read_byte();

    //CurrentT = ((templ&0xf0)>>4) | ((temph&0x07)<<4);

    CurrentT = temph*256 +templ;

    CurrentT = CurrentT * 62.5;

    return CurrentT;

}


/****************侧忙函数************************/

BOOL lcd_bz() {

    BOOL result;

    LCD_RS = 0;

    LCD_RW = 1;

    LCD_EP = 1;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    result = (BOOL) (P0 & 0x80); //检测P0最高位是否为1

    LCD_EP = 0;

    return result;

}

/****************写命令函数************************/

void write_com(uchar cmd) {

    while (lcd_bz())

        ;

    LCD_RS = 0;

    LCD_RW = 0;

    //    LCD_EP = 0;

    _nop_();

    _nop_();

    P0 = cmd;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    LCD_EP = 1;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    LCD_EP = 0;

}


void lcd_pos(uchar pos) {

    write_com(pos | 0x80);

}


/****************写数据函数************************/

void write_data(uchar dat) { //写入字符显示数据到LCD

    while (lcd_bz())

        ;

    LCD_RS = 1;

    LCD_RW = 0;

    //    LCD_EP = 0;

    _nop_();

    _nop_();

    P0 = dat;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    LCD_EP = 1;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    LCD_EP = 0;

}


void initT() {

    //    dula=0;

    //    wela=0;

    LCD_EP = 0;

    write_com(0x38); //16*2显示

    write_com(0x0e); //开显示;显示光标,光标不闪烁

    write_com(0x06); //光标自动增加111

    write_com(0x01); //显示清屏

    //    write_com(0x80+0x10);

}

//////////////////////////////


unsigned int ReData;

uchar num=0;

const char Message[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};    //要发送的数据

char Get_Mes[8]={0x03};               //获取到的数据

uchar i=0;

uchar Chose;//判断选择哪一个功能选项

//此表为 LED 的字模, 共阴数码管 0-F  

uchar code   LEDMAP[] = {~0x3f, ~0x06, ~0x5b, ~0x4f, ~0x66, ~0x6d, ~0x7d, ~0x07,~0x7f, ~0x6f, ~0x77, ~0x7c, ~0x39, ~0x5e, ~0x79, ~0x71};  //段码控制

uint LEDN[16];

int n=0;

void delay(uint);


void Send_data(char p[])   //发送数据

{

    uchar i;

    for(i=0;i<1;i++)

    {

        SBUF = p[i];            //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)

        while(!TI);                // 等特数据传送    (TI发送中断标志)

        TI = 0;                    // 清除数据传送标志    

    } 


void zhuanhuan(char c)     //将PC传过来的16进制数转化成对应的十进制数

{

       switch(c)

      {

        case 0x00:

        {

          LEDN[0]=0;

          break;

        }

      }

}


void Get_data(char p[])    //接受数据到数组中

{

    

    i=i%8;

    i++;

    P2=LEDMAP[SBUF];

    p[i]=P2;

    FlagC=1;

    while(!RI);                // 等特数据传送    (TI发送中断标志)

    RI = 0;                    // 清除数据传送标志    

}

//返回一个选择项

char Get_Chose()

{

    return SBUF;

}


void delay(uint z)

{

    uchar j;

    for(z;z>0;z--)

        for(j=0;j<200;j++)

            ;    

}


void init()

{

    SCON = 0x50;      //REN=1允许串行接受状态,串口工作模式1                      

                    

    PCON|= 0x80;

                                                             

    TMOD|= 0x20;      //定时器工作方式2

    TH1 = 0xF3;                    // //baud*2  /*  波特率4800、数据位8、停止位1。效验位无 (12M)

    TL1 = 0xF3;         

    TR1  = 1;                                                             

    ES   = 1;        //开串口中断                  

    EA   = 1;        // 开总中断 

}


//蜂鸣器响

void beep(uint t)

{

    uint time=0;

    for(time;time

    {

        P10=1;

        delay(100);

        P10=0;

        delay(100);

    }

}


/////////红外//////////////////



void beeph()

{

  unsigned char i;

  for (i=0;i<100;i++)

   {

   delay(4);

   P10=!P10;                 //BEEP取反

   } 

  P10=1;                      //关闭蜂鸣器

}


void delayh(unsigned char x)    //x*0.14MS

{

 unsigned char i;

  while(x--)

 {

  for (i = 0; i<13; i++) {}

 }

}


void delay1h(int ms)

{

 unsigned char y;

  while(ms--)

 {

  for(y = 0; y<250; y++)

  {

   _nop_();

   _nop_();

   _nop_();

   _nop_();

  }

 }

}



void IR_IN() interrupt 0 using 0

{

  unsigned char j,k,N=0;

     EX0 = 0;   

     delayh(15);

     if (IRIN==1) 

     { EX0 =1;

       return;

      } 

                           //确认IR信号出现

  while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。

    {delayh(1);}


 for (j=0;j<4;j++)         //收集四组数据

 { 

  for (k=0;k<8;k++)        //每组数据有8位

  {

   while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。

     {delayh(1);}

    while (!IRIN)          //等 IR 变为高电平

     {delayh(1);}

     while (IRIN)           //计算IR高电平时长

      {

    delayh(1);

    N++;           

    if (N>=30)

     { EX0=1;

     return;}                  //0.14ms计数过长自动离开。

      }                        //高电平计数完毕                

     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”

     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”

     N=0;

  }//end for k

 }//end for j

   

   if (IRCOM[2]!=~IRCOM[3])

   { EX0=1;

     return; }


   IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位

   IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位


   if(IRCOM[5]>9)

    { IRCOM[5]=IRCOM[5]+0x37;}

   else

      IRCOM[5]=IRCOM[5]+0x30;


   if(IRCOM[6]>9)

    { IRCOM[6]=IRCOM[6]+0x37;}

   else

      IRCOM[6]=IRCOM[6]+0x30;


    //将红外信号转换成数字

    if(IRCOM[6]=='4'&&IRCOM[5]=='5')

    {

         nn=10;//关闭

    }

    if(IRCOM[6]=='1'&&IRCOM[5]=='6')

    {

         nn=0;

    }

    if(IRCOM[6]=='0'&&IRCOM[5]=='C')

    {

         nn=1;

    }

    if(IRCOM[6]=='1'&&IRCOM[5]=='8')

    {

         nn=2;

    }

    if(IRCOM[6]=='5'&&IRCOM[5]=='E')

    {

         nn=3;

    }

    if(IRCOM[6]=='0'&&IRCOM[5]=='8')

    {

         nn=4;

    }

    if(IRCOM[6]=='1'&&IRCOM[5]=='C')

    {

         nn=5;

    }

    if(IRCOM[6]=='5'&&IRCOM[5]=='A')

    {

         nn=6;

    }

    if(IRCOM[6]=='4'&&IRCOM[5]=='2')

    {

         nn=7;

    }

    if(IRCOM[6]=='5'&&IRCOM[5]=='2')

    {

         nn=8;

    }

    if(IRCOM[6]=='4'&&IRCOM[5]=='A')

    {

         nn=9;//关闭

    }


     beeph();

     EX0 = 1; 


/////////////////////////////////


void main (void) 

{

    init();

    Chose=Get_Chose();

    if(Chose=='0')          //chose为0的时候是悬空状态

    {

      P2=LEDMAP[0];

      delay(5000);

    }

    if(Chose=='P')

    {

        while(1)

        { 

          if(P2!=~0x5e)       //如果按下的不是d(退出键),则继续,如果是d(退出键),则退出,继续选择其他的功能

          {

              if (FlagC==1)

              {    

                  Send_data(Message);

                 FlagC=0;

              }

              else

              {

                  Get_data(Get_Mes);

                //beeph();

                  FlagC=1;

              }

          }

          else

          {

              P2=0x00;

               break;

          }

         }

      }

     if(Chose=='T')

     {

        

           initT();

        while (1) 

        {

            temper = readtemperature();

            lcd_pos(0);

            if (temper < 0) {

                write_data('-');

                temper = 0 - temper;

            } else

                write_data('+');

    

            lcd_pos(1);

            write_data((temper) / 10000 + 0x30);

    

            lcd_pos(2);

            write_data(((temper) % 10000 )/ 1000 + 0x30);

    

            lcd_pos(3);

            write_data('.');

    

            lcd_pos(4);

            write_data(((temper) % 10000 % 1000 )/ 100 + 0x30);

    

            lcd_pos(5);

            write_data(((temper) %10000 %1000 % 100 )/10 + 0x30);

            /*lcd_pos(6);

            write_data((temper) %10000 %1000 % 100 % 10 + 0x30);  */

            lcd_pos(6);

            write_data(0xdf);

            lcd_pos(7);

            write_data('C');

            if(Chose!='T')

            {

                /* uint jj=0;

                for(jj;jj<8;jj++)

                {

                     write_data(' '); 

                }

                */

                 break;

            }

        }

     }

     if(Chose=='R')        //红外控制

     {

          /*P2=LEDMAP[1];

        delay(5000); */

        IRIN=1;//初始化红外P3.2

        P10=1;//初始化蜂鸣器

        delay1h(10);

        IE = 0x81;                 //允许总中断中断,使能 INT0 外部中断

        TCON = 0x01;               //触发方式为脉冲负边沿触发

        nn=0;

        P2=LEDMAP[nn];

        while(1)

        {

            if(nn==10)

            {

                 EA=0;//关闭中断

                break;    

            }

            else{

                 P2=LEDMAP[nn];

            }

            if(Chose!='R')

            {break;}

        }

     }

}

/****************************************************

               串口中断程序

******************************************************/

void ser_int (void) interrupt 4 using 1

{

    

}

复制代码

复制代码

  #include

  #include

typedef unsigned int uint;

typedef unsigned char uchar;


bit FlagC=1;    //接受和发送的标志位

sbit P10=P1^0;   //控制蜂鸣器响

sbit IRIN = P3^2;         //红外接收器数据线

uchar IRCOM[7];

uint nn=11;//用来判断红外发送的信号是数字几

//////温度液晶////////////////

typedef bit BOOL;


sbit DQ = P3 ^ 7;


uchar Temp_Value[] = { 0x00, 0x00 };

uchar Display_Digit[] = { 0, 0, 0, 0 };


sbit LCD_RW = P2 ^ 5; //写数据?

sbit LCD_RS = P2 ^ 6;

sbit LCD_EP = P2 ^ 7; //使能?

uchar num;

int temper = 0;

int CurrentT = 0;

bit flag;


void delayT(uchar t) {

    while (t--)

        ;

}


void init_ds18b20() {

    //    uchar n;

DQ = 1;

    _nop_();

    DQ = 0;

    delayT(80);

    _nop_();

    DQ = 1;

    delayT(14);

    _nop_();

    _nop_();

    _nop_();


    if (DQ == 0)

        flag = 1; //detect 1820 success!

    else

        flag = 0; //detect 1820 fail!

    delayT(20); //20

    _nop_();

    _nop_();

    DQ = 1;

}


void write_byte(uchar dat) {

    uchar i;

    for (i = 0; i < 8; i++) {

        DQ = 0;

        _nop_();

        DQ = dat & 0x01; //从最低位开始写

        delayT(3);

        _nop_();

        _nop_();

        DQ = 1;

        dat >>= 1;

    }

    //    delay(4);

}


uchar read_byte() {

    uchar i, value = 0;

    for (i = 0; i < 8; i++) {

        DQ = 0;

        value >>= 1;

        DQ = 1;

        if (DQ)

            value |= 0x80;

        delayT(2);

        _nop_();

    }

    return value;

}


int readtemperature() {

    uchar templ, temph;

    //    int temp;

    init_ds18b20();

    write_byte(0xcc); //跳过ROM

    write_byte(0x44); //启动温度测量

    delayT(300);


    init_ds18b20();

    write_byte(0xcc);

    write_byte(0xbe);

    //    Temp_Value[0] = ReadOneByte();

    //    Temp_Value[1] = ReadOneByte();

    templ = read_byte();

    temph = read_byte();

    //CurrentT = ((templ&0xf0)>>4) | ((temph&0x07)<<4);

    CurrentT = temph*256 +templ;

    CurrentT = CurrentT * 62.5;

    return CurrentT;

}


/****************侧忙函数************************/

BOOL lcd_bz() {

    BOOL result;

    LCD_RS = 0;

    LCD_RW = 1;

    LCD_EP = 1;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    result = (BOOL) (P0 & 0x80); //检测P0最高位是否为1

    LCD_EP = 0;

    return result;

}

/****************写命令函数************************/

void write_com(uchar cmd) {

    while (lcd_bz())

        ;

    LCD_RS = 0;

    LCD_RW = 0;

    //    LCD_EP = 0;

    _nop_();

    _nop_();

    P0 = cmd;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    LCD_EP = 1;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    LCD_EP = 0;

}


void lcd_pos(uchar pos) {

    write_com(pos | 0x80);

}


/****************写数据函数************************/

void write_data(uchar dat) { //写入字符显示数据到LCD

    while (lcd_bz())

        ;

    LCD_RS = 1;

    LCD_RW = 0;

    //    LCD_EP = 0;

    _nop_();

    _nop_();

    P0 = dat;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    LCD_EP = 1;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    LCD_EP = 0;

}


void initT() {

    //    dula=0;

    //    wela=0;

    LCD_EP = 0;

    write_com(0x38); //16*2显示

    write_com(0x0e); //开显示;显示光标,光标不闪烁

    write_com(0x06); //光标自动增加111

    write_com(0x01); //显示清屏

    //    write_com(0x80+0x10);

}

//////////////////////////////


unsigned int ReData;

uchar num=0;

const char Message[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};    //要发送的数据

char Get_Mes[8]={0x03};               //获取到的数据

uchar i=0;

uchar Chose;//判断选择哪一个功能选项

//此表为 LED 的字模, 共阴数码管 0-F  

uchar code   LEDMAP[] = {~0x3f, ~0x06, ~0x5b, ~0x4f, ~0x66, ~0x6d, ~0x7d, ~0x07,~0x7f, ~0x6f, ~0x77, ~0x7c, ~0x39, ~0x5e, ~0x79, ~0x71};  //段码控制

uint LEDN[16];

int n=0;

void delay(uint);


void Send_data(char p[])   //发送数据

{

    uchar i;

    for(i=0;i<1;i++)

    {

        SBUF = p[i];            //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)

        while(!TI);                // 等特数据传送    (TI发送中断标志)

        TI = 0;                    // 清除数据传送标志    

    } 


void zhuanhuan(char c)     //将PC传过来的16进制数转化成对应的十进制数

{

       switch(c)

      {

        case 0x00:

        {

          LEDN[0]=0;

          break;

        }

      }

}


void Get_data(char p[])    //接受数据到数组中

{

    

    i=i%8;

    i++;

    P2=LEDMAP[SBUF];

    p[i]=P2;

    FlagC=1;

    while(!RI);                // 等特数据传送    (TI发送中断标志)

    RI = 0;                    // 清除数据传送标志    

}

//返回一个选择项

char Get_Chose()

{

    return SBUF;

}


void delay(uint z)

{

    uchar j;

    for(z;z>0;z--)

        for(j=0;j<200;j++)

            ;    

}


void init()

{

    SCON = 0x50;      //REN=1允许串行接受状态,串口工作模式1                      

                    

    PCON|= 0x80;

                                                             

    TMOD|= 0x20;      //定时器工作方式2

    TH1 = 0xF3;                    // //baud*2  /*  波特率4800、数据位8、停止位1。效验位无 (12M)

    TL1 = 0xF3;         

    TR1  = 1;                                                             

    ES   = 1;        //开串口中断                  

    EA   = 1;        // 开总中断 

}


//蜂鸣器响

void beep(uint t)

{

    uint time=0;

    for(time;time

    {

        P10=1;

        delay(100);

        P10=0;

        delay(100);

    }

}


/////////红外//////////////////



void beeph()

{

  unsigned char i;

  for (i=0;i<100;i++)

   {

   delay(4);

   P10=!P10;                 //BEEP取反

   } 

  P10=1;                      //关闭蜂鸣器

}


void delayh(unsigned char x)    //x*0.14MS

{

 unsigned char i;

  while(x--)

 {

  for (i = 0; i<13; i++) {}

 }

}


void delay1h(int ms)

{

 unsigned char y;

  while(ms--)

 {

  for(y = 0; y<250; y++)

  {

   _nop_();

   _nop_();

   _nop_();

   _nop_();

  }

 }

}



void IR_IN() interrupt 0 using 0

{

  unsigned char j,k,N=0;

     EX0 = 0;   

     delayh(15);

     if (IRIN==1) 

     { EX0 =1;

       return;

      } 

                           //确认IR信号出现

  while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。

    {delayh(1);}


 for (j=0;j<4;j++)         //收集四组数据

 { 

  for (k=0;k<8;k++)        //每组数据有8位

  {

   while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。

     {delayh(1);}

    while (!IRIN)          //等 IR 变为高电平

     {delayh(1);}

     while (IRIN)           //计算IR高电平时长

      {

    delayh(1);

    N++;           

    if (N>=30)

     { EX0=1;

     return;}                  //0.14ms计数过长自动离开。

      }                        //高电平计数完毕                

     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”

     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”

     N=0;

  }//end for k

 }//end for j

   

   if (IRCOM[2]!=~IRCOM[3])

   { EX0=1;

     return; }


   IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位

   IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位


   if(IRCOM[5]>9)

    { IRCOM[5]=IRCOM[5]+0x37;}

   else

      IRCOM[5]=IRCOM[5]+0x30;


   if(IRCOM[6]>9)

    { IRCOM[6]=IRCOM[6]+0x37;}

   else

      IRCOM[6]=IRCOM[6]+0x30;


    //将红外信号转换成数字

    if(IRCOM[6]=='4'&&IRCOM[5]=='5')

    {

         nn=10;//关闭

    }

    if(IRCOM[6]=='1'&&IRCOM[5]=='6')

    {

         nn=0;

    }

    if(IRCOM[6]=='0'&&IRCOM[5]=='C')

    {

         nn=1;

    }

    if(IRCOM[6]=='1'&&IRCOM[5]=='8')

    {

         nn=2;

    }

    if(IRCOM[6]=='5'&&IRCOM[5]=='E')

    {

         nn=3;

    }

    if(IRCOM[6]=='0'&&IRCOM[5]=='8')

    {

         nn=4;

    }

    if(IRCOM[6]=='1'&&IRCOM[5]=='C')

    {

         nn=5;

    }

    if(IRCOM[6]=='5'&&IRCOM[5]=='A')

    {

         nn=6;

    }

    if(IRCOM[6]=='4'&&IRCOM[5]=='2')

    {

         nn=7;

    }

    if(IRCOM[6]=='5'&&IRCOM[5]=='2')

    {

         nn=8;

    }

    if(IRCOM[6]=='4'&&IRCOM[5]=='A')

    {

         nn=9;//关闭

    }


     beeph();

     EX0 = 1; 


/////////////////////////////////


void main (void) 

{

    init();

    Chose=Get_Chose();

    if(Chose=='0')          //chose为0的时候是悬空状态

    {

      P2=LEDMAP[0];

      delay(5000);

    }

    if(Chose=='P')

    {

        while(1)

        { 

          if(P2!=~0x5e)       //如果按下的不是d(退出键),则继续,如果是d(退出键),则退出,继续选择其他的功能

          {

              if (FlagC==1)

              {    

                  Send_data(Message);

                 FlagC=0;

              }

              else

              {

                  Get_data(Get_Mes);

                //beeph();

                  FlagC=1;

              }

          }

          else

          {

              P2=0x00;

               break;

          }

         }

      }

     if(Chose=='T')

     {

        

           initT();

        while (1) 

        {

            temper = readtemperature();

            lcd_pos(0);

            if (temper < 0) {

                write_data('-');

                temper = 0 - temper;

            } else

                write_data('+');

    

            lcd_pos(1);

            write_data((temper) / 10000 + 0x30);

    

            lcd_pos(2);

            write_data(((temper) % 10000 )/ 1000 + 0x30);

    

            lcd_pos(3);

            write_data('.');

    

            lcd_pos(4);

            write_data(((temper) % 10000 % 1000 )/ 100 + 0x30);

    

            lcd_pos(5);

            write_data(((temper) %10000 %1000 % 100 )/10 + 0x30);

            /*lcd_pos(6);

            write_data((temper) %10000 %1000 % 100 % 10 + 0x30);  */

            lcd_pos(6);

            write_data(0xdf);

            lcd_pos(7);

            write_data('C');

            if(Chose!='T')

            {

                /* uint jj=0;

                for(jj;jj<8;jj++)

                {

                     write_data(' '); 

                }

                */

                 break;

            }

        }

     }

     if(Chose=='R')        //红外控制

     {

          /*P2=LEDMAP[1];

        delay(5000); */

        IRIN=1;//初始化红外P3.2

        P10=1;//初始化蜂鸣器

        delay1h(10);

        IE = 0x81;                 //允许总中断中断,使能 INT0 外部中断

        TCON = 0x01;               //触发方式为脉冲负边沿触发

        nn=0;

        P2=LEDMAP[nn];

        while(1)

        {

            if(nn==10)

            {

                 EA=0;//关闭中断

                break;    

            }

            else{

                 P2=LEDMAP[nn];

            }

            if(Chose!='R')

            {break;}

        }

     }

}

/****************************************************

               串口中断程序

******************************************************/

void ser_int (void) interrupt 4 using 1

{

    

}


关键字:51单片机  串口通信  ASP.NET  密码锁系统 引用地址:基于51单片机、串口通信、ASP.NET的密码锁系统

上一篇:按键数码管数值前移
下一篇:利用外部中断和时间中断计数0-999显示在数码管上

推荐阅读最新更新时间:2024-03-16 15:31

数字式温湿度传感器SHT11在51单片机系统的应用
1 概述 温湿度的测量在仓储管理、生产制造、气象观测、科学研究以及日常生活中被广泛应用,传统的模拟式湿度传感器一般都要设计信号调理电路并需要经过复杂的校准和标定过程,因此测量精度难以保证,且在线性度、重复性、互换性、一致性等方面往往不尽人意。SHT11是瑞士Sensirion公司推出的基于CMOSensTM技术的新型温湿度传感器。该传感器将CMOS芯片技术与传感器技术结合起来,从而发挥出它们强大的优势互补作用。 2 性能特点 SHT11温湿度传感器的主要特性如下: ●将温湿度传感器、信号放大调理、A/D转换、I2C总线接口全部集成于一芯片(CMOSensTM技术); ●可给出全校准相对湿度及温度值输出; ●带
[单片机]
数字式温湿度传感器SHT11在<font color='red'>51单片机</font><font color='red'>系统</font>的应用
51单片机彩灯控制(包括功能说明、原理及C程序)
/*一、功能说明: 此程序是一款普通的彩灯,它通过电源 开关控制四种模式,即关掉电源然后打开电源就可以改变 一种模式,它的功能主要有四种模式分别如下:第一种模式 :开机四种颜色以0.5秒速度循环1次,然后在白颜色上停止 循环,即显示白光第二种模式:按下功能键后,它以1秒 速度四种颜色不停的循环第三种模式:当按键按下后它会 记住第二种模式的颜色,比如第二种模式现在亮得是绿色, 你按下按键时,它会先闪一下,然后在绿颜色上停下来第 四模式:当你再按下开关时,它自动回到模式一下,在模式 三下,当它断电时,可以记住模式三 些产品特点:利用 电源开关切换功能,断电数据保存,起到减小EEPROM擦除 次数.程序部分转自51单片机 www.51he
[单片机]
<font color='red'>51单片机</font>彩灯控制(包括功能说明、原理及C程序)
51单片机+点阵8*8上、下、左、右移显示C程序
最近在研究点阵,这东西看起来简单,但是要完全掌握它,可是要花一定时间的!我现在做得8*8点阵硬件电路是这样的,行采用74HC138+三极管8550驱动,列采用74HC595驱动,这种电路是非常用的,其次的扫描原理就是,先打开第一行,然后送代码给列,即595端,像这样扫描8次行,一个字就完成了,具体原理图如下图: 下面我将我写得代码下载地址分享下: 一、上移: #include reg52.h #define uchar unsigned char #define uint unsigned int #define LINE P1//定义行线IO口,即74HC154控制端 #define shudu 50//字移动的速度 sbi
[单片机]
<font color='red'>51单片机</font>+点阵8*8上、下、左、右移显示C程序
基于51单片机及ADC0808的数字电压表数码管汇编语言设计
前言 大家好,上一条博客写了关于基于51单片机以及ADC0808的数字电压表,但是采用的C语言,本章讲一下采用汇编语言来实现电压的测量,同样采用数码管显示。 硬件设计 该设计采用的MCU同样是51单片机,ADC也是采用的TI的ADC0808,显示部分采用4位数码管,最终的测试电压范围为0~5V,这次的精度提高到约为0.01V,仿真图如下: 右下方是模拟的输入电压 部分汇编代码如下: (代码详细备注,方便阅读) LED_0 EQU 30H ;百分位 LED_1 EQU 31H ;十分位 LED_2 EQU 32H ;个位 LED_3 EQU 33H ;
[单片机]
基于<font color='red'>51单片机</font>及ADC0808的数字电压表数码管汇编语言设计
嵌入式学习笔记8——51单片机之矩阵键盘
1. 独立键盘由单片机的一个I/O口驱动,如果开发的系统要用到很多按键时,为节省I/O口,我们一般使用4*4键盘,这样驱动16个键盘只需用一个8位I/O口就可以了。 2. 按键检测(检测哪个按键被按下): 针对上图电路,先让P3输出1111 0000,接着开始读P3,根据线与的概念,检测到P34~P37某个为0(假设P35为0),则可以确定按键所在的列;然后反过来,将P3输出1101 1111(高位保持上次检测的值),同样根据线与的概念,检测到P30~P33某个为0(假设P30为0,则P3为1101 1110),则可以确定按键所在的行,这样就确定了按下的按键的位置。整个检测时间肯定会小于按键按下的时间(约20ms)
[单片机]
嵌入式学习笔记8——<font color='red'>51单片机</font>之矩阵键盘
ATmega16开发板教程(6)——串口通信
7、串口通信 串口通信的基本概念就是用一根线收RX和另外一根线发TX数据,那么什么时候发?什么时候开始收呢?例如,古时候的暗号——天王盖地虎、小鸡炖蘑菇,说完就开始交易。 串口通信最重要的参数就是波特率、起始位、数据位、奇偶校验、停止位,这些必须匹配正确才能正常通信。 串口通信可以理解为:两个人交流时语速(波特率)要一致,一个人说得快,一个说的慢,那么聊天就失败了;当2个人交流语速一致时,那么就要通过举手(起始位)示意,告诉对方我要开始说话了;然后说话(数据位);说完话后可以思考思考自己说的话是不是对的——奇偶校验,也可以不用考虑太多就直接放下手,示意我说完了——结束位。 如下图为串口通信的时序图,默认电平为1,起始位
[单片机]
ATmega16开发板教程(6)——<font color='red'>串口通信</font>
51单片机寄存器功能一览表
21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SFR存储空间中,地址空间为80H-FFH,在这片SFR空间中,包含有128个位地址空间,地址也是80H-FFH,但只有83个有效位地址,可对11个特殊功能寄存器的某些位作位寻址操作(这里介绍一个技巧:其地址能被8整除的都可以位寻址)。 扩展阅读:51单片机常用波特率初值表(12M晶振) 在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为
[单片机]
如何使用8051单片机实现双极LED驱动器电路?
在本文中,将介绍如何使用8051单片机实现双极LED驱动器电路。双极LED与常规双色LED的不同之处在于,双极LED只有两个引线,而常规双色LED具有三个引线。 双色LED是一种特殊类型的LED,它由两个在封装内反向连接的二极管组成。双色LED通常由三个端子组成,即一个公共引脚和两个独立的引脚。如果是共阴极LED,则公共引脚可以接地,如果是共阳极,则可以连接到 +5V 电源。但是,还有另一种具有两个端子的双色LED,称为双极LED。 该设备根据提供给终端之一的正信号起作用。例如,对于绿红双色LED,绿色端的正信号和红色端的负信号确保绿色LED正向偏置,红色LED反向偏置。这会导致绿灯闪烁。红色LED的情况也是如此。 但是,如
[单片机]
如何使用80<font color='red'>51单片机</font>实现双极LED驱动器电路?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved