51黑有你更精彩!!!,看楼主的程序是一种享受,调理清晰,注释详细.
- #include <STC89C5xRC.H>
- #include <intrins.h> //包含_nop_()延时函数
- #include <absacc.h> //包含 CBYTE[]
- #include <string.h> // 包含 strlen (char *)函数
- #include "ASCII816.h" //标准ASCII库
- #include "12864.h" //液晶驱动
- #define uchar unsigned char
- #define uint unsigned int
- sbit wux=P3^2;
-
- uchar D[3];
- uint temp;
- uchar flag,flag1;
- uint kk[3];
- uint ka;
- uchar k;
- void jiema()//解码
- {
- uchar j,i;
- TH0=0; //T0作为计时器使用
- TL0=0; //T0作为计时器使用
- ET0=0; //T0溢出不中断
- while(wux); //等待低电平
- TR0=1; //检测到低电平开启T0计时
- while(!wux) //等待高电平
- {
- if(TF0==1) //等待高电平是T0产生溢出
- {
- TF0=0; //清除溢出标识
- flag1=1; //接收错误标识置1
- TR0=0; //关闭T0计时
- break; //跳出等待
- }
- }
-
- if(flag1!=1) //如果接收正确
- {
- flag1=0; //清除接收正确标识
- TR0=0; //关闭计时
- temp=TH0; //计时时间 = T0计时时间高8位
- temp=(temp<<8)+TL0; //计时时间=计时时间左移8位 + T0计时时间低8位 得到16位计时时间
- TH0=0; //清除T0计时时间高8位
- TL0=0; //清除T0计时时间低8位
- if ((temp>10200) && (temp<11000)) //如果计时时间在10200us - 11000us之间 则判定为检测到正确的同步码
- {
- while(wux); //等待低电平
- TR0=1; //检测到低电平开启T0计时
- for(i=0;i<3;i++) //数据接收 因为需要两位才能判定2262发送的数据是 0还是1 还是悬空码
- //一共发送12位数据 地址1 + 地址2 + 数据 所以需要循环 3次
- {
- for(j=8;j>0;j--) //接收八位数据
- {
- while(!wux); //等待高电平
- TR0=0; //检测到高电平后关闭T0计时
- temp=TH0; //计时时间 = T0计时时间高8位
- temp=(temp<<8)+TL0; //计时时间=计时时间左移8位 + T0计时时间低8位 得到16位计时时间
- TH0=0;
- TL0=0; //清除T0计时时间
- D[i]=D[i]<<1; //数据左移一位 然后在接收
- if ((temp>200) && (temp<360)) //测低电平时间 如果为200us-360us之间 为0
- {
- D[i]=D[i]|0X00; //0
- }
- else if ((temp>800) && (temp<1100)) //测低电平时间 如果为800us-1100us之间 为1
- {
- D[i]=D[i]|0X01; //1
- }
- else if ((temp>1100)){return;} //检测到大于1100us 则认为已经放开按键 防止产生误动作直接跳出
- while(wux); //等待低电平后开始计时
- TR0=1; //检测到低电平开始记录下一个码低电平时间
- }
- }
-
- if(k==0) //判定一次接收结果
- {
- ((uchar *) &ka)[0]=D[0];
- ((uchar *) &ka)[1]=D[1];
- }
- if((k==1)&&(D[1]==((uchar *) &ka)[1])&&(D[0]==((uchar *) &ka)[0])) //两次接收一致则为接收正确
- {
- kk[0]=D[0];
- kk[1]=D[1];
- kk[2]=D[2];
- flag=1; //开显示
- }
- k++;if(k>1)k=0; //加记录次数
- }
- }
- }
- void Delay20ms() //@12.000MHz
- {
- unsigned char i, j;
- i = 39;
- j = 230;
- do
- {
- while (--j);
- } while (--i);
- }
- void main()
- {
- InitLCD(); //初始化显示
- ClearScreen(); //清屏
- SetOnOff(1,0,15); //开显示,正常显示,亮度7
- TMOD = 0x01; //设置定时器模式
- while(1)
- {
- flag=0;
- if(wux==0) //如果检测到低电平
- jiema(); //开始解码
-
- if(flag==1) //
- {
- WRITE_STRING816(4,0, D[0]/16/10,0);
- WRITE_STRING816(4,8, D[0]/16%10,0);
- WRITE_STRING816(4,16,D[0]%16/10,0);
- WRITE_STRING816(4,24,D[0]%16%10,0);
-
- WRITE_STRING816(4,40,D[1]/16/10,0);
- WRITE_STRING816(4,48,D[1]/16%10,0);
- WRITE_STRING816(4,56,D[1]%16/10,0);
- WRITE_STRING816(4,64,D[1]%16%10,0);
-
- WRITE_STRING816(4,80,D[2]/16/10,0);
- WRITE_STRING816(4,88,D[2]/16%10,0);
- WRITE_STRING816(4,96,D[2]%16/10,0);
- WRITE_STRING816(4,104,D[2]%16%10,0);
- WRITE_STRING816(6,0, kk[0]/16/10,0);
- WRITE_STRING816(6,8, kk[0]/16%10,0);
- WRITE_STRING816(6,16,kk[0]%16/10,0);
- WRITE_STRING816(6,24,kk[0]%16%10,0);
-
- WRITE_STRING816(6,40, kk[1]/16/10,0);
- WRITE_STRING816(6,48, kk[1]/16%10,0);
- WRITE_STRING816(6,56, kk[1]%16/10,0);
- WRITE_STRING816(6,64, kk[1]%16%10,0);
- WRITE_STRING816(6,80,kk[2]/16/10,0);
- WRITE_STRING816(6,88,kk[2]/16%10,0);
- WRITE_STRING816(6,96,kk[2]%16/10,0);
- WRITE_STRING816(6,104,kk[2]%16%10,0);
-
- Delay20ms(); //延时
- flag=0; //关显示
- }
- }
- }
复制代码
|