找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我有一个STC8G1k08—20PIN的多通道内部ADC查询测量程序,想改成定时器加中断检测该...

[复制链接]
跳转到指定楼层
楼主
ID:589833 发表于 2020-6-18 17:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 619247581 于 2020-6-18 17:16 编辑
  1. #include<stc8g.h>                //STC8G系列单片机头文件,可去最新版stc—isp里下载
  2. #include "intrins.h"
  3. #include "stdio.h"
  4. #include "codetab.h"
  5. #include "LQ12864.h"

  6. /******************************+**********************************
  7. 函数功能: 采AD转换完成的值
  8. 说    明:
  9. 入口参数: channel 定义ADC口,范围:0x00~0x07    0x08~0x0e    0x0f
  10.                                                                    P1.0~P1.7        P3.0~P3.6  单片机VCC脚
  11. 出口参数: tes
  12. *****************************************************************/
  13. unsigned int AD_get(unsigned char channel)
  14. {
  15.    int tes;     //定义一个变量tes,用来储存ADC读取的结果
  16.    ADC_CONTR = 0x80|0x40|channel; //启动 AD 转换
  17.    _nop_();
  18.    _nop_();
  19.    while (!(ADC_CONTR & 0x20)); //查询 ADC 完成标志
  20.    ADC_CONTR &= ~0x20; //清完成标志
  21.    tes = ADC_RES; //读取 ADC 结果
  22.    return tes;          //返回AD转换完成的值
  23. }
  24. /****************************************************************
  25. 函数功能: 读取8个采到的AD值,求其平均值并返回所求值
  26. 说    明:先取两次AD值,并丢弃,再采8个AD值,求其平均值,再返回值
  27. 入口参数: channel 定义ADC口,范围:0x00~0x07    0x08~0x0e    0x0f
  28.                                                                    P1.0~P1.7        P3.0~P3.6  单片机VCC脚
  29. 出口参数: res
  30. *****************************************************************/
  31. unsigned int AD_work(unsigned char channel)
  32. {       
  33.     char i;

  34.     unsigned int res=0;   
  35.         AD_get(channel);
  36.     AD_get(channel); //前两个数据丢弃,在切换通道的时候更加稳定
  37.         res = 0;   //res清零

  38.         for (i=0; i<8; i++)
  39.         {
  40.                 res += AD_get(channel); //读取 8 次数据
  41.         }

  42.         res=res/8; //取平均值
  43.     return res;         //返回完成的值
  44. }
  45. //主函数
  46. void main()
  47. {       
  48.         unsigned int vcc;                //定义无符号整形变量vcc,存储AD_val运算完后的整数值
  49.         unsigned int vcc1;                //定义无符号整形变量vcc1,存储AD_val运算完后的小数值
  50.         unsigned int vcc2;                //定义无符号整形变量vcc2,存储AD_vcc运算完后的整数值
  51.         unsigned int vcc3;                //定义无符号整形变量vcc3,存储AD_vcc运算完后的小数值

  52.         unsigned int AD_val;        //定义无符号整形变量AD_val,存储P1.0采到的AD值
  53.         unsigned int AD_vcc;    //定义无符号整形变量AD_vcc,存储P1.1采到的AD值

  54.         unsigned char s[8]={0};        //定义无符号整形数组s,存储AD_val的值
  55.         unsigned char t[8]={0};        //定义无符号整形数组t,存储AD_vcc的值

  56.         P0M0 = 0x00; //设置P0.0~P0.7为双向口模式
  57.         P0M1 = 0x00;
  58.         P1M0 = 0x00; //设置P1.0~P1.7为双向口模式
  59.         P1M1 = 0x00;
  60.         P2M0 = 0x00; //设置P2.0~P2.7为双向口模式
  61.         P2M1 = 0x00;
  62.         P3M0 = 0x00; //设置P3.0~P3.7为双向口模式
  63.         P3M1 = 0x00;
  64.         P4M0 = 0x00; //设置P4.0~P4.7为双向口模式
  65.         P4M1 = 0x00;
  66.         P5M0 = 0x00; //设置P5.0~P5.7为双向口模式
  67.         P5M1 = 0x00;
  68.         P1M0 = 0x00; //设置 P1.0和P1.1,P1.4 为 ADC 口,也就是高阻输入模式
  69.     P1M1 = 0x13;
  70.         P3M0 = 0x00; //设置P3.1~P3.6为ADC 口
  71.         P3M1 = 0x7e;
  72.         ADCCFG = 0x0f; //设置 ADC 时钟为系统时钟/2/16/16
  73.         ADC_CONTR = 0x80; //使能 ADC 模块
  74.         OLED_Init(); //OLED初始化                       
  75.         while(1)
  76.         {       
  77.             AD_val=AD_work(0x00);           //将P1.0口的返回值储存到变量AD_val
  78.                 AD_vcc=AD_work(0x01);           //将P1.1口的返回值储存到变量AD_vcc

  79.                 vcc=AD_val*20/1024;           //取模作为显示电压1的整数
  80.                 vcc1=AD_val*20%1024;          //取余作为显示电压1的小数
  81.                 vcc2=AD_vcc*20/1024;           //取模作为显示电压2的整数
  82.                 vcc3=AD_vcc*20%1024;          //取余作为显示电压2的小数

  83.                 if(vcc1<10)          //如果小数部分小于10,则在数组里小数部分前置两个零
  84.                 {
  85.                         sprintf(s,"%d.00%dv",vcc,vcc1); //打印电压值到数组s
  86.                 }
  87.                 else if(vcc1<100)  //如果小数部分小于100,则在数组里小数部分前置一个零
  88.                 {
  89.                         sprintf(s,"%d.0%dv",vcc,vcc1); //打印电压值到数组s
  90.                 }
  91.         else if(vcc1>=1000)  //如果小数部分小于1000,则在数组里小数部分强制减去18
  92.                 {
  93.                         sprintf(s,"%d.%dv",vcc,vcc1-18); //打印电压值到数组s
  94.                 }
  95.                 else          //如果小数部分大于1000,无特殊要求
  96.                 {
  97.                         sprintf(s,"%d.%dv",vcc,vcc1); //打印电压值到数组s
  98.                 }


  99.                 if(vcc3<10)         //如果小数部分小于10,则在数组里小数部分前置两个零
  100.                 {
  101.                         sprintf(t,"%d.00%dv",vcc2,vcc3);
  102.                 }
  103.                 else if(vcc3<100)  //如果小数部分小于100,则在数组里小数部分前置一个零
  104.                 {
  105.                         sprintf(t,"%d.0%dv",vcc2,vcc3); //打印电压值到数组t
  106.                 }
  107.         else if(vcc3>=1000)        //如果小数部分小于1000,则在数组里小数部分强制减去18
  108.                 {
  109.                         sprintf(t,"%d.%dv",vcc2,vcc3-18); //打印电压值到数组t
  110.                 }
  111.                 else                                 //如果小数部分大于1000,无特殊要求
  112.                 {
  113.                         sprintf(t,"%d.%dv",vcc2,vcc3); //打印电压值到数组t
  114.                 }


  115. //                sprintf(s,"%d",AD_val);                //把AD_val的值打印成一个字符串保存在数组s中
  116. //                sprintf(t,"%d",AD_vcc);                //把AD_vcc的值打印成一个字符串保存在数组s中
  117.                 delay(2000);                                //延时2秒,防止数据刷新太快
  118.                
  119.                 OLED_P6x8Str(24,0,"Voltage tester");
  120.                 OLED_P6x8Str(0,1,"V1:");                                 
  121.                 OLED_P6x8Str(19,1,s);                //在显示屏显示数组s里的值
  122.                 OLED_P6x8Str(0,2,"I1:");
  123.                 OLED_P6x8Str(0,4,"V3:");

  124.                 OLED_P6x8Str(0,5,"I3:");
  125.                 OLED_P6x8Str(0,7,"V5:");
  126.                                
  127.                 OLED_P6x8Str(64,1,"V2:");
  128.                 OLED_P6x8Str(83,1,t);                //在显示屏显示数组t里的值
  129.                 OLED_P6x8Str(64,2,"I2:");
  130.             OLED_P6x8Str(64,4,"V4:");

  131.                 OLED_P6x8Str(64,5,"I4:");
  132.                 OLED_FormLine(0,3);
  133.                 OLED_FormLine(0,6);
  134.                 AD_val=0;                                          //清零
  135.                 AD_vcc=0;                                          //清零

  136.                 vcc=0;                                                  //清零
  137.                 vcc1=0;                                                  //清零
  138.                 vcc2=0;                                                  //清零
  139.                 vcc3=0;                                                  //清零

  140.         }
  141. }
复制代码

如题,想改成定时器加中断检测内部多通道ADC的函数,不知道该怎么改,请求大佬们给点思路
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:838744 发表于 2021-7-7 21:01 | 只看该作者
看看你的代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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