6-1 反置数 (100 分)

本文介绍了一种求整数反置数的算法,并提供了一个简单的C语言函数实现。该函数通过循环处理输入整数的每一位,构造出反置后的整数。文章还附带了测试用例和示例代码。

一个整数的“反置数”指的是把该整数的每一位数字的顺序颠倒过来所得到的另一个整数。如果一个整数是以0结尾,那么在它的反置数当中,这些0就被省略掉了。比如说,12345的反置数是 54321,而3200的反置数是23。请你设计一个求一个整数反置数的函数。

输入只有一行,为一个整数n(0<n)。

输出也只有一个整数,为n的反置数。测试用例保证所有整数都可以用int存储。

函数接口定义:


int reverse(int n) ;

其中 n 是用户传入的参数。函数须返回 n 的反置数。

裁判测试程序样例:

#include <stdio.h>

int reverse(int n) ; 

int main()
{
    int        n ;
    
    scanf( "%d" , &n );
    printf( "%d\n" , reverse(n) );

    return 0 ;
}


/* 请在这里填写答案 */

输入样例一:

12345

输出样例一:

54321

输入样例二:

3200

输出样例二:

23

这个叫函数题

代码如下:

int reverse(int n)
{
	int s = 0;
	while (n > 0)
	{
		s = s * 10 + n % 10;
		n /= 10;
	}
	return s;
}

这个求反置数的代码在简单题中经常考的

尤其实那种笔试中

求逆置数的方法很多的

