找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC8A单片机多通道同时使用的程序问题

[复制链接]
ID:411221 发表于 2019-11-21 16:01 | 显示全部楼层 |阅读模式
10黑币
请问STC8A单片机多通道使用怎么切换达使用,我只会该单通道使用的程序,两个通道同时使用不会更改  请问怎么改
170606ofznnsfpeggnevh1.png
单片机源程序如下:
  1. #include
  2. #include  // _nop_()function
  3. #include "STC8.h"
  4. #include
  5. #include "DELAY.h"


  6. #define VCC  2.5
  7. #define Tstop2  1400      //刹车温度2
  8. #define Tstop1  1400     //刹车温度1
  9. #define T       1400        //目标温度
  10. #define T_poor  20          //目标温度差
  11. #define Tmax    1500      //最大温度
  12. #define TAlert  1540     //警戒温度
  13. #define uint unsigned int
  14. #define uchar  unsigned char
  15. #define U32 unsigned long
  16. #define U16 unsigned int

  17. #define FOSC            24000000UL
  18. #define BRT             (65536 - FOSC / 115200 / 4)


  19. #define ADC_CHANNEL0          0x00            //转换通道P1.0
  20. #define ADC_CHANNEL1          0x01            //转换通道P1.1
  21. #define ADC_CHANNEL2          0x02            //转换通道P1.2
  22. #define ADC_CHANNEL3          0x03            //转换通道P1.3
  23. #define ADC_CHANNEL4          0x04            //转换通道P1.4
  24. #define ADC_CHANNEL5          0x05            //转换通道P1.5
  25. #define ADC_CHANNEL6          0x06            //转换通道P1.6
  26. #define ADC_CHANNEL7          0x07            //转换通道P1.7
  27. #define ADC_CHANNEL8          0x08            //转换通道P0.0
  28. #define ADC_CHANNEL9          0x09            //转换通道P0.1
  29. #define ADC_CHANNEL10         0x0a            //转换通道P0.2
  30. #define ADC_CHANNEL11         0x0b            //转换通道P0.3
  31. #define ADC_CHANNEL12         0x0c            //转换通道P0.4
  32. #define ADC_CHANNEL13         0x0d            //转换通道P0.5
  33. #define ADC_CHANNEL14         0x0e            //转换通道P0.6


  34. sbit TEMP1 = P0^2; //控制1
  35. sbit TEMP2 = P4^3; //控制2
  36. sbit TEMP3 = P0^3; //控制3



  37. float code RTD_TAB_PT100[] =   
  38. {
  39.   88.04,87.64,87.24,86.84,86.44,86.04,85.63,85.23,84.83,84.43, //-30
  40.         92.04,91.64,91.24,90.84,90.44,90.04,89.64,89.24,88.84,88.44, //-20
  41.         98.03,95.63,95.23,94.83,94.43,94.03,93.63,93.24,92.84,92.44, //-10
  42.         100.00,99.60,99.21,98.81,98.41,98.01,97.62,97.22,96.82,96.42, //-0
  43.         100.00,100.40,100.79,101.19,101.59,101.98,102.38,102.78,103.17,103.57, //0
  44.   103.96,104.36,104.75,105.15,105.54,105.94,106.33,106.73,107.12,107.52, //10
  45.         107.91,108.31,108.70,109.10,109.49,109.88,110.28,110.67,111.07,111.46, //20
  46.         111.85,112.25,112.64,113.03,113.43,113.82,114.21,114.60,115.00,115.39, //30
  47.         115.78,116.17,116.57,116.96,117.35,117.74,118.13,118.52,118.91,119.31, //40
  48.         119.70,120.09,120.48,120.87,121.26,121.65,122.04,122.43,122.82,123.21, //50
  49.         123.60,123.99,124.38,124.77,125.16,125.55,125.94,126.33,126.72,127.10, //60
  50. };


  51. U32 AD_value;

  52. ////PT100温度采集
  53. //unsigned char xdata  ADC1;//外部温度1
  54. //unsigned char xdata  ADC2;//外部温度2
  55. //unsigned char xdata  ADC3;//油温度

  56. /**********************初始化串口******************************/
  57. void UartInit(void)                //9600bps@24.000MHz
  58. {
  59.         SCON = 0x50;                //8位数据,可变波特率
  60.         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  61.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  62.         TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
  63.         TL1 = 0x8F;                //设定定时初值
  64.         TH1 = 0xFD;                //设定定时初值
  65.         ET1 = 0;                //禁止定时器1中断
  66.         TR1 = 1;                //启动定时器1
  67.         TI=1;
  68. }

  69. //-----------------------------------------
  70. //ADC初始化程序
  71. //
  72. //-----------------------------------------
  73. void ADC_INI()
  74. {
  75.     P1M0 = 0xff;                                //设置P1为ADC口
  76.     P1M1 = 0x00;
  77.    // ADC_CONTR |= 0x03;                                                                                                        //切换AD通道,03为  P1.3
  78.     ADCCFG = 0x0f;                              //设置ADC时钟为系统时钟/2/16/16
  79.     ADC_CONTR = 0x80;                           //使能ADC模块
  80.     EADC = 1;                                   //使能ADC中断
  81.     ADC_CONTR |= 0x40;                          //启动AD转换
  82. }


  83. //-----------------------------------------
  84. //AD中断服务程序
  85. //
  86. //-----------------------------------------
  87. void ADC_Isr() interrupt 5 using 1
  88. {
  89.   static U32 accumulator = 0;//AD采集数值累加
  90.   static U16 measurements = 20;//数据值平均次数

  91.   U32 result = 0;  //平均值结果

  92.   EA = 0;//20190121
  93.         ADC_CONTR|= 0x03;
  94.   ADC_CONTR &= ~0x20;                         //清中断标志
  95.   ADCCFG = 0x20;                              //设置结果右对齐
  96.   ACC = ADC_RES;                              //A[3:0]存储ADC的12位结果的高4位,A[7:4]为0
  97.   B = ADC_RESL;                               //B存储ADC的12位结果的低8位

  98.   accumulator += ACC * 256 + B;                // Add most recent sample
  99.   measurements--;

  100.   if (measurements == 0)
  101.     {
  102.      measurements = 20;//平均值滤波======================
  103.      result = accumulator / measurements;
  104.      accumulator = 0;        //=================================
  105.      AD_value =  result ;
  106.                 }
  107.         EA = 1;
  108.   ADC_CONTR |= 0x40;   //继续AD转换               
  109.         }



  110. /*******************************主函数**********************************/
  111. void main (void)
  112. {

  113.   float  Vin3,T0,AD3;//,//Vin2;
  114. //  uint AD3=0;
  115. //        uint T0=0;

  116.   uint AD2= 100;


  117. //使用内部高精度晶振  ----------------------------------------------------
  118.   P_SW2 = P_SW2 | 0x80;  //访问扩展SFR时,要将P_SW2的高位置 1, EAXFR = 1
  119.   CKSEL = 0x00;//使用内部高精度晶振
  120.   CLKDIV = 0x00;//时钟不分频  默认是4分频即:CLKDIV = 0x04;
  121.   while (1) //等待晶振稳定*************
  122.     {
  123.      if ((IRC24MCR & 0x01) == 1)
  124.        {
  125.        IRC24MCR = IRC24MCR |0x80;
  126.        break;
  127.        }
  128.      } //******************************
  129.   P_SW2 = P_SW2 & 0x7F;
  130. //-------------------------------------------------------------------------        
  131.   

  132.   UartInit();
  133.         ADC_INI();
  134.         TEMP1= 0;
  135.   TEMP2= 0;
  136.         TEMP3= 0;   //控制端置0
  137.                   
  138.         EA = 1;
  139.                  
  140.   while(1)
  141.                 {

  142.                 AD3 = AD_value;
  143.     Vin3 =  AD3;   //输出通道3的电压值
  144.                 T0 = Vin3;        
  145.         
  146.                                 
  147.                         
  148.                         
  149.                 }
  150. }
复制代码
全部资料51hei下载地址:
TempCtrl.zip (51.99 KB, 下载次数: 17)

回复

使用道具 举报

ID:213173 发表于 2019-11-21 20:43 | 显示全部楼层
STC8A8K16S4A12有8个ADC通道,但内部AD转换器只有1个(其它品牌也基本如此),通过开关选通某通道转换。不可能多通道同时转换,而是分时转换。由于转换速度很快,可以理解为同时转换。
回复

使用道具 举报

ID:123289 发表于 2019-11-21 21:54 | 显示全部楼层
多通道不用怕,就当成单通道来写!
关键是协议,你可以在协议上做文章,各机下载的数据,有取有舍,协议规定是自己的就取,不是自己的就舍,也就OK了。
当然其中有此技巧,你要看书,看多机通讯的章节。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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