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

具体实现功能

具体功能:

通过滑动变阻器和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可选。

设计思路

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

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

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

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

设计内容

仿真图

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

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

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

程序

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

#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=(data2%100)/10;xiao2=data2%10;}main(){flag=1;     while(1){        ad();           cal();          display();  }}

更多资料欢迎关注“电子工程师成长日记”!

上一篇:基于51单片机的控制角度仪设计proteus仿真


下一篇:C51+led1602