基于51单片机的ADC0832数字电压表(仿真+程序)

合集下载

基于51单片机的数字电压表仿真设计(有参考文献)

基于51单片机的数字电压表仿真设计(有参考文献)

基于51单片机的数字电压表仿真设计一、引言随着电子科学技术的发展,电子测量成为广大电子工作者必须掌握的手段,对测量的精度和功能的要求也越来越高,而电压的测量甚为突出,因为电压的测量最为普遍。

数字电压表是采用数字化测量技术设计的电压表。

数字电压表与模拟电压表相比,具有读数直观、准确、显示范围宽、分辨力高、输入阻抗大、集成度高、功耗小、抗干扰能力强,可扩展能力强等特点,因此在电压测量、电压校准中有着广泛的应用。

而单片机也越来越广泛的应用与家用电器领域、办公自动化领域、商业营销领域、工业自动化领域、智能仪表与集成智能传感器传统的控制电路、汽车电子与航空航天电子系统。

单片机是现代计算机技术、电子技术的新兴领域。

本文采用ADC0808对输入模拟信号进行转换,控制核心C51单片机对转换的结果进行运算和处理,最后驱动输出装置显示数字电压信号,通过Proteus仿真软件实现接口电路设计,并进行实时仿真。

Proteus软件是一种电路分析和实物模拟仿真软件。

它运行于Windows 操作系统上,可以进行仿真、分析(SPICE)各种模拟器件和集成电路,是集单片机和SPICE分析于一身的仿真软件,功能强大,具有系统资源丰富、硬件投入少、形象直观等优点,近年来受到广大用户的青睐。

二、数字电压表概述1、数字电压表的发展与应用电压表指固定安装在电力、电信、电子设备面板上使用的仪表,用来测量交、直流电路中的电压。

传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,并且传统的电压表在测量电压时需要手动切换量程,不仅不方便,而且要求不能超过该量程。

目前,由各种单片A/D转换器构成的数字电压表,已被广泛用于电子及电工测量领域,并且由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。

2、本次设计数字电压表的组成部分本设计是由单片机AT89C51作为整个系统控制的核心,整个系统由衰减输入电路、量程自动转换电路、交直流转换电路、模数转换及控制电路以及接口电路五大部分构成。

单片机数字电压表(带仿真图C程序)

单片机数字电压表(带仿真图C程序)

基于51单片机数字电压表本模块采用ADC0832模数转换芯片,LCD1602液晶显示,测量范围0-5V,精度误差0.01V看了很多网上的课程设计或者毕业论文,得出以下几点:1.数字电压表的方案有很多种,有的采用ADC0809,或者ADC0808等,他们都是8温AD,并口传输数据,具有速率高的优点。

但是硬件复杂,与单片机电路繁琐,焊接起来比较麻烦。

所以本设计采用ADC0832,同样8位AD,特点是串口传输数据,硬件接口简单,且精度误差一致,速率也比较快,对于要求不高的系统非常适合。

2.显示电路,网上采用LED显示居多,本设计采用LCD1602液晶显示,具有硬件搭设简单,显示美观等优点3.本设计方便移植,只需将LCD1602三个控制端口,ADC0832 四个控制端口修改即可。

注意LCD1602数据传输接口是单片机的P0口,如下图,需要接上拉电阻4.程序采用C代码编写,亲测直接可以使用,若需仿真文件,请用E-mail联系邮系。

邮箱:gnsywb@5.网上很多设计数据转换程序有误,不够正确。

在转换过程中,中间变量需设置为int 类型,虽然8位AD输出最高位255,但是余数转换过程中会大于255。

若设计char型,会造成显示输出有误。

