分别用汇编语言和C51 语言编程实现如下功能:用一片ADC0808完成8路模拟量巡回检测,通过8个按键选择对应的通道,在4位共阳的八段数码管上显示通道编号和相应的模数转换值。运行结果要求:没有按键按下时,LED 不显示,当有按键按下后第一位显示其通道编号 1~8,后三位显示该通道模数转换值 0~255,调节滑动变阻器,转换值实时变化。有其它按键按下后显示内容即改为对应通过的通道编号和模数转换值。
时间: 2024-03-26 13:35:29 浏览: 87
好的,我可以为您提供一些基本思路和建议。
对于这个问题,我们需要完成以下几个步骤:
1. 初始化ADC0808芯片和8个按键,设置4位共阳的八段数码管的控制引脚。
2. 定义一个数组来存储8个通道的模数转换值。
3. 循环扫描8个按键,检测按键是否按下,如果按下则选择对应通道进行模数转换,将转换结果存储到数组中。
4. 根据当前按下的按键,将对应的通道编号和模数转换值显示到4位共阳的八段数码管上。
5. 持续循环检测,直到有新的按键按下。
在C51语言中,我们可以使用Keil C编译器来编写程序,并使用C语言标准库函数来控制芯片的输入输出端口。在汇编语言中,我们可以使用汇编指令来控制芯片的输入输出端口,以及处理模数转换结果等操作。
下面是C语言的示例代码:
```c
#include <reg52.h> // 51单片机头文件
#include <intrins.h> // 延时函数头文件
#define uchar unsigned char
#define uint unsigned int
sbit LED = P1^0; // LED指示灯
sbit KEY1 = P2^0; // 按键1
sbit KEY2 = P2^1; // 按键2
sbit KEY3 = P2^2; // 按键3
sbit KEY4 = P2^3; // 按键4
sbit D0 = P3^0; // 数码管第一位
sbit D1 = P3^1; // 数码管第二位
sbit D2 = P3^2; // 数码管第三位
sbit D3 = P3^3; // 数码管第四位
sbit CS = P3^4; // ADC0808片选
sbit CLK = P3^5; // ADC0808时钟
sbit DIO = P3^6; // ADC0808数据
uchar code table[] = { // 数码管显示表
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
uint AD_Value[8]; // 存储8个通道的模数转换值
void Delay() // 延时函数
{
uint i, j;
for (i = 0; i < 100; i++)
for (j = 0; j < 1000; j++);
}
void WriteByte(uchar dat) // 向ADC0808写入数据
{
uchar i;
for (i = 0; i < 8; i++) {
CLK = 0;
if (dat & 0x80)
DIO = 1;
else
DIO = 0;
dat <<= 1;
CLK = 1;
}
}
uchar ReadByte() // 从ADC0808读取数据
{
uchar i, dat = 0;
for (i = 0; i < 8; i++) {
CLK = 0;
dat <<= 1;
if (DIO)
dat |= 0x01;
CLK = 1;
}
return dat;
}
void ReadADC(uchar ch) // 读取ADC0808通道数据
{
uchar dat;
CS = 0;
WriteByte(ch | 0x80);
Delay();
dat = ReadByte();
CS = 1;
AD_Value[ch] = dat;
}
void Display(uchar ch, uchar dat) // 在数码管上显示数据
{
D0 = 1;
D1 = 1;
D2 = 1;
D3 = 1;
P0 = table[ch];
P0 &= 0xf0;
P0 |= (dat & 0x0f);
Delay();
}
void main()
{
uchar ch = 0;
uchar key, i;
while (1) {
key = 0;
if (!KEY1) {
ch = 0;
key = 1;
}
if (!KEY2) {
ch = 1;
key = 1;
}
if (!KEY3) {
ch = 2;
key = 1;
}
if (!KEY4) {
ch = 3;
key = 1;
}
if (key) {
Display(ch, ch + 1);
ReadADC(ch);
for (i = 0; i < 3; i++)
Display(i + 1, AD_Value[ch] >> (i * 8));
}
else {
D0 = 0;
D1 = 0;
D2 = 0;
D3 = 0;
}
}
}
```
在上面的示例代码中,我们使用了ADC0808芯片来完成8路模拟量巡回检测,通过8个按键选择对应的通道,在4位共阳的八段数码管上显示通道编号和相应的模数转换值。在程序运行过程中,如果有按键按下,则会选择对应通道进行模数转换,并将转换结果存储到数组中,并将通道编号和模数转换值显示到4位共阳的八段数码管上。如果没有按键按下,则LED不显示。
阅读全文