简单数字电压表的c语言程序,简易数字直流电压表电路及程序
简易数字直流电压表电路及程序
设计一个简易数字直流电压表。(量程0V-2V、测量速度为大于等于2次/秒、测量误差在±0.05V以内,有超限报警、数码管显示。)
3.5.1模块1:系统设计
(1)分析任务要求,写出系统整体设计思路
从试题的要求分析,主要包括的内容为ADC转换电路的控制、采用定时器定时读取ADC转换器的数据、将ADC转换器的数据计算为对应的电压值,最后在数码管上显示出来。
整体设计思路:硬件采用单片机的P0输出数码管的7段码,P2口输出数码管的位控信号。用P1的三个I/O管脚连接ADC转换器的接口,通过查询定时器T0中断标志是否有效来启动ADC转换器的工作,并读取ADC转换器的转换结果。然后,根据ADC转换器的参考电压将ADC转换器的转换结果计算为对应的电压值,并在数码管上显示出来。
(2)选择单片机型号和所需外围器件型号,设计单片机硬件电路原理图
采用MCS51系列单片机At89S51作为主控制器,外围电路器件包括数码管驱动、AD转换器TLC549、基准电压TL431等。
数码管驱动采用2个四联共阴极数码管显示,由于单片机驱动能力有限,采用74HC244作为数码管的驱动。在74HC244的7段码输出线上串联100欧姆电阻起限流作用。
AD转换器的参考电压由精密基准电源TL431提供,标准参考电压Vref+为2.5伏, Vref-为0伏。由于0V-2V内的测量误差控制在±0.05V内,因此8 位A/D转换器即可满足要求。AD转换器TLC549是以8位开关电容逐次逼近A/D转换器为基础而构造的CMOS A/D转换器。 它们设计成能通过3态数据输出和模拟输入与微处理器或外围设备串行接口。TLC549仅用输入/输出时钟(I/O CLOCK)和芯片选择 (CS)输入作数据控制。TLC549的IO CLOCK输入频率最高可达1.1MHz。
TLC549提供了片内系统时钟,它通常工作在4MHz且不需要外部元件。片内系统时钟使内部器件的操作独立于串行输入/输出的时序并允许TLC548和TLC549象许多软件和硬件所要求的 I/O CLOCK和内部系统时钟一起可以实现高速数据传送以及对于TLC549为每秒40,000次转换的转换速度。TLC549 的引脚排列分别如图3-17下。
如图3-17 TLC549 的引脚排列
TLC549 的工作时序如图3-18所示。
图3-18 TLC549 的工作时序
转换周期需要36个系统时钟周期(最大为 17μs),它开始于CS变为低电平之后I/O CLOCK的第8个下降沿,这适用于该时刻其地址存在于存储器中的通道。
在CS变为低电平后,最高有效位 (A7)自动被放置在DATA OUT总线上。其余的7 位(A6-A0)在前7个I/O CLOCK下降沿由时钟同步输出。
TLC549的工作原理
TLC549是在单个芯片内的完善的数据采集系统。每一个器件包含内部系统时钟,采样和保持,8位A/D转换器,数据寄存器以及控制逻辑电路。为了提高灵活性和访问速度,器件有两个控制输入:I/OCLOCK和芯片选择(CS)。这些控制输入和与TTL兼容的3态输出易于与微处理器或小型计算机的串行通信。器件可在17μs或更短时间内完成转换。TLC549每25μs重复一次完整的输入-转换-输出(input-conversion-output)周期。
内部系统时钟和I/OCLOCK独立使用且不需要任何特定的速度或二者之间的相位关系。这种独立性简化了器件的硬件和软件控制任务。由于这种独立性和系统时钟的内部产生,控制硬件和软件只需关心利用I/O时钟读出先前转换结果和启动转换。内部系统时钟以这种方式驱动转换电路以便控制硬件和软件不需要涉及此项任务。
当CS为高电平时,DATAOUT处于高阻状态且I/OCLOCK(I/O时钟)被禁止。正常控制时序为:
1.CS被拉至低电平。当CS变为低电平时,前次转换结果的最高有效位(MSB)开始出现在DATAOUT端。
2.前4个I/OCLOCK周期的下降沿输出前次转换结果的第2、第3、第4和第5个最高有效位。在I/OCLOCK第4个高电平至低电平的跳变之后,片内采样和保持电路开始对模拟输入采样。采样操作主要包括内部电容器充电到模拟输入电压的电平。
3.其后再把三个I/OCLOCK周期加至I/OCLOCK端,在这些时钟周期的下降沿,第6、第7和第8个转换位被移出。
4.最后(第8个)时钟周期被加至I/OCLOCK。此时钟周期高电平至低电平的跳变使片内采样和保持电路开始保持功能。保持功能在接着四个内部系统时钟周期内继续进行,在此之后保持功能结束且在下面32个系统时钟周期内完成转换,总共为36个周期。在第8个I/OCLOCK周期之后,CS必须变为高电平,否则I/OCLOCK必须保持低电平达至少36个系统时钟周期以供保持和转换功能的完成。在多个转换周期内CS可保持低电平。在多个转换周期内使CS保持低电平时必须特别注意防止I/OCLOCK线上的噪声闪变。如果在I/OCLOCK上发生闪变,那么在微处理器/控制器和器件之间的I/O时序将失去同步。此外,如果CS变为高电平,那么它必须保持高电平直至转换结束为止。否则,CS的有效高电平至低电平跳变将引起复位,它使正在进行的转换失败。
在36个系统时钟周期发生之前,通过完成步骤1至4可以启动新的转换,同时正在进行的转换中止。此操作产生先前的转换结果而不是正在进行的转换结果。
(3)分析软件任务要求,写出程序设计思路,分配单片机内部资源,画出程序流程图
软件的任务包括定时器的定时功能、AD转换器TLC549的控制与数据的读取,数码管的动态扫描。程序设计思路,采用查询定时器中断标志的方式来启动AD转换器TLC549的工作,在读取AD转换器的数据之后,再对数据进行计算换算为对应的电压值。
需要分配的单片机存储资源包括AD转换器数据的暂存变量(re_data)、定时器溢出次数的计数变量(T_cnt)、数据换算的系数(xishu)以及电压值(volt)等。
主程序的流程图如图3-19所示。由于采用查询中断标志的方式来响应的中断,所以主程序要循环完成如下任务:中断标志的查询、AD转换器数据的读取、电压值的换算以及数码管的动态扫描显示。
图3-19数字电压表的主程序流程图
(4)设计系统软件调试方案、硬件调试方案及软硬件联合调试方案
软件调试方案:伟福软件中,在“文件\新建文件”中,新建C语言源程序文件,编写相应的程序。在“文件\新建项目”的菜单中,新建项目并将C语言源程序文件包括在项目文件中。
在 “项目\编译”菜单中将C源文件编译,检查语法错误及逻辑错误。在编译成功后,产生以 “*.hex”和“*.bin” 后缀的目标文件。
硬件调试方案:在设计平台中,将单片机的P1.0接TLC549的CLK管脚,P1.1接TLC549的DOUT管脚,P1.2接TLC549的CS管脚。
在伟福中将程序文件编译成目标文件后,将下载线安装在实验平台上,运行“MCU下载程序”,选择相应的flash 数据文件,点击“编程”按钮,将程序文件下载到单片机的Flash中。
然后,上电重新启动单片机,检查所编写的程序是否达到题目的要求,是否全面完整地完成试题的内容。
3.6.2 模块2 程序设计
//晶振:11.0592MHz,定时器T0每50ms中断一次,每隔0.1秒读ADC一次
/* AD转换器使用 TLC549
p1.0-Clock
p1.1-Data out
p1.2-CS
*/
#include "reg51.h"
#include "intrins.h"
#include "math.h"
sbit ad_clk=P1^0;
sbit ad_dout=P1^1;
sbit ad_cs=P1^2;
unsigned char data re_data;
unsigned int data T_cnt;
double volt,xishu;
char code led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//led_seg_code[0-9]代表0-9的7段码
//---------------
void delay(unsigned int i)//延时
{ while(--i); }
//---------------
void led_show(double f)
{ unsigned char i,s;
unsigned int k,*j;
if (f<2)
{ k=f;//取整数 部分
i=k;
P0=led_seg_code[i] | 0x80;
P2=0xfb;
delay(50);
i=f*10;
i=i%10;
P0=led_seg_code[i];
P2=0xfd;
delay(50);
i=f*100; //取小数后1位
i=i%10;
P0=led_seg_code[i];
P2=0xfe;
delay(50);
else //超限报警,显示“---”
{ P0=0x40;
P2=0xfb;
delay(50);
//---------
P2=0xfd;
delay(50);
//-----------
P2=0xfe;
delay(50);
}
}
//----读取ADC转换器TLC549的数据----
unsigned char receive_data()
{unsigned char i,d;
d=0;
ad_cs=1; // /CS置高,片选无效
ad_clk=0;
ad_cs=0;
_nop_();
for(i<0;i<8;i++)
{ ad_clk=1;
d=d<<1;
if (ad_dout)
{ d++;}
ad_clk=0;
}
ad_cs=1;
for(i=0;i<10;i++) // 适当延时超过17us
_nop_();
return d;
}
//-------------
main()
{T_cnt=0;
TMOD=0x01; //定时器设置T0
TH0=0x4c; //50000us=(65536-0x4c00)*12/11.0592
TL0=00;
EA=0;
TR0=1;
re_data=0x00;
volt=0;
xishu=2.5/255.0;
//-----------------------------
while(1)
{ if(TF0==1)
{ TF0=0;
TH0=0x4c; //50000us=(65536-0x4c00)*12/11.0592
TL0=0x0;
if (T_cnt<2) //T0为50毫秒溢出一次,每100ms读取一次AD转换器数据
{T_cnt++;}
else
{ T_cnt=0;//计时到100ms了
re_data=receive_data();
//转换为电压值
volt=re_data;
volt=volt*xishu;
}
}
led_show(volt);
}
}
简单数字电压表的c语言程序,简易数字直流电压表电路及程序相关推荐
- c语言编程的电压表设计,简易数字直流电压表的设计(最终版)最新版
<简易数字直流电压表的设计.doc>由会员分享,可免费在线阅读全文,更多与<简易数字直流电压表的设计(最终版)>相关文档资源请在帮帮文库(www.woc88.com)数亿文档库 ...
- 程序员数字_作为社会科学程序员处理不同的数字数据
程序员数字 Yesterday I had a discussion with a fellow student in Social Data Science, and we asked oursel ...
- ec11编码器c语言程序,EC11旋转编码器电路和程序
现在手里的项目使用到了旋转编码器,目前只使用了旋转功能,按钮功能没用到,电路图如下: 说一下为什么这么画,原因很简单,旋钮并不需要供电,它做的工作是把原来的高电平拉低,或者不改变高电平状态,这就是为什 ...
- 基于STM32控制的数字BUCK电路及程序编写
本文芯片采用STM32G474CBT6,采用STM32cubeMX进行程序生成. BUCK电路拓扑结构: 如图所示,BUCK变换器主要由电源VDC.场效应管MOSFET.续流二极管VD.电感L以及滤波 ...
- 单片机简易定时闹钟控制c语言代码,简易定时闹钟.doc
简易定时闹钟 课程名称:单片机课程设计 设计题目: 简易数字闹钟 院 系: 专 业: 年 级: 姓 名: 学 号: 指导教师: 课 程 设 计 任 务 书 专 业 姓 名 学 号 开题日期: 完成日期 ...
- python是一种代表简单主义思想的语言_setuptools-36.6.0
setuptools-36.6.0 所属分类:Windows编程 开发工具:Python 文件大小:708KB 下载次数:1 上传日期:2017-10-25 10:37:48 上 传 者:Lhy123 ...
- tl494组成的超声波发射电路_9018简易调频发射器电路 - 最简单无线发射电路图大全(超声波发射/射频收发电路/调频发射器)...
最简单无线发射电路图(七) 9018简易调频发射器电路中的发射器线圈是用1.0mm的漆包线在3.2mm的钻头上绕6-8圈,可覆盖88-108MHz,7圈时在100MHz附近.距离不是很远,<10 ...
- c语言程序 电子钢琴按键,基于51单片机8按键电子琴-简易版系统设计(原理图+程序仿真+论文)...
一. 引言 单片机因其体积小,功能强,价格低廉而得到广泛应用,同时随着我国经济的飞速发展,单片机在越来越多的领域得到了广泛的应用,现在国内的单片机多用于电话,玩具和LCD等产品,预计在未来,利用单片机 ...
- 【入门级C语言程序 -- 猜数字】Guess Number Game
今天小玄给大家带来一个简单的C语言小程序 -- 猜数字的游戏. 其中主要涉及到的要点是随机数的产生 : 首先需要引入头文件 :<stdlib.h> <time.h> 然后去使 ...
- c语言设置一个选择数字的程序,C语言编一个数字益智小游戏
程序功能及运行情况 设计的程序是一个数字益智游戏,旨在培养小朋友玩家的数学思维,提高玩家的数学能力.游戏共设有四个不同的小游戏,分别是一位数四则运算.两位数四则运算.找最值游戏.排序游戏.程序能实现产 ...
最新文章
- Java项目:学生信息管理系统(java+SSM+jsp+mysql+maven)
- python百度百科api-python使用API
- 微信小程序页面间的对象传递
- 软件设计师 --哈夫曼树的一个经典问题
- 精通Android自定义View(八)绘制篇Canvas分析之绘制文本
- 理解TypeScript的泛型
- idea java sdk找不到指定文件路径_java-IntelliJ找不到任何声明
- linux上用selenium登录新浪微博,获取用户关注的用户id
- 如果Mac在播放音乐时遇到问题,没有声音或无法调整音量,该怎么办呢?
- 用DIB位图显示图像
- 程序员进阶之路的10本必读书目
- 从零开始学Android应用安全测试
- OSHI 是一个免费的基于 JNA(本机)的 Java 操作系统和硬件信息库
- UNP编程:15---UDP之(recvfrom、sendto函数)
- pt,px,屏幕尺寸,分辨率以及ppi关系与换算
- Javaeve博客教你怎么发带图片的博客,非其他网络连接图片
- solve函数c语言_c语言:回溯解数独程序
- Mysql数据库基础及高阶
- 社群裂变工具有哪些?怎么用?微信如何引流客源呢?
- python,分析网页,使用 bs4和requests 爬取网页指定图片