PCF8591数字电压表数码管显示
51单片机PCF8591数字电压表数码管设计( proteus仿真+程序+设计报告+讲解视频)
仿真图proteus7.8及以上
程序编译器:keil 4/keil 5
编程语言:C语言
设计编号:S0059
1.主要功能:
基于51单片机AT89C51/52(与AT89S51/52、AT89C51/52、STC89C51/52等51内核单片机通用)
基于51单片机的数字电压表设计
1.采用PCF8591实现AD采样功能;
2.采样电压范围0-5V;
3.用数码管显示转换后的实际电压值
4.显示保留小数点后两位。
需注意仿真中51单片机芯片是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。
以下为本设计资料展示图:
讲解视频:
仿真讲解+代码讲解
51单片机PCF8591数字电压表数码管( proteus仿真+程序+报告+讲解)
2.仿真
开始仿真
打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。数码管显示电压值,精确到小数点后两位。可以调整范围0-5V。
3. 程序代码
使用keil4或者keil5编译,代码有注释,可以结合报告理解代码含义。
main函数:
c
main()
{
while(1)
{
/********以下AD-DA处理*************/
PCF8591_SendByte(AddWr,0); //启动转换
D[0]=PCF8591_RcvByte(AddWr); //读转换完的数字信号,ADC0 模数转换 范围是256-0;
vol_value = PCF8591_RcvByte(AddWr);
vol_value = vol_value*5.0*100/256;//得到范围是500-0,方便显示
dis[0] = (vol_value%1000)/100; //百
dis[1] = (vol_value%100)/10; //十
dis[2] = vol_value%10;
C4 = C2 =C1 =0; //关闭134数码管
C3=1; //打开第2位数码管
Dp=0; //打开小数点
P1=table[dis[0]]; //显示整数部分及小数点
delay(10); //延时一定时间
C4 = C3 = C1=0; //关闭第124位数码管
C2=1; //打开第3位数码管
Dp=1;
P1=table[dis[1]];
delay(10);
C4 = C3 =C2 =0; //关闭123数码管
C1=1; //打开第4位数码管
Dp=1;
P1=table[dis[2]];
delay(10); //延时一定时间
}
}
PCF8591相关操作函数
c
/************************************************************
* 函数名 : Pcf8591_SendByte
* 函数功能 : 写入一个控制命令
* 输入 : addr(器件地址),channel(转换通道)
* 输出 : 无
************************************************************/
bit PCF8591_SendByte(unsigned char addr,unsigned char channel)
{
Start_I2c(); //启动总线
I2C_SendByte(addr); //发送器件地址
if(ack==0)return(0);
I2C_SendByte(0x40|channel); //发送控制字节
if(ack==0)return(0);
Stop_I2c(); //结束总线
return(1);
}
/************************************************************
* 函数名 : PCF8591_RcvByte
* 函数功能 : 读取一个转换值
* 输入 :
* 输出 : dat
************************************************************/
unsigned char PCF8591_RcvByte(unsigned char addr)
{
unsigned char dat;
Start_I2c(); //启动总线
I2C_SendByte(addr+1); //发送器件地址
if(ack==0)return(0);
dat=I2C_RcvByte(); //读取数据0
Ack_I2c(1); //发送非应答信号
Stop_I2c(); //结束总线
return(dat);
}
IIC通信函数
c
/*******************************************************************
起动总线函数
函数原型: void Start_I2c();
功能: 启动I2C总线,即发送I2C起始条件.
********************************************************************/
void Start_I2c()
{
sda=1; /*发送起始条件的数据信号*/
_nop_();
scl=1;
_nop_(); /*起始条件建立时间大于4.7us,延时*/
_nop_();
_nop_();
_nop_();
_nop_();
sda=0; /*发送起始信号*/
_nop_(); /* 起始条件锁定时间大于4μs*/
_nop_();
_nop_();
_nop_();
_nop_();
scl=0; /*钳住I2C总线,准备发送或接收数据 */
_nop_();
_nop_();
}
/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c()
{
sda=0; /*发送结束条件的数据信号*/
_nop_(); /*发送结束条件的时钟信号*/
scl=1; /*结束条件建立时间大于4μs*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=1; /*发送I2C总线结束信号*/
_nop_();
_nop_();
_nop_();
_nop_();
}
/*******************************************************************
字节数据发送函数
函数原型: void I2C_SendByte(UCHAR c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void I2C_SendByte(unsigned char c)
{
unsigned char i;
for(i=0;i<8;i++) /*要传送的数据长度为8位*/
{
if((c<<i)&0x80)sda=1; /*判断发送位*/
else sda=0;
_nop_();
scl=1; /*置时钟线为高,通知被控器开始接收数据位*/
_nop_();
_nop_(); /*保证时钟高电平周期大于4μs*/
_nop_();
_nop_();
_nop_();
scl=0;
}
_nop_();
_nop_();
sda=1; /*8位发送完后释放数据线,准备接收应答位*/
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
if(sda==1)ack=0;
else ack=1; /*判断是否接收到应答信号*/
scl=0;
_nop_();
_nop_();
}
/*******************************************************************
字节数据接收函数
函数原型: UCHAR I2C_RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数应答从机。
********************************************************************/
unsigned char I2C_RcvByte()
{
unsigned char retc=0,i;
sda=1; /*置数据线为输入方式*/
for(i=0;i<8;i++)
{
_nop_();
scl=0; /*置时钟线为低,准备接收数据位*/
_nop_();
_nop_(); /*时钟低电平周期大于4.7μs*/
_nop_();
_nop_();
_nop_();
scl=1; /*置时钟线为高使数据线上数据有效*/
_nop_();
_nop_();
retc=retc<<1;
if(sda==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
_nop_();
_nop_();
}
scl=0;
_nop_();
_nop_();
return(retc);
}
4. 设计报告
5133字设计报告,内容包括硬件设计、软件设计、软硬件框图、调试、结论等
5. 设计资料内容清单&&下载链接
资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图等。
0、常见使用问题及解决方法--必读!!!!
1、仿真图
2、程序源码
3、功能要求
4、开题报告
5、设计报告
6、软硬件流程框图
7、讲解视频
Altium Designer 软件资料
KEIL软件资料
Proteus软件资料
单片机学习资料
答辩技巧
设计报告常用描述
鼠标双击打开查找更多51 STM32单片机课程毕业设计.url