单片机+ADC0832简易数字电压表proteus仿真与程序源码

发布者:CW13236066525最新更新时间:2019-12-05 来源: 51hei关键字:单片机  ADC0832  简易数字电压表  proteus仿真 手机看文章 扫描二维码
随时随地手机看文章

ADC0832电压表仿真原理图如下

单片机电压表源程序如下:

#include

#include


#define uint unsigned int

#define uchar unsigned char

        

sbit CS =P3^4;              //片选使能端

sbit DI =P1^1;               //数据信号输入端,选择通道控制(SIG/DIF和ODD/EVEN)

sbit DO =P1^1;             //数据输出端

sbit CLK =P1^0;           //时钟脉冲


sbit S_1 = P2^3;

sbit S_2 = P2^4;

sbit S_3 = P2^5;

sbit S_4 = P2^6;


unsigned char wd[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //不带小数点的段选码

unsigned char yd[]={0x40,0x79,0x024,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的段选码


// ===========延时子程序=================

void delay_ms(unsigned int x) 

{

        unsigned int i,j;

        for(i=0;i             for(j=0;j<123;j++);              //延时1ms

}

/*=============读ADC0832函数=============*/

/*=============采集并返回=================*/

unsigned int Adc0832(unsigned char channel)  //AD转换,返回结果

{

    uchar i=0;   

                uchar j;

                uint dat=0;            //正向输入数据

                uchar ndat=0;       //反向输入数据

//****************初始化操作**************

                if(channel==0)channel=2;     //10B对应SGL/DIF=1,ODD/EVEN=0

                if(channel==1)channel=3;     //11B对应SGL/DIF=1,ODD/EVEN=1

//****************写操作,将通道数据写入ADC0832**************

           DI=1; _nop_();_nop_();     //发起始位,固定为1(1位)

                 CS=0;_nop_();_nop_();     //拉低CS端,让ADC0832使能

                 CLK=1;_nop_();_nop_();   //拉高CLK端,DI端的数据移入ADC0832内部的多路移位寄存器

                 CLK=0;_nop_();_nop_();    //拉低CLK端,形成下降沿1,第一个周期开始

                 CLK=1;    //拉高CLK端,在第一个时钟周期内,DI为高电平,表示启动位

                                         //紧接着输入两位配置位进行通道选择

                        DI=channel&0x1;_nop_();_nop_(); //假设选取通道0,则10&01=0,即SGL/DIF=0,为差分输入(2位)

                        CLK=0;_nop_();_nop_();    //拉低CLK端,形成下降沿2,第二个周期开始

                        CLK=1;                                //拉高CLK端

                        DI=(channel>>1)&0x1;_nop_();_nop_();  //假设选取通道0,则01&01=1,ODD/EVEN=1,表示通道0

            CLK=0;                                 //拉低CLK端,形成下降沿3

                        DI=1;_nop_();_nop_();        //控制命令结束 

                        dat=0;

                //*************读操作,将AD转换的数从DO口输出****************

                        for(i=0;i<8;i++)   //每一个CLK下降沿输出一位数,先输出高位

                        {

                                 dat|=DO;    //收数据,“|”位或,如果2位中有一位为1,则结果为1,否则为0

                                 CLK=1;_nop_();_nop_();

                                 CLK=0;_nop_();_nop_();      //形成一次时钟脉冲

                                 dat<<=1;

                                 if(i==7)dat|=DO;

                        } 

                        

                        for(i=0;i<8;i++)  //每一个CLK下降沿输出一位数,先输出低位

                        {

                                 j=0;

                                 j=j|DO;    //收数据

                                 CLK=1;_nop_();_nop_();

                                 CLK=0;_nop_();_nop_();    //形成一次时钟脉冲

                                 j=j<<7;

                                 ndat=ndat|j;

                                 if(i<7)ndat>>=1;

                        }

//*********************结束AD转换,并返回转换的数***********************

                        CS=1;     //拉低CS端

                        CLK=0;   //拉低CLK端

                        DO=1;     //拉高数据端,回到初始状态

                        dat<<=8;

                        dat|=ndat;

                        return(dat);            //返回数据

                        }

//============数码管显示函数==========================

        void display(uchar p)                  //数码管显示函数

        {

        uchar S1,S2,S3;


        S1=p/51;                       //个位

        S2=(p*10/51)%10;        //十分位

        S3=(p*100/51)%10;      //百分位

                

        //个位

        S_1 = 1;                 //第一个数码管

        S_2 = 0;

        S_3 = 0;

        S_4= 0;

        P0=yd[S1];             //选取带有小数点的段选码

        delay_ms(5);               //延时

        S_1 = 0;                        //消隐

                

  //十分位

        S_1 = 0;

        S_2 = 1;                   //取第二个数码管

        S_3= 0;

        S_4= 0;

        P0=wd[S2];              //选取不带有小数点的段选码

  delay_ms(5);

        S_2 = 0;                    //消隐

        

  //百分位

        S_1 = 0;

        S_2 = 0;

        S_3= 1;                      //取第三个数码管

        S_4= 0;

        P0=wd[S3];                //选取不带有小数点的段选码

        delay_ms(5);  

  S_3= 0;                       //消隐

        }

//===========主函数================

        int main(void)

{

        while(1)                    //无限循环

        display(Adc0832(0));//数码管显示

//Adc0832(0):选择通道0,单端模式

//调用Adc0832(0),SIG/DIF=0,ODD/EVEN=1,表示工作在差分输入方式,且CH0为-,CH1为+

……………………



关键字:单片机  ADC0832  简易数字电压表  proteus仿真 引用地址:单片机+ADC0832简易数字电压表proteus仿真与程序源码

上一篇:单片机全自动洗衣机程序+仿真+原理图设计调试与分析
下一篇:51单片机之4位数加法计算器的设计报告

推荐阅读最新更新时间:2024-11-13 13:25

基于单片机的出租车计价器设计
01项目介绍 随着城市交通的日益繁忙,出租车行业的规范化和精确化管理需求愈发凸显。出租车计时器应运而生,作为这一需求背景下的产物。本设计采用 51 单片机作为出租车计时器的控制核心,分为主控模块和执行模块,实现车程计时、费用计算、里程显示、票据打印等功能。在硬件部分,使用高精度时钟芯片、GPS 定位模块、热敏打印机、数码管显示屏,不仅能够实现精准计时和定位以确保数据的准确性,而且稳定性高、适应性强、维护成本低。在软件部分,采用自顶向下的结构化编程思想,以推动系统朝着智能化和高效化方向发展。测试结果表明,本系统的各项功能均达到了设计预期 02 摘要 本电路以 89S51 单片机为核心,巧妙搭配 A44E 霍尔传感器进行精准测距,
[单片机]
关于单片机的C语言编程基础知识(初学注意)
80C51上的C语言编程 C51的特色: (1)学习过C语言的同学在对单片机有了基本了解之后,就可以开始试着写一两个基于单片机的C语言的程序了。C51语言继承了ANSI C 的绝大部分的特性,基本的语法相同,同学们上手会比较快。但是,由于C51语言是对硬件进行控制的编程语言,其本身又在硬件结构上有所扩展以增强C语言对硬件的控制,如关键字sbit,data,code等(后面会讲他们是做什么的)。 (2)因为单片机不是我们平时用的计算机,他的英文名为MCU(微控制器),特点体现在这个“微”字。因而,它里面的硬件资源是非常少的,所以你在写程序的时候就要注意对RAM(存储数据)和ROM(存储程序)的使用。说白了,就是也程序的时候要
[单片机]
AVR单片机闪烁灯程序-第一个程序
自从无线通信完成后我没做什么,而是把AVR的学习列上日程,AVR的学习我是纯手工打造,所有的实验板全部自己焊接,因为用51习惯了,他是那么的方便,到AVR这却是一件很简单的事情显得如此复杂,那下载来说吧,51的ISP是通过串口直接写到FLASH,而AVR的还要设置熔丝位,如果搞不好芯片锁死就完蛋了,至少我的水平是够呛解决的。遇到的第一个问题是价格,AVR的价格比51的贵将近2-5倍,我选的是16L,因为他的FLASH足够我这种菜鸟用的,16KB,另一个是他的宽电压,以前51就没有这个优势,最重要的其实学哪种都无所谓,编程吗,其实就是一个中心思想的问题,只要你有好的算法,用什么语言描述就无关紧要了,关键AVR有个架构是不同于51的,
[单片机]
基于瑞萨单MCU的智能照明平台解决方案
  本文主要介绍了世强电讯基于瑞萨(Renesas)电子为照明应用贴身打造的的高性能78K0/Ix2系列MCU开发的智能照明平台解决方案,该方案在硬件、软件方面满足中高端照明产品智能化调光控制和组网的需求,具有高性能、低成本的优势。    一、照明技术现状   随着照明工业的迅速发展,出现了越来越多的照明控制方案,电源的设计、灯的驱动电路、安全保护、管理接口等各方面都变得愈加灵活。目前,照明技术主要包括主流的荧光灯、LED灯和HID技术等,其广泛应用使电源驱动的拓扑结构差异非常大,从常见的Flyback、Buck、Boost以及延伸出来的其他结构都在被大量使用,产品设计是否采用先进的数字节能控制设计,是否支持flyback、B
[单片机]
基于瑞萨单<font color='red'>MCU</font>的智能照明平台解决方案
单片机键盘的应用
作业1:数码管前三位数显示一个跑表,从000到999,之间以百分之一秒的速度运行,当按下key1时跑表停止,再次按下时跑表开始 #include reg52.h #define uint unsigned int #define uchar unsigned char sbit dula =P2^6; sbit wela = P2^7; sbit key1 = P3^7; uchar aa,flag,bai,shi,ge,tt; uint num,bb; void init(); void keyscan(); void delay(uint z); void display(uchar bai,uchar shi,uc
[单片机]
单片机报时控制器
原理说明   本例所设计的是一个具有报时功能及作息时间控制钟。它利用SPCE061A 单片机 的2 Hz 时基计时,进行年历计算,并用SPCE061A的语音功能将它报出来;在进行时间计算,分每加1时,都与规定的作息时间比较,如果相等则进行相应的控制或动作。本例中假定某高校的作息时间如下所示: 08:00-------08:50 第一节课 09:00-------09:50 第二节课 09:52-------10:05 课间操 10:10-------11:00 第三节课 01:10-------12:00 第四节课 12:00-------13:30 午间休息 13:30-------14:20 第五节课 14:30------
[单片机]
<font color='red'>单片机</font>报时控制器
单片机用switch语句控制一个点阵滚动显示文字
PROTEUS仿真电路图: 电路图原理: 用74LS138译码器控制点阵的阴极端口,P2口控制阳极端口,也即是字形代码输入端。 仿真效果图: C语言程序代码: #include REGX51.H #include at89x51.h sbit a=P1^0; sbit b=P1^1; sbit c=P1^2; unsigned char code hua = { 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x3E,0x8,0x8,0x8,0x8,0x3E,0x0, 0x0,0x66,0x99,0x81,0x42,0x24,0x18,0x0, 0x0,0x24,0
[单片机]
<font color='red'>单片机</font>用switch语句控制一个点阵滚动显示文字
如何对GD32 MCU进行加密?
GD32 MCU有哪些加密方法呢?大家在平时项目开发的过程中,最后都可能会面临如何对出厂产品的MCU代码进行加密,避免产品流向市场被别人读取复制。 下面为大家介绍GD32 MCU所支持的几种常用的加密方法: 首先GD32 MCU本身支持防硬开盖破解的功能,GD32 MCU内部Flash直接硬开盖破解读取的数据无法在同型号的产品上运行,因为GD32 MCU内部Flash物理地址和逻辑地址是随机加密的,因而可以有效防止硬破解读取代码的可能,这是GD32 MCU本身支持的,无需使用者进行配置; 可以设置读保护,GD32 MCU支持读保护设置,有些MCU支持低保护等级,设置读保护后,通过ISP出厂BOOTLOADER或者SWD端口均无
[单片机]
如何对GD32 <font color='red'>MCU</font>进行加密?
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved