找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC12C5204AD单片机AD转换,改变检测电压后只有重新上电再更新串口数据?

[复制链接]
跳转到指定楼层
楼主
#include<STC12C5A60S2.h>
unsigned int a;
unsigned int res;
//定义延时函数                                          

void delay(a){
while(--a!=0){
unsigned int i;
for(i=0;i<600;i++);
}
}

//串口初始化函数
void UART_INT(void){

PCON=0X80;
TMOD=0X20;                                                   
SCON=0X50;
TH1=0XF3;
TL1=0XF3;
EA=1;
ES=1;
TR1=1;

}

//AD转换函数初始化
void ADC_INT()
{
P1ASF=0X01;//选择P1.0口作AD转换输入口;
ADC_RES=0;//转换结果寄存器清零
ADC_CONTR=ADC_CONTR|0x80;         //          让第七位ADC_POWER置1,打开电源
EADC=1;         //打开AD转换开关
delay(2);        //延时等待电源稳定
ADC_CONTR=ADC_CONTR|0x08; //让第3位ADC_START置1,开始转换
}

//AD中断函数
ADC_ISR() interrupt 5 using 1
{         
while((ADC_CONTR&0x10)==0);         //        等待转换完成,第四位ADC_FLAG标志位为0时等待
res=ADC_RES;//转换完成后,将值赋给串口数据寄存器
SBUF=res;        
ADC_CONTR|=0x08;//重新启动ADC转换                                
}
//
void main(void)                  
{
UART_INT();        
ADC_INT();
while(1){
while(!TI);        
SBUF=res;        
TI=0;
}
}
//


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2019-8-16 06:28 | 只看该作者

  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ---------------------------------------------*/
  3. /* --- STC12C5Axx Series MCU A/D Conversion Demo -------------------*/
  4. /* --- Mobile: (86)13922805190 -------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/
  7. /* --- Web: www.STCMCU.com -----------------------------------------*/
  8. /* --- Web: www.GXWMCU.com -----------------------------------------*/
  9. /* If you want to use the program or the program referenced in the  */
  10. /* article, please specify in which data and procedures from STC    */
  11. /*------------------------------------------------------------------*/

  12. #include "reg51.h"
  13. #include "intrins.h"

  14. #define FOSC    11059200L
  15. #define BAUD    9600

  16. typedef unsigned char BYTE;
  17. typedef unsigned int WORD;

  18. /*Declare SFR associated with the ADC */
  19. sfr ADC_CONTR   =   0xBC;           //ADC control register
  20. sfr ADC_RES     =   0xBD;           //ADC hight 8-bit result register
  21. sfr ADC_LOW2    =   0xBE;           //ADC low 2-bit result register
  22. sfr P1ASF       =   0x9D;           //P1 secondary function control register

  23. /*Define ADC operation const for ADC_CONTR*/
  24. #define ADC_POWER   0x80            //ADC power control bit
  25. #define ADC_FLAG    0x10            //ADC complete flag
  26. #define ADC_START   0x08            //ADC start control bit
  27. #define ADC_SPEEDLL 0x00            //420 clocks
  28. #define ADC_SPEEDL  0x20            //280 clocks
  29. #define ADC_SPEEDH  0x40            //140 clocks
  30. #define ADC_SPEEDHH 0x60            //70 clocks

  31. void InitUart();
  32. void SendData(BYTE dat);
  33. void Delay(WORD n);
  34. void InitADC();

  35. BYTE ch = 0;                        //ADC channel NO.

  36. void main()
  37. {
  38.     InitUart();                     //Init UART, use to show ADC result
  39.     InitADC();                      //Init ADC sfr
  40.     IE = 0xa0;                      //Enable ADC interrupt and Open master interrupt switch
  41.                                     //Start A/D conversion
  42.     while (1);
  43. }

  44. /*----------------------------
  45. ADC interrupt service routine
  46. ----------------------------*/
  47. void adc_isr() interrupt 5
  48. {
  49.     ADC_CONTR &= !ADC_FLAG;         //Clear ADC interrupt flag

  50.     SendData(ch);                   //Show Channel NO.
  51.     SendData(ADC_RES);              //Get ADC high 8-bit result and Send to UART

  52. //if you want show 10-bit result, uncomment next line
  53. //    SendData(ADC_LOW2);             //Show ADC low 2-bit result
  54.    
  55.     if (++ch > 7) ch = 0;           //switch to next channel
  56.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  57. }

  58. /*----------------------------
  59. Initial ADC sfr
  60. ----------------------------*/
  61. void InitADC()
  62. {
  63.     P1ASF = 0xff;                   //Set all P1 as analog input port
  64.     ADC_RES = 0;                    //Clear previous result
  65.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  66.     Delay(2);                       //ADC power-on delay and Start A/D conversion
  67. }

  68. /*----------------------------
  69. Initial UART
  70. ----------------------------*/
  71. void InitUart()
  72. {
  73.     SCON = 0x5a;                    //8 bit data ,no parity bit
  74.     TMOD = 0x20;                    //T1 as 8-bit auto reload
  75.     TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate
  76.     TR1 = 1;                        //T1 start running
  77. }

  78. /*----------------------------
  79. Send one byte data to PC
  80. Input: dat (UART data)
  81. Output:-
  82. ----------------------------*/
  83. void SendData(BYTE dat)
  84. {
  85.     while (!TI);                    //Wait for the previous data is sent
  86.     TI = 0;                         //Clear TI flag
  87.     SBUF = dat;                     //Send current data
  88. }

  89. /*----------------------------
  90. Software delay function
  91. ----------------------------*/
  92. void Delay(WORD n)
  93. {
  94.     WORD x;

  95.     while (n--)
  96.     {
  97.         x = 5000;
  98.         while (x--);
  99.     }
  100. }

复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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