标题: C51单片机的AD PCF5819采集程序 带Proteus仿真和代码 [打印本页]
作者: qw2597758qw 时间: 2023-4-27 09:02
标题: C51单片机的AD PCF5819采集程序 带Proteus仿真和代码
分享一下做基于C51的AD数据采集用的PCF5819 有实验文档 还有仿真以及代码
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
将AD转换后,转成电压量(保留2位小数),显示于数码管,并发送到PC机的串口调试助手上。
二、 仪器用具及材料
Keil、Proteus 8 Professional、串口助手、串口模拟器。
三、 实验内容及原理
1. 电路分析
本次使用的数码元器件有八位共阳数码管,串口,PCF8591以及单片机STC15W4K32S4。
(具体电路图见附件一)
2. 软件编程
(1) 数码管
因为实验涉及小数所以本次显示数码的码字有两种,一种是不带小数点的,一种是带小数点的。不带小数点的 “code unsigned char segcode[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};”
带小数点的“ code unsigned char segcode1[] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7F};”
数码管还涉及到三位数字的显示,虽然是一个整数和两个小数,但本质上可以用一个函数先将这个数直接变成三位数,然后将第一位的数字加上“.”显示的效果就是保留两位小数的数字。具体如下
int fenli(float e) //分离函数 将AD转换以后的小数变成三位整数
{
int x,y,z;
x=e*1000;
z=e*100;
y=x%10;
if(y>=5)
{
z=z+1;
}
return z;
}
数码管显示小数函数如下:
void shumaguan(int x) //数码管显示函数显示被分离的数字
{
int i,j,ge,shi,bai;
bai=x/100%100%10;
shi=x/10%100%10;
ge=x%1000%10;
P0=segcode[10]; //清除所有位数
P2=0xe0;
P2=0;
P0=0xFF;
P2=0xc0;
P2=0;
P0=segcode1[bai]; // 显示百位
P2=0xe0;
P2=0;
P0=0x01;
P2=0xc0;
P2=0;
for(i=0;i<1;i++)
for(j=0;j<1;j++);
P0=segcode[shi]; //显示十位
P2=0xe0;
P2=0;
P0=0x02;
P2=0xc0;
P2=0;
P0=segcode[ge]; //显示个位
P2=0xe0;
P2=0;
P0=0x04;
P2=0xc0;
P2=0;
}
(2) I2C的软件编程
主要有以下几个步骤1.启动信号;2停止信号;3应答信号;4等待应答信号;5发送字节;6接收字节;
(3) 串口的编程
本次串口的输出需要用到文本格式所以需要在头文件上加上stdio.h,另外还需要改写char putchar(char c)底层函数这样就可以用printf()函数通过串口来发送文本,代码如下。
char putchar(char c)
{ ES=0; //关闭串口中断
SBUF=c;
while(!TI); //等待发送完成
TI=0; //清除发送完成标志
ES=1; //开启串口中断
return c;
}
(4) PCF8591的串口通信代码以及采集AD的IO口选择。
本次实验主要用到的是AIN0口并不允许模拟电压输出模拟输入方式是4通道输入,另外不自动增加通道号因此控制字节为0x00;具体代码如下:
unsigned char PCF8591_Adc(void)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x00);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
(5) 主函数的编程
流程图如右图。
代码如下
int main()
{
int a,b;
float c=255,e;
int x,n=1;
while(1)
{
while(n)
{
PCF8591_Adc();
a=PCF8591_Adc();
e=a/c*5;
x=fenli(e);
UartInit();
printf("%.2fV\n",e);
shumaguan(x);
n=0;
}
PCF8591_Adc();
b=PCF8591_Adc();
if(b!=a)
{
n=1;
}
}
}
总的代码见附件二。
四、 实验过程与数据记录
1. 将原理图中的滑动变阻器调成100%启动proteus模拟软件,串口输出5.00V如下图

数码管显示如下图

将滑动变阻器下调到99%串口输出如下图

数码管显示如下

将滑动变阻器改成50%串口显示如下

数码管显示如下图
9、总结
这次实验涉及的内容较多有数码管的显示串口以及I2C的通信等,算是个不大不小的项目,这次实验也是我巩固了之前所学C语言的知识,也对串口通信以及I2C的通信有了一个新的了解和认知,希望在今后的学习中能挑战更多更有趣的实验。
下载:
仿真和文档.7z
(191.53 KB, 下载次数: 10)
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |