[KF8F] KF8F ADC例程

[复制链接]
221|5
 楼主 | 2017-5-26 15:38 | 显示全部楼层 |阅读模式
  1. /****************************************************************************************
  2. * KF8F系列单片机开发板演示程序
  3. * 标    题: ADC转换采样
  4. * 项目名: 02-ADC_TEST
  5. * 开发环境: ChipON IDE
  6. * 作    者:上海芯旺微电子技术有限公司
  7. * 功能简述:  ADC转换采样,数码管显示采样得到的值(16进制显示) 按键key2可切换采样通道,同时P12指示通道
  8. * 亮灯时指示P20口的AN8,否则指示P21口的AN7,跳线处LED相关的还需要J12的P20、P21、P26口以及J21的控制D4指示灯
  9. ****************************************************************************************/
  10. #include<KF8F4156.h>
  11. /*********************宏定义******************************/
  12. #define uchar unsigned char
  13. #define uint  unsigned int

  14. #define        COM1         P0LR0
  15. #define        COM2         P0LR1
  16. #define        COM3         P0LR3
  17. #define        COM4         P0LR4

  18. #define SMG_A         P3LR0
  19. #define SMG_B         P3LR1
  20. #define SMG_C         P3LR2
  21. #define SMG_D         P3LR3
  22. #define SMG_E         P3LR4
  23. #define SMG_F         P3LR5
  24. #define SMG_G         P3LR6
  25. #define SMG_P         P3LR7

  26. #define Key2         P26
  27. uint    KeyCount;
  28. uchar   KeyState;
  29. /*********************宏定义结束****************************/
  30. /**************定义全局变量(注:为节省内存空间,全局变量尽量不要赋初值)*********/
  31. uchar const Arr_num[] = {
  32.                                                         0X3F,   // 0
  33.                                                         0X06,        // 1
  34.                                                         0X5B,        // 2
  35.                                                         0X4F,        // 3
  36.                                                         0X66,        // 4
  37.                                                         0X6D,        // 5
  38.                                                         0X7D,        // 6
  39.                                                         0X07,        // 7
  40.                                                         0X7F,        // 8
  41.                                                         0X6F,        // 9
  42.                                                         0X77,        // a
  43.                                                         0X7C,        // b
  44.                                                         0X58,        // c
  45.                                                         0X5E,        // d
  46.                                                         0X79,        // E
  47.                                                         0X71,        // F
  48.                                                         0X40,        // -
  49.                                                         0X00,        // 空

  50. };//共阴接法
  51. uchar Unit, Decade, Hundred, Thousand;    //定义数码管的个十百千位
  52. uchar com_temp;                                                          //查表结果
  53. /***********************全局变量定义结束**************************************/
  54. /*****************函数声明(注:中断和main函数不需声明)*************************/
  55. void Init_fun();
  56. void Delay_200us();
  57. uint Adc_fun(void);
  58. uint Adc_read(void);
  59. void input_smg();
  60. void Display();
  61. /********************函数声明结束************************************/

  62. /************************
  63. * 函数名     :main
  64. * 函数功能:程序入口主函数
  65. * 入口参数:无
  66. * 返回          :无
  67. ************************/

  68. void main()
  69. {
  70.         uint Dis_adc = 0 ;                            //采样接收变量
  71.         Unit = 0;
  72.         Decade = 0;
  73.         Hundred = 0;
  74.         Thousand = 0;
  75.         Init_fun();                                          //初始化
  76.         P1LR2=1;                                                        // 默认指示采样通道AN8 亮灯
  77.         while(1)
  78.         {
  79.                 Dis_adc = Adc_read();           //将ADC采样返回值赋予Dis_adc

  80.                 Unit = Dis_adc&0x0f;            //将Dis_adc的最低4位赋予数码管的个位

  81.                 Decade = Dis_adc&0xf0;
  82.                 Decade >>= 4;                   //将Dis_adc的第7-4位赋予数码管的十位

  83.                 Dis_adc >>= 8;                  //右移8位,取Dis_adc的高8位
  84.                 Hundred = Dis_adc&0x0f;         //将此时的Dis_adc的最低4位赋予数码管的百位

  85.                 Thousand = Dis_adc&0xf0;
  86.                 Thousand >>= 4;                  //将此时的Dis_adc的第7-4位赋予数码管的千位

  87.                 Display();                       //显示
  88.                 //按键判断,切换通道
  89.                 if(Key2)
  90.                 {
  91.                         KeyCount=0;
  92.                 }
  93.                 else
  94.                 {
  95.                         if(KeyCount<2)
  96.                         {
  97.                                 KeyCount++;
  98.                                 if(KeyCount==2 )
  99.                                 {
  100.                                         if(KeyState)
  101.                                         {
  102.                                                 ADCCTL0 = 0xA1; // P20 AN8
  103.                                                 KeyState=0;
  104.                                                 P1LR2=1;
  105.                                         }
  106.                                         else
  107.                                         {
  108.                                                 ADCCTL0 = 0x9D; // P21 AN7
  109.                                                 KeyState=1;
  110.                                                 P1LR2=0;
  111.                                         }
  112.                                 }
  113.                         }
  114.                 }
  115.         }
  116. }

  117. /************************
  118. * 函数名     :Init_fun
  119. * 函数功能:初始化函数
  120. * 入口参数:无
  121. * 返回          :无
  122. ************************/

  123. void Init_fun()
  124. {
  125.         OSCCTL = 0x50;                     //设置为4M
  126. /*********端口初始化***********/
  127.         TR0 = 0x04;                                                 //P02仅输入 LED片选
  128.         TR1 = 0x00;                                                 //设置P1端口为输出
  129.         TR2 = 0x43;                                                 //P20 P21 AD输入  P26 key2输入
  130.         TR3 = 0X00;                                                                 //LED 输出
  131.         P0 = 0;
  132.         P1 = 0;
  133.         P2 = 0;
  134.         P3 = 0;
  135.         P0LR=0;
  136.         P1LR=0;
  137.         P2LR=0;
  138.         P3LR=0x00;
  139.         /****初始化AD寄存器****/
  140.         ANSEH = 0x01;                              //设置通道AN8 P20为模拟口
  141.         ANSEL = 0x80;                              //设置通道AN7 P21为模拟口

  142.         ADCCTL1 = 0x94;                              //ad校准使能,8分频,VDD作为参考电压
  143.         ADCCTL0 = 0xA1;                              //右对齐,通道8, AD使能打开
  144. }
  145. /************************
  146. * 函数名     :Adc_fun
  147. * 函数功能:ADC函数,模数转换
  148. * 入口参数:无
  149. * 返回          :返回ADC采样值
  150. ************************/
  151. uint Adc_fun(void)
  152. {
  153.             uint Adc_num = 0 ;                          //ADC转换缓冲变量
  154.             START = 1;                                          //启动ADC
  155.                 while(START);                 //等待转换结束
  156.                 Adc_num = ADCDATA0H;                    //将高位加进去
  157.                 Adc_num <<=8;
  158.                 Adc_num |= ADCDATA0L;                  //将低位加进去
  159.                 return Adc_num;                              //返回转换值
  160. }
  161. /************************
  162. * 函数名     :Adc_read
  163. * 函数功能:ADC求均值函数,adc读取函数
  164. * 入口参数:无
  165. * 返回          :返回ADC采样8次均值
  166. ************************/
  167. uint Adc_read(void)
  168. {
  169.         uint Adc_sum = 0 ;                           //adc采样累加变量
  170.         uchar i = 0;
  171.         for(i = 0; i < 8; i++)
  172.         {
  173.                 Adc_sum += Adc_fun();                  //累加八次采样值
  174.         }
  175.         Adc_sum+=4;                                           // 四舍五入
  176.         Adc_sum >>= 3;                              //右移动3位  除8求均值
  177.         return Adc_sum;
  178. }
  179. /************************
  180. * 函数名     :Display
  181. * 函数功能:数码管显示
  182. * 入口参数:显示数字
  183. * 返回          :无
  184. ************************/
  185. void Display()
  186.   {
  187.         uchar i;
  188.         for(i = 0; i < 10; i++)        // 控制显示的时长,计数速度控制
  189.          {
  190.             //打开数码管的 个位
  191.                 com_temp = Arr_num[Unit];
  192.             input_smg();
  193.             COM1 =0;
  194.             COM2 =1;
  195.             COM3 =1;
  196.             COM4 =1;
  197.             Delay_200us();
  198.             COM1 =1;        //消隐
  199.             COM2 =1;
  200.             COM3 =1;
  201.             COM4 =1;

  202.             //打开数码管的 十位
  203.             com_temp = Arr_num[Decade];
  204.             input_smg();
  205.             COM1 =1;
  206.             COM2 =0;
  207.             COM3 =1;
  208.             COM4 =1;
  209.             Delay_200us();
  210.             COM1 =1;        //消隐
  211.             COM2 =1;
  212.             COM3 =1;
  213.             COM4 =1;

  214.             //打开数码管的 百位
  215.             com_temp = Arr_num[Hundred];
  216.             input_smg();
  217.             COM1 =1;
  218.             COM2 =1;
  219.             COM3 =0;
  220.             COM4 =1;
  221.             Delay_200us();
  222.             COM1 =1;        //消隐
  223.             COM2 =1;
  224.             COM3 =1;
  225.             COM4 =1;

  226.             //打开数码管的 千位
  227.             com_temp = Arr_num[Thousand];
  228.             input_smg();
  229.             COM1 =1;
  230.             COM2 =1;
  231.             COM3 =1;
  232.             COM4 =0;
  233.             Delay_200us();
  234.             COM1 =1;        //消隐
  235.             COM2 =1;
  236.             COM3 =1;
  237.             COM4 =1;
  238.             //结束当前,等待下次刷新
  239.             Delay_200us();
  240.         }
  241. }
  242. /************************
  243. * 函数名     :input_smg
  244. * 函数功能:将结果输出到对应IO口上
  245. * 入口参数:无
  246. * 返回          :无
  247. ************************/
  248. void input_smg()                                //数码管段显
  249. {
  250. #if 1
  251.         P3=com_temp;
  252. #else
  253.         if(com_temp&0x01)
  254.         {
  255.                 SMG_A=1;
  256.         }
  257.         else
  258.         {
  259.                 SMG_A=0;
  260.         }
  261.         if(com_temp&0x02)
  262.         {
  263.                 SMG_B=1;
  264.         }
  265.         else
  266.         {
  267.                 SMG_B=0;
  268.         }
  269.         if(com_temp&0x04)
  270.         {
  271.                 SMG_C=1;
  272.         }
  273.         else
  274.         {
  275.                 SMG_C=0;
  276.         }
  277.         if(com_temp&0x08)
  278.         {
  279.                 SMG_D=1;
  280.         }
  281.         else
  282.         {
  283.                 SMG_D=0;
  284.         }
  285.         if(com_temp&0x10)
  286.         {
  287.                 SMG_E=1;
  288.         }
  289.         else
  290.         {
  291.                 SMG_E=0;
  292.         }
  293.         if(com_temp&0x20)
  294.         {
  295.                 SMG_F=1;
  296.         }
  297.         else
  298.         {
  299.                 SMG_F=0;
  300.         }
  301.         if(com_temp&0x40)
  302.         {
  303.                 SMG_G=1;
  304.         }
  305.         else
  306.         {
  307.                 SMG_G=0;
  308.         }
  309.         if(com_temp&0x80)
  310.         {
  311.                 SMG_P=1;
  312.         }
  313.         else
  314.         {
  315.                 SMG_P=0;
  316.         }
  317. #endif
  318. }
  319. /************************
  320. * 函数名     :Delay_200us
  321. * 函数功能:短时间延时
  322. * 入口参数:无
  323. * 返回          :无
  324. ************************/
  325. void Delay_200us()
  326. {
  327. //        uchar i = 60;
  328. //        while(--i);
  329.         uchar i = 250;
  330.         while(--i);
  331.         i = 250;
  332.         while(--i);
  333. }

复制代码


 楼主 | 2017-5-26 15:40 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2017-5-30 10:28 | 显示全部楼层
AD的转换速度和频率可以达到多快呢?
| 2017-5-30 10:37 | 显示全部楼层
KF系列的AD有单独的中断,这个好,可以用来进行电量的检测。
| 2018-6-21 21:53 | 显示全部楼层
使用前需要校准吗
| 2018-6-27 10:02 | 显示全部楼层
转换精度如何
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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