📄 gfhghky.txt
字号:
/*************************
程序功能:
1.m序列的产生
2.游程的计算
3.人机互动的实现
**************************/
#include <reg52.h>
#include<absacc.h>
#include<stdio.h>
#define uc unsigned char
void count0();
void count1();
uc y;
uc q;
uc bu;
uc bu1;
unsigned char code s[]=
{
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
0x77,/*A*/
0x7C,/*b*/
0x39,/*C*/
0x5E,/*d*/
0x79,/*E*/
0x71,/*F*/
};//字型码组void delay() //延时
void delay() //延时
{
uc j;
uc k;
for(j=10;j--;j>0)
for(k=248;k--;k>0);
}
void delay0() //延时
{
uc j;
uc k;
for(j=200;j--;j>0)
for(k=200;k--;k>0);
}
void delay10() //延时
{ uc i;
uc j;
uc k;
for(i=1;i--;i>0)
for(j=2;j--;j>0)
for(k=24;k--;k>0);
}
first()
{
uc cu;
cu=100;
for(q=0;q<100;q++)
{
cu--;
P0=s[cu%10];
P2=0x01;
delay();
P0=s[cu/10];
P2=0x02;
delay();
if(cu==0)
{
cu=100;
}
P0=s[cu%10];
P2=0x01;
delay();
P0=s[cu/10];
P2=0x02;
delay();
}
P0=s[45];
P2=0xff;
delay0();
delay0();
}
uc buf[]={0,0,0,0};//4通道数据待存数组
uc c[]={0x01,0x02,0x04,0x08};//数码管位选数组
uc temp;
uc l;
uc i;
uc q;
uc r;
uc bu;
uc bu1;
bit p;
sbit x0=IP^0;
sbit x1=IP^1;
sbit x2=IP^2;
sbit x3=IP^3;
sbit K1=P3^5;
sbit K2=P3^6;
sbit K3=P3^7;
main()
{
TMOD=0x20;// 波特率发生器T1工作在模式2上
TH1=0xf3;// 预置初值(按照波特率2400BPS预置初值)
TL1=0xf3;// 预置初值(按照波特率2400BPS预置初值)
TR1=1;// 启动定时器T1
SCON=0x50; //设置成串口1方式
PCON=0x80; //波特率翻倍2*2400=4800bps
first();
while(1)
{
if(K1==1)
{
IP=P1&0x0f;
}
else
{
IP=SBUF;
delay10();
if(RI)
{
RI=0;
}
} //K1决定选择寄存器数值的输入方式,电脑键盘或是拨码开关
for(l=16;l>2;l--)
{
p=x0^x1;
temp=IP&0x0f;
if(temp==0)
{
K3=0;
}
else
{
K3=1;
}
if(l%4==0)//寄存器每移位四位则处理
{
buf[(l/4)-1]=temp;
if(l/4==1)
{
buf[0]=buf[0]&0x07;
}
P0=s[buf[(l/4)-1]];
P2=c[4-l/4]; //将计算出的数值在数码管上显示
SBUF=temp; //将计算出的数值送电脑串口并在屏幕上显示
for(i=0;i<15;i++)
{
delay10();
}
if(!TI)
{
TI=0;
}
}
IP=IP>>1;
x3=p;
}
/***************************
K2若按下,循环显示游程值
***************************/
loop:
if(K2==0)//判断按键是否被按下
{
delay10();
if(K2==0) //再次判断判断按键是否真被按下
count0();//调用函数,计算并显示0的游程数
l=r;
delay10();
count1();//调用函数,计算并显示1的游程数
delay10();
l=l+r;
l=l&0x0f;
P0=s[l];
P2=0x01;//显示总游程数目
delay10();
goto loop;
}
}
}
/**********************************
函数名称:count0
作用:计算M序列中0的游程总数
***********************************/
void count0(void)
{
uc k;
k=0;
r=0;//游程初始化
bu=0x00;
bu=buf[2]<<4;////buf[2]左移四位赋予bu
bu=bu&0xf0;//高四位清0
bu=bu|buf[3];//buf[2]与buf[3]构成一个8位的bu
for(i=16;i>2;i--)
{
if(i<15&&i>7)
{
/*********************************************
bu右移满4位后,高4位重新装入须计算的buf值
*********************************************/
if(i%4==0)
{
uc s;
bu=bu&0x0f;
s=i/4;
bu1=buf[s-2]<<4;
bu1=bu1&0xf0;
bu=bu|bu1;
}
}
q=bu&0x03;//判断bu最后两位是否全为0
bu=bu>>1;
//右移一位
if(q==0) //为0则处理
{
r++; //游程累加
if(k==i)
{
r--;
}//判断是否连0状态,若是则游程不需累加
k=i-1;
}
}
P0=s[r];
P2=0x08;
}
/*****************************************
函数名称:count1
作用:计算M序列中1的游程总数
******************************************/
void count1(void)
{
uc k;
k=0;
r=0;
bu=0x00;
bu=buf[2]<<4;
bu=bu&0xf0;
bu=bu|buf[3];
for(i=16;i>1;i--)
{
if(i<15&&i>7)
{
if(i%4==0)
{
uc s;
bu=bu&0x0f;
s=i/4;
bu1=buf[s-2]<<4;
bu1=bu1&0xf0;
bu=bu|bu1;
}
}
q=bu&0x03;
bu=bu>>1;
if(q==0x03) //判断bu最后两位是否全为1
{
r++;
if(k==i)
{
r--;
}
k=i-1;
}
}
P0=s[r];
P2=0x04;
}
//////////////////////////////////////////////////////
//////////////////////////////////////////////////////
/*************************
程序功能:
1.M序列的产生
2.游程的计算
3.人机互动的实现
4.移位寄存器的状态显示
**************************/
#include <reg52.h>
#include<absacc.h>
#include<stdio.h>
#define uc unsigned char
void count0();
void count1();
uc y;
uc bu;
uc bu1;
unsigned char code s[]=
{
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
0x77,/*A*/
0x7C,/*b*/
0x39,/*C*/
0x5E,/*d*/
0x79,/*E*/
0x71,/*F*/
};//字型码组
void delay() //延时
{
uc j;
uc k;
for(j=5;j--;j>0)
for(k=200;k--;k>0);
}
void delay1() //延时
{
uc j;
uc k;
for(j=200;j--;j>0)
for(k=248;k--;k>0);
}
void delay10() //延时
{ uc i;
uc j;
uc k;
for(i=1;i--;i>0)
for(j=20;j--;j>0)
for(k=24;k--;k>0);
}
FIRST()
{
uc cu;
uc q;
cu=100;
for(q=0;q<100;q++)
{
cu--;
P0=s[cu%10];
P2=0x01;
delay();
P0=s[cu/10];
P2=0x02;
delay();
if(cu==0)
{
cu=100;
}
P0=s[cu%10];
P2=0x01;
delay();
P0=s[cu/10];
P2=0x02;
delay();
}
P0=s[45];
P2=0xff;
delay1();
}
uc buf[]={0,0,0,0};//4通道数据待存数组
uc buf1[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//16通道数据待存数组
uc c[]={0x01,0x02,0x04,0x08};//数码管位选数组
uc temp;
uc temp1;
uc l;
uc i;
uc q;
uc r;
uc bu;
uc bu1;
bit p;
sbit x0=IP^0;
sbit x1=IP^1;
sbit x2=IP^2;
sbit x3=IP^3;
sbit K1=P3^5;
sbit K2=P3^6;
sbit K3=P3^7;
main()
{
r=16;
TMOD=0x20;// 波特率发生器T1工作在模式2上
TH1=0xf3;// 预置初值(按照波特率2400BPS预置初值)
TL1=0xf3;// 预置初值(按照波特率2400BPS预置初值)
TR1=1;// 启动定时器T1
SCON=0x50; //设置成串口1方式
PCON=0x80; //波特率翻倍2*2400=4800bps
FIRST();
while(1)
{
if(K1==1)
{
IP=P1&0x0f;
}
else
{
IP=SBUF;
if(RI)
{
RI=0;
}
} //K1决定选择寄存器数值的输入方式,电脑键盘或是拨码开关
for(l=16;l>0;l--)
{
p=x0^x1;
temp=IP&0x0f;
buf1[l-1]=temp;
if(x1==0&&x2==0&&x3==0)
{
p=~p;
}// x1,x2,x3全为0时,x0,x1异或值取反
if(l%4==0)//寄存器每移位四位则处理
{
buf[(l/4)-1]=temp;
P0=s[temp];
P2=c[4-l/4]; //将计算出的数值在数码管上显示
SBUF=temp; //将计算出的数值送电脑串口并在屏幕上显示
if(!TI)
{
TI=0;
}
delay10();
}
IP=IP>>1;
x3=p;
}
/***************************
4位移位寄存器状态显示
***************************/
show4:
if(K3==0)//判断按键是否被按下
{
if(temp1!=buf[0])
{
r=16;
}
if(r==0)
{
r=16;
}
P0=s[(16-r)%10];
P2=0x02;
delay10();
if(r<7)
{
P0=s[(16-r)/10];
P2=0x04;
delay10();
}
P0=s[buf1[r-1]];
P2=0x01;
delay10();
if(K3==1)
{
r--;
}
temp1=buf[0];
goto show4;
}
/***************************
K2若按下,循环显示游程值
***************************/
show:
if(K2==0)//判断按键是否被按下
{
delay10();
if(K2==0) //再次判断判断按键是否真被按下
count0();//调用函数,计算并显示0的游程数
delay10();
l=r;
count1();//调用函数,计算并显示1的游程数
delay10();
l=l+r;
l=l&0x0f;
P0=s[l];
P2=0x01;//显示总游程数目
delay10();
goto show;
}
}
}
/**********************************
函数名称:count0
作用:计算M序列中0的游程总数
***********************************/
void count0(void)
{
uc k;
k=0;
r=0;//游程数值初始化
bu=0x00;
bu=buf[2]<<4;////buf[2]左移四位赋予bu
bu=bu&0xf0;//高四位清0
bu=bu|buf[3];//buf[2]与buf[3]构成一个8位的bu
for(i=16;i>1;i--)
{
if(i<15&&i>7)
{
/*********************************************
bu右移满4位后,高4位重新装入须计算的buf值
**********************************************/
if(i%4==0)
{
uc s;
bu=bu&0x0f;
s=i/4;
bu1=buf[s-2]<<4;
bu1=bu1&0xf0;
bu=bu|bu1;
}
}
q=bu&0x03;//判断bu最后两位是否全为0
bu=bu>>1; //右移一位
if(q==0) //为0则处理
{
r++; //游程累加
if(k==i)
{
r--;
}//判断是否连0状态,若是则游程不需累加
k=i-1;
}
}
P0=s[r];
P2=0x08;
}
/*****************************************
函数名称:count1
作用:计算M序列中1的游程总数
******************************************/
void count1(void)
{
uc k;
k=0;
r=0;
bu=0x00;
bu=buf[2]<<4;
bu=bu&0xf0;
bu=bu|buf[3];
for(i=16;i>1;i--)
{
if(i<15&&i>7)
{
if(i%4==0)
{
uc s;
bu=bu&0x0f;
s=i/4;
bu1=buf[s-2]<<4;
bu1=bu1&0xf0;
bu=bu|bu1;
}
}
q=bu&0x03;
bu=bu>>1;
if(q==0x03) //判断bu最后两位是否全为1
{
r++;
if(k==i)
{
r--;
}
k=i-1;
}
}
P0=s[r];
P2=0x04;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -