找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2548|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机数字电压表

[复制链接]
跳转到指定楼层
楼主
这是以前制作的东西。 给点币  我要下载东西啊。谢谢各位大佬

TIM图片20190402184545.png (80.39 KB, 下载次数: 20)

TIM图片20190402184545.png

数字电压表.zip

18.13 KB, 下载次数: 24, 下载积分: 黑币 -5

仿真和hex文件下载(不含代码)

评分

参与人数 1黑币 +16 收起 理由
angmall + 16 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:467275 发表于 2019-4-24 22:09
#include<STC12C5A60S2.H>  #define uint   unsigned int  #define uchar unsigned char  sbit CS=P2^0;         //LCD12864串行通信片选  sbit SID=P2^1;         //LCD12864串行通信数据口  sbit SCLK=P2^2;         //LCD12864串行通信同步时钟信号  sbit PSB=P2^5;         //LCD12864并/串选择:H并行 L串行   unsigned int temp1,sh1,ge1,n1,m1;  unsigned char ad_result_data[10];   //AD转换高八位  unsigned char ad_result_low2[10];   //AD转换低八位  unsigned char ad_result_total[10];   //AD转换总十位  unsigned char ad_average_result;   //AD转换十次的平均值  unsigned char Ain,Vin;  unsigned char b,t,R;  char tp=0;  unsigned char code ma1[6]={0xb5,0xe7,0xd1,0xb9,0xa1,0xc3}; //电压:  unsigned char code ma2[]={"."};  uchar code disp1[]={"提示: 按1 键进入"};  uchar code disp2[]={"功能选择界面. "};  unsigned char code num0[]={0xa3,0xb0};  unsigned char code num1[]={0xa3,0xb1};  unsigned char code num2[]={0xa3,0xb2};  unsigned char code num3[]={0xa3,0xb3};  unsigned char code num4[]={0xa3,0xb4};  unsigned char code num5[]={0xa3,0xb5};  unsigned char code num6[]={0xa3,0xb6};  unsigned char code num7[]={0xa3,0xb7};  unsigned char code num8[]={0xa3,0xb8};  unsigned char code num9[]={0xa3,0xb9};  //-------模块延时程序---------------------------- 1ms  void delay1ms(uint delay1ms) //STC11F60XE,22.1184M,延时1ms  {  uint i,j;   for(;delay1ms>0;delay1ms--)     for(i=0;i<7;i++)       for(j=0;j<210;j++);  }  void delay(uint delay) //STC11F60XE,22.1184M,延时170us  {  uint i,j;  for(;delay>0;delay--)     for(i=0;i<124;i++);       for(j=0;j<124;j++);  }  /*******************************************************                    AD转换程序  *******************************************************/  void AD_initiate() //初始化函数  {   ES=0;  TMOD=0x21; //定时计数器方式控制寄存器,"自动重装,16位计数器".  SCON=0x50; //串行控制寄存器,方便在串口助手那观察  TH1=0xfa;  TL1=0xfa;  TR1=1;  }  void ADC_Power_On()      //AD转换电  {  ADC_CONTR|=0x80;  delay(5);     //必要的延时  }  void get_ad_result() //取AD结果函数,它是十位AD转换,每十次平均,最后取低八位作为AD采样数据  {   uint i,q=0;  for(i=0;i<10;i++)     {         tp=0;         ADC_RES=0;     //高八位数据清零,STC12C5A60S2 AD数据寄存名与STC12C54××系列不同      ADC_RESL=0;    //低两位清零         ADC_CONTR|=0x08; //启动AD转换         while(!tp)     //判断AD转换是否完成            {             tp=0x10;             tp&=ADC_CONTR;           }            ADC_CONTR&=0xe7;     ad_average_result=ADC_RES;     q=q+ad_average_result;     }     ad_average_result=q/10;     //ad_average_result=ad_average_result*4*5000/1024;  }  /************************AD转换结束***********************/   void send_ad_result() //取AD结果函数发送到串口,方便调试  {                    SBUF=n1;     while(TI==0) ;      TI=0;     delay1ms(100);     //SBUF=R>>4;  }   //---------------------电压采样程序-------------------------  void caiyangP10()     //测电压  {  P1M0|=0x01;         //设P1_0为开漏模式 如: P1_0= #00000000B  P1M1|=0x01;  ADC_CONTR=0xe0;   //设置P1.0为输入AD转换口  delay(2);  get_ad_result();        //取转换数据  Vin=ad_average_result;  R=Vin;  }   /*-----------写控制字到LCD12864------------*/  void write_cmd(uchar cmd)  {  uchar i;  uchar i_data;  i_data=0xf8;          //命令控制字:11111000写指令 11111010写数据 11111100读状态 11111110读数据  CS=1;          //片选置高,才能进行读写操作  SCLK=0;  /*----------写命令控制字-----------------*/  for(i=0;i<8;i++)       //循环八次,每次读取一位数据  {     SID=(bit)(i_data&0x80);     //bit表示取其最高位     SCLK=0;     SCLK=1;         //正跳变写入指令     i_data=i_data<<1;      //左移一位  }        /*---------------------------------------*/  /*----------写指令高四位-----------------*/  i_data=cmd;  i_data=i_data&0xf0;       //把低四位置0  for(i=0;i<8;i++)       //循环八次,每次读取一位数据  {         SID=(bit)(i_data&0x80);     //bit表示取其最高位     SCLK=0;     SCLK=1;         //正跳变写入指令     i_data=i_data<<1;      //左移一位  }                   /*---------------------------------------*/  /*----------写指令低四位-----------------*/  i_data=cmd;  i_data=i_data<<4;       //左移四位,把低四位的数据移到高四位,再把低四位置0  for(i=0;i<8;i++)       //循环八次,每次读取一位数据  {         SID=(bit)(i_data&0x80);     //bit表示取其最高位     SCLK=0;     SCLK=1;        //正跳变写入指令     i_data=i_data<<1;     //左移一位  }   /*-----------------------------------------*/     CS=0;         //把片选置低  delay1ms(5);       //延时是因为没有进行忙检测,适当的延时可以不进行忙检测  }  /*-----------------------------------------*/  /*------------写数据到LCD12864-------------*/  void write_dat(uchar dat)  {  uchar i;  uchar i_data;  i_data=0xfa;  CS=1;  for(i=0;i<8;i++)  {     SID=(bit)(i_data&0x80);     SCLK=0;     SCLK=1;     i_data=i_data<<1;  }  i_data=dat;  i_data=i_data&0xf0;  for(i=0;i<8;i++)  {         SID=(bit)(i_data&0x80);     SCLK=0;     SCLK=1;     i_data=i_data<<1;  }  i_data=dat;  i_data=i_data<<4;  for(i=0;i<8;i++)  {         SID=(bit)(i_data&0x80);     SCLK=0;     SCLK=1;     i_data=i_data<<1;  }  CS=0;  delay1ms(5);  }  /*-----------------------------------------*/  /*--------------显示坐标-------------------*/  void lcd_pos(uchar x,uchar y)      //汉字显示坐标,x为哪一行,y为哪一列  {  uchar pos;  if(x==0)     x=0x80;         //第一行  else if(x==1)     x=0x90;         //第二行  else if(x==2)     x=0x88;         //第三行  else if(x==3)     x=0x98;         //第四行  pos=x+y;         //显示哪一行(总共有4行)哪一竖(总共有8竖,每16列为1竖)  write_cmd(pos);  }  /*-----------------------------------------*/  /*--------------显示8个汉字-------------------*/  void disp_hanzi(uchar code *chn)  {     uchar i;     write_cmd(0x30);    //基本指令操作方式     for(i=0;i<16;i++)   //16列*8个汉字=128(刚好)         write_dat(chn);  }  /*-----------------------------------------*/  /*--------------显示数字-------------------*/  void disp_num(uchar code *chn)  {  uchar i;     write_cmd(0x30);    //基本指令操作方式     for(i=0;i<2;i++)      //1个数字         write_dat(chn);  }  void disp_number(uchar num)  {          switch(num)     {  case 0: disp_num(num0);break;  case 1: disp_num(num1);break;  case 2: disp_num(num2);break;  case 3: disp_num(num3);break;  case 4: disp_num(num4);break;  case 5: disp_num(num5);break;       case 6: disp_num(num6);break;  case 7: disp_num(num7);break;  case 8: disp_num(num8);break;  case 9: disp_num(num9);break;  default: break;     }  }  /*----------- --LCD初始化------------------*/  void lcd_init()  {  PSB=0;  write_cmd(0x30);       //基本指令  write_cmd(0x02);       //地址归位  write_cmd(0x06);       //游标右移  write_cmd(0x0c);       //整体显示  write_cmd(0x01);       //清屏  }  /*-----------------------------------------*/  void displayP10()  {  float ad1;  //unsigned int temp1,sh1,ge1,n1,m1;  //uchar code dis2[]={0x01,0x02,0x00};   //ad1=x*7.8125;   //电压修正  uchar i;  ad1=Vin*3.9608;   //具体线性参数由输入电压值调整,该值的测量范围为0-10.00V,5V左右的测量比较准确,                        //两端的最大误差为70mv,其他一般在40mv以内  temp1=(int)ad1;  sh1=temp1/1000;    //十位  ge1=(temp1%1000)/100;   //个位  n1=((temp1%1000)%100)/10; //小数点后一位  m1=((temp1%1000)%100)%10; //小数点后二位  //write_cmd(0x01);   write_cmd(0x30);    //基本指令操作方式   lcd_pos(0,0);      for(i=0;i<6;i++)        write_dat(ma1);           lcd_pos(0,3);  disp_number(sh1);  lcd_pos(0,4);  disp_number(ge1);  lcd_pos(0,5);  for(i=0;i<2;i++)    write_dat(ma2);  lcd_pos(0,6);  disp_number(n1);  lcd_pos(0,7);  disp_number(m1);  /*lcd_pos(2,0);  disp_hanzi(disp1);  lcd_pos(3,0);  disp_hanzi(disp2);*/  }  void main()  {        EA=1;  AD_initiate();   //初始化   ADC_Power_On();     //开AD电源  //init();  lcd_init();  delay(10);  while(1)  {               caiyangP10();    //测电压       send_ad_result();     //Vin=Vin*4007;     displayP10();     delay(10);  }  }  参考链接:http://www.picavr.com/news/2010-11/2388.htm

板凳
ID:1138740 发表于 2024-12-6 03:20 | 只看该作者
老哥,能把c代码也分享下吗
回复

使用道具 举报

地板
ID:1138740 发表于 2024-12-6 03:20 | 只看该作者
老哥,能把c代码也发出来吗
回复

使用道具 举报

5#
ID:1138740 发表于 2024-12-6 05:40 | 只看该作者
源代码可以发吗,可加黑币老哥
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表