帮我写出下面结构体成员的偏移量:typedef struct OWS_SHD_CTRL_CMD { unsigned short header1;//帧起始标志 固定为0x5555 固定为0x5555 unsigned short header2;//帧起始标志 固定为0xAAAA 固定为0xAAAA unsigned short dppsn; //据处理序列号 0~65535,顺序增加,发一帧加1 据处理填 0~65535,顺序增加,发一帧加1 unsigned short len;//32位据长度 1024 固定 1024 unsigned char packetType; //B7~B0 据包类型 "0x10:工作据包; unsigned char bak; //B15~B8 备份 "据处理填 /* 0x30:初始化据包; 0x40:空包(用于DBF状态回读) " "0x10:工作据包; 0x30:初始化据包; 0x40:空包(用于DBF状态回读) " */ unsigned short rcsn;//雷控序列号 0~65535 雷控填 0~65535 unsigned char year; // 6 1 B15~B8 月 值域:[1,12] 雷控填 值域:[1,12] unsigned char month; // B7~B0 年 值域:[0,99] 雷控填 值域:[0,99] unsigned char day; // 7 1 B15~B8 时 值域:[0,23] 雷控填 值域:[0,23] unsigned char hour; // B7~B0 日 值域:[1,31] 雷控填 值域:[1,31] unsigned char minute; // 8 1 B15~B8 秒 值域:[0,59] 雷控填 值域:[0,59] unsigned char second; // B7~B0 值域:[0,59] 雷控填 值域:[0,59] unsigned short us100;//秒以下单位 秒以下,单位:100us 雷控填 秒以下,单位:100us unsigned char testMode : 4;// unsigned char taskMode : 4;// /*B7~B4 任务模式 "0x0:工作模式(不监测) 0x1:发监测; 0x2:收监测; 0x3:模拟目标测试; 注:当要使用模拟目标时必须要控制模拟目标模式,频率源响应此字决定是否输出模拟目标 " "0x0:工作模式(不监测) 0x1:发监测; 0x2:收监测; 0x3:模拟目标测试; 注:当要使用模拟目标时必须要控制模拟目标模式,频率源响应此字决定是否输出模拟目标 "*/ unsigned char workMode;//B15~B8 工作模式 "0x00:工作模式A(工作模式0) unsigned char bak103; // B7~B0 备份 unsigned char bitMode;// /* 11 1 B15~B8 BIT工作方式 "0x00:开机测试; 0x01:在线测试(全机);0x02:在线测试(DBF);0x03:在线测试(备份);0x04:在线测试(信号处理);0x05:在线测试(据处理); 0x06:在线测试(光传与控制);0x07:在线测试(频率源);0x08:在线测试(伺服);0x09:在线测试(电源);0x0A:在线测试(阵面冷却); 0x0B:干扰前记录据的回放;0x80:外码元;0x81:全阵面据采集;0x82:数字单元BITE传送;0x83:备份; " "0x00:开机测试; 0x01:在线测试(全机);0x02:在线测试(DBF);0x03:在线测试(备份);0x04:在线测试(信号处理);0x05:在线测试(据处理);0x06:在线测试(光传与控制); 0x07:在线测试(频率源);0x08:在线测试(伺服);0x09:在线测试(电源);0x0A:在线测试(阵面冷却); 0x0B:干扰前记录据的回放; 0x80:外码元; 0x81:全阵面据采集; 0x82:数字单元BITE传送; 0x83:备份; " */ unsigned short bak1; //备份 unsigned short pitch; //阵面姿态 默认阵面倾角 资源调度或显控填 默认阵面倾角 unsigned short txBeamEle;//发射波束向 量化单位0 .1° 资源调度或显控填 量化单位0.1° unsigned short rxBaseBeamEle;//本帧接收的最低一个俯仰波束-2°~90°,量化单位0 .1° 资源调度或显控填 -2°~90°,量化单位0.1° unsigned short rxEleNum;//本帧俯仰同时接收波束个(有效波束) 俯仰面同时接收波束个,0X011个;…0X05:5个;…0X0A:10个;…0x14:20个 资源调度或显控填 俯仰面同时接收波束个,0X011个;…0X05:5个;…0X0A:10个;…0x14:20个 unsigned short rxEleStep;//本帧接收的俯仰波束间隔 0~5°,量化单位0 .01° 资源调度或显控填 0~5°,量化单位0.1° unsigned short bak2; //备份 unsigned short sweepNum; //波位总 当前工作模式一共多少个波位 资源调度填 unsigned short beamPos; //当前波位号 当前为第几个波位 资源调度填 unsigned short scanBeamTxEle;//波瓣测试发射仰角 角度值*100 显控填 角度值*100 unsigned short scanBeamRxEle;//波瓣测试接收仰角 角度值*100 显控填 角度值*100 unsigned short bak3[2]; //备份 unsigned short srvAzA; //伺服A方位角码 960伺服双机热备,所以有两个方位角码,需与张宏超沟通更改程序 雷控填 960伺服双机热备,所以有两个方位角码,需与张宏超沟通更改程序 unsigned short srvAzB; //伺服B方位角码 雷控填 unsigned short bak4[5]; //备份 unsigned char workMod;// /*32 K 1 B7~B0 工作模式 "0x80: 正常工作模式 0x91: 发射监测模式 0x92: 接收监测模式 0xEA: DDS复位、BIT总清 0xCC:令BIT参回读(见BIT回读)(b7~b0为0xCC时进行令BIT参回读,其他模式则为周期BIT回读) " 阵面控制工作模式总览 "0x80: 正常工作模式 0x91: 发射监测模式 0x92: 接收监测模式 0xEA: DDS复位、BIT总清 0xCC:令BIT参回读(见BIT回读)(b7~b0为0xCC时进行令BIT参回读,其他模式则为周期BIT回读) "*/ unsigned char bak5; //B15~B8 备份 保留、填0 保留、填0 unsigned short antType; //阵面重构类型 保留、填0 阵面重构类型选择 保留、填0 unsigned char bak6; unsigned char freqNum : 3;//频率组循环参 unsigned char freqREn : 1;//频率组循环参使能 unsigned char bakold : 4;//频率组循环参 unsigned short calEn : 1; //35 K+3 1 b0 天线阵面发射相位、接收幅度、相位补偿使能 0:补偿 1:不调用补偿值///////(单元级用本bit)0 "补偿使能开关 unsigned short subAntEn : 1;//b1 阵面级收发通道接收幅度加权旁路使能 "0:使能 1:不调用补偿值///////(子阵级用本bit)1 /* 接收做组件内DBF时相应此字,如不调用补偿,则对八个通道据不进行幅度加权,如调用补偿,则进行幅度加权,加权信息对应96字b5-b8及之后波束对应字 " "0:使能 1:不调用补偿值///////(子阵级用本bit)1 接收做组件内DBF时相应此字,如不调用补偿,则对八个通道据不进行幅度加权,如调用补偿,则进行幅度加权,加权信息对应96字b5-b8及之后波束对应字 " */ unsigned short antTxW : 1;// b2 天线阵面发射展宽 0:展宽 1:不展宽 0 0:展宽 1:不展宽 0 unsigned short chlNorEn : 1; // b3 组件收发幅相归一化补偿使能。953首套1,正常0。 "0:归一化 1:不使能 9531测雨0 //暗室测试时为了取原始据会1,正常使用时0 //组件级补偿,通常在微电子时会先烧好,如果一个产品各个组件的组件级补偿烧好了,那么B0代表的阵面级补偿就只补偿组件以外的东西,这样的好处是组件故障后可以直接更换,如不烧组件级补偿,那组件更换后要再进行阵面补偿 " "0:归一化 1:不使能 9531测雨0 //暗室测试时为了取原始据会1,正常使用时0 " unsigned short actChlEn : 1; //b4 数字通道均衡旁路使能 保留、填0 保留、填0 unsigned short actChlEn2 : 1; //b5 数字时延处理旁路使能 保留、填0 保留、填0 unsigned short actChlEn3 : 1; //b6 DDC窄带频率集旁路使能,除A模式外其他模式1 0:无频率集;1有频率集 0:无频率集;1有频率集 unsigned short actChlEn4 : 1; //b7 数字时延误差补偿旁路使能 保留、填0 保留、填0 unsigned short powerMngEn : 1; //b8 能量管理码 调用使能 Q "0:调用能量管理 1:不调用能量管理 0 与96字(及之后的几个发射脉冲字段)的能量管理类型,即开单极化或双极化关联。0时能量管理类型字有效,1时无效" unsigned short bak7 : 3; //b11~b9 备份 保留、填0 保留、填0 unsigned short baktxPhaseSig : 1; //b12 发射频移极性 保留、填0 保留、填0 unsigned short bakrxPhaseSig : 1; //b13 接收频移极性 保留、填0 保留、填0 unsigned short txPhaseSig : 1; //b14 发射移相极性 控制发射移相正1,0 保留、填0 unsigned short rxPhaseSig : 1; //b15 接收移相极性 保留、填0 保留、填0 // unsigned short subdbf : 4; //36 K+4 1 b3~b0 数字板打包选择 "0x0:不进行组件内DBF合成; //unsigned short subdbfEn:1;//0x4:进行组件DBF合成,0x4 =4通道合1;(953,2201) //unsigned short doubleFreqEn:1;//0x8:按频率集,8通道合1;(中南S) unsigned short waveCode : 2; //b5~b4 码元控制 0:AD,1:码元1 0:AD,1:码元1 unsigned short iqRev : 1; //b6 IQ正 "960此处有效,可用来调试,正常填0,如发现下行据IQ了,则可1将它再过来 unsigned short bak8 : 1; //b7 备份 备份 备份 unsigned short dbf : 3; //b10~b8 DBF打包输出选择 "0:按b3-b0设执行DBF或不合成; /* 1:保留 2:合成单通道模式,仅被字39选择单通道移相,加权输出。 其余保留。 正常工作时0,2是为了验证当组件内DBF合成时各通道幅度相位加权的正确性的,即:当b3-b08时,此处可2,2后根据39字的设选择单独下行某一个通道的加权结果,而不是8通道加权合一的结果,进行验证。正常工作时不需2 . " "0:按b3-b0设执行DBF或不合成; 1:保留 2:合成单通道模式,仅被字39选择单通道移相,加权输出。 其余保留。 正常工作时0,2是为了验证当组件内DBF合成时各通道幅度相位加权的正确性的,即:当b3-b08时,此处可2,2后根据39字的设选择单独下行某一个通道的加权结果,而不是8通道加权合一的结果,进行验证。正常工作时不需2 . " */ unsigned short externWaveCode : 1; //b11 外码元 "0x1:外码元 0x0:IQ据 unsigned short packetMode : 3; //b14~b12 打包模式 "0x0:中心频点IQ据打包 /* 0x1:接收5集40通道IQ据打包 0x2:合成模式打包(打包合成后5通道,可配合合成单通道模式) " "0x0:中心频点IQ据打包 0x1:接收5集40通道IQ据打包 0x2:合成模式打包(打包合成后5通道,可配合合成单通道模式) " */ unsigned short exWaveCode : 1; //b15 外码元 0x1:外码元 0x0:IQ据 0x1:外码元 0x0:IQ据 unsigned short paraChl0; //参提取单通道据下传选择阵面ID 保留、填0 保留、填0 unsigned short paraChl1; //参提取单通道据下传选择阵面ID 保留、填0 保留、填0 unsigned short paraChl2; //参提取选择通道(组件内DBF功能) "可下传0~N-1中任一单个数字通道的加权结果,N代表数字组件数字通道,当且仅当36字:b11~b8为2时起效 //此字为测试用,当36字b11-b82时,根据此字的值选择使组件单独下传值对应通道的加权结果,用于组件内DBF合成验证,正常工作时不使用此字,0即可 " 组件内DBF模块负载实现 "可下传0~N-1中任一单个数字通道的加权结果,N代表数字组件数字通道,当且仅当36字:b11~b8为2时起效 //此字为测试用,当36字b11-b82时,根据此字的值选择使组件单独下传值对应通道的加权结果,用于组件内DBF合成验证,正常工作时不使用此字,0即可 " unsigned short bak9[2]; //备份 保留、填0 保留、填0 unsigned short ddcfir : 4;//42 K+10 1 B3~B0 DDC FIR滤波器带宽/采样率 0x0:1M/2M 0x1: 2M/2M 0x2:4M/4M DDC采样滤波器选择 0x0:1M/2M 0x1: 2M/2M 0x2:4M/4M unsigned short bak10 : 12;// unsigned short bak11[12]; //备份 保留、填0 保留、填0 unsigned short stc : 6;//b5~b0 数字组件接收衰减 "b4-b0有效,b0代表1dB衰减,b1代表2dB衰减,以此类推,b4代表16dB衰减,衰减范围0-31dB 1:不衰减 0:衰减 例如:11110(二进制),代表衰减1dB unsigned short stcMethod : 1; //b6 数字组件衰减控制方式选择 0:从上述令中选取 1:衰减可变(从可变STC字段选取) 0:从上述令中选取 1:衰减可变(从可变STC字段选取) unsigned short txForce : 1; //b7 发射强制开启 保留、填0 保留、填0 unsigned short bak21 : 1; //b8 中频滤波器选择 保留、填0 保留、填0 unsigned short bak22 : 1; //b9 DDS声表滤波器选择 保留、填0 保留、填0 unsigned short bak23 : 1; //b10 中频发射直通选择 保留、填0 保留、填0 unsigned short bak24 : 1; //b11 本振切换 保留、填0 保留、填0 unsigned short bak25 : 1; //b12 宽窄带滤波器控制 保留、填0 保留、填0 unsigned short txFilterSel : 3; //b15~b13 射频滤波器选择 "B15:收发射频滤波器设方式切换,目前根据频点为两种滤波器,频点0-124为滤波器1,频点125-300为滤波器2。0:根据96字(及之后几个发射脉冲对应字)b7的设切换,1:手动根据b14-b13的值切换。 /* 正常使用时b150,这样可以对每个发射脉冲根据频率单独设滤波器,更加灵活。要进行相关测试时可以1进行手动切换统一使用一种滤波器 B14-B13:手动设滤波器,B15为1时生效。00:滤波器1,01:滤波器2 " "B15:收发射频滤波器设方式切换,目前根据频点为两种滤波器,频点0-124为滤波器1,频点125-300为滤波器2。0:根据96字(及之后几个发射脉冲对应字)b7的设切换,1:手动根据b14-b13的值切换。 正常使用时b150,这样可以对每个发射脉冲根据频率单独设滤波器,更加灵活。要进行相关测试时可以1进行手动切换统一使用一种滤波器 B14-B13:手动设滤波器,B15为1时生效。00:滤波器1,01:滤波器2 " */ unsigned short stcIndex; //STC曲线号 保留、填0 保留、填0 unsigned short bak54[3]; //备份 保留、填0 保留、填0 unsigned int basePulseWidth; //基带信号脉宽 保留、填0 保留、填0 unsigned short txOff; //发射关断模式字 关断时,填写0x9A,其余时刻不填。 "用来在调试时对模拟前端的收发、自激、拖尾进行检测。 //正常工作时不用 " 9x5不用,960应该也不用 关断时,填写0x9A,其余时刻不填。 unsigned short trunOffID; //关断或开启通道的用户ID[15:0] 要关断或开启的通道用户ID号(开启时,若为0xFFFFFFFF,则全阵开,否则是单板开) 要关断或开启的通道用户ID号(开启时,若为0xFFFFFFFF,则全阵开,否则是单板开) unsigned short trunOffID2;//关断或开启通道的用户ID[31:0] unsigned short trunOffChlNum; //关闭通道号 1-16通道,别对应b0~b15,0x1代表关断 1-16通道,别对应b0~b15,0x1代表关断 unsigned char rxSelfExcitTh;//B7~B0 接收自激检测门限 0x0-0x90:对应1-90dB;0x0时默认为80dB; 0x0-0x90:对应1-90dB;0x0时默认为80dB; unsigned char txTrailTh;//B15~B8 发射拖尾检测门限 0x0-0x90:对应1-90dB;0x0时默认为80dB; 0x0-0x90:对应1-90dB;0x0时默认为80dB; unsigned short rxSelfExcitEn : 1; //b0 接收自激检测使能 0x0:无效,0x1:有效 0x0:无效,0x1:有效 unsigned short rxSelfExcitS : 1; //b1 接收自激检测判别方法 0x0:绝对门限法,0x1:相对门限法 0x0:绝对门限法,0x1:相对门限法 unsigned short rxSelfExcitChlEn : 1; //b2 接收自激异常通道关断方式 0x0:手动,0x1:自动 0x0:手动,0x1:自动 unsigned short rxSelfExcitStaRet : 1; //b3 接收自激状态复位 0x0:保持原状,0x1:关断通道恢复开启 0x0:保持原状,0x1:关断通道恢复开启 unsigned short rxSelfExcitExcFlagEn : 1; //b4 接收自激异常标志清除 0x0:保持原状,0x1:标志清除 0x0:保持原状,0x1:标志清除 unsigned short rxSelfExcitDtcStartPos : 4; //b8~b5 接收自激检测起始位(从波门起始开始算起,步进500us) 0:500us;1:1ms;···14:7 .5ms;15:0ms(监测时用) 0:500us;1:1ms;···14:7.5ms;15:0ms(监测时用) unsigned short rxSelfExcitChlDiffThl : 3;//b11~b9 接收自激检测通道间差异阈值 "0x0:30dB;0x1:27dB;0x2:24dB; //0x3:21dB;0x4:18dB;0x5:15dB; //0x612dB;0x7:9dB; " "0x0:30dB;0x1:27dB;0x2:24dB; //0x3:21dB;0x4:18dB;0x5:15dB; //0x612dB;0x7:9dB; " unsigned short adRevDtcEn : 1; // b12 AD翻转检测使能 0x0:无效,0x1:有效 0x0:无效,0x1:有效 unsigned short adRevDtcSel : 1; //b13 AD翻转检测方式 0x0:高位,0x1:全部 0x0:高位,0x1:全部 unsigned short txTrailEn : 1; //b14 发射拖尾检测使能 0x0:无效,0x1:有效 0x0:无效,0x1:有效 unsigned short txTrailExFlagEn : 1; //b15 发射拖尾异常标志清除 0x0:保持原状,0x1:标志清除 0x0:保持原状,0x1:标志清除 unsigned short checkSum; //校验码 关断或开启时,填写0xaa55,其余时刻不填。 关断或开启时,填写0xaa55,其余时刻不填。 unsigned short bak53[2];//备份 无 无 unsigned short bakpulseWidth;//脉冲宽度 无 无 unsigned short rxFeqNco[10][2]; //由低到高依次为:接收集NCO1的 低16位 高16位, NCO2 ...NCO10 "前5个频点为第一组 /*中频-奈奎斯特最大值 " "10个NCO字, 接收频率集使能时起效,每个NCO字为32BIT, 72-73是频率1; NCO =((480-实际接收中频频率)/120)*2^32 实际接收中频频率计算方式: 频率 =接收本振-回波频率 " "前5个频点为第一组 中频-奈奎斯特最大值 "*/ RCV_BEAM_PARA DBF_beta[10];//0水平,1 垂直,然后10个表示10个角度的beta码。由低到高别是水平波束1 2 3 10。,然后是垂直极化的波束1 2 3 10。 unsigned short beta[2][10]; //备份 unsigned short bak12[16]; //备份 unsigned short mnBak[4]; //MN预留 unsigned int txCalChlID;//发射监测模式下被监测数字组件用户ID[15:0] "发射监测时选定阵面数字组件,接收监测时填写0xFFFF? //根据用户ID,字32选发射监测,即可对对应ID的数字组件进行发射监测 " 监测选定数字组件,接收监测时填写0xFFFF,选中用户ID,字32选发射,即可发射 unsigned short txCalChlSet;//发射监测模式下被监测数字组件发射通道设 发射监测时选定数字组件的发射通道号,0-7代表1-8通道 监测选定数字组件,接收监测时填写0xFFFF unsigned short txCalAntID; //监测子阵波控板用户ID[15:0] 保留,备份 保留,备份 unsigned short txCalAnalogChl; //监测有源子阵内模拟通道号 保留,备份 保留,备份 unsigned short txCalDigitalChl; //监测组件发射数字通道号 保留,备份 保留,备份 unsigned short mntADFalg : 1; //1 B0 监测:数字/模拟链路 缺省填1数字组件 缺省填1数字组件 unsigned short mntHVFalg : 2; // b2~b1 监测极化控制 保留,填0 保留,填0 unsigned short mntCalPAStat : 2; // b4~b3 监测通道幅相位状态 保留,填0 保留,填0 unsigned short mntCalCalTxRxStat : 2; // b6~b5 监测通道收发状态 保留,填0 保留,填0 unsigned short bak13 : 9; // b15~b7 备份 保留,填0 保留,填0 unsigned short calCoefAddr : 8;//200 R+12 1 B7~B0 监测频率对应的补偿地址 "当字32选择发射监测或接收监测时,要想调用补偿值,在此字调用的补偿值,调用方法同字94 unsigned short calCoefAddr2 : 8; // B15~B8 补偿地址备份 unsigned short bak14[10]; //备份 unsigned short bak15; //备份 保留,备份 保留,备份 unsigned short calTRMod;//监测组件工作模式 "监测组件工作模式:接收内监测0x0002 接收外监测0x0040 发射内监测0x0000 发射外监测0x8000 /*监测组件工作模式: 外接收监测0x0009 外发射监测0x0010 内接收监测0x000c 内发射监测0x0090 模拟目标0x800a 噪声源0x4000 匿影0x0000 其余保留,缺省为匿影 "*/ unsigned short calTRAtten : 7; // B6~B0 监测组件发射衰减值 监测组件发射衰减0-XXXdB,单位1dB 只需直接填入想要衰减的值即可,具体衰减实现由组件内部根据填入的值自适应进行 "b6~b0:模拟目标衰减 unsigned short simTgtFreq : 2;//b9~b7:模拟目标频率选择 其余保留 " unsigned short calTRTxFreqSel : 7; // B14~B8 监测组件发射频率段索引 "同一衰减下,监测组件在不同发射频率下其衰减补偿值不同,此字段用来选择监测组件发射频率段索引,对应不同衰减补偿值 //将301个频点按4M划(以除以四后四舍五入为准则),为76个频率段,用0-75表示,0代表频点号0、1对应频率,1代表2、3、4、5对应频率,以此类推 " "设此频率段索引为F,监测组件发射频率为f,则此字段填入 //F =四舍五入(f/4) " unsigned short stc1Value : 5;// B4~B0 监测组件接收衰减控制STC1 b4:1 =16dB衰减,b3:1=8,b2:1=4,b1:1=2,b0:1=1, STC1控制0-31dB衰减,STC2控制0-31 .5dB衰减,两者可叠加 b4:1=16dB衰减b3:1=8,b3:1=8,b2:1=4,b1:1=2,b0:1=1, unsigned short bak42 : 3;//b5-b7 备份 保留0 1开,0关 unsigned short stc2Value : 6;// b8-b13 监测组件接收衰减控制STC2 b13:1 =16dB衰减,b12:1=8,b2:11=4,b1:10=2,b9:1=1,b8:1=0 .5 1关,0开 unsigned short bak43 : 1;//b14 备份 保留0 1关,0开 unsigned short bak44 : 1; //b15 备份 保留0 保留0 unsigned short bak45 : 7; //b15~b8 备份 保留,填0 保留,填0 unsigned int calTRID; //监测参考数字组件阵面ID[15:0] 保留,填0 保留,填0 unsigned short calTRCalNum; //监测参考数字组件数字通道号 保留,填0 保留,填0 unsigned short bitModSel : 8;// B7~B0 BIT模式选择 "0x7:数字收发BIT //(字32:0xCC时,为令BIT参回读,其他模式则为周期BIT回读) " "0x7:数字收发BIT //(字32:0xCC时,为令BIT参回读,其他模式则为周期BIT回读) " unsigned short bitSubModSel : 8; //b15~b8 BIT模式子集选择 "工作模式为0xCC令BIT参回读 unsigned short txrxBitMod : 8; //b7~b0为0x7数字收发BIT模式 /*0x0:数字通道全局列坐标M 0x1数字通道全局行坐标N 0x2:模拟通道全局列坐标M 0x7F: 厂家ID及FLASH信息 0x81数字收发时钟链路、光链路工作状态 0x83:令接收状态 0x91数字收发接收通道工作状态 0x92:数字收发发射通道工作状态 0x93:数字收发AD寄存器据回读 0x94:数字收发DA寄存器据回读*/ unsigned int bitParaAddr;//参BIT回读地址[15:0] unsigned short readCalNum : 8; // b7~b0 回读通道 unsigned short readCeofAddr : 8; // b15~b8 回读补偿地址(频点/点/阶) unsigned short dbfCtrlBit[4];//波控令BIT控制字(详见右) 令BIT控制[15:0] 令BIT控制[15:0] unsigned short bak46[16]; //备份 备份 备份 unsigned short cycleFreqNum2;//循环二接收本振频点号(FR2) 0-200;9300~9500MHz,1MHz一个点,共201个 0-200;9300~9500MHz,1MHz一个点,共201个 unsigned short cycleFreqNum1;//循环一接收本振频点号(FR1) 0-200;9300~9500MHz,1MHz一个点,共201个 0-200;9300~9500MHz,1MHz一个点,共201个 unsigned char clockSel; //B7~B0 晶振选择(频率源A) 0:自发自收 1:自关收外 暂不使用 0:自发自收 1:自关收外 unsigned char clockWaveNum; //B15~B8 波形个(频率源A) 0x1~0xA =1~10 0xB:发连续波 暂不使用 0x1~0xA=1~10 0xB:发连续波 PULSE_PARA pulsePara[10];/*0x1:1MHz; 0x2:2MHz;0x3:4MHz; " "0:0(单载频);0x1:1MHz; 0x2:2MHz;0x3:4MHz; "*/ unsigned short bak30[15]; //备份 unsigned short dbfMode; //DBF工作模式 "0x40:光纤和网络送出波束据(波瓣测试用) /*0x80:正常工作(正常工作用) 0x90:窄带接收内监校 0x91:窄带接收外监校 0x92:发射内监校 0x93:发射外监校 0x96:扫描架接收监校 0xc2:阵面BIT回读 0xc3:基本通道参回读 0xc4:频点参回读 0xc6:锥削权索引回读 0x65:基本通道参加载 0x67:锥削权索引加载 0x68:频点参加载 0x75:基本通道参固化 " "0x40:光纤和网络送出波束据(波瓣测试用) 0x80:正常工作(正常工作用) 0x90:窄带接收内监校 0x91:窄带接收外监校 0x92:发射内监校 0x93:发射外监校 0x96:扫描架接收监校 0xc2:阵面BIT回读 0xc3:基本通道参回读 0xc4:频点参回读 0xc6:锥削权索引回读 0x65:基本通道参加载 0x67:锥削权索引加载 0x68:频点参加载 0x75:基本通道参固化 "*/ unsigned short workPara : 2; // B1~B0 工作参 00:常规工作;01:步进频方式;10:远近区方式;11:频率集 0:单频点; 1:多频点补盲;2:暂无;3:频率集。无需填写 00:常规工作;01:步进频方式;10:远近区方式;11:频率集 unsigned short WNFlag : 1;// B2 宽窄带标志 宽窄带标志,1据率>120M,0:据率≤120M 无需填写 宽窄带标志,1据率>120M,0:据率≤120M unsigned short bak49 : 1;//B3 备份 无 无 unsigned short rngSegment : 4;//B7~B4 远近区距离段 最大4段 无需填写 最大4段 unsigned short freqMutiN : 4;// B11~B8 多频点频点 最大40 无需填写 最大40 unsigned short bak50 : 1;//B12 备份 无 无 unsigned short collectSel : 2; // B14~B13 阵面据采集 "11:采集波束10:采集加权后据 //01:采集原始通道据 00:不采集(在工作状态时采集各通道的一些据用于监测) " 无需填写 "11:采集波束10:采集加权后据 //01:采集原始通道据 00:不采集(在工作状态时采集各通道的一些据用于监测) " unsigned short bak51 : 1;// B15 备份 无 无 unsigned int dataLen; //据包长度[15:0] "BIT校验用,不影响工作(BIT要填)填不填都不影响正常工作,但如果填错了BIT会报错" /* 据包长度[31:16] "本帧据的回波脉冲长度,脉冲积累*单个脉冲距离库*频点 GH模式下,频点为:G:5;H:3;单个脉冲距离库为:采样率*(第一周期波门长度+第二周期波门长度) 脉冲积累665字设的值 " 本帧据的回波脉冲长度,脉冲积累X波束X单个脉冲距离库长 */ unsigned short pulseNum; //脉冲总(本帧据的脉冲个) 8~512脉冲积累 "BIT校验用,不影响工作(BIT要填) //填不填都不影响正常工作,但如果填错了BIT会报错 " 8~512脉冲积累 unsigned int sampStart; //采集起始计[15:0] "从该点开始抽取32个点在网络转发,用于监测,正常工作不影响 //代点,而不是时间,例如填50(十进制),则意味着DBF在其收到的据的第50点开始,抽取32点转发 " 用于监测,正常工作不影响采集起始计[31:16] 从这个点开始抽取64点,用于监测和查错 unsigned short dbfused; //DBF专用字段 unsigned short dbfOffset; //阵面子阵合成后选用的DBF参偏移 阵面合成填16,不合成填8 本产品内已写死,无需填写 新增 阵面合成填16,不合成填8 unsigned short bak16; unsigned short freqSegment; //跳频段 "GH模式,长短脉冲跳频,两组时补盲循环填2 //其他无时补盲,填1 " "GH模式,长短脉冲跳频,两组时补盲循环填2 //其他无时补盲,填1 " unsigned char dataRate : 4;//B0~B3 据率 1:2bps,2:2bps;3:4bps 1:2bps,2:2bps;3:4bps unsigned char workMode2 : 4;//B4~B7 工作模式 A:1;B:2;C:3;D:4;E:5;F:6;G:7;H:8 F和G模式下,只处理2bps据率;4bps由阵面做一级DBF; A:1;B:2;C:3;D:4;E:5;F:6;G:7 unsigned char bak17; unsigned short bak18[5]; unsigned char oneLineChlNum; //B7~B0 输入单根光纤通道 频率集,填1无需填写 按照实际填写,频率集:填1 .无需填写 频率集,填1无需填写 unsigned char dbfBeamNum; //B15~B8 合成波束 无需填写 A/D/E模式:24/12;F/G模式:4/2;无需填写 unsigned char oneLineDbfNum; //B7~B0 DBF合成过程中输出单根光纤通道 未定义 与B7~B0定义相同 unsigned char oneLineAfterDbfNum; //B15~B8 DBF对下一级输出单根光纤通道 A/D/E模式:24/12;F/G模式:4×5频率/2×5频率; unsigned short bak19[3]; unsigned short freqIndex[10]; //频点索引,DBF计算回波alpha,beta值计算 频点索引:频点序号:从0起。 频点索引,DBF计算回波alpha,beta值计算 unsigned short freqIndex11to40[30];//频点11~频点40 BEAM_AZEL beamAngle[96]; //波束2到波束96方位、俯仰向 unsigned char deamDbfCeof[96]; //B7~B0 波束1~96的锥削权索引 "权值索引的b6,b14代表了水平/垂直权,其中1为垂直0为水平 /*权值,而b0~b5或b8~b13则为权值号;权值需要阵面预先烧好,其中相同权值号的不同极化权值相同 以上1垂直0水平的实现方式其实还是通过权值实现,换句话说,b0-7、b8-15都是代权值套,b6和b14本身也是权值套的一部。例如b7-0为‘0x40’的时候的是该波束为垂直极化,并且用第0套权值,但实际烧权值的时候,该套权值是烧在地址64,即‘0x40’的十进制上的,在该套权值中,水平组件对应用户ID下的权值均为0,只有垂直组件对应ID下各通道的权值为想要的权值,通过这种方式来实现水平和垂直的切换。 所以可以不遵守以上规律,可自行更改,但为了统一,除非权值套非常多,否则以后可都遵守此规律 " "权值索引的b6,b14代表了水平/垂直权,其中1为垂直0为水平 权值,而b0~b5或b8~b13则为权值号;权值需要阵面预先烧好,其中相同权值号的不同极化权值相同 "*/ unsigned short dbfbak[60]; //DBF字段备份 unsigned short jambak[18]; //干扰字段 unsigned short timeingEn : 1; //B0 定时使能 0:关闭,仅产生据处理中断和雷控默认定时;1:开启 0:关闭,仅产生据处理中断和雷控默认定时;1:开启 unsigned short bak52 : 15; //B15~B1 备份 unsigned int timeingSwitch; // 定时 每一位:0:关闭;1:开启 每一位:0:关闭;1:开启 unsigned short simTgtTime;//模拟目标模拟触发位 "0 .1us单位,0~6553.5us //>接收波门起始,<接收波门结束 " 模拟目标的带宽和脉宽可以设 "0 .1us单位,0~6553.5us //>接收波门起始,<接收波门结束 " unsigned short pulseWidth;//脉冲宽度 1us单位,最大1 .5ms 保留,暂不使用 1us单位,最大1.5ms unsigned short pulseNum0;//填零脉冲(距离模糊倍) 0~20个 0~20个 unsigned short startSampTime; //时脉冲1接收波门起始(1us) 1us 单位 1us 单位 unsigned short endSampTime; //时脉冲1接收波门结束(1us) 1us 单位 1us 单位 unsigned short calStartSampTime;//监测组件接收波门起始(1us) 5 5 5 unsigned short calEndSampTime;//监测组件接收波门结束(1us) aa 170 aa unsigned short cancelStartSampTime;//对消采样波门起始 相对M0的提前时刻(us) 相对M0的提前时刻(us) unsigned short cancelEndSampTime;//对消采样波门结束 相对M0的提前时刻(us) 相对M0的提前时刻(us) unsigned short bak20; //备份 unsigned short simTgtFd : 15;//B14~B0 模拟目标fd,单位1Hz ±3661Hz ±3661Hz unsigned short simTgtsign : 1;//B15 符号位,0为减去fd,1为加上fd unsigned short simTgtAtten;//模拟目标衰减 0~100dB 不启用 0~100dB unsigned short txPulseNum; //发射脉冲(8~512个) unsigned short PRT; //(100us~65ms)(1us) 所有时周期求和 所有时周期求和 unsigned short pulse2Start;//时P2周期起始时刻(1us) unsigned short pulse3Start;//时P3周期起始时刻(1us) unsigned short pulse2RxStart;//时P2周期接收波门起始(1us) unsigned short pulse2RxEnd;//时P2周期接收波门结束(1us) unsigned short pulse3RxStart;//时P3周期接收波门起始(1us) unsigned short pulse3RxEnd;//时P3周期接收波门结束(1us) unsigned short calTxRxEn : 2; // B1~B0 内外监测发射开关 "bit0:内监测,1:开,0:关闭(监测组件2通道) unsigned short bak121 : 14; //B15~B2 备份 unsigned short bak1232;//备份 匿影天线低噪放控制 unsigned short bak123[6];//备份 无 无 unsigned short dspMode;//信号处理工作方式 0:自检 1:RESET 2:工作 3:直通(时域IQ) 0:自检 1:RESET 2:工作 3:直通(时域IQ) unsigned short bak124;//备份 无 无 unsigned short method : 1;//B0 处理方式 0:FFT 1:PPP 0:FFT 1:PPP unsigned short points : 10; //B10~B1 FFT/PPP点 8~512 与657字发射脉冲相同 8~512 unsigned short winFun : 2; // B12~B11 FFT加权函的选择 0:不加权 1:海明加权 2:Blackman加权 3:其他 0:不加权 1:海明加权 2:Blackman加权 3:其他 unsigned short pcFun : 2; //B14~B13 LFM脉压加权函的选择 0:不加权 1:海明加权 2:Blackman加权 3:其他 0:不加权 1:海明加权 2:Blackman加权 3:其他 unsigned short pcPara : 1; //B15 脉压选择 0:不脉压 1:脉压 对窄脉冲无效,窄脉冲默认不脉压,默认填1即可,需要验证宽脉冲时填0 0:不脉压 1:脉压 unsigned short bak125; //备份 unsigned short beamNum;//总波束 1~60 1~60 unsigned short phaseCodeEn : 3; //B15~B13 相位编码使能 0:不开启,1~7:对应1~7套相位编码 信号处理算法标志 0:不开启,1~7:对应1~7套相位编码 unsigned short clutterProEn : 1; //B12 地杂波处理算法选择 0:手动;1:自适应 0:手动;1:自适应 unsigned short singleCompEn : 1; //B11 信号形式补偿开关 0:关闭;1开启 0:关闭;1开启 unsigned short fsFilterEn : 1; //B10 飞机舰船滤波开关 0:关闭;1开启 0:关闭;1开启 unsigned short b2bSmoothEn : 1; //B9 帧内平滑开关 0:关闭;1开启 0:关闭;1开启 unsigned short beamSmoothEn : 1; //B8 帧间平滑开关 0:关闭;1开启 0:关闭;1开启 unsigned short antSyncEn : 1; //B7 异步开关 0:关闭;1开启 0:关闭;1开启 unsigned short noPulseDelEn : 1; //B6 窄脉冲剔除开关 0:关闭;1开启 0:关闭;1开启 unsigned short sideEn : 1; //B5 副瓣对消开关 0:关闭;1开启 0:关闭;1开启 unsigned short hideEn : 1; //B4 副瓣匿影开关 0:关闭;1开启 0:关闭;1开启 unsigned short CCOREn : 1; //B3 CCOR开关 0:关闭;1开启 0:关闭;1开启 unsigned short SIGEn : 1; //B2 SIG开关 0:关闭;1开启 0:关闭;1开启 unsigned short LOGEn : 1; //B1 LOG开关 0:关闭;1开启 0:关闭;1开启 unsigned short SQIEn : 1; //B0 SQI开关 0:关闭;1开启 0:关闭;1开启 unsigned short SQIThl; //SQI门限 0~100,代表0-1,100量化 0~100,代表0-1,100量化 unsigned short LOGThl; //LOG门限 0~100,代表0-1,100量化 0~100,代表0-1,100量化 unsigned short SIGThl; //SIG门限 0~100,代表0-1,100量化 0~100,代表0-1,100量化 unsigned short CCORThl; //CCOR门限 0~100,代表0-1,100量化 0~100,代表0-1,100量化 unsigned short hideThl;//副瓣匿影门限 0~65535,100倍填写,单位:Db 0~65535,100倍填写,单位:Db unsigned char noPulseDelWidthThl; // B15~B8 窄脉冲剔除宽度门限 值域[0,255],量化单位1us,0:不剔除 窄脉冲剔除用 值域[0,255],量化单位1us,0:不剔除 unsigned char noPulseDelAmpThl; unsigned short antSyncThl; //异步门限 异步用 unsigned short noiseThl1;//信号处理噪声门限1 0~1000 .00 int16,噪声功率nn1的倍(噪声功率由信号处理配文件给出) 0~1000.00 unsigned short noiseThl2;//信号处理噪声门限2 0~1000 .00 int16,噪声功率nn1的倍(噪声功率由信号处理配文件给出) 0~1000.00 unsigned short noiseThl3;//信号处理噪声门限3 0~1000 .00 int16,噪声功率nn1的倍(噪声功率由信号处理配文件给出) 0~1000.00 unsigned short b2bSmooths; //帧间平滑点 11000,奇 3*3的有效小于此值填无效值,否则填有效据之和的平均 11000,媸? unsigned short beamSmooths; //帧内平滑点 11000,奇 11000,奇 unsigned short groundClutterVelThl;//地杂波速度门限 0-5000,100倍量化,int16,单位是m/s 地杂波处理算法选择为手动时起效 0-5000,100倍量化,int16,单位是m/s unsigned short groundClutterWiodthThl;//地杂波谱宽门限 0-5000,100倍量化,int16,单位是m/s 0-5000,100倍量化,int16,单位是m/s unsigned short groundClutterRngThl;//地杂波距离门限 0-500,无量化,int16,单位是km 0-500,无量化,int16,单位是km unsigned short bak31;//备份 无 无 unsigned short doubFreqPro : 2; //B1~B0 双重频算法选择 0:单重频;1:双重频;2:重频复用 单重频时填0 0:单重频;1:双重频;2:重频复用 unsigned short doubFreqFlag : 2; // B3~B2 双重频标志 其它:否;1:是,第一帧;2:是,第二帧 单重频时填0 其它:否;1:是,第一帧;2:是,第二帧 unsigned short doubFreqType : 2;//B5~B4 双重频比 0—1:11—2:3;2—3:4;3—4:5 单重频时填0 0—1:11—2:3;2—3:4;3—4:5 unsigned short bak32 : 10;//B15~B6 备份 无 无 unsigned short bak33[27]; //备份 unsigned short txPhaseCtrl[127];//发射脉冲相位控制 (所需相位值(度))/360×2^16 int16,相位编码用 (所需相位值(度))/360×2^16 unsigned short bak34[13];//备份 无 无 unsigned short p1_20Start[20];//脉冲1~20 首库库号(相对M0)零号库 波束1~20 标定零号库库号(相对M0) int16 波束1~20 标定零号库库号(相对M0) unsigned short p1_10Start[20];//脉冲110 起始库号(距离拼接用) int16 unsigned short p1_10End[20];//脉冲110 结束库号(距离拼接用) int16 unsigned short p1_20End[20];//脉冲1~20 库(距离拼接用) int16 unsigned short b2bRngAdd; //距离拼接(波束之间) 0:不启用 1:启用 0:不启用 1:启用 unsigned short burstNum;//有效波束 1~60 1~60 unsigned short rangUnit;//库长 0~65535 0:150m;1:75m;2:37 .5m 0~65535 unsigned char noiseTestsn;// unsigned char noiseTestsn2;// unsigned short testStart : 1; // 1 B1~B0 测试起始标志 unsigned short testSn : 15; //B2~B15 测试序列号 unsigned short compEn; //补偿开关 备用 备用 unsigned short bak35[49];//备用 无 无 unsigned short txEle; //发射仰角 角度×100 "波瓣测试时用; //正常工作时,资源调度填写和解析给RCM不同发射仰角用 " 角度×100 unsigned short rxEle;//接收仰角 角度×100 波瓣测试时用,接收据在dbf前先根据此值移相,再波束合成,这样可以画不同向的方向图(即此值为方向图角度横轴,方向图样式由前面dbf字段的beta码和锥削权决定) 角度×100 unsigned short bak37; unsigned short bak38; unsigned int checkSum16; //校验和L 16累加 16累加 unsigned short tail1;//帧结束标志 固定为0x55AA 结束标志 固定为0x55AA unsigned short tail2;//帧结束标志 固定为0xAA55 结束标志 固定为0xAA55 }OWS_SHD_CTRL_CMD;
最新发布
07-27
<think>我们之前已经设计了一个1~6进制的计器,使用JK触发器实现,状态为001110(跳过000和111)。现在用户希望了解如何通过码管显示这个计器的值。码管显示通常需要将计器的二进制输出转换为码管驱动所需的信号。码管有两种常见类型:共阳和共阴。我们通常使用译码器(如74LS47用于共阳码管,74LS48用于共阴码管)将4位BCD码转换为7段码。但注意,我们的计器输出是3位二进制(001~110,别代表1~6),且没有0(000被跳过),也没有7(111也被跳过)。因此,我们需要设计一个将3位二进制转换为7段码的电路,或者使用一个组合逻辑电路来实现。由于我们只需要显示1~6,因此可以直接设计一个真值表,然后用组合逻辑实现。此外,我们也可以使用一个3-8译码器(如74LS138)加上一些门电路来实现,或者使用一个小的ROM,或者直接使用嵌入式编程(如果涉及微控制器)来查表。以下是两种实现方案:方案1:纯硬件设计(使用组合逻辑电路)步骤:1.定义3位二进制(Q2,Q1,Q0)作为输入,输出7段码管的段码(a,b,c,d,e,f,g)。2.列出真值表(1~6):输入(Q2,Q1,Q0)输出(abcdefg)对应数字0010110000101011011012(注意:7段码管有两种连接方式,这里按照常见的标准:a~g别对应7个段,通常为0有效(共阴)或者1有效(共阳)?这里以共阴码管为例,即1表示点亮,0表示熄灭?但74LS48输出为高电平有效,对应共阴码管,但实际电路设计需根据硬件决定)但是,7段码管的标准显示编码如下(共阴码管,低电平点亮则使用高电平编码相,所以通常我们给出的是共阳编码或共阴编码)?为了简单,这里我们假设使用共阴码管,并使用74LS48这样的译码器。但是74LS48是4位BCD输入,而我们的计器输出是3位且非标准的BCD(BCD码是0000-1001对应0-9,而我们的状态001-110代表1-6),因此不能直接使用标准BCD-7段译码器。所以,我们可以自定义一个译码电路。真值表(输入:Q2,Q1,Q0;输出:7段码a,b,c,d,e,f,g):注意:标准7段码排列(从高位到低位:a,b,c,d,e,f,g)或者(g,f,e,d,c,b,a)?通常我们按照a~g的顺序,这里我们定义为:a是最高位,g是最低位。以共阴码管为例,我们给出高电平点亮的编码(即1表示亮,0表示灭):数字abcdefg10011000->0011000?但实际上1的显示是右边两个段(b和c),所以应该是:b=1,c=1,其余为0。因此:a=0,b=1,c=1,d=0,e=0,f=0,g=0->0110000(如果按照a-g的顺序,则从高位到低位:a,b,c,d,e,f,g,则二进制为0110000,即0x30?)但是常见的1显示为“右上方和右下方”,实际上应该是b和c段亮。所以正确的应该是:a=0,b=1,c=1,d=0,e=0,f=0,g=0,所以编码为0110000(注意,这里a是高位,所以8位据的高两位是0,然后依次是b=1,c=1,d=0,e=0,f=0,g=0?不对,应该是7位,顺序是:a,b,c,d,e,f,g->0,1,1,0,0,0,0->二进制0110000,十六进制0x30。但通常我们用8位据,最高位不用,所以可以表示为0x06(如果过来排列?)我们需要查标准7段码编码,常用的编码方式如下(共阴):0:0x3F(00111111)->但注意我们通常用8位,最高位为0,然后a~g对应低7位:a在最低位?不对,更常见的顺序是:dp,g,f,e,d,c,b,a。但这里我们不用dp(小点),所以只考虑7位。为了避免混淆,我们重新定义:将输出定义为7位:gfedcba->这样不常见。更常见的顺序是:abcdefg(a为最高位,g为最低位)或者相?我们采用a为最高位,g为最低位,即7位输出:D6=a,D5=b,D4=c,D3=d,D2=e,D1=f,D0=g。则:数字abcdefg十六进制(6~0位,共7位)0:1111110->0x7E(01111110)但注意,实际共阴码管的0是除了g段(中间横)不亮,但实际上0是6个段全亮,中间横不亮?不对,标准0是a,b,c,d,e,f亮,g不亮。所以:a=1,b=1,c=1,d=1,e=1,f=1,g=0->1111110,按照a(最高位)到g(最低位)排列,二进制1111110->0x7E?但实际上,7段码管的编码有多种,为了避免混乱,我们列出如下(共阴,1亮0灭):0:0x3F->00111111(二进制)的含义:如果按dp,g,f,e,d,c,b,a,则0x3F表示:dp=0,g=0,f=1,e=1,d=1,c=1,b=1,a=1->即a,b,c,d,e,f亮(g和dp不亮)?但为了简化,我们这里不采用8位(带小点),而是7位(不带小点)。我们定义:输出7位:a,b,c,d,e,f,g(顺序从高位到低位a->g)。则:0:abcdefg->1111110->0x7E1:bc->0110000->0x302:abged->1101101->0x6D3:abgcd->1111001->0x794:fbcd->0110011->0x335:afgcd->1011011->0x5B6:afgedc->1011111->0x5F(注意,这里6有两种显示方式,一种是显示6条,一种是显示6条加上a段。我们按照显示全6条,但通常6是除了b段外都亮?这里我们按照常见的:a,f,g,e,d,c亮->但这样写6是a,f,g,e,d,c->那么a=1,f=1,g=1,e=1,d=1,c=1,b=0->1011111(a,b,c,d,e,f,g:a=1,b=0,c=1,d=1,e=1,f=1,g=1->所以二进制1011111,即0x5F)7:abc->1110000->0x708:1111111->0x7F9:1111011->0x7B但是我们的需求是1~6,所以我们只需要16的编码。注意:我们的计器状态001(二进制)对应数字1,010对应2,直到110对应6。真值表(输入Q2,Q1,Q0,输出7段码a~g):状态(Q2Q1Q0)|数字|abcdefg|编码(16进制)001(1)->1->0110000->0x30010(2)->2->1101101->0x6D011(3)->3->1111001->0x79100(4)->4->0110011->0x33101(5)->5->1011011->0x5B110(6)->6->1011111->0x5F注意:这里我们使用的7段码编码方案如上(共阴码管,高电平点亮)。现在,我们需要一个组合逻辑电路,其输入是Q2,Q1,Q0,输出是a,b,c,d,e,f,g。我们可以用卡诺图化简,或者使用PLD,或者用多个逻辑门来实现。由于输出有7个,我们可以别对每个段进行化简。但是7个逻辑表达式,而且输入只有3个(共8种组合),其中000和111是不出现的状态(我们将其作为无关项处理)。例如,对于段a:Q2Q1Q0|a000x(无关项)001001010111100010111101111x(无关项)然后利用卡诺图化简,求出a的表达式。同理求b~g。由于时间关系,我们可以直接使用真值表而不化简,因为只有7个输出,我们可以用8选1据选择器(74LS151)或者用ROM实现,但这样需要7片据选择器。一种方法是使用3-8译码器(74LS138)加上或门(每个输出对应多个最小项)来实现。我们以74LS138为例:74LS138有3个输入端(A,B,C),8个输出端(Y0~Y7),低电平有效。我们将Q0接A,Q1接B,Q2接C(注意:74LS138的输入顺序为A最低位,C最高位,因此输出Y0对应000,Y1对应001,Y2对应010,...,Y7对应111)根据真值表,我们得到:段a:数字1(001->Y1:此时a=0数字2(010)->Y2:a=1->Y2有效时(低电平)对应a=1(即我们想要在Y2时为1,但是74LS138输出为低,所以我们需要取?)由于74LS138输出低电平有效,而我们希望得到的a输出(高电平点亮),所以我们可以将多个输出(为低电平的)进行或运算(相当于与非门,因为输出低电平代表该最小项),然后取?或者直接用与非门合并后再用非门?具体方法:设138的输出为Y0~Y7(低电平有效),则:段a在以下状态下为1:2,3,5,6->即输入为010,011,101,110->对应Y2,Y3,Y5,Y6。由于138在这些状态输出低电平,因此我们用一个4输入与非门(输入接Y2,Y3,Y5,Y6),则输出为:当这四个中有任何一个为低,则与非门输出高。这样,当2,3,5,6任一状态时,与非门输出低,然后再用一个非门(相器)则变为高,就得到1。但注意,其他状态(如1,4)时,段a输出0。在138中,非这些状态时,138对应的输出为高电平,所以4输入与非门的所有输入都是高,则输出低,然后经相器变为高?不对,那样就所有都是高了。所以我们要在138输出为低电平时,该状态被选中,那么对于段a为1的情况,我们只需要把这些对应的输出进行“或”运算(然后输出就是高电平)?但138输出是低电平有效,所以我们可以将138的输出用一个或门(而不是与门)来合并?因为138输出的低电平对应我们想要的状态,而或门在输入有低时输出低,与门在输入有低时输出低?都不行。一种方法:将138的输出作为低电平有效信号,然后我们要求某个段为1时,实际上就是138的某些输出为低电平。因此,我们可以这样设计:对于每个段,我们将该段为1的所有状态对应的138输出连接到一个与门(实际是用与非门)?比如段a,在状态2,3,5,6时为1,我们要求当这些状态出现时,段a=1。所以我们可以用一个4输入或门(注意138输出是低电平),那么:当状态2出现(Y2=0),则或门的输入有一个低电平,输出为低?但是我们需要高电平点亮。所以我们将138的输出取(用与非门代替或门)?不对,其实应该:段a=Y2'ORY3'ORY5'ORY6'(因为138输出低电平表示被选中,所以Y2=0时,我们需要一个高电平输出,那么我们用非门将Y2变成高,然后多个高输入或门得到高)所以:用一个4输入或门,输入端接Y2,Y3,Y5,Y6(此时Y2=0表示状态2,但是我们希望输出高电平),所以我们先对Y2,Y3,Y5,Y6各接一个非门(得到高电平),再送入或门?这样资源浪费。更简单:使用或非门?不用。我们可以利用德·摩根定律:将多个低电平信号合并成一个高电平信号,用与非门。段a=(Y2*Y3*Y5*Y6)'(因为138输出低,所以四个都为低时,与非门输出高,否则输出低)但是,我们要求只要有一个状态出现(任何一个为低),段a就输出高。所以应该是:段a=(Y2Y3Y5Y6)'(也就是与非门,输入Y2,Y3,Y5,Y6,输出为高电平的条件是:这些输入中至少有一个为低(即状态出现))->这样满足要求,因为当状态2(Y2=0)时,与非门输入中有0,则输出1。因此,对于段a,我们用一个4输入与非门,输入接Y2,Y3,Y5,Y6,输出就是段a。但是,注意138输出是低电平有效,所以在状态2时,Y2=0,其他输出为高(138每次只有一个输出为低),所以与非门的输出=(0,1,1,1)的非->输出高,段a亮。在状态1(Y1=0)时,段a=0:因为我们没有接Y1到与非门,所以与非门的输入全为高(因为我们只接了Y2,Y3,Y5,Y6,此时Y2=1,Y3=1,Y5=1,Y6=1,所以与非门输出0),从而段a不亮。符合要求。但是注意无关项(000和111):138的Y0和Y7在正常计中不会出现(计器状态不会出现000和111),所以无论我们怎么处理都行,这里我们未连接它们,所以无关。同理,我们可以得到其他段:段b:为1的状态:1,2,3,4->001,010,011,100->Y1,Y2,Y3,Y4所以用一个4输入与非门,输入Y1,Y2,Y3,Y4段c:为1的状态:1,3,4,5,6->001,011,100,101,110->Y1,Y3,Y4,Y5,Y65输入与非门段d:为1的状态:2,3,5->010,011,101->Y2,Y3,Y53输入与非门段e:为1的状态:2,6->010,110->Y2,Y62输入与非门段f:为1的状态:4,5,6->100,101,110->Y4,Y5,Y63输入与非门段g:为1的状态:0?我们没有0,但是注意:2,3,4,5,6->除了1(001)以外都亮?不对,看我们的6段码表:1:0,2:1,3:1,4:1,5:1,6:1->实际上除1不亮外,其他都亮?在真值表中,1(001)时g=0,2~6时g=1。所以:为1的状态:2,3,4,5,6->Y2,Y3,Y4,Y5,Y6用5输入与非门这样,我们用一个3-8译码器74LS138(产生Y0~Y7)和7个与非门(多输入)就可以完成7段码的转换。但是注意:74LS138输出的低电平,我们通过与非门后变成了高电平(当至少有一个输入为低时,与非门输出高)。其他时间输出为低。这与我们想要的段码高电平点亮一致。方案2:使用微控制器(如51单片机)实现如果使用嵌入式编程,我们可以将计器的输出(Q2,Q1,Q0)连接到单片机的三个IO口,然后单片机通过查表方式得到7段码,再通过IO口驱动码管(或通过锁存器/译码器等)。我们使用定时器或外部中断来检测计器输出的变化,然后读取输入,查表得到对应的7段码,输出到码管上。步骤:1.连接计器输出(Q2,Q1,Q0)到单片机的P0.0,P0.1,P0.2。2.单片机连接一个7段码管(共阴),通过一个端口(如P1)输出7段码(a~g,接8位端口的高7位或低7位)。3.程序:while(1){//读取输入input=P0&0x07;//取低3位if(input==0)input=1;//如果读到000(无效状态),我们强制显示1?或者跳过?根据计器设计,它应该不会出现000,但为保险可以处理//因为我们的计器状态001~110别对应1~6,而000和111是无效状态,我们可以忽略或强制显示0?//这里,如果出现000,我们显示0?或者根据我们的计器自启动,它会自动跳转到001,所以实际不会出现000。所以直接查表://定义7段码表(共阴码管,顺序为a~g,高位a,低位g?或者根据实际电路连接)//这里我们假设输出端口为8位:低7位对应g~a(即最低位是a?)?或者高7位?取决于硬件连接。这里假设我们用P1.0接a,P1.1接b,...,P1.6接g,P1.7不用。//我们定义7段码组://索引0对应0,但是我们不需要0,所以从1开始,定义6:unsignedcharcode_table[]={0x30,//0x30:1->0011000,但这里0x30=00110000(8位),我们只取低7位?或者重新定义//根据我们上面定义的编码(7位,高位a,低位g),用16进制表示:1:0x30,2:0x6D,3:0x79,4:0x33,5:0x5B,6:0x5F};//但是注意,我们的输入(3位)取值:001->1(索引0),010->2(索引1)...110->6(索引5)//所以:输入3位,减去1:index=input-1//而input的值:001=1,010=2,011=3,100=4,101=5,110=6//所以index=input-1,范围0~5。//但注意:如果input为0或7,怎么办?我们可以设默认显示0或者不显示。unsignedcharseg;if(input>=1&&input<=6){seg=code_table[input-1];//1对应0x30,即组第一个}else{//显示0(0的编码:0x3F?)或者显示错误seg=0x00;//或者0x7E(0的编码)}//将seg输出到P1口,注意:我们假设a在P1.0,那么编码的a(最高位)应该放在P1.0吗?//实际上,我们的段码定义是a(D6)到g(D0)吗?这里我们将编码放到端口://我们的7段码定义:D6=a,D5=b,D4=c,D3=d,D2=e,D1=f,D0=g->8位的话,我们可以将seg左移1位(因为最高位可能不用)?或者重新调整。//因为我们用P1.0~P1.6别接a~g(a在P1.0,g在P1.6?)或者相?如果是这样连接,那么我们就需要将编码按照位重新映射。//假设硬件连接:P1.0=a,P1.1=b,P1.2=c,P1.3=d,P1.4=e,P1.5=f,P1.6=g//那么编码的a在最高位(D6),而我们要放在P1.0(最低位)。所以我们需要把编码的位重新排列:即把编码中的a放到P1.0,b放到P1.1,...,g放到P1.6。//方法:将seg(7位)按位倒序?不对。比如我们的编码0x30(用于1):0x30=00110000(二进制,高8位),我们只取7位:0011000->a=0,b=1,c=1,d=0,e=0,f=0,g=0->放到P1口:P1.0=a=0,P1.1=b=1,P1.2=c=1,P1.3=d=0,P1.4=e=0,P1.5=f=0,P1.6=g=0//所以:我们需要将7位编码seg从高位到低位别对应P1.0~P1.6?或者直接输出到P1口的低7位?但P1口有8位,我们忽略最高位。//重新定义:编码seg的位顺序:bit0=g,bit1=f,bit2=e,bit3=d,bit4=c,bit5=b,bit6=a(这样,我们的seg编码的bit6对应a,我们希望a输出到P1.0?不匹配)//一种方法:改变编码表,按照实际硬件端口顺序定义。这样更容易。//定义新的编码表:每个编码按位对应端口P1.0~P1.6(其中P1.0为最低位,P1.6为最高位)?或者我们定义端口的顺序://假设我们这样连接:P1.0:a,P1.1:b,P1.2:c,P1.3:d,P1.4:e,P1.5:f,P1.6:g//那么对于数字1,我们想要:b=1,c=1->即P1.1=1,P1.2=1,其他为0。所以编码:0b0110000(从高位到低位P1.6~P1.0:0,0,0,0,1,1,0)?不对,P1.6是g,P1.5是f,P1.4是e,P1.3是d,P1.2是c,P1.1是b,P1.0是a。那么1的显示:b和c亮,所以://g=0,f=0,e=0,d=0,c=1,b=1,a=0->用8位表示:0b0000110->0x06(在P1口:00000110?因为低8位:P1.7(不用)为0,P1.6:0,P1.5:0,P1.4:0,P1.3:0,P1.2:1(c),P1.1:1(b),P1.0:0(a))->0x06//所以我们重新定义7段码表(共阴)://注意:这里按端口顺序:P1.0=a,P1.1=b,P1.2=c,P1.3=d,P1.4=e,P1.5=f,P1.6=g,P1.7未用,0。//数字1:b和c亮->输出:a=0,b=1,c=1,d=0,e=0,f=0,g=0->整个字节(从高到低):g,f,e,d,c,b,a->0,0,0,0,1,1,0->二进制00000110(高7位为0000011,但注意P1口是8位)->0x06//数字2:a,b,g,e,d亮->a=1,b=1,g=1,e=1,d=1->001011101(最高位开始:g,f,e,d,c,b,a:g=1,f=0,e=1,d=1,c=0,b=1,a=1)->二进制1011101,8位:01011101?不对,重新排列:整个P1口(8位):g(位7)不用?实际上P1口我们只用位0~6(7位),位7不用。所以我们用位0~6表示a~g(位0:a,位1:b,...,位6:g)。//数字2:a=1,b=1,g=1,e=1,d=1->所以位0:a=1,位1:b=1,位2:c=0,位3:d=1,位4:e=1,位5:f=0,位6:g=1->写成二进制(从高到低:位6到位0):1011101->0x5D?//但这样计算麻烦,我们可以用一种方式:直接赋值。//重新定义编码表(用于直接输出到P1的低7位)://位顺序:P1.0=a,P1.1=b,P1.2=c,P1.3=d,P1.4=e,P1.5=f,P1.6=gunsignedcharcode_table[]={0x06,//1:b,c亮(00000110:即bit1,bit2=1->0x060x5B,//2:a,b,g,e,d亮:a(bit0)=1,b(bit1)=1,g(bit6)=1,e(bit4)=1,d(bit3)=1->二进制:位6~0:1011011->即1011011->0x5B0x4F,//3:a,b,g,c,d亮:a(bit0)=1,b(bit1)=1,g(bit6)=1,c(bit2)=1,d(bit3)=1->位6~0:1001111->1001111->0x4F?不对,重新:位6=g=1,位5=f=0,位4=e=0,位3=d=1,位2=c=1,位1=b=1,位0=a=1->1001111?0x4F是01001111(8位)->不符合。};//这个重新定义容易出错,我们采用原始方法:每个位对应。//定义:数字1:输出0x06(二进制00000110),即://P1.0=0,P1.1=1,P1.2=1,P1.3=0,P1.4=0,P1.5=0,P1.6=0->但是这样连接:a接P1.0=0(不亮),b接P1.1=1(亮),c接P1.2=1(亮),d=0,e=0,f=0,g=0->这样显示1正确。//数字2:要显示:a=1,b=1,c=0,d=1,e=1,f=0,g=1->//所以:P1.0=1(a),P1.1=1(b),P1.2=0(c),P1.3=1(d),P1.4=1(e),P1.5=0(f),P1.6=1(g)->整个字节:P1.7(未用)=0,其他:0b10111011(从高到低:位7=P1.7=0,位6=P1.6=1,位5=P1.5=0,位4=P1.4=1,位3=P1.3=1,位2=P1.2=0,位1=P1.1=1,位0=P1.0=1->二进制:010111011->0x5B//所以定义:unsignedcharcode_table[6]={//1:0x06,//二进制00000110//2:0x5B,//二进制01011011//3:0x4F,//?按照上面的方法:数字3:a,b,c,d,g亮->a=1,b=1,c=1,d=1,e=0,f=0,g=1->//P1.0=1,P1.1=1,P1.2=1,P1.3=1,P1.4=0,P1.5=0,P1.6=1->8位:0b01001111->0x4F//4:0x66,//?数字4:b,c,f,g亮->b=1,c=1,f=1,g=1->a=0,d=0,e=0->//P1.0=0,P1.1=1,P1.2=1,P1.3=0,P1.4=0,P1.5=1,P1.6=1->0b01100110->0x66//5:0x6D,//?数字5:a,f,g,c,d亮->a=1,f=1,g=1,c=1,d=1->b=0,e=0->//P1.0=1,P1.1=0,P1.2=1,P1.3=1,P1.4=0,P1.5=1,P1.6=1->0b01101101->0x6D?但是8位,写成01101101=0x6D//6:0x7D,//数字6:a,c,d,e,f,g亮->a=1,c=1,d=1,e=1,f=1,g=1(b=0)->//P1.0=1,P1.1=0,P1.2=1,P1.3=1,P1.4=1,P1.5=1,P1.6=1->0b01111101=0x7D};//然后输出:P1=code_table[input-1];}但是注意:这依赖于硬件连接。由于硬件连接不同,编码表需要根据实际调整。结论:1.纯硬件方法:使用3-8译码器74LS138加上与非门实现7段码译码。2.嵌入式方法:使用单片机读取计器的输出,查表得到7段码,并输出到码管。具体选择取决于应用场景和复杂度。</think> 我将为您详细解析如何使用码管显示1~6进制计器的值,包括硬件电路设计和嵌入式编程两种实现方案。设计基于前文所述的JK触发器计器(状态序列:001→010→011100101110)[^1]。 ### 一、硬件电路设计方案 #### 1. 整体架构 ```mermaid graph LR A[JK触发器计器] --> B[3-8译码器] B --> C[段码生成逻辑] C --> D[7段码管] ``` - **计器**:输出3位二进制信号(Q₂Q₁Q₀) - **译码器**:74LS138(将3位输入转换为8个低有效输出) - **段码逻辑**:与非门网络生成7段码 - **码管**:共阴型(型号如LS05-SFH) #### 2. 真值表与7段编码 输入为计器状态(Q₂Q₁Q₀),输出为7段码(a~g): | 状态 | 数字 | $a$ | $b$ | $c$ | $d$ | $e$ | $f$ | $g$ | 十六进制 | |------|------|-----|-----|-----|-----|-----|-----|-----|----------| | 001 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0x30 | | 010 | 2 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0x6D | | 011 | 3 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0x79 | | 100 | 4 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0x33 | | 101 | 5 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0x5B | | 110 | 6 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0x5F | > 编码规则:1表示亮,0表示灭(共阴码管标准)[^1] #### 3. 74LS138译码器接口设计 令译码器输入: - $A = Q_0$(LSB) - $B = Q_1$ - $C = Q_2$(MSB) 输出与段码关系: | 段 | 为1的状态 | 对应 $Y_i$ | 逻辑表达式 | |----|------------|-------------|------------------| | $a$ | 2,3,5,6 | $Y_2,Y_3,Y_5,Y_6$ | $a = \overline{Y_2 Y_3 Y_5 Y_6}$ | | $b$ | 1,2,3,4 | $Y_1,Y_2,Y_3,Y_4$ | $b = \overline{Y_1 Y_2 Y_3 Y_4}$ | | $c$ | 1,3,4,5,6 | $Y_1,Y_3,Y_4,Y_5,Y_6$ | $c = \overline{Y_1 Y_3 Y_4 Y_5 Y_6}$ | | $d$ | 2,3,5 | $Y_2,Y_3,Y_5$ | $d = \overline{Y_2 Y_3 Y_5}$ | | $e$ | 2,6 | $Y_2,Y_6$ | $e = \overline{Y_2 Y_6}$ | | $f$ | 4,5,6 | $Y_4,Y_5,Y_6$ | $f = \overline{Y_4 Y_5 Y_6}$ | | $g$ | 2,3,4,5,6 | $Y_2,Y_3,Y_4,Y_5,Y_6$ | $g = \overline{Y_2 Y_3 Y_4 Y_5 Y_6}$ | > 注:$\overline{Y_i Y_j}$ 表示多输入与非门 #### 4. 电路连接示例 ```plaintext ┌─────────────┐ Q0 ─────┤A Y0 ├─┐ Q1 ─────┤B Y1 ├─┤──┐ b逻辑输入 Q2 ─────┤C Y2 ├─┤──┴─ a逻辑输入 │ 74LS138 Y3 ├─┤──┬─ │ Y4 ├─┤──┘ | │ Y5 ├─┤────┘ │ Y6 ├─┤ │ Y7 ├─┘ (悬空) └─────────────┘ 段码生成: a = NAND(Y2,Y3,Y5,Y6) b = NAND(Y1,Y2,Y3,Y4) ... g = NAND(Y2,Y3,Y4,Y5,Y6) 码管连接: a~g ──[电阻]──> 码管对应引脚 COM ──────────> GND (共阴极) ``` ### 二、嵌入式编程方案(基于51单片机) #### 1. 硬件连接 -器输出:$Q_0 \rightarrow P1.0$, $Q_1 \rightarrow P1.1$, $Q_2 \rightarrow P1.2$ - 码管接口:$P2.0 \rightarrow a, \dots, P2.6 \rightarrow g$ #### 2. 参考代码 ```c #include <reg51.h> // 7段码表 (顺序: a,b,c,d,e,f,g) unsigned char seg_code[6] = { 0x30, // 1: 0011000 -> 0x30 0x6D, // 2: 1101101 -> 0x6D 0x79, // 3: 1111001 -> 0x79 0x33, // 4: 0110011 -> 0x33 0x5B, // 5: 1011011 -> 0x5B 0x5F // 6: 1011111 -> 0x5F }; void main() { while(1) { unsigned char input = P1 & 0x07; // 读取P1低3位 // 状态转换(跳过无效状态) if(input >= 1 && input <= 6) { P2 = seg_code[input - 1]; // 输出7段码 } else { // 处理异常状态 P2 = 0x00; // 关闭显示 // P2 = 0x7F; // 或显示全亮 } } } ``` #### 3. 关键优化技巧 1. **消隐处理**:当检测到无效状态(000或111)时关闭显示 2. **动态扫描**:若需多位码管,增加扫描驱动电路 3. **延时控制**:计速度超过25Hz时需加视觉暂留延时 ```c void delay_ms(unsigned int t) { unsigned i,j; for(i=0; i<t; i++) for(j=0; j<120; j++); } ``` ### 三、方案对比 | 特性 | 硬件方案 | 嵌入式方案 | |--------------|------------------------------|--------------------------| | 响应速度 | 亚微秒级 | 微秒级(受MCU主频限制) | | 功耗 | 15~30mW | 50~100mW | | 扩展性 | 需修改电路 | 软件可重构 | | 开发成本 | 低($<$5美元) | 中($>$8美元) | | 适用场景 | 纯数字系统 | 带控制功能的智能设备 | | 抗干扰能力 | 强 | 中(需加滤波电路) | > 注:码管需串联限流电阻(220Ω~1kΩ),防止过流烧毁[^1] --- 相关问题 1. 如何在Proteus中仿真该计器与码管显示电路? 2. 共阴和共阳码管的驱动电路有何差异? 3. 如何设计计器与码管间的缓冲接口电路? 4. 嵌入式方案中如何实现计器的软件去抖动? [^1]: 码管驱动需考虑限流保护与信号完整性 [^2]: 74LS138译码器输出低有效特性简化了与非门设计 [^3]: 微控制器实现时需注意端口驱动能力匹配
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值