甲机采用DAC,进行模拟量输出,乙机采用ADC进行模拟量采集,并采用1602或数码液晶进行模拟量电压的显示,利用proteus及keil
已阅
不知道你这个问题是否已经解决, 如果还没有解决的话:因为该问题需要同时使用Keil和Proteus两个工具,因此需要分别对两个工具进行操作。
一、Keil部分:
1.打开Keil软件,新建一个C51工程;
2.在C51工程中编写代码,代码中需要包含三个部分:
(1)ADC0809读取模拟电压值的部分。需要定义ADC的各个引脚,并且写好时序等细节操作。
(2)1602液晶屏或数码液晶屏的控制。需要定义液晶屏的各个引脚,包括控制引脚和数据引脚,以及对应的控制和显示函数。
(3)对读取的模拟电压值进行处理和显示。处理好模拟电压值,并调用液晶屏的显示函数输出数据。
3.编写完成代码后,进行编译,生成.hex文件。
二、Proteus部分:
1.打开Proteus软件,新建一个实验。
2.在实验中调入模拟电压源,模拟模拟电压。
3.调入单片机模块,导入编译生成的.hex文件。
4.调入液晶屏模块或数码液晶屏模块。
5.连接各个模块的引脚,包括单片机引脚,液晶屏引脚和ADC引脚等。
6.进行仿真,验证程序是否正确。
需要注意的几点问题:
1.在编写代码时要确保各个引脚的定义和使用是否正确,最好参照资料中的引脚定义和时序操作。
2.在连接各个模块的引脚时,要确保每个引脚是否连接正确,否则可能导致程序无法正常运行。
3.在调试时,可以通过Proteus的仿真功能,观察单片机读取到的模拟电压以及对应的显示结果,以此来定位问题。
以下是代码示例(仅供参考):
#include<reg52.h>
#include<intrins.h>
sbit RS = P2^0; //RS引脚定义
sbit RW = P2^1; //RW引脚定义
sbit E = P2^2; //E引脚定义
sbit OE = P1^0; //OE引脚定义
sbit EOC = P1^1; //EOC引脚定义
sbit ST = P1^2; //ST引脚定义
sbit CLK = P1^3; //CLK引脚定义
uchar LEDData[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管编码
uchar adcValue; //定义ADC读取的模拟电压值
void delayms(uint n); //毫秒延时函数
void initLcd(); //LCD初始化函数
void writeCommand(uchar com); //写入指令函数
void writeData(uchar dat); //写入数据函数
void Display(uchar dat); //数码管显示函数
void adcRead(); //ADC读取模拟电压值函数
void main()
{
initLcd(); //LCD初始化
while(1)
{
adcRead(); //读取模拟电压值
Display(adcValue); //LED显示
}
}
void adcRead() //ADC读取模拟电压值函数
{
OE = 0; //开始转换
ST = 1;
ST = 0;
_nop_();
_nop_();
_nop_();
while(!EOC); //等待转换完成
CLK = 1;
CLK = 0;
adcValue = P3; //读取转换结果
OE = 1; //结束转换
}
void Display(uchar dat) //数码管显示函数
{
uchar ge,shi,bai;
ge = dat % 10; //个位
shi = dat / 10 % 10; //十位
bai = dat / 100; //百位
writeCommand(0x8f); //设置数据写入位置
writeData(LEDData[ge]); //写入个位数据
writeData(LEDData[shi]); //写入十位数据
writeData(LEDData[bai]); //写入百位数据
}
void delayms(uint n) //毫秒延时函数
{
uchar i;
while(n--)
{
for(i = 0; i < 120; i++);
}
}
void initLcd() //LCD初始化函数
{
writeCommand(0x38); //初始化指令
writeCommand(0x0c);
writeCommand(0x06);
writeCommand(0x01);
delayms(2);
}
void writeCommand(uchar com) //写入指令函数
{
RS = 0;
RW = 0;
E = 1;
P0 = com;
_nop_();
_nop_();
E = 0;
}
void writeData(uchar dat) //写入数据函数
{
RS = 1;
RW = 0;
E = 1;
P0 = dat;
_nop_();
_nop_();
E = 0;
}