在上述键盘设定的情况下,输入四个数字并循环显示。
例如:以输入2761为例,数码管显示:2761-276.1-27.61-2.761-7612-761.2-76.123-7.612-7127-612.7-61.27-6.127-1276-127.6-12.76-1.276-2761-...。
不知道你这个问题是否已经解决, 如果还没有解决的话:
步骤:
(1)、作出电路图,将V2信号源的 AC 设置为1
(2)、在Analysis type中选择AC Sweep/Noise,在Options中选中General Settings。AC Sweep的分析频率从0.01H
z到1
GHz,采用十倍频,每十倍频采样点数为50
。运行仿真。
(3)、在Probe窗口中,键入幅频响应表达式:DB(V(out)/V(in)),显示出电压增益的幅频特性曲线。启动标尺,测量并列出中频电压增益(分贝)=( 45.448
)。下限截止频率fL和上限截止频率fH大约是:fL=( 4.3368HZ
),fH=( 8.9149HZ
)。(上限截止频率fH和下限截止频率的分贝数要比中频电压增益(分贝)少3分贝)
(4)be窗口中,键入相频响应表达式:P(V(out)/V(in)
),显示出电压增益的相频特性曲线。启动标尺,测量并列出中频区相位差大约为( 89.2
)。
(5)、在Probe窗口中,显示出输入电阻的特性曲线。输入电阻表达式:V(in)/I(c2)
。启动标尺,测量并列出中频区输入电阻大约为(899.767
)。
在Probe窗口中,显示出输入电阻的特性曲线。方法如下:
①将电路输入端短路。即将电源V1去掉,用 wire 代替。
②负载电阻R4去掉,在输出端加入信号源Vt(将信号源 AC设置为1 )。
③进行交流扫描分析,键入表达式:
启动标尺,测量并列出中频区的输出电阻数值大约为( 1.7492K
)。
这道题目需要先让用户输入一个四位数字,然后循环显示这个数字和它的不同组合。具体实现方法如下:
首先,我们需要定义一个变量来表示用户输入的四位数字。这个变量可以是一个四位数的整数或者一个字符串。
接下来,我们可以使用一个循环来依次显示这个数字和它的不同组合。在每次循环中,我们可以使用数学公式来计算当前需要显示的数字,然后将其显示在数码管上。
在计算当前需要显示的数字时,我们可以将输入的四位数字拆分成单独的数字,并将它们分别赋值给不同的变量。然后,我们可以使用四个循环来依次计算这个数字的各个组合。具体来说,我们可以设计一个双重循环,在外层循环中计算数字的小数点位置,在内层循环中计算数字的值。
在每次循环中,我们需要根据当前计算的值来更新数码管上的显示。我们可以使用一个位移运算来将数字的二进制代码发送到数码管的段选和位选引脚上。为了避免闪烁,我们可以使用循环来控制数码管的刷新速度。
下面是部分代码示例:
#include <STC15F2K60S2.H>
u16 num = 0; // 存储用户输入的数字
u8 digits[4] = {0}; // 将数字拆分成单独的数字
u8 point_pos = 0; // 小数点位置
u8 segs[4] = {0}; // 数码管段选值
u8 coms[4] = {0}; // 数码管位选值
/* 将数字拆分成单独的数字 */
void split_digits(u16 num, u8 *digits) {
digits[0] = num % 10;
digits[1] = (num / 10) % 10;
digits[2] = (num / 100) % 10;
digits[3] = (num / 1000) % 10;
}
/* 计算当前需要显示的数字 */
u16 calc_number(u8 pos, u8 *digits) {
u16 num = 0;
for (u8 i = 0; i < 4; i++) {
if (i == pos) {
num += 1;
} else {
num = num * 10 + digits[i];
}
}
return num;
}
/* 将数字的二进制代码发送到数码管上 */
void display_number(u8 *segs, u8 *coms) {
for (u8 i = 0; i < 4; i++) {
P0 = ~(segs[i]);
choose(7);
P0 = coms[i];
choose(6);
delay(2); // 控制刷新速度
}
}
/* 主程序 */
void main() {
/* 初始化数码管和按键 */
init();
/* 让用户输入一个四位数字 */
while (num < 1000 || num > 9999) {
num = get_number();
}
/* 将数字拆分成单独的数字 */
split_digits(num, digits);
/* 计算并显示数字的各个组合 */
for (u8 i = 0; i < 4; i++) {
for (u8 j = 0; j < 10; j++) {
u16 num = calc_number(i, digits) * 10 + j;
split_digits(num, digits);
if (i == 0) {
point_pos = 0;
} else if (i == 1) {
point_pos = 1;
} else if (i == 2) {
point_pos = 2;
} else {
point_pos = 3;
}
/* 计算数码管的段选和位选值 */
calc_segs_coms(digits, point_pos, segs, coms);
/* 显示数字 */
display_number(segs, coms);
/* 等待一段时间 */
delay(100);
}
}
/* 循环显示数字 */
while (1) {
for (u8 i = 0; i < 4; i++) {
/* 计算当前需要显示的数字 */
u16 num = calc_number(i, digits);
split_digits(num, digits);
if (i == 0) {
point_pos = 0;
} else if (i == 1) {
point_pos = 1;
} else if (i == 2) {
point_pos = 2;
} else {
point_pos = 3;
}
/* 计算数码管的段选和位选值 */
calc_segs_coms(digits, point_pos, segs, coms);
/* 显示数字 */
display_number(segs, coms);
/* 等待一段时间 */
delay(100);
}
}
}