51单片机_5X5按键驱动20210915100123.rar

  • k7_287468
    了解作者
  • 83.1KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-16 02:27
    上传日期
51单片机_5X5按键驱动20210915100123
51单片机_5X5按键驱动20210915100123.rar
  • 5X5.uvgui.Administrator
    134.8KB
  • 5X5(1).uvopt
    5KB
  • 5X5.build_log(1).htm
    2KB
  • 5X5_uvopt.bak
    5KB
  • 5X5.uvopt
    5KB
  • 5X5.uvgui_Administrator.bak
    134.8KB
  • 5X5_uvproj(1).bak
    0B
  • 输出文件
  • main(1).obj
    19.8KB
  • 5X5(1).lnp
    80B
  • 5X5.build_log(1).htm
    1017B
  • 5X5(1).hex
    4KB
  • 5X5.hex
    4KB
  • ExtDll.iex
    19B
  • ExtDll(1).iex
    19B
  • 5X5
    17.4KB
  • 5X5(1)
    17.4KB
  • 5X5.lnp
    80B
  • 新建文件夹
  • main.obj
    19.8KB
  • 5X5.build_log.htm
    1017B
  • 5X5.uvgui_Administrator(1).bak
    134.8KB
  • 5X5(1).uvproj
    13.6KB
  • 5X5.m51
    17.9KB
  • 5X5(1).m51
    17.9KB
  • 库文件
  • main(1).c
    8KB
  • main.c
    8KB
  • 5X5_uvproj.bak
    0B
  • 5X5.uvproj
    13.6KB
  • main(1).lst
    14.9KB
  • 5X5_uvopt(1).bak
    5KB
  • main.lst
    14.9KB
  • 5X5.uvgui(1).Administrator
    134.8KB
  • 5X5.build_log.htm
    2KB