void convert(uchar a){ uint temp; //特别注意这里需定义int型(余数将大于255)dis[0]=a/51; //取个位temp=a%51;temp=temp*10; dis[1]=temp/51; //取小数点后第一位temp=temp%51;temp=temp*10; dis[2]=temp/51; //取小数点后第二位}具体电路图如下:1.利用电压表与测量显示电压对比附录:C程序/******************************************** 功能:单片机数字电压表ADC0832+LCD16021,测量范围0-5V2,2路输入电压,可自行设定3,测量精度误差0.01V,LCD液晶显示编写者:小子在西藏gnsywb@编写日期:2012-11-5*********************************************/ #include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit lcdrs=P2^4;sbit lcdrw=P2^5;sbit lcden=P2^6; //1602控制端口sbit DI=P3^4;sbit DO=P3^4; //DI和DO与单片机共接口sbit Clk=P3^3;sbit CS=P3^5;//ADC0832控制端口uchar dis[3]={0x00,0x00,0x00}; //显示缓冲区uchar date=0; //AD值uchar CH; //ADC0832通道值/*****************************************AD0832转换程序******************************************/uchar ADC0832(uchar CH){uchar i,dis0,dis1;Clk=0; //拉低时钟DI=1; //初始化_nop_();CS=0; //芯片选定_nop_();Clk=1; //拉高时钟_nop_();if(CH==0) //通道选择{Clk=0; //第一次拉低时钟DI=1; //通道0的第一位_nop_();Clk=1; //拉高时钟_nop_();Clk=0; //第二次拉低时钟,ADC0832 DI接受数据DI=0; //通道0的第二位_nop_();Clk=1;_nop_();}else{Clk=0;DI=1; //通道1的第一位_nop_();Clk=1;_nop_();Clk=0;DI=1; //通道1的第二位_nop_();Clk=1;_nop_();}Clk=0; //第三次拉低时钟,此前DI两次赋值决定通道DI=1; //DI开始失效,拉高电平,便于DO数据传输for(i= 0;i<8;i++) //读取前8位的值{_nop_();dis0<<= 1;Clk=1;_nop_();Clk=0;if (DO)dis0|=0x01;elsedis0|=0x00;}for (i=0;i<8;i++) //读取后8位的值{dis1>>= 1;if (DO)dis1|= 0x80;elsedis1|= 0x00;_nop_();Clk=1;_nop_();Clk=0;}if(dis0==dis1) //两次结束数据比较,若相等date=dis0; //则赋值给dat_nop_();CS=1; //释放ADC0832DO=1; //拉高输出端,方便下次通道选择DI端有效Clk=1; //拉高时钟return date;}/***********************************************数据转换程序功能:将0-255级换算成0.00-5.00的电压数***********************************************/void convert(uchar a){uint temp; //特别注意这里需定义int型(余数将大于255)dis[0]=a/51; //取个位temp=a%51;temp=temp*10;dis[1]=temp/51; //取小数点后第一位temp=temp%51;temp=temp*10;dis[2]=temp/51; //取小数点后第二位}/***************************************** LCD1602驱动程序******************************************/ void delay(uchar z){uint x,y;for(x=z;x>0;x--)for(y=122;y>0;y--);}void write_cmd(uchar cmd)//lcd1602写命令函数{lcdrs=0;lcdrw=0; //选择指令寄存器lcden=1;P0=cmd; //写数据delay(5);lcden=0; //使能拉低lcden=1;}void write_date(uchar date)//lcd1602写数据函数{lcdrs=1;lcdrw=0; //选择数据寄存器lcden=1;P0=date; //写数据delay(5);lcden=0; //使能拉低lcden=1;}void init_lcd1602()//lcd1602初始化{write_cmd(0x01); //清屏write_cmd(0x38); //功能设置write_cmd(0x0c); //显示设置write_cmd(0x06); //输入方式从左到右delay(1);}/***************************************** 显示函数*****************************************/ void display(void){uchar i;write_cmd(0x80);for(i=0;i<3;i++){if(i==1) write_date('.'); //第二位显示小数点write_date (0x30+dis[i]);delay(5);}write_date('V'); //最后一位后显示字符'V'}/************************************************ 主函数***************************************************/ void main(void){CH=0; //选择通道0或1init_lcd1602();//液晶1602显示初始化while(1) //主循环{date=ADC0832(CH);//启动ADC0832转换并接受数据delay(1);convert(date); //数据转换成BCD码display(); //显示数值}}。

基于51+ADC0832+LCD1602+仿真图四位电压显示测试OK汇编

基于51+ADC0832+LCD1602+仿真图四位电压显示测试OK汇编

//********************************//说明:调用VR2时,ADC0832将模拟电压转换为数字电压并显示在LCD1602上//********************************#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define delay4us(){_nop_();_nop_();_nop_();_nop_();}//********************************//ADC引脚定义//********************************sbit CS=P3^0;sbit CLK=P3^1;sbit DIO=P3^2;//********************************//LCD端口定义//********************************sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;//********************************//一位整数、两位小数的数字电压显示缓冲//********************************uchar Display_Buffer[]="0.000V";//********************************//LCD第一行显示信息//********************************uchar code Line[]="TEST OK DC ";//********************************//延时子程序//********************************void DelayMS(uint x){uchar t;while(x--)for(t=0;t<120;t++);}//********************************//LCD忙状态检测//********************************bit LCD_BUSY_CHECK(){bit result;RS=0;RW=1;E=1;delay4us();result=(bit)(P0&0x80);E=0;return result;}//********************************//写LCD命令//********************************void LCD_Write_Command(uchar cmd){while(LCD_BUSY_CHECK()); //判断LCD是否忙碌RS=0;RW=0;E=0;_nop_();P0=cmd;delay4us();E=1;delay4us();E=0;}//********************************//设置LCD显示位置//********************************void Set_Disp_Pos(uchar pos){LCD_Write_Command(pos|0x80);}//********************************//写LCD数据//********************************void LCD_Write_Data(uchar dat){while(LCD_BUSY_CHECK()); //判断LCD是否忙碌RS=1;RW=0;E=0;P0=dat;delay4us();E=1;delay4us();E=0;}//********************************//LCD初始化//********************************void LCD_Initialise(){LCD_Write_Command(0x38);DelayMS(1);LCD_Write_Command(0x0C);DelayMS(1);LCD_Write_Command(0x06);DelayMS(1);LCD_Write_Command(0x01);DelayMS(1);}//********************************//获取AD转换结果(0通道)//********************************uchar GET_AD_RESULT(){uchar i;uchar dat1=0;uchar dat2=0;//起始控制位CS=0;CLK=0;DIO=1;_nop_(); _nop_();CLK=1;_nop_(); _nop_();//第一个下降沿之前,社DI=1/0//选择单端/差分(SGL\DIF)模式中的单端输入模式CLK=0;DIO=1;_nop_(); _nop_();CLK=1;_nop_(); _nop_();//第二个下降沿之前,设DI=0/1,选择CH0\CH1CLK=0;DIO=0;_nop_(); _nop_();CLK=1;DIO=1;_nop_(); _nop_();//第三个下降沿之前,设DI=1CLK=0;DIO=1;_nop_(); _nop_();//第四个至第十一个,共八个下降沿读数据(MSB_LSB) for(i=0;i<8;i++){CLK=1;_nop_(); _nop_();CLK=0;_nop_(); _nop_();dat1=dat1<<1|DIO;}//第十一个至第十八个,共八个下降沿读数据(LSB_MSB) for(i=0;i<8;i++){dat2=dat2|((uchar)(DIO)<<i);CLK=1;_nop_(); _nop_();CLK=0;_nop_(); _nop_();}CS=1;//如果MSB_LSB和LSB_MSB读取的结果相同,则返回读取的结果,否则返回0 return(dat1==dat2)?dat2:0;}//***************************//主函数//***************************void main(){uchar i;uint d;uint c;LCD_Initialise();DelayMS(10);while(1){//获取AD转换值,最大值为255对应于最高电压5.00V//本例中设计为三个显示数位,故用500d=GET_AD_RESULT()*5000.0/255;//将AD转换后的数据分解为3个数位Display_Buffer[0]=d/1000+'0';Display_Buffer[2]=d%1000/100+'0';Display_Buffer[3]=d%100/10+'0';Display_Buffer[4]=d%10+'0';Set_Disp_Pos(0x00);i=0;while(Line[i]!='\0')LCD_Write_Data(Line[i++]);Set_Disp_Pos(0x46);i=0;while(Display_Buffer[i]!='\0')LCD_Write_Data(Display_Buffer[i++]);}}。

adc0832数字电压表(程序+仿真图)

adc0832数字电压表(程序+仿真图)

adc0832数字电压表(程序+仿真图)仿真图:/*********************************包含头文件********************************/#include <reg51.h>#include <intrins.h>/*********************************端口定义**********************************/sbit CS = P3^5;sbit Clk = P3^3;sbit DATI = P3^4;sbit DATO = P3^4;sbit P20=P2^0 ;/*******************************定义全局变量********************************/unsigned char dat = 0x00; //AD值unsigned char count = 0x00; //定时器计数unsigned char CH; //通道变量unsigned char dis[] = {0x00, 0x00, 0x00}; //显示数值/*******************************共阳LED 段码表*******************************/unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90};char code tablewe[]={ 0xfd,0xfb,0xf7,0xef,0xdf,0xfe };/**************************************** ************************************函数功能:AD转换子程序入口参数:CH出口参数:dat***************************************** ***********************************/unsigned char adc0832(unsigned char CH){unsigned char i,test,adval;adval = 0x00;test = 0x00;Clk = 0; //初始化DATI = 1;_nop_();CS = 0;_nop_();Clk = 1;_nop_();if ( CH == 0x00 ) //通道选择{Clk = 0;DATI = 1; //通道0的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 0; //通道0的第二位_nop_();Clk = 1;_nop_();}else{Clk = 0;DATI = 1; //通道1的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 1; //通道1的第二位_nop_();Clk = 1;_nop_();}Clk = 0;DATI = 1;for( i = 0;i < 8;i++ ) //读取前8位的值{_nop_();adval <<= 1;Clk = 1;_nop_();Clk = 0;if (DATO)adval |= 0x01;elseadval |= 0x00;}for (i = 0; i < 8; i++) //读取后8位的值{test >>= 1;if (DATO)test |= 0x80;elsetest |= 0x00;_nop_();Clk = 1;_nop_();Clk = 0;}if (adval == test) //比较前8位与后8位的值,如果不相同舍去。

基于51单片机的数字电压表的设计与仿真

基于51单片机的数字电压表的设计与仿真
脚 连接 到一 点 ,通 过 非 门与 单 片 机 的 P . / 3 6 WR 脚
电压 信号 .系统 结 构框 图如 图 1所示 .
收 稿 日期 : 0 1— 8—1 21 0 0
相 连 ,当执行 写 片外 数据存 储 器 的指令 时 就可 以启
基 金 项 目 :安 徽 省 高 等 学 校 教 学 质 量 与 教 学 改 革 工 程 重 点 项 目 (0 0 3 6 2 1 15 )
对 P . 时取 反 输 出 5 0k z的 C K信号 ,作 为 2 7定 0 H L A C 89所 需 的 时 钟 信 号 .程 序 流 程 图 如 图 3所 D 00
刁 .
3 2 接 口程 序 .
主程序流程 图
图 3 电压 表 程 序 流 程 图
部分 程 序代码 如 下 MA N: V T D, 0 H; 时 器 工作 在方 式 2 I MO MO # 2 定
LCAL DELAY L S ETB P2. 2
图 2 数 字 电压 表 电路 原 理 图
3 系统 程序 设计
3 1 程序 设计 思路 .
定时 中断程 序流程 图
本 系 统 的程 序 设 计 主 要 包 括 初 始 化 、A D 转 / 换、 E L D显示 和定 时器 中断部 分 .定 时 中断部 分 是
片 机设计 的数 字 电压 表 可 以测 量 0—5 的直 流 电 V
A C 89具有 8路 模 拟量输 入 通道 ,通道 的选 D 00
择 由地址 线 C、 A的值 决定 , 口 A E为 地址 锁 B、 端 L 存 允许 控制 端 口 , 当输 人为 高 电平 时 ,对地 址线 C、 B、A输 人 的 地 址 信 号 进 行 锁 存 ,从 而 决 定 对 哪 路 待 测输 人 电压 值 进 行 A D转 换 .SA T为 转 换 启 / TR 动 信号 , 当输 入 1个 2 宽 的高 电平 脉 冲时 ,开 始 s 进 行 A D转 换.E C为 A D 转 换 结 束 信 号 端 口, / O / 当 A D转 换 结束 时 , 端 口输 出一个 正 脉 冲 , 信 / 该 此

ADC0832数字电压表

ADC0832数字电压表

毕业设计(论文)摘要单片计算机即单片微型计算机。

(Single-Chip Microcomputer),是集CPU ,RAM ,ROM 定时,计数和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。

近年来随着计算机在社会领域的渗透, 单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。

在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。

而51系列单片机是各单片机中最为典型和最有代表性的一种。

这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。

简易电压表是利用模拟量转换成数字量经单片机处理并反映在显示器上,它可以分析5V的电压,并能用该电压表可测出该电路的电流和电阻值。

本文介绍了电压表的使用和开发环境,仿真系统和开发使用的MCS-51系列的单片机芯片。

在第二章论述了总体设计过程,确定了技术指标及器件的选择第四章着重描述了系统硬件电路设计、硬件设计框图及所使用的各种芯片功能与特性。

关键词:电压表、单片机技术、A/D转换AbstractWith the infiltration in the social field of the c omputer in recent years, the application of the one-chip computer is moving towards deepening constantly, drive tradition is it measure crescent benefit to upgrade day to control at the same time. In measuring in real time and automatically controlled one-chip computer application system, the one-chip computer often uses as a key part, only one-chip computer respect knowledge is not enough, should also follow the structure of the concrete hardware , and direct against and use the software of target's characteristic to combine concretly, in order to do perfectly. The pressure system of much passways of simulation utilizes the pressure sensor to gather the pressure at present and reflect by display, it can analyse excessive Cheng of the pressure , sends out and reports to the police. It can be according to inputting the amount of money of calculating out the object with accurate unit price to adopt the principle of the electronic scale.This text has introduced the research meaning of this system and development environment used in the introduction at first, artificial system of the big good fortune and developing the one-chip computer chip of MCS-51 series used. Have described the overall design process in chapter two, have confirmed chapter three of choice of technical indicator and device has described emphatically that designs the block diagram and various kinds of chip functions and characteristics used in circuit design of the systematic hardware , hardware, have analyzed the design course of the software especially in chapter four.Keyword: Electric voltage form,technology of the one-chip computer , A/D change目录引言 (4)1 核心芯片简介 (5)2 AT89S51简介 (8)2.1 AT89S52芯片的引脚及特点 (8)2.2 AT89S52的主要性能参数 (11)2.3 AT89S52的新功能 (11)3 方案设计 (12)4 软硬件设计 (13)4.1 硬件电路设 (13)4.2 单片机AT89S52外围电路设计 (13)4.3 ADC0832与单片机的接口设计 (14)4.4 显示设计 (14)4.5 电源设计 (14)5 结论 (15)6 致谢 (15)7 参考文献 (16)附录一设计总电路图 (17)附录二设计总PCB图 (18)附录三电压表源程序 (19)引言电压、电流、功率是表征电信号能量大小的三个基本参量。

51单片机实现简易数字电压表(液晶显示)仿真图+程序

51单片机实现简易数字电压表(液晶显示)仿真图+程序
#include <reg51.h>
#include <lcd.c>
#include <ADC0809.c>
#define uchar unsigned char
#define uint unsigned int
void main()
{
uchar i;
ADC_init();
LCD_init();
while(1)
void LCD_w_com(uchar com)
{
while(lcd_bz());
LCD_DB=com;
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_E=1;
LCD_E=0;
delay(1);//等待执行完毕。。。
}
//===================写数据函数=================
void gotoxy(uchar x,uchar y) // x表示行,y表示列
{uchar address;
if(x==1)
address=0x80+y;
else
address=0xc0+y;
LCD_w_com(address);
}
//=========显示一个字符串==================
gotoxy(2,5);
LCD_display(c);
}
void sepr(uchar i)
{
uint ch;
ch=i;
c[0]='0'+ch/51;
c[1]='.';
c[2]='0'+(ch%51)*10/51;

adc0832数字电压表(程序+仿真图)

adc0832数字电压表(程序+仿真图)

adc0832数字电压表(程序+仿真图)仿真图:/*********************************包含头文件********************************/#include <reg51.h>#include <intrins.h>/*********************************端口定义**********************************/sbit CS = P3^5;sbit Clk = P3^3;sbit DATI = P3^4;sbit DATO = P3^4;sbit P20=P2^0 ;/*******************************定义全局变量********************************/unsigned char dat = 0x00; //AD值unsigned char count = 0x00; //定时器计数unsigned char CH; //通道变量unsigned char dis[] = {0x00, 0x00, 0x00}; //显示数值/*******************************共阳LED 段码表*******************************/unsigned char i,test,adval;adval = 0x00;test = 0x00;Clk = 0; //初始化DATI = 1;_nop_();CS = 0;_nop_();Clk = 1;_nop_();if ( CH == 0x00 ) //通道选择{Clk = 0;DATI = 1; //通道0的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 0; //通道0的第二位_nop_();Clk = 1;_nop_();}else{Clk = 0;DATI = 1; //通道1的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 1; //通道1的第二位_nop_();Clk = 1;_nop_();}Clk = 0;DATI = 1;for( i = 0;i < 8;i++ ) //读取前8位的值{_nop_();adval <<= 1;Clk = 1;_nop_();Clk = 0;if (DATO)adval |= 0x01;elseadval |= 0x00;}for (i = 0; i < 8; i++) //读取后8位的值{test >>= 1;if (DATO)test |= 0x80;elsetest |= 0x00;_nop_();Clk = 1;_nop_();Clk = 0;}if (adval == test) //比较前8位与后8位的值,如果不相同舍去。

基于ADC0832数字电压表

基于ADC0832数字电压表

阿坝师范高等专科学校电子信息工程系课程设计基于ADC0832数字电压表学生姓名任银鹏专业名称电子信息工程技术班级电信班学号20113026基于ADC0832数字电压表一、设计要求设计一个在单片机AT89S52作用下基于ADC0832数字电压表.二、系统设计方案1. 模块图2. 模块作用该电压表由单片A/D转换器构成,在很大的电压情况下,电压表去测量时会对其并联很大的电阻分掉高压,然后再进行测量,这本来很大的电压,到后来测出来的电压就会很小,这就是A/D转换实现低压电压表测量高压三、硬件原理1.LCD1602图3.1 LCD1602外观如图3.1 LCD1602外观,从LCD1602参数手册知道芯片工作电压为4.5~5.5V,工作电流20mA。

模块最佳工作电压为5V。

引脚作用说明如下表3.1:表3.1引脚作用说明从参数手册知道LCD1602与单片机8051系列连接方式如图3.2所示,LCD1602引用电路如图3.3:图3.2 LCD1602与单片机8051系列连接方式图3.3 LCD1602引用电路如图3.3 LCD1602引用电路,单片机P2口与LCD1602的7-14脚连接,单片机14脚与LCD1602的6脚连接,单片机15脚与LCD1602的4脚连接。

2. ADC0832ADC0832具有8位分辨率;双通道A/D转换;输入输出电平与TTL/CMOS相兼容;5V电源供电时输入电压在0-5V之间,工作频率为250KHz,转换时间为32us;一般功耗仅为15Mw的特点。

ADC0832芯片引脚说明如图3.4:图3.4ADC0832芯片引脚说明:cs:片选使能,低电平芯片使能;cho:模拟输入通道0,或作为IN+/-使用;ch1:模拟输入通道:1,或作为IN+/-使用;GND:芯片参考0电位;DI:数据信号输入,悬着通道控制;DO:数据信号输出,转换数据输出;CLK:芯片时钟输入;Vcc/REF:电源输入及参考电压输入。

基于ad0832的液晶显示数字电压表

基于ad0832的液晶显示数字电压表

目录第一章绪论............................................................ 错误!未定义书签。

1.1选题目的................................................................. 错误!未定义书签。

1.2设计要求................................................................. 错误!未定义书签。

1.2.1设计题目和设计指标................................. 错误!未定义书签。

1.2.2设计功能..................................................... 错误!未定义书签。

第二章总体设计及工作原理................................ 错误!未定义书签。

2.1设计原理及方案..................................................... 错误!未定义书签。

2.2总体设计................................................................. 错误!未定义书签。

第三章硬件设计及电路图. (1)3.1芯片资料介绍 (1)3.1.1 AT89C51 (1)3.1.2 AD0832 (1)3.2单片机对 ADC0832 的控制原理 (3)3.3 LCD显示模块 (3)3.4时钟电路 (4)3.5电压调节部分 (4)3.6复位电路 (5)3.7系统原理图 (5)第四章系统程序设计 (6)4.1软件总体框架设计 (6)4.2系统子程序设计 (7)4.2.1初始化程序 (7)4.2.2A/D转换子程序 (7)收获和体会 (10)致谢 (11)参考文献 (12)附录1 (13)附录2完整程序代码 (14)原件清单 (31)第三章硬件设计及电路图3.1芯片资料介绍3.1.1 AT89C51AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。

基于ADC0832的数字电压表

基于ADC0832的数字电压表

//基于ADC0832的数字电压表#include<reg51.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件//ADC0832端口引脚定义sbit CS=P3^0; //将CS位定义为P3.0引脚sbit CLK=P3^6; //将CLK位定义为P3.6引脚sbit DIO=P3^7; //将DIO位定义为P3.7引脚//全局变量声明unsigned char code digit[10]={"0123456789"}; //定义字符数组显示数字unsigned char code Str[]={"Volt="}; //说明显示的是电压//液晶端口定义sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚/*****************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delaynms(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。

adc0832做的数字电压表

adc0832做的数字电压表

#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define _rrca_() CY = ACC & 0x01 //产生RRC A指令#define _rlca_() CY = ACC & 0x80 //产生RLC A指令sbit bADcs=P1^4;sbit bADcl=P1^5;sbit bADda=P1^6;sbit flag=P1^7;sbit str=P2^7;sbit d=P2^6;sbit clk=P2^5;bit choose=0;unsigned char data1;unsigned char count;unsigned char cycle;uint ge,xiao1,xiao2;unsigned long data2;//无小数点const uchar table1[17]={0x81,0xed,0x43,0x49,0x2d,0x19,0x11,0xcd,0x01,0x09,0x71,0x31,0x93,0x61,0x13,0 x17,0xff};//有小数点const uchar table2[17]={0x80,0xec,0x42,0x48,0x2c,0x18,0x10,0xcc,0x00,0x08,0x70,0x30,0x92,0x60,0x12,0 x16,0xff};uchar buffer[4]={0x00,0x00,0x00,0x00};void Delayus(uchar i){while(--i);}void display(void){uchar bit_count=0;uchar table_counter=0;uchar byte_counter=0;uchar temp_i=0;buffer[0]=xiao2;buffer[1]=xiao1;buffer[2]=ge;buffer[3]=0x00;//led_str_off;//先清零str=0;//led_clk_off;clk=0;for(byte_counter=0;byte_counter<4;byte_counter++) {bit_count=8;if(byte_counter==2)temp_i=table2[buffer[byte_counter]];elsetemp_i=table1[buffer[byte_counter]];// nop;while(bit_count>0){if((temp_i&0x80)==0){//led_d_off;d=0;}else{//led_d_on;d=1;}temp_i=(temp_i<<1);// nop;//led_clk_on;clk=1;// nop;//led_clk_off;clk=0;// nop;bit_count--;}}//led_str_on;str=1;}/*void ad(){choose=0;count = 0;bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.bADcl = 0;bADda = 1;//在第1 个时钟脉冲的下沉之前DI端必须是高电平.bADcl = 1;bADcl = 0;//pulse 1 downbADda = 1;bADcl = 1; bADcl = 0;//pulse 2 downif(choose == 0)bADda = 0;elsebADda = 1;bADcl = 1; bADcl = 0;//pulse 3 downbADcl = 1; bADcl = 0;//pulse 4 down//bADcl = 1;for(cycle = 8; cycle > 0; cycle-- ){bADda = 1;//bADcl = 0;//pulsebADcl = 1;CY = bADda;_rlca_(); //RRC AbADcl = 0;//pulse}data1= ACC;for(cycle = 8; cycle > 0; cycle-- ){bADda = 1;bADcl = 1;CY = bADda;_rrca_();//RLC AbADcl = 0;//pulse}//bADcl = 0;//pulse} */void ad(void){ uchar i;//data1=0;bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.bADcl=0;bADda=1;bADcl=1;bADcl=0;//i downbADda=1;bADcl=1;bADcl=0; // 2 downbADda=0;bADcl=1;bADcl=0; // 3 downbADda=1;bADcl=1;bADcl=0; // 4 downfor(i=8;i>0;i--){data1<<=1;bADcl=0;bADcl=1;if(bADda==1) data1|=0x01;bADda=1;}/* for(i=8;i>0;i--){bADcl=0;bADcl=1;} */bADcs=1;}void cal(){data2=((ulong)data1*493)/256; ge=data2/100;xiao1=(data2%100)/10;xiao2=data2%10;}main(){flag=1;while(1){ad();cal();display();}}。

基于51单片机和DAC0832的信号源(proteus电路图加程序)

基于51单片机和DAC0832的信号源(proteus电路图加程序)

基于51单⽚机和DAC0832的信号源(proteus电路图加程序)班级学号⾃动测试实验报告学院机电⼯程学院专业测控技术与仪器导师姓名吕晓洲学⽣姓名学号摘要本⽂介绍了以8051和DAC0832为核⼼的信号源,可以通过按键选择正弦波、⽅波、三⾓波、锯齿波和梯形波,也可以通过按键选择798.6Hz、266.2Hz、88.7Hz、29.6Hz、9.85Hz、3.3Hz、1.1Hz共九档频率。

波形和频率通过软件改变,幅值通过硬件放⼤的放⼤器改变。

本信号源具有结构简单、功能丰富、使⽤⽅便另外价格实惠等特点。

【关键词】单⽚机,8051,DAC0832,信号源,频率,波形⼀.实验要求以及⽅案选择1.实验要求:设计⼀个信号源,能产⽣正弦波、三⾓波、锯齿波、⽅波等简单的波形,能够⽅便改变波形和频率。

2.⽅案选择:⽅案⼀:完全由硬件电路制作,使⽤传统的锁相频率合成⽅法。

通过芯⽚IC145152,压控振荡器搭接的锁相环电路输出稳定性极好的正弦波,再利⽤过零⽐较器转换成⽅波,积分电路转换成三⾓波。

此⽅案,电路复杂,⼲扰因素多,不易实现。

⽅案⼆:直接利⽤波形产⽣芯⽚,例如,利⽤MAX038芯⽚组成的电路输出波形。

MAX038是精密⾼频波形产⽣电路,能够产⽣准确的锯齿波、三⾓波、⽅波和正弦波四种周期性波形。

但此⽅案成本⾼,程序复杂度⾼。

⽅案三:通过单⽚机控制DAC,输出五种波形。

此⽅案输出的波形分辨率不够⾼,频率有限。

但此⽅案电路简单、成本低,波1.80C51单⽚机80C51单⽚机属于MCS-51系列单⽚机,由Intel公司开发,其结构是8048的延伸,改进了8048的缺点,增加了如乘(MUL)、除(DIV)、减(SUBB)、⽐较(CMP)、16位数据指针、布尔代数运算等指令,以及串⾏通信能⼒和5个中断源。

采⽤40引脚双列直插式DIP(Dual In Line Package),内有128个RAM单元及4K的ROM。

它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接⼝制作在⼀块集成电路芯⽚中,从⽽构成较为完整的计算机、⽽且其价格便宜。

基于51单片机的ADC0832电压采样,12864液晶显示的Proteus仿真

基于51单片机的ADC0832电压采样,12864液晶显示的Proteus仿真

基于51单片机的ADC0832电压采样,12864液晶显示的Proteus仿真(1:源程序2:Proteus 仿真)1源程序:#include <reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define delay4us() {_nop_();_nop_();_nop_();_nop_();}//ADC0832引脚定义sbit CS=P1^0;sbit CLK=P1^1;sbit DIO=P1^2;//LCD1602端口定义sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;//一位整数,两位小数的数字电压显示缓冲uchar Display_Buffer[]="0.00V";//LCD第一行显示的信息uchar code Line1[]="Current V oltage:";//延时子程序void DelayMS(uint ms){uchar t;while(ms--)for(t=0;t<120;t++);}//LCD忙状态检测bit LCD_Busy_Check(){bit result;RS=0;RW=1;E=1;delay4us();result=(bit)(P0&0x80);E=0;return result;}//写LCD命令void LCD_Write_Command(uchar cmd){while(LCD_Busy_Check()); //判断LCD是否忙碌RS=0;RW=0;E=0;_nop_();_nop_();P0=cmd;delay4us();E=1;delay4us();E=0;}//设置LCD显示位置void Set_Disp_Pos(uchar pos){LCD_Write_Command(pos|0x80);}//写LCD数据void LCD_Write_Data(uchar dat){while(LCD_Busy_Check()) ; //判断LCD是否忙碌RS=1;RW=0;E=0;P0=dat;delay4us();E=1;delay4us();E=0;}//LCD初始化void LCD_Initialise(){LCD_Write_Command(0x38);DelayMS(1);LCD_Write_Command(0x0C);DelayMS(1);LCD_Write_Command(0x06);DelayMS(1);LCD_Write_Command(0x01);DelayMS(1);}//获取AD转换结果uchar Get_AD_Result(){uchar i,dat1=0,dat2=0;//起始控制位CS=0;CLK=0;DIO=1;_nop_();_nop_();CLK=1;_nop_();_nop_();//第一个下降沿之前,设Di=1/0//选择单端/差分(SGL/DIF)模式中的单端输入模式CLK=0;DIO=1;_nop_();_nop_();CLK=1;_nop_();_nop_();//第二个下降沿之前,设DI=0/1,选择CH0/CH1CLK=0;DIO=0;_nop_();_nop_();CLK=1;DIO=1;_nop_();_nop_();//第三个下降沿之前,设DI=1CLK=0;DIO=1;_nop_();_nop_();//第4-11,共8个下降沿读数据(MSB=>LSB) for(i=0;i<8;i++){CLK=1;_nop_();_nop_();CLK=0;_nop_();_nop_();dat1=dat1<<1|DIO;}//11-18,共8个下降沿读数据(LSB=>MSB)for(i=0;i<8;i++){dat2=dat2|((uchar)(DIO)<<i);CLK=1;_nop_();_nop_();CLK=0;_nop_();_nop_();}CS=1;//如果MSB->LSB和LSB->MSB读取的结果相同,则返回读取的结果,否则返回0 return (dat1==dat2)?dat1:0;}/*主程序*/void main(){uchar i;uint d; //注意d的类型LCD_Initialise();DelayMS(10);while(1){//获取AD转换值,最大值255对应于最高电压5.00V//本例中设计为显示三个位数,故使用500d=Get_AD_Result()*500.0/255;//将AD转换后的数据分成3个数位Display_Buffer[0]=d/100+'0';Display_Buffer[2]=d/10%10+'0';Display_Buffer[3]=d%10+'0';Set_Disp_Pos(0x01); //设置显示位置i=0;while(Line1[i]!='\0')LCD_Write_Data(Line1[i++]); //设置第一行字符串Set_Disp_Pos(0x46); //设置显示位置i=0;while(Display_Buffer[i]!='\0')LCD_Write_Data(Display_Buffer[i++]); //设置第二行字符串}}2:Proteus 仿真如下:。

ADC0832数字电压表

ADC0832数字电压表

信息与电气工程学院单片机应用系统(三级项目)设计说明书(2014/2015学年第二学期)题目:数字电压表设计与实现目录一、课程设计目的...................................................................................................................... - 1 -二、课程设计正文...................................................................................................................... - 1 -2.1 总体论述...................................................................................................................... - 1 -2.2 设计方案...................................................................................................................... - 2 -2.3 硬件元器件的选择与设计.......................................................................................... - 2 -2.3.1 AT89C51模块................................................................................................... - 2 -2.3.2 A/D数据转换模块........................................................................................... - 5 -2.3.3 LCD显示系统设计........................................................................................... - 7 -2.4 程序设计总方案.......................................................................................................... - 9 -2.4.1. 初始化程序.................................................................................................... - 9 -2.4.2显示子程序...................................................................................................... - 9 -2.4.3A/D转换子程序................................................................................................ - 9 -三、软件调试与仿真................................................................................................................ - 11 -3.1软件调试..................................................................................................................... - 11 -3.2数字电压表仿真......................................................................................................... - 11 -四、课程设计总结.................................................................................................................... - 11 -五、参考文献............................................................................................................................ - 12 - 附录 ........................................................................................................................................... - 13 -数字电压表设计与实现一、课程设计目的电压表已经有100多年的发展历史,虽然不断改进与完善,仍然无法满足现代电子测量的需求,近二十年,微电子技术,计算机技术,集成技术,网络技术等高新技术得到了迅猛发展。

ADC0832的数字电压表设计说明

ADC0832的数字电压表设计说明

目录1. 引言 (1)2. 方案设计 (1)2.1设计要求 (1)2.2设计方案 (1)3. 硬件设计 (2)3.1单片机最小系统 (2)3.2显示驱动部分 (2)3.3转换电路 (3)3.4单片机驱动部分 (3)4. 软件设计 (4)4.1软件流程 (4)4.2子程序模板 (5)5实验结果与讨论 (5)5.1实验仿真 (5)5.2结果讨论 (5)6心得体会 (6)7参考文献 (13)8附录8.1程序 (7)8.2原理图 (7)1. 引言随着片机技术的飞速发展,,现代的电子产品几乎渗透到了社会的各个领域,有力地推动了社会生产力的发肢和社会信息化程度的提商,人们为了寻求最好的科技,为了方便人类在使用科技产品的快速性,准确性。

例如数字电压表能够准确的,快速的量出电压。

利用ADC0832和AT89C52的结合再通过LCD来显示出来。

ADC0832是一个8位D/A转换器。

单电源供电,从+5V〜+15V均可正常工作。

基准电压的围为土10V;电流建立时间为1卩S; CMOS:艺,低功耗20mWADC0832 转换器芯片为20引脚,双列直插式封装。

该转换器由输入寄存器和DAC寄存器构成两级数据输入锁存。

使用时数据输入可以采用两级锁存(双锁存)形式,或单级锁存(一级锁存,一级直通)形式,或直接输入(两级直通)形式。

2. 方案设计2.1设计要求按系统要实现功能,设计必须达到以下的几个步骤的要求(1)主电路系统是由ADC0832单片机AT89C52和LCD显示屏组成。

(2)ADC083是模拟数字转换芯片,是将外侧电压信号转换成数字信号再通过AT89C52处理,再通过LCD显示出来(3)能测量0-5V的数字电压(4)测量误差不大于0.1V2.2设计方案2.1.1 单片机的选择本设计选用单片机AT89C52它是一种带8K字节闪烁可编程可擦除只读存储器的低电压,足够本设计之用,高性能CMOS位微处理器该器件采用ATME高密度非易失存储器制造技术制造,与工业标准的MCS-51指令系统及8052产品引脚兼容,功能强大、使用方便的AT80C52单片机适用于许多较为复杂的应用场合。

用ADC0832设计的两路电压表protues仿真

用ADC0832设计的两路电压表protues仿真
delay(1);
LCD_write_cmd(0x0c);
delay(1);
LCD_write_cmd(0x06);
delay(1);
LCD_write_cmd(0x01);
delay(1);
}
#endif
#ifndef _ADC0832_H_
#define_ADC0832_H_
uchar ADC_read_data(uchar ch)
{
if(j==0)
add=0x00;
else
add=0x40;
ADC_change(j);
LCD_buffer[j][8]=dat/100+'0';
LCD_buffer[j][10]=dat/10%10+'0';
LCD_buffer[j][11]=dat%10+'0';
LCD_display(add,LCD_buffer[j]);
delay_us();
clk=1;
delay_us();
/*********二,三个下降沿选择通道1***********************沿之前,设DIO=1
delay_us();
for(i=0;i<8;i++)//第4~11共8个下降沿读数据(MSB->LSB)
delay(2);
en=0;
delay(2);
}
void LCD_display(uchar add,uchar s[])
{
uchar i;
LCD_write_cmd(0x80+add);
for(i=0;i<16;i++)

基于ADC0832的数字电压表设计报告

基于ADC0832的数字电压表设计报告

基于ADC0832的数字电压表设计报告设计题目:基于ADC0832数字一路电压表电路设计专业班级:电气工程及其自动化1024 学号:22 、32 、21姓名:杨青涛、康爱丽、孟广琴指导教师:瓮嘉民目录基于ADC0832的一路数字电压表设计 (3)1、电压表设计原理图 (3)2、PROTEUS仿真图 (4)3、原理图 (5)4、PCB图 (6)5、实物图 (7)6、报告 (8)1、设计方案 (8)2、电路特色 (9)3、功能介绍 (10)4、流程图、 (11)5、1感受(康爱丽) (13)5、2感受(孟广琴) (14)5、3感受(杨青涛) (15)6 参考资料 (16)基于ADC0832的一路数字电压表设计1、电压表设计原理图2、proteus仿真图5、实物图第二组:杨青涛孟广琴基于ADC0832的一路数字电压表设计康爱丽6、报告1、设计方案通过一个A/D(ADC0832模拟数字转换)芯片采集后将外测电压信号转换为数字信号,再由单片机(AT89S52)处理信号,输出信号,由LCD1602显示各路电压。

89S52引脚图2、电路特色设计以单片机at89s52芯片为核心的简单电压测量电路,它由5V直流电源供电。

在硬件方面,通过可变电阻调节输入电压的变化来反映检测到的电压变化。

通过A/D转换后数字量在单片机at89s52处理在转换成相应的实际电压,通过LCD1602显示器进行显示。

LCD 显示电压实现零辐射、低功耗、散热小、体积小、图像还原精确、字符显示锐利等。

3、功能介绍该电压表由单片A/D转换器构成,在很大的电压情况下,电压表去测量时会对其并联很大的电阻分掉高压,然后再进行测量,这时本来很大的电压,到后来测出来的电压就会很小,这就是A|D转换实现低压电压表测量高压液晶与89S52的接口4、流程图、(1)主程序(2)液晶模块电压显示流程图(3 ) 电压显示5、1感受(康爱丽)问1:while(1){}部分的流程图咋画?答1:这段语句说明结构体是一个死循环,这样就该明白咋画了问2:画循环时需要在横线上添加Y和N该咋添加?答2:经百度查询后我明白了一般只有封闭图形才可以直接添加文字的,比如矩形,这个问题还得用文本框解决,具体方法是设置文本框属性线条颜色和填充颜色都设置为无;这样就可以实现了。

ADC0832程序完整版 源码+Proteus仿真

ADC0832程序完整版 源码+Proteus仿真

前段时间一直在为ADC0832的程序感到疑惑,从网上找了很多的代码,用Proteus仿真,最后都出现了一些奇怪的问题,有的根本没法读取数据,有的数据有错误。

当参考电压为5V时,如果把输入电压从0一直调到5V,读取的数据应该是从0到255,2.5V时应该是128。

但是我发现一些源码在输入0~2.5V时读取出来的是0~255,到2.5V时读取的数据为0,从2.5到5V,读出的值又从0增加到255,始终不正确。

今天下午特地查阅的ADC0832英文原版的DataSheet,又参考了一篇中文文档,终于写出了其完整的程序,并且先后读取了MSB FIRST DATA和LSB FIRST DATA,进行比较,如果两个数据相等,返回读取的数据,否则返回0,这样可以避免读取发生错误,更稳定可靠。

并通过了Proteus 仿真。

下图是ADC0832的时序图:其中T-SetUp为250ns,由于使用的是51单片机,晶振11.0592MHz,机器周期比这个值大,可以不考虑,但为了防止出现异常,还是延时了两个机器周期。

注意在第11个时钟下降沿之后,DO上的电平既是MSB FIRST 输出的最后一位,又是LSB FIRST输出的第一位。

以下是读取ADC0832的代码。

[cpp] view plaincopysbit CS_0832 = P1^0;sbit CLK_0832 = P1^1;sbit DO_0832 = P1^2; // DI、DO不同时有效,可共用一个接口sbit DI_0832 = P1^2;extern void _nop_ ( void );#define pulse0832() _nop_();_nop_();CLK_0832=1;_nop_();_nop_();CLK_0832=0//把模拟电压值转换成8位二进制数并返回unsigned char read0832(){unsigned char i, ch = 0, ch1 = 0;CS_0832=0; // 片选,DO为高阻态DI_0832=1;// 此处暂停T-SetUp: 250ns (由pulse0832完成)pulse0832(); // 第一个脉冲,起始位,DI置高DI_0832=1;pulse0832(); // 第二个脉冲,DI=1表示双通道单极性输入DI_0832=1;pulse0832(); // 第三个脉冲,DI=1表示选择通道1(CH2)// 51单片机为准双向IO口:应先写入1再读取DI_0832=1;// MSB FIRST DATAfor(i = 0; i < 8; ++i) {pulse0832();ch <<= 1;if(DO_0832==1)ch |= 0x01;}// MSB FIRST输出的最后一位与LSB FIRST输出的第一位是在// 同一个时钟下降沿之后,故此处先执行读取,后执行pulse // LSB FIRST DATAfor(i = 0; i < 8; ++i) {ch1 >>= 1;if(DO_0832==1)ch1 |= 0x80;pulse0832();}CS_0832=1; // 取消片选,一个转换周期结束return (ch==ch1) ? ch : 0; // 返回转换结果}更多datasheet搜索: 。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

仿真图:
/*********************************包含头文件********************************/ #include <reg52.h>
#include <intrins.h>
/*********************************端口定义**********************************/ sbit CS = P3^5;
sbit Clk = P3^3;
sbit DATI = P3^4;
sbit DATO = P3^4;
sbit P20=P2^0 ;
/*******************************定义全局变量********************************/ unsigned char dat = 0x00; //AD值
unsigned char count = 0x00; //定时器计数
unsigned char CH; //通道变量
unsigned char dis[] = {0x00, 0x00, 0x00}; //显示数值
/*******************************共阳LED段码表*******************************/ unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char code tablewe[]={ 0xfd,0xfb,0xf7,0xef,0xdf,0xfe };
/**************************************************************************** 函数功能:AD转换子程序
入口参数:CH 出口参数:dat
****************************************************************************/ unsigned char adc0832(unsigned char CH)
{
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0; //初始化
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if ( CH == 0x00 ) //通道选择
{
Clk = 0;
DATI = 1; //通道0的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0; //通道0的第二位
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1; //通道1的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1; //通道1的第二位
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ ) //读取前8位的值{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++) //读取后8位的值
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test) //比较前8位与后8位的值,如果不相同舍去。

若一直出现显示为零,请将该行去掉
dat = test;
_nop_();
CS = 1; //释放ADC0832
DATO = 1;
Clk = 1;
return dat;
}
/**************************************************************************** 函数功能:延时子程序
****************************************************************************/ void delay(void)
{
int k;
for(k=10;k<500;k++);
}
/**************************************************************************** 函数功能:将0-255级换算成0.00-5.00的电压数值
****************************************************************************/ void convdata(unsigned char i)
{
dis[0] = i/51; //个位
dis[1] = (i%51)*10/51*2; //小数点后第一位
dis[2] = ((i%51)*10%51)*10/51*2; //小数点后第二位
}
/**************************************************************************** 函数功能:数码管显示子程序
****************************************************************************/ void display(void)
{
P2=0xff;
P0=tab[dis[0]] & 0x7f; //显示个位和小数点
delay();
P2=0xfd;
P2=0xff;
P0=tab[dis[1]]; //显示小数点后第一位
delay();
P2=0xfb;
P2=0xff;
P0=tab[dis[2]]; //显示小数点后第二位
delay();
P2=0xf7;
P2=0xff;
P0=0xff; //显示小数点后第二位
delay();
P2=0xfe;
}
/**************************************************************************** 函数功能:主程序
****************************************************************************/ void main(void)
{
P2=0xff; //端口初始化
P0=0xff;
delay();
CH = 0x00; //在这里选择通道0x00或0x01
TMOD = 0x01; //设置中断
TH0=(65536-50000)/256;//定时器1初值定时50ms
TL0=(65536-50000)%256;
IE = 0x82;
TR0 = 1;
while(1) //主循环
{ dat = adc0832(CH);
convdata(dat); //数据转换
display(); //显示数值
}
}
/**************************************************************************** 函数功能:定时器中断延时程序这一段的作用时隔一段时间抽样一次否侧显示的最后一位
会不稳定
**************************************************************************** void timer0(void) interrupt 1
{
TMOD = 0x01;
TH0=(65536-50000)/256;//定时器1初值定时50ms
TL0=(65536-50000)%256;
IE = 0x82;
TR0 = 1;
count++;
if (count == 0x01)
{
count = 0x00;
dat = adc0832(CH);
}
}。

相关文档
最新文档