微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机AD转换的程序

51单片机AD转换的程序

时间:11-28 来源:互联网 点击:

  1. void Read_init (unsigned char CHA){
  2. unsigned char AD_FIN=0; //存储A/D转换标志
  3. CHA = 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
  4. ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
  5. _nop_();
  6. ADC_CONTR |= CHA; //选择A/D当前通道
  7. _nop_();
  8. ADC_CONTR |= 0x80; //启动A/D电源
  9. DELAY_MS(1); //使输入电压达到稳定(1ms即可)
  10. }
  11. unsigned char Read (void){
  12. unsigned char AD_FIN=0; //存储A/D转换标志
  13. ADC_CONTR |= 0x08; //启动A/D转换(0000 1000 令ADCS = 1)
  14. _nop_();
  15. _nop_();
  16. _nop_();
  17. _nop_();
  18. while (AD_FIN ==0){ //等待A/D转换结束
  19. AD_FIN = (ADC_CONTR 0x10); //0001 0000测试A/D转换结束否
  20. }
  21. ADC_CONTR = 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换,
  22. return (ADC_DATA); //返回A/D转换结果(8位)
  23. }


以上- 8位ADC程序模块(适用于STC12C2052AD系列)

C代码

  1. #include //单片机头文件
  2. #include //51基本运算(包括_nop_空函数)
  3. void DELAY_MS (unsigned int a){
  4. unsigned int i;
  5. while( a-- != 0){
  6. for(i = 0; i < 600; i++);
  7. }
  8. }
  9. void UART_init (void){
  10. //EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
  11. //ES = 1; //允许UART串口的中断
  12. TMOD = 0x20; //定时器T/C1工作方式2
  13. SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
  14. TH1 = 0xF3; //定时器初值高8位设置
  15. TL1 = 0xF3; //定时器初值低8位设置
  16. PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
  17. TR1 = 1; //定时器启动
  18. }
  19. void UART_T (unsigned char UART_data){ //定义串口发送数据变量
  20. SBUF = UART_data; //将接收的数据发送回去
  21. while(TI == 0); //检查发送中断标志位
  22. TI = 0; //令发送中断标志位为0(软件清零)
  23. }
  24. void Read_init (unsigned char CHA){
  25. unsigned char AD_FIN=0; //存储A/D转换标志
  26. CHA = 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
  27. ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
  28. _nop_();
  29. ADC_CONTR |= CHA; //选择A/D当前通道
  30. _nop_();
  31. ADC_CONTR |= 0x80; //启动A/D电源
  32. DELAY_MS(1); //使输入电压达到稳定(1ms即可)
  33. }
  34. unsigned char Read (void){
  35. unsigned char AD_FIN=0; //存储A/D转换标志
  36. ADC_CONTR |= 0x08; //启动A/D转换(0000 1000 令ADCS = 1)
  37. _nop_();
  38. _nop_();
  39. _nop_();
  40. _nop_();
  41. while (AD_FIN ==0){ //等待A/D转换结束
  42. AD_FIN = (ADC_CONTR 0x10); //0001 0000测试A/D转换结束否
  43. }
  44. ADC_CONTR = 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换,
  45. return (ADC_DATA); //返回A/D转换结果(8位)
  46. }
  47. void main (void){
  48. unsigned char R;
  49. UART_init();//串口初始程序
  50. Read_init(0);//ADC初始化
  51. P1M0 = 0x01; //P1.7~.0:0000 0001(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。
  52. P1M1 = 0x00; //P1.7~.0:0000 0000(强推)
  53. while(1){
  54. R = Read ();
  55. UART_T (R); //串口小秘书,将ADC读出值送入串口显示
  56. }
  57. }


以上- 8位ADC应用实例(适用于STC12C2052AD系列)

C代码

  1. void Read_init (unsigned char CHA){
  2. unsigned char AD_FIN=0; //存储A/D转换标志
  3. CHA = 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
  4. ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
  5. _nop_();
  6. ADC_CONTR |= CHA; //选择A/D当前通道
  7. _nop_();
  8. ADC_CONTR |= 0x80; //启动A/D电源
  9. DELAY_MS(1); //使输入电压达到稳定(1ms即可)
  10. }
  11. unsigned int ADC_Read (void){
  12. unsigned char AD_FIN=0; //存储A/D转换标志
  13. ADC_CONTR |= 0x08; //启动A/D转换(0000 1000 令ADCS = 1)
  14. _nop_();
  15. _nop_();
  16. _nop_();
  17. _nop_();
  18. while (AD_FIN ==0){ //等待A/D转换结束
  19. AD_FIN = (ADC_CONTR 0x10); //0001 0000测试A/D转换结束否
  20. }
  21. ADC_CONTR = 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换,
  22. return (ADC_RES*4+ADC_RESL);//返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)
  23. }


以上- 10位ADC程序模块(适用于STC12C5A60S2系列)

C代码

  1. #include //单片机头文件
  2. #include //51基本运算(包括_nop_空函数)
  3. void DELAY_MS (unsigned int a){
  4. unsigned int i;
  5. while( a-- != 0){
  6. for(i = 0; i < 600; i++);
  7. }
  8. }
  9. void UART_init (void){
  10. //EA = 1; //允许总中断(如不使用中断,可用//屏蔽)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top