找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4561|回复: 2
收起左侧

STC15F2K60S2单片机单片机数字电压表程序 内部ADC实现

  [复制链接]
ID:549708 发表于 2020-7-25 10:48 | 显示全部楼层 |阅读模式
①使用STC15F2K60S2单片机板设计一个数字电压表,只能采用单片机内部ADC实现;
②要求能够测量直流电压范围为0~4.55V,测量误差小于0.005V,测量结果保留三位小数点;
③电压表具有自动超量程报警功能,当测量电压超过4.55V时驱动蜂鸣器报警,电压小于4.55V时自动关闭蜂鸣器;
④电压测量校准与测评以考试当天手上的万用表为准,显示器件自选,要求使用内部基准电压作为参考电压;
⑤采集结果通过USB转串口线上传至PC机,显示格式为:“N路电压:X.XXXV”;
⑥串口传输波特率为57600,晶振采用内部22.1184M,复位引脚不能当做I/O使用;
⑦电压表具有自动休眠功能,每当启动15秒钟后自动进入休眠模式,唤醒后继续正常工作。

单片机源程序如下:
  1. #include"STC15F2K60S2.h"      //头文件
  2. #include"JLX12864G-086S-ZK.h" //头文件
  3. #include"ADC.h"               //头文件
  4. #include <stdio.h>                  //printf函数使用到的头文件
  5. float VCC;                              //供电电压
  6. unsigned int a;                                  //测量第九通道ADC数字量
  7. float Va;                                          //第九通道电压值
  8. char temp[16];
  9. void UART_int()                                                          //串口初始化函数
  10. {
  11.         TMOD|=0x20;//T1工作于方式2,8位自动重装模式
  12.         TH1=TL1=256-22118400/57600/384;//TH1:重装值9600波特率,晶振11.0592MHz ;
  13.         TR1=1;        
  14.         AUXR=0x00;//使用定时器1产生波特率,S1ST2=0
  15.         SCON=0x50;//SCON:模式1,8-bit UART,使能接收
  16.         TI=1;
  17. }
  18. void main()
  19. {
  20.         float Vin,V_temp=0;
  21.         unsigned char i;
  22.         InitADC();
  23.         UART_int();
  24.         initial_lcd();
  25.         clear_screen();
  26.         display_GB2312_string(1,1,"数字电压表的设计");
  27.         display_GB2312_string(3,1,"电压:");
  28.         while(1)
  29.         {        
  30.                 //测量第九通道电压值(内部参考电压)
  31.                 P1ASF=0x00;
  32.                 VCC=(1.24612/ADC_Read(ADC_CH0))*1023;//内部参考电压为1.23611V(1.27),通过反推求出VCC
  33.                
  34.                 P1ASF=0xFF;
  35. //                for(i=0;i<30;i++)V_temp=V_temp+VCC/1023*ADC_Read(ADC_CH0);
  36. //                Vin=V_temp/30;//求平均值  校准精度用的
  37. //                V_temp=0;
  38.             Vin=VCC/1023*ADC_Read(ADC_CH0);
  39.                 sprintf(temp,"%.3fV",Vin);
  40.                 display_GB2312_string(3,41,temp);
  41.                 if(Vin>4.55)P34=!P34;
  42.                 else {P34=1;}
  43.                 printf("0路电压:%.3fV\n",Vin);
  44.         }
  45. }
复制代码
  1. #include"STC15F2K60S2.h"    //头文件
  2. #include <stdio.h>                //printf函数使用到的头文件

  3. //ADC控制位定义ADC_CONTR
  4. #define ADC_POWER    0x80   //ADC电源控制位
  5. #define ADC_FLAG     0x10   //ADC转换完成标记
  6. #define ADC_START    0x08   //ADC开始转换标记
  7. #define ADC_SPEEDLL  0x00   //ADC转换速率540时钟
  8. #define ADC_SPEEDL   0x20   //ADC转换速率360时钟
  9. #define ADC_SPEEDH   0x40   //ADC转换速率180时钟
  10. #define ADC_SPEEDHH  0x60   //ADC转换速率90时钟
  11. #define ADC_CH0      0x00   //转换通道P1.0
  12. #define ADC_CH1      0x01   //转换通道P1.1
  13. #define ADC_CH2      0x02   //转换通道P1.2
  14. #define ADC_CH3      0x03   //转换通道P1.3
  15. #define ADC_CH4      0x04   //转换通道P1.4
  16. #define ADC_CH5      0x05   //转换通道P1.5
  17. #define ADC_CH6      0x06   //转换通道P1.6
  18. #define ADC_CH7      0x07   //转换通道P1.7
  19. //ADC端口模拟功能设置P1ASF
  20. #define P1ASF_0             0x01   //设置P1.0口为ADC端口
  21. #define P1ASF_1             0x02   //设置P1.1口为ADC端口
  22. #define P1ASF_2             0x04   //设置P1.2口为ADC端口
  23. #define P1ASF_3             0x08   //设置P1.3口为ADC端口
  24. #define P1ASF_4             0x10   //设置P1.4口为ADC端口
  25. #define P1ASF_5             0x20   //设置P1.5口为ADC端口
  26. #define P1ASF_6             0x40   //设置P1.6口为ADC端口
  27. #define P1ASF_7             0x80   //设置P1.7口为ADC端口

  28. float VCC;                            //供电电压
  29. void delay_nus(unsigned int t){while(t--);}//微秒延时函数
  30. void delay_nms(unsigned int t)                           //毫秒延时函数
  31. {
  32.         unsigned int a;
  33.         while(t--)for(a=0;a<80;a++);
  34. }
  35. void InitADC()
  36. {
  37.     P1ASF=0xFF;//打开P1.0~P1.7作为模拟输入通道
  38.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
  39.     delay_nms(1);                                      //延时1mS
  40. }
  41. unsigned int ADC_Read(unsigned char ADC_CH)//ADC采样初始化函数
  42. {
  43.         unsigned int AD_Dat;
  44.         ADC_CONTR|=ADC_POWER|ADC_SPEEDLL|ADC_CH|ADC_START;//配置ADC控制寄存器                                                                      //打开电源、最高速度、选择通道
  45.         delay_nus(100);                                  //延时100uS
  46.         while((ADC_CONTR&ADC_FLAG)==0);                  //等待转换结束0x10=0001 0000
  47.         ADC_CONTR &=~ADC_FLAG;                //清除转换结束ADC_FLAG
  48.         AD_Dat=(ADC_RES<<2)+(ADC_RESL&0x03);  //把数据整合成10位数,并做计算
  49.         ADC_CONTR=0x00;                                                  //实践证明要添加这句代码才能进行多路电压采集
  50.         return AD_Dat;                                                  //返回电压数字量
  51. }
复制代码


所有程序51hei提供下载:
数字电压表.rar (95.97 KB, 下载次数: 154)

评分

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

查看全部评分

回复

使用道具 举报

ID:560110 发表于 2020-7-26 21:49 | 显示全部楼层
我下载下来看看,我在看看看看看看看看
回复

使用道具 举报

ID:839438 发表于 2021-7-9 19:34 | 显示全部楼层
萌新找资料好累
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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