找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3157|回复: 4
收起左侧

STC15单片机自带ADC电压表Proteus仿真程序 求帮助

[复制链接]
ID:888341 发表于 2021-3-4 17:19 | 显示全部楼层 |阅读模式
1515.png

单片机源程序如下:
  1. #include <stc15f2k60s2.h>//添加STC15单片机头文件
  2. unsigned long result,ref; //定义无符号长整形变量result ref
  3. unsigned char R=0,K=0;   //定义无符号整形变量
  4. void votage() interrupt 0 //外部中断0服务函数
  5. {
  6.     if(K>=6)   //if判断语句  如果k>6  k置0
  7.     {
  8.         K=0;   
  9.     }
  10.     else
  11.     {
  12.         K++;   //k自加
  13.     }
  14. }
  15. void ADC_int() interrupt 5    //ADC中断服务子函数
  16. {
  17.     if(R==0)    //if判断语句  如果R等于0  执行以下语句
  18.     {
  19.         ADC_CONTR=0x60+K; //ADC控制寄存器设置为0x60+k
  20.         ref=(ADC_RES*256+ADC_RESL)*5.0/1024*100000;  //ref变量存储转换结果
  21.         R=1;      //变量R置1
  22.         ADC_CONTR=0xe8+K;   //ADC控制寄存器设置为0xe8+k
  23.     }
  24.     else
  25.     {
  26.         ADC_CONTR=0x67;  //ADC控制寄存器设置为0x67
  27.         result=((ADC_RES*256+ADC_RESL)*5.0/1024*100000)/ref*2.5*100000-300; //result变量存储转换结果
  28.         R=0;
  29.         ADC_CONTR=0xef;   //ADC控制寄存器设置为0xef
  30.     }
  31. }
  32. void main()
  33. {
  34.     unsigned int code a[]= {0x01,0x02,0x04,0x08,0x10,0x20},b[]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90},c[]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0,0x10},d[]= {10000,1000,100,10,1};
  35.         //code 指定数据是存储在代码区,数据是在编程的时候跟代码一起写入代码存储器,运行过程中不能改变;
  36.         //定义的是静态数组
  37.    unsigned int i,n;//定义无符号整形变量
  38.     P1ASF = 0xFF;//与ADC 相关寄存器P1ASF的值设置为0xFF
  39.     CLK_DIV= 0x20;    //ADC时钟设置为0x20
  40.     IE0=0;  
  41.     EADC=EA=EX0=IT0=1;   //使能ADC中断和打开总中断,打开外部中断0  设置为下降沿触发
  42.     ADC_CONTR =0xef; //ADC控制寄存器设置为0xe8
  43.     while(1)
  44.     {
  45.         P7=b[K]; //把静态数组a的元素值赋给P7口
  46.         n=result / 100000 % 10;   //取result的十万位赋给n   比如result是946782 则除100000后是9 对10求余后是9
  47.         P0=a[0]; //把静态数组a的元素值赋给P0口
  48.         P2=c[n];  //把静态数组c的元素值赋给P2口
  49.         for (i=1; i<=5; i++) //for循环  i从1到5
  50.         {
  51.             n=result / d[i-1] % 10;//依次取 result(即ADC转换结果)的万位,千位,百位,十位,个位  
  52.             P0=a[i];//把静态数组a的元素值赋给P0口
  53.             P2=b[n];//把静态数组c的元素值赋给P2口
  54.         }
  55.     }
  56. }
复制代码

这个程序貌似我仿真的时候,无结果,求大神指导:
15ADC电压表.zip (84.04 KB, 下载次数: 101)
回复

使用道具 举报

ID:65956 发表于 2021-3-5 08:23 | 显示全部楼层
你这程序也只是一般用的测试,基准源是自设定的,这种方法测出来是有一定的误差的,建议用读内部基准源再来计算,这样误差就小点了,不然你的供电5V就要非常准才稳定,另外这个芯片可以测8路的,你也只是测了7路而已
回复

使用道具 举报

ID:888341 发表于 2021-3-5 13:21 | 显示全部楼层
aking991 发表于 2021-3-5 08:23
你这程序也只是一般用的测试,基准源是自设定的,这种方法测出来是有一定的误差的,建议用读内部基准源再来 ...

大神能分享一份比较好的STC15ADC采集程序和仿真吗?
回复

使用道具 举报

ID:1069504 发表于 2023-4-3 19:28 | 显示全部楼层
我的也出现了这个问题呀
回复

使用道具 举报

ID:1123544 发表于 2024-6-3 17:46 | 显示全部楼层
怎么减小这个程序的误差啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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