单片机课程设计报告
题 目 数字电压表
班 级
姓 名
学 号
指导老师
设计时间
1 方案设计证
11 硬件总体设计
设计制作基单片机数字电压表电路结构框图图 11 示
单片机
STC 89C52
时钟电路
复位电路
键
测量电压输入
PCF8591
AD转换电路
电压数码显示系统
图11 硬件结构框图
(1)单片机系统电路部分
(2)数码显示部分
(3) PCF8591芯片 AD转换部分
(4)外部电压采集部分
12软件总体设计
良设计方案减少软件设计工作量提高软件通性扩展性读性系统设计方案步骤:
(1)根需求系统功求逐级划分模块
(2)明确模块间数流传递关系力求数传递少增强模块独立性便软件编制调试
(3)确定软件开发环境选择设计语言完成模块功设计分调试通
(4)开发式软件设计结构模块机结合起成较完善系统采 PCF8591芯片中AD转换器实现模拟量数字量转换单电源供电单片机模块采STC89C52单片机作系统控制单元通键选择相应档位控控制相应继电器选取模拟量输入通AD转换测值转换数字量送入单片机中单片机送显
2 硬件设计
21 电源电路
设计电源部分采外部直流直接供电方案采DC插座连接器件电压值直流5V供电外部直流5V电输入时首先进行滤波处理减少直流电中交流部分系统提供稳定5V电源保证电路正常稳定工作
图21 电源电路图
22 显示电路
显示电路4位阳数码4PNP型三极S85504限流电阻构成S8550数码段码驱动开关B极低电时三极导通B极高电时三极截止4三极B极受控单片机IO口三极E极接电源正三极导通时电源正极达数码阳极时数码8段点亮熄灭完全受控数码段码控制IO低电点亮数码中相应段
图221 显示电路图
图222 显示电路图
23 单片机系统电路
单片机系统复位电路晶振电路组成电路图:
图231 单片机系统电路图
复位电路键复位电复位两部分组成STC89C52系列单片高电复位通常复位引脚RST连接电容VCC连接电阻GND形成RC充放电回路保证单片机电时RST脚足够时间高电进行复位回低电进入正常工作状态电阻电容典型值10K10uF
键复位复位电容联开关开关时电容放电RST拉高电电容充电会保持段时间高电单片机复位
晶振电路晶振器件2助振电容组成晶体振荡器作振荡源单片机部带振荡电路外部连接晶振两电容电容容量般15pF50pF间
系统采部方式时钟电路加电复位复位电路图示:
图232 时钟电路图 图233 复位电路图
24 PCF8591芯片 AD转换部分电路
PCF8591芯片模拟电压信号转化二进制数值I²C总线传送单片机单片机转换成十进制数值通数码显示PCF8591芯片AD转换部分电路图24示:
图24 PCF8591芯片 AD转换部分电路图
量程设置衰减例输入电阻总回路电阻值外部采集电压进电阻进行衰减降 PCF8591 芯片基准采集电压范围
PCF85918位 DA采串行数模转换器4路采样通道设计采样温度电压需2采样通道PCF8591单片机通迅方便简单PCF85914采集通道分AIN0AIN1AIN2AIN3AIN3电压检测通道检测输入端电压单片机处理PCF8591发送数计算出相应电压值数码显示出
TL431调稳压芯片图接法典型25V接法需调电阻方便简单25VR4电阻C5组合成RC滤波然供PCF8591做基准电压知道PCF85918位ADDA芯片8位256量果25V做基准话分辨量25V(2561) 约等 98mVPCF8591检测量98mV检测电压值
RW高精密调电阻称电压校正电阻作调整输入电压分压输入电压般准电压输入电压进行分压处理然程序里进行原处理
3 软件设计
31 程序
系统程序包括PCF8591AD转换模块电压计算数码显示程序通调函数实现系统总体功工作序:
(1)系统启动进行系统初始化
(2)读取 PCF8591芯片值判断值否超电压通数码显示
(3)果超量测量电压显示OL表示超量程没超显示相应电压值
程序程序流程图图 31示
程序开始
初始化
循环30次读取AD结果
AD结果30均值
AD结果值?
电压值计算
显示电压
显示超量程
N
Y
图 31 程序程序流程图
32 PCF8591AD转换程序设计
电压表测量通 PCF8591ADDA转换芯片实现硬件电路设计中已做设计现设计 PCF8591ADDA转换芯片软件部分
AD转换流程图
子程序初始化
I2C初始条件
写入器件址(写)
发送控制字
检测应答信号
I2C初始条件
写入器件址(读)
检测应答信号
接收数存入指针址
结束
图32 AD转换流程图
AD系统程序设计包括三部分:总线初始化程序启动信号程序应答信号程序停止信号程序写字节程序读字节程序
4 安装调试
41 电路安装
(1)检查元件坏
电路图买元件首先检查买回元件坏元件检测方法分进行检测定仔细认真认真核原理图否致检查件焊件防止出现错误焊件便改正
(2)放置焊接元件
原理图位置放置元件放置程中先放置焊接较低元件焊较高求较高元件特容易损坏元件焊焊集成芯片时连续焊接时间超10s注意芯片安装方
42 系统调试
(1)Keil软件中编写调试程序修改语法错误终生成hex目标程序
(2)利Proteus软件绘制电路图确保电路连接正确误情况载入目标程序仿真查结果图41示
图41仿真图
5 性测试结果分析
STCISP软件烧入目标程序观察实物运行效果导线接纽扣电池正负端电压测量效果图51示实验测试该数字电压表设计方案正确行项指标稳定
图51实物运行效果
6 心体会
通次设计仅单片机门课程更深刻认识懂运课知识结合实际完成定时器显示编程方法数码显示电路驱动方法够快适应现代控制技术发展需求时提高思维力实际操作力更走工作岗位奠定坚实基础外次设计更进步认识关 STC89C52等芯片引脚功方法学会应芯片配合完成整设计操作做硬件电路段时间里思考设计电路调试许困难样软件进行设计时路坎坷通软硬件断撞墙断思考解决问题程中学会东西时单片机更深认识
参考文献:
[1] 王福瑞.单片机测控系统设计全[M] .北京北京航空航天学出版社2000
[2] 谭浩强.C程序设计[M].北京:清华学出版社2007
[3] 丁元杰.单片机原理应[M] .北京 机械工业出版社2003
附录:
1 电路图
2 实物图(正反面)
3 源程序
#include
#define setPcf8591Add 0x90 定义PCF859器件址
sbit SCL P2^6 定义PCF859时钟IO口
sbit SDA P2^7 定义PCF859数IO口
*样做处意改IO段码应关系(方便洞洞板接线)*
sbit LED1 P3^7 定义第1数码位选
sbit LED2 P3^6 定义第2数码位选
sbit LED3 P1^2 定义第3数码位选
sbit LED4 P1^1 定义第4数码位选
sbit LED_a P3^5 定义数码段选a段
sbit LED_b P1^3 定义数码段选b段
sbit LED_c P3^0 定义数码段选c段
sbit LED_d P3^2 定义数码段选d段
sbit LED_e P3^3 定义数码段选e段
sbit LED_f P3^4 定义数码段选f段
sbit LED_g P1^7 定义数码段选g段
sbit LED_dp P3^1 定义数码段选dp段
*数显段码存放数组里数组标应*
unsigned char dig[10] {0x030x9f0x250x0d0x990x490x410x1f0x010x09}
0 1 2 3 4 5 6 7 8 9段码
*数码显示暂存数组*
unsigned char ledData[] {0xff0xff0xff0x03}
第3位第2位第1位第0位
*数码显示函数*
void led_out(void)
{
unsigned char ij
for(i 0i < 4i++) for循环4次i03循环4次次扫描4数码
{
*关全部位选*
LED1 1 数码位选1位关
LED2 1 数码位选2位关
LED3 1 数码位选3位关
LED4 1 数码位选4位关
*输入显示数组里段码*
LED_a ledData[i] & 0x80 数码段选a段输出暂存数组里相应数
LED_b ledData[i] & 0x40 数码段选b段输出暂存数组里相应数
LED_c ledData[i] & 0x20 数码段选c段输出暂存数组里相应数
LED_d ledData[i] & 0x10 数码段选d段输出暂存数组里相应数
LED_e ledData[i] & 0x08 数码段选e段输出暂存数组里相应数
LED_f ledData[i] & 0x04 数码段选f段输出暂存数组里相应数
LED_g ledData[i] & 0x02 数码段选g段输出暂存数组里相应数
LED_dp ledData[i] & 0x01 数码段选dp段输出暂存数组里相应数
*判断开位选*
if(i 0) 判断显示位置
LED1 0 果前扫描第1数码位选开显示数
else if(i 1) 果前扫描第2数码位选开显示数
LED2 0
else if(i 2) 果前扫描第3数码位选开显示数
LED3 0
else if(i 3) 果前扫描第4数码位选开显示数
LED4 0
for(j 0j < 240j++) 延时段时间
*关全部位选*
LED1 1 数码位选1位关
LED2 1 数码位选1位关
LED3 1 数码位选1位关
LED4 1 数码位选1位关
}
}
*
函数名 I2C通迅延时
调 调函数
参 数 参数
返回值 返回值
备 注 I2C单片机通迅相慢时序延时
*
void delay(unsigned char time) 延时
{
for(time > 0time)
}
*
函数名 I2C起始条件
调 调函数
参 数 参数
返回值 返回值
备 注 SCL高SDA降做起始条件(5V时高06us低06us)
*
void i2c_start(void) I2C起始条件
{
SDA 1 SDA输出高电(注意SCL需SDA面拉高果外部已拉低SCLSDA拉高着停止条件)
delay(5) 延时
SCL 1 SCL输出高电
delay(5) 延时
SDA 0 SDA降
delay(5) 延时
SCL 0 SCL输出高电
delay(5) 延时
}
*
函数名 I2C停止条件
调 调函数
参 数 参数
返回值 返回值
备 注 SCL高SDA升做停止条件
写函数思想1产生停止条件必须SDA产生1升产生升前SDA须低
2正常停止信号ACK应答产生考虑应答非应答先拉低SCL允许
SDA确保低拉高SCL满足1条件
*
void i2c_stop(void) I2C停止条件
{
SCL 0 允许SDA低
delay(5) 延时
SDA 0 SDA输出低电
delay(5) 延时
SCL 1 SCL输出高电
delay(5) 延时
SDA 1 SDA升
delay(5) 延时
}
*
函数名 回复应答者非应答信号
调 调函数
参 数 ACKsw应答开关0时表示应答1表示非应答
返回值 返回值
备 注
*
void i2c_ACK(bit ACKsw) 回复应答者非应答信号0时表示应答1表示非应答
{
SCL 0 拉抵SCL允许SDA变化
delay(5) 延时
SDA ACKsw 应答信号传输SDA
delay(5) 延时
SCL 1 拉高SCLI2C读取
delay(5) 延时
SCL 0 拉低SCL允许外部改变SDA
delay(5) 延时
}
*
函数名 检测应答信号
调 调函数
参 数 参数
返回值 返回值应答0表示应答1表示非应答
备 注 发送完8数位发送1SCL检测I2C否应答
*
bit i2c_waitACK(void) 检测应答信号
{
SCL 0 拉低SCL允许SDA改变
delay(5) 延时
SDA 1 接收低电先拉高SDA电
delay(5) 延时
SCL 1 发送1SCL高准备检测SDA数
delay(30) 延时
if(SDA 1) 检测SDA数
{
SCL 0 拉低SCL准备退出允许外部改变SDA
delay(5) 延时
return 1 果读应答应位1说明I2C没应答
}
else
{
SCL 0 拉低SCL准备退出允许外部改变SDA
delay(5) 延时
return 0 果读应答应位0说明I2C回复应答
}
}
*
函数名 I2C位发送
调 调函数
参 数 dat发送8位数
返回值 返回值
备 注 传输1字节数8位
*
void i2c_sendbyte(unsigned char dat)I2C位发送
{
unsigned char i 定义1变量循环发送数位
SCL 0 SCL输出低电允许数改变
delay(5) 延时
for(i 0i < 8i++) 循环8次发送1数8位
{
if(dat & 0x80) 果发送数高位1
SDA 1 传输位1
else
SDA 0 否传输0
dat << 1 传输数移高位方便次发送
delay(5) 延时
SCL 1 SCL输出高电I2C读数
delay(5) 延时
SCL 0 SCL输出低电允许改变数
delay(5) 延时
}
}
*
函数名 I2C读取8位
调 调函数
参 数 参数
返回值 返回读取8位数
备 注 读取1字节数8位
*
unsigned char i2c_recbyte(void) I2C读取8位
{
unsigned char i 定义1变量循环接收数位
unsigned char readDat 定义1变量暂存接收数
readDat 0 暂存初值0
SCL 0 SCL输出低电允许数改变(时序函数结束时应保持SCL低电)
SDA 1 果接收数必须释放数总线SDA
delay(5) 延时
for(i 0i < 8i++) 循环8次接收1数8位
{
SCL 1 SCL拉高电24C输出数位
delay(30) 延时
readDat << 1 24C传输数高位前必须左移1位空位接收新数位
if(SDA 1) 果读数1
readDat++ 暂存低位置1
SCL 0 SCL输出低电允许改变数
delay(5) 延时
}
return readDat 返回读取字节
}
*
函数名 读AD转换值
参 数 com值AD转换控制字具体查PCF8591手册控制字寄存器功说明
dat转换值指针变量变量址传函数函数转换
改变传址变量值假传A变量址函数转换成功AD转换结果存入A变量址
判断函数转换成功直接A值
返回值 返回1说明转换失败
备 注 读取AD转换次结果
*
bit i2c_readbyte(unsigned char com unsigned char *dat)
{
i2c_start() I2C起始条件
i2c_sendbyte(setPcf8591Add) I2C写入器件址(写)
if (i2c_waitACK()) 检测应答信号果非应答返回1结束函数
return 1
i2c_sendbyte(com) 果器件址通发送控制字节
if (i2c_waitACK()) 检测应答信号果非应答返回1结束函数
return 1
i2c_start() I2C起始条件
i2c_sendbyte(setPcf8591Add+1) I2C写入器件址(读)
if (i2c_waitACK()) 检测应答信号果非应答返回1结束函数
return 1
*dat i2c_recbyte() 读取数
i2c_ACK(0) 读字节数发送ACK信号
i2c_stop() 发送停止信号
return 0 返回0说明转换成功
}
*定时器0初始化*
void Init_Timer0(void)
{
TMOD | 0x01 模式116位定时器|符号定时器时受影响
TMOD & 0xF0 设置定时器模式
TL0 0x00 设置定时初值
TH0 0x00 设置定时初值
EA 1 总中断开
ET0 1 定时器中断开
TR0 1 定时器开关开
}
*定时器中断子程序*
void Timer0_isr(void) interrupt 1
{
TMOD & 0xF0 设置定时器模式
TL0 0x00 设置定时初值
TH0 0x00 设置定时初值
led_out() 扫描数码显示电压值
}
*函数*
void main(void)
{
unsigned char ans i 0 声明1变量延时计数1变量存AD中间结果
unsigned int V 0 声明1变量存储计算电压值
unsigned char pcf_dat 0 AD转换成功存入变量
Init_Timer0() 定时器0初始化
while(1) 循环
{
V 0
for(i 0i < 30i++) 次读30次结果
{
if(i2c_readbyte(0X43&ans) 0) 果转换成功0X43选择通道3输入
pcf_dat ans 转换结果存入pcf_dat变量
V + pcf_dat 读结果全部累加int变量中存储
}
pcf_dat V 30 求均值变量pcf_dat
if(pcf_dat 255) 果转换结果达255显示OL表示超量程
{
ledData[3] 0xff 显示关
ledData[0] 0xff 显示O
ledData[1] 0x03 显示L
ledData[2] 0xe2 显示关
}
else 果没达满量程
{
V 47 * pcf_dat 计算出电压值47mV1转换结果47mV12V量程分255量1量47mV255量12V
V 10 10表示mV保留2位数精确V数2位
ledData[3] dig[V 10] 显示转换结果数点位位
ledData[2] dig[(V 10) 10] 显示转换结果数点位二位
ledData[1] dig[(V 100) 10]1 显示转换结果电压V显示数点
if((V 1000) 10 0) 果V十位0关闭显示
ledData[0] 0xff
else
ledData[0] dig[(V 1000) 10] 否显示电压十位数
}
}
}
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档