内容介绍
#include<stc15.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define FOSC 11059200L //系统频率 #define BAUD 9600 //串口波特率 sbit X1=P2^0; sbit X2=P2^1; sbit X3=P2^2; sbit X4=P2^3; sbit X5=P2^4; sbit Y1=P2^5; sbit Y2=P2^6; sbit Y3=P2^7; sbit Y4=P0^4; sbit Y5=P0^5; sbit RF = P3^7; //信号输 #define S3RI 0x01 //S3CON.0 #define S3TI 0x02 //S3CON.1 #define S3RB8 0x04 //S3CON.2 #define S3TB8 0x08 //S3CON.3 #define S3_S0 0x02 //P_SW2.1 /************接受变量***************/ bit rf_ok; //收到有效数据 uchar da1527[2][4]; //解码过程中临时数组 uchar short_k; //窄脉冲宽度 uchar tab[2][4]; //校验 uchar tab1[4]; //调用 bit rf_ok1; //有效解码开关 //*************************// bit busy; void SendData(uchar dat); void SendString(unsigned char rr); uchar X,Y,key; uchar rfff; /*aa bb 0a cc ee 22 33 00 44 55 */ code uchar aactab[20][10]={ 0x20,0x15,0x01,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x15,0x02,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x15,0x03,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x15,0x04,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x15,0x05,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x15,0x06,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x15,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x15,0x08,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x15,0x09,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x15,0x0a,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x15,0x01,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x15,0x02,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x15,0x03,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x15,0x04,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x15,0x05,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x15,0x06,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x15,0x07,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x15,0x08,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x15,0x09,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x15,0x0a,0xff,0x00, };//*/ void intin(); void Y_Y(); void X_X(); void delay1(uchar ms); void delay(uint ms); void RF_decode(); void main() { intin(); while(1) { ET0 = 0; Y_Y(); if(rfff!=tab1[3]) { rfff=tab1[3]; if((tab1[0]==0xf0)&&(tab1[1]==0xf0)&&(tab1[2]==0xf0)) { SendString(tab1[3]-1); tab1[0]=0x00; tab1[1]=0x00; tab1[2]=0x00; } } ET0 = 1; P1=key; P4=tab1[3]; } } void InterruptTimer0() interrupt 1 { TH0=(65536-100)>>8; //???? 50ms TL0=(65536-100)&0xff; RF_decode(); } void intin() { P_SW2 &= ~S3_S0; //S3_S0=0 (P0.0/RxD3, P0.1/TxD3) //P_SW2 |= S3_S0; //S3_S0=1 (P5.0/RxD3_2, P5.1/TxD3_2) T3L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值 T3H = (65536 - (FOSC/4/BAUD))>>8; T4T3M |= 0x02; //定时器3为1T模式 T4T3M |= 0x08; //定时器3开始计时 IE2 = 0x08; //使能串口3中断 EA = 1; TMOD |= 0x01; TH0=(65536-500)>>8; //???? 50ms TL0=(65536-500)&0xff; TR0 = 1; ET0 = 1; TMOD |= 0x10; TH1 = 0x0FF; TL1 = 0x0F8; TR1 = 1; P2M0=0xe0; P2M1=0x00; P0M0=0x30; P0M1=0x00; P1M0=0xff; P1M1=0x00; P4M0=0xff; P4M1=0x00; X1=X2=X3=X4=X5=1; Y1=Y2=Y3=Y4=Y5=1; } //============================接收解码部分========================================// void delay(uint ms)//8.5US 外部3.57M //此处换用不同单片机需调整参数 { while(ms--) { while(TF1!=1); TF1=0; TH1=0xff; TL1=0xF8; } } void RF_decode() { uchar ii=0,j=0,k=0,rep=0; uint head_k=0; //短脉冲宽度 //-------------------------------数据接收----------------------------------------- short_k=0; while(RF && short_k<250) //检测头信号前一个高脉冲的宽度 { delay(1); short_k++; } while(!RF) { delay(1); head_k++; } //检测头脉冲的宽度 if(((short_k*20)<head_k) && (head_k<(short_k*40))) //引导码宽度是窄脉冲的32倍 24/38 { for(rep=0;rep<2;rep++) { for(ii=0;ii<4;ii++)//4字节 { for(k=0;k<8;k++)//每个字节8位 { j=0; while(RF && j<245) { delay(1); j++; }// if(j>(short_k-short_k/2-short_k/3)&&j<(short_k*2)) { da1527[rep][ii]&=~(1<<((7-k))); } else if(j>(short_k*2)&&j<(short_k*5))da1527[rep][ii]|=(1<<(7-k)); else {return;} //乱码退出 j=0; while(!RF && j<150){delay(2);j++;} //跳过低电平 } }//for(ii=0;ii<12;ii++) j=0;while(RF && (j<200)){delay(1);j++;} //跳个最后一个高脉冲 head_k=0;while(!RF) {delay(1);head_k++;} //检测下一个前导信号的寬度 if((head_k<(short_k*20)) || (head_k>(short_k*40))) {return;} //引导码宽度是窄脉冲的32倍 //乱码退出 } if((da1527[0][0]==da1527[1][0])&&(da1527[0][1]==da1527[1][1])&&(da1527[0][2]==da1527[1][2])&&(da1527[0][3]==da1527[1][3])) { tab[0][0]=da1527[0][0]; tab[0][1]=da1527[0][1]; tab[0][2]=da1527[0][2]; tab[0][3]=da1527[0][3]; } if((tab[0][0]==da1527[1][0])&&(tab[0][1]==da1527[1][1])&&(tab[0][2]==da1527[1][2])&&(tab[0][3]==da1527[1][3])) { tab[1][0]=da1527[1][0]; tab[1][1]=da1527[1][1]; tab[1][2]=da1527[1][2]; tab[1][3]=da1527[1][3]; } if((tab[0][0]==tab[1][0])&&(tab[0][1]==tab[1][1])&&(tab[0][2]==tab[1][2])&&(tab[0][3]==tab[1][3])) { tab1[0]=tab[1][0]; tab1[1]=tab[1][1]; tab1[2]=tab[1][2]; tab1[3]=tab[1][3]; rf_ok1=1; } } } /*****************************/ void Y_Y() { X1=X2=X3=X4=X5=1; Y1=0;Y2=Y3=Y4=Y5=1; Y=0; X_X(); X1=X2=X3=X4=X5=1; Y2=0;Y1=Y3=Y4=Y5=1; Y=1; X_X(); X1=X2=X3=X4=X5=1; Y3=0;Y2=Y1=Y4=Y5=1; Y=2; X_X(); X1=X2=X3=X4=X5=1; Y4=0;Y2=Y3=Y1=Y5=1; Y=3; X_X(); X1=X2=X3=X4=X5=1; Y5=0;Y2=Y3=Y4=Y1=1; Y=4; X_X(); } void X_X() { if(X1==0) { delay1(10); if(X1==0) { X=1; key=(Y*5)+X; while(X1==0); if(key<21)SendString(key-1); } } if(X2==0) { delay1(10); if(X2==0) { X=2; key=(Y*5)+X; while(X2==0); if(key<21)SendString(key-1); } } if(X3==0) { delay1(10); if(X3==0) { X=3; key=(Y*5)+X; while(X3==0); if(key<21)SendString(key-1); } } if(X4==0) { delay1(10); if(X4==0) { X=4; key=(Y*5)+X; while(X4==0); if(key<21)SendString(key-1); } } if(X5==0) { delay1(10); if(X5==0) { X=5; key=(Y*5)+X; while(X5==0); if(key<21)SendString(key-1); } } } void delay1(uchar ms) //@11.0592MHz { uchar i, j; for(;ms>0;ms--) { _nop_();_nop_();_nop_(); i = 11;j = 190; do{while (--j);} while (--i); } } /*---------------------------- UART3 中断服务程序 -----------------------------*/ void Uart3() interrupt 17 using 1 { if (S3CON & S3RI) { S3CON &= ~S3RI; //清除S3RI位 } if (S3CON & S3TI) { S3CON &= ~S3TI; //清除S3TI位 busy = 0; //清忙标志 } } /*---------------------------- 发送串口数据 ----------------------------*/ void SendData(uchar dat) { while (busy); //等待前面的数据发送完成 ACC = dat; //获取校验位P (PSW.0) busy = 1; S3BUF = ACC; //写数据到UART2数据寄存器 } /*---------------------------- 发送字符串 ---
评论
    相关推荐
    • 51单片机
      51单片机
    • 51单片机资料
      光敏热敏电阻实验以及C程序。与大家分享。。
    • 51单片机教程
      来自平凡单片机网站(word)
    • 51单片机程序
      LED流水灯实验是能较好的引导单片机爱好者入门学习,该程序实现了LED间隔10ms循环点亮
    • 51单片机程序
      包含51单片机的基础程序,以及综合程序。供初学者学习,及编写一定模块程序
    • 51单片机课件
      单片机入门和提高级的朋友有用。虽然资源分要5分,但是你下载完后如果给我评分,系统能给你6分,也就是下这个软件你能挣一分。如果虚假欢迎举报。
    • 51单片机WIFI
      利用wifi对51单片机进行控制,内附原理图及PCB板制作
    • 51单片机学习
      适合想学习51单片机的新人,能够快速学习,里面有多种实例可以方便学习。另外有很多视频,如果想要的话可以发邮件到:www.gaoju1024@qq.com
    • 51单片机教程
      51单片机的初级教程,里面包含单片机的各个模块的详细介绍,以及各个模块的验证程序,能够学会单片机的操作
    • 单片机课件 51单片机
      课件 51单片机 C程序设计