帮我写一个C51的程序,利用A/D,实现lcd屏四位数字的调控
时间: 2024-03-06 19:51:48 浏览: 20
好的,这是一个比较基础的C51程序,主要功能是利用ADC测量模拟量,并通过LCD显示数字。以下是程序代码:
```c
#include <reg51.h>
// 定义LCD的相关引脚
sbit RS = P2^6;
sbit EN = P2^5;
sbit D4 = P0^4;
sbit D5 = P0^5;
sbit D6 = P0^6;
sbit D7 = P0^7;
// 定义ADC相关引脚
sbit ADC_CS = P3^5;
sbit ADC_CLK = P3^6;
sbit ADC_DIN = P3^4;
sbit ADC_DOUT = P3^7;
unsigned char ADC_Result; // 存储ADC转换结果的变量
// 延时函数
void Delay(unsigned int n)
{
unsigned int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < 125; j++);
}
// LCD写命令
void LcdWriteCmd(unsigned char cmd)
{
RS = 0;
P0 = cmd;
EN = 1;
Delay(1);
EN = 0;
}
// LCD写数据
void LcdWriteData(unsigned char dat)
{
RS = 1;
P0 = dat;
EN = 1;
Delay(1);
EN = 0;
}
// LCD初始化
void LcdInit()
{
LcdWriteCmd(0x02); // 回到起始位置
LcdWriteCmd(0x0c); // 将光标设为不可见,不闪烁
LcdWriteCmd(0x06); // 设定光标移动的方向和位移
LcdWriteCmd(0x01); // 清屏
}
// LCD显示数字
void LcdDisplay(unsigned char num)
{
unsigned char i, j, k, l;
i = num / 1000;
j = num % 1000 / 100;
k = num % 100 / 10;
l = num % 10;
LcdWriteCmd(0x80); // 设置光标位置为第1个字符
LcdWriteData(i + 0x30); // 显示千位数字
LcdWriteData(j + 0x30); // 显示百位数字
LcdWriteData(k + 0x30); // 显示十位数字
LcdWriteData(l + 0x30); // 显示个位数字
}
// ADC转换函数
unsigned char ADC_Convert()
{
unsigned char i, dat;
ADC_CS = 0;
ADC_CLK = 0;
ADC_DIN = 1;
Delay(1);
ADC_CLK = 1;
Delay(1);
ADC_CLK = 0;
ADC_DIN = 0;
Delay(1);
ADC_CLK = 1;
Delay(1);
ADC_CLK = 0;
ADC_DIN = 1;
Delay(1);
ADC_CLK = 1;
Delay(1);
ADC_CLK = 0;
for (i = 0; i < 8; i++)
{
ADC_CLK = 1;
Delay(1);
dat <<= 1;
if (ADC_DOUT)
dat++;
ADC_CLK = 0;
Delay(1);
}
ADC_CS = 1;
return dat;
}
// 主函数
void main()
{
LcdInit(); // 初始化LCD
while (1)
{
ADC_Result = ADC_Convert(); // 进行ADC转换
LcdDisplay(ADC_Result); // 显示数字到LCD屏幕
Delay(500); // 延时一段时间
}
}
```
这个程序中,我们使用了P0口作为LCD的数据口,P2.6和P2.5作为LCD的控制引脚,P3.4、P3.5、P3.6和P3.7作为ADC的控制引脚。程序中的ADC_Convert()函数实现了一次ADC转换,将转换结果存储在ADC_Result变量中,并通过LcdDisplay()函数将数字显示在LCD屏幕上。程序中的Delay()函数提供了一段延时,以控制数字的刷新速度。