设计分享|单片机电压表模拟

2022-07-27 19:10:23 浏览数 (1)

具体实现功能

具体功能:

通过滑动变阻器和ADC0832模块对电压值进行采样,反馈电压值通过数码管进行显示,电压范围为0-5V,如图所示表示电压为3.92V。

设计介绍

单片机介绍

51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。

设计思路

文献研究法:搜集整理相关单片机智能手环系统相关研究资料,认真阅读文献,为研究做准备;

调查研究法:通过调查、分析、具体试用等方法,发现单片机智能手环系统的现状、存在问题和解决办法;

比较分析法:比较不同单片机智能手环系统的具体原理,以及同一类传感器性能的区别,分析单片机智能手环系统的研究现状与发展前景;

软硬件设计法:通过软硬件设计实现具体硬件实物,最后测试各项功能是否满足要求。

设计内容

01

仿真图

本设计利用protues8.7软件实现仿真设计,具体如图。

Protues也是在单片机仿真设计中常用的设计软件之一,通过设计出硬件电路图,及写入驱动程序,就能在不实现硬件的情况进行电路调试。另外,protues还能实现PCB的设计,在仿真中也可以与KEIL实现联调,便于程序的调试,且支持多种平台,使用简单便捷。

02

程序

本设计利用KEIL5软件实现程序设计,具体如图。作为本科期间学习的第一门编程语言,C语言是我们最熟悉的编程语言之一。当然,由于其功能强大,C语言是当前世界上使用最广泛、最受欢迎的编程语言。在单片机设计中,C语言已经逐步完全取代汇编语言,因为相比于汇编语言,C语言编译与运行、调试十分方便,且可移植性高,可读性好,便于烧录与写入硬件系统,因此C语言被广泛应用在单片机设计中。keil软件由于其兼容单片机的设计,能够实现快速调试,并生成烧录文件,被广泛应用于C语言的编写和单片机的设计。

代码语言:javascript复制
#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,0x17,0xff};


//有小数点
const uchar table2[17]={0x80,0xec,0x42,0x48,0x2c,0x18,0x10,0xcc,0x00,0x08,0x70,0x30,0x92,0x60,0x12,0x16,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]];
    else
  temp_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 down
   bADda = 1;
   bADcl = 1; bADcl = 0;//pulse 2 down
   if(choose == 0)
     bADda = 0;
  else
     bADda = 1;   
    bADcl = 1; bADcl = 0;//pulse 3 down
    bADcl = 1; bADcl = 0;//pulse 4 down
      //bADcl = 1;


      for(cycle = 8; cycle > 0; cycle-- )
     {
     bADda = 1;

    //bADcl = 0;//pulse 
    bADcl = 1;
     CY = bADda;
     _rlca_();  //RRC A
     bADcl = 0;//pulse
     }
   data1= ACC;

     
   for(cycle = 8; cycle > 0; cycle-- )
     {
     bADda = 1;
      
      bADcl = 1;
     CY = bADda;
     _rrca_();  //RLC A
     bADcl = 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 down
   bADda=1;
   bADcl=1;
   bADcl=0;  //   2 down
   bADda=0;
   bADcl=1;
   bADcl=0;  //   3 down
   bADda=1;
   bADcl=1;
   bADcl=0;  //   4 down

   for(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=(data20)/10;
xiao2=data2;
}

main()
{
flag=1;   
  while(1){
        ad();
           cal();
          display();
  }
}

0 人点赞