找回密码
 立即注册

QQ登录

只需一步,快速开始

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

一个关于AD检测DA输出的单片机问题求助

[复制链接]
ID:289777 发表于 2018-6-10 11:05 | 显示全部楼层 |阅读模式
50黑币
AD检测DA输出的模拟电压,然后在数码管上显示
我的能显示,但是数字总是跳变,这是怎么回事,数字不稳定,跳变明显
占空比明明我已经固定了,按理说不会发生很大的跳变现象,但是我的依然发生的跳变很大,这是怎么回事
我的程序在下面,很短,麻烦看一下,占空比是Value
周期是Timer1
主函数While 里已经把占空比固定了,为什么数字跳变在数码管上还是很明显??


是中断的问题吗?但是数码管的中断我已经修改好几了,不管定时是长一点还是短,跳变现象都很明显,怎么办?

单片机源码:
  1. /**************************************************************************************
  2. *                外部输入AD实验              *
  3. 实现现象: 具体接线操作请参考视频
  4.    下载程序后数码管前4位显示外部输入IN3通道检测的AD值,模拟信号电压范围在0-5V
  5. 注意事项:                     
  6. ***************************************************************************************/
  7. #include "reg52.h"    //此文件中定义了单片机的一些特殊功能寄存器
  8. #include"XPT2046.h"
  9. typedef unsigned int u16;   //对数据类型进行声明定义
  10. typedef unsigned char u8;
  11. //--定义使用的IO口--//
  12. sbit PWM=P2^1;
  13. bit DIR;
  14. //--定义一个全局变量--//
  15. u16 count,value,timer1;
  16. sbit LSA=P2^2;
  17. sbit LSB=P2^3;
  18. sbit LSC=P2^4;
  19. u8 disp[4];
  20. u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  21. /*******************************************************************************
  22. * 函 数 名         : delay
  23. * 函数功能     : 延时函数,i=1时,大约延时10us
  24. *******************************************************************************/
  25. void delay(u16 i)
  26. {
  27. while(i--);
  28. }
  29. /*******************************************************************************
  30. * 函数名         :datapros()
  31. * 函数功能   :数据处理函数
  32. * 输入           : 无
  33. * 输出           : 无
  34. *******************************************************************************/
  35. void datapros()
  36. {
  37. u16 temp;
  38. static u8 i;
  39. if(i==50)
  40. {
  41.   i=0;
  42.   temp = Read_AD_Data(0xE4);  //   AIN3 外部输入
  43. }
  44. i++;
  45. disp[0]=smgduan[temp/1000];//千位
  46. disp[1]=smgduan[temp%1000/100];//百位
  47. disp[2]=smgduan[temp%1000%100/10];//个位
  48. disp[3]=smgduan[temp%1000%100%10];  
  49. }

  50. /*******************************************************************************
  51. * 函数名         :DigDisplay()
  52. * 函数功能   :数码管显示函数
  53. * 输入           : 无
  54. * 输出           : 无
  55. *******************************************************************************/
  56. void DigDisplay()
  57. {
  58. u8 i;
  59. for(i=0;i<4;i++)
  60. {
  61.   switch(i)  //位选,选择点亮的数码管,
  62.   {
  63.    case(0):
  64.     LSA=0;LSB=0;LSC=0; break;//显示第0位
  65.    case(1):
  66.     LSA=1;LSB=0;LSC=0; break;//显示第1位
  67.    case(2):
  68.     LSA=0;LSB=1;LSC=0; break;//显示第2位
  69.    case(3):
  70.     LSA=1;LSB=1;LSC=0; break;//显示第3位
  71.   }

  72.   P0=disp[i];//发送数据
  73.   delay(40); //间隔一段时间扫描
  74.   P0=0x00;//消隐
  75. }  
  76. }
  77. /*******************************************************************************
  78. * 函 数 名       : main
  79. * 函数功能   : 主函数
  80. * 输    入       : 无
  81. * 输    出      : 无
  82. *******************************************************************************/
  83. void Timer1Init()
  84. {
  85. TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
  86. TH1 = 0xFF;
  87. TL1 = 0xff;   //1us
  88.   
  89. ET1=1;//打开定时器1中断允许
  90. EA=1;//打开总中断
  91. TR1=1;//打开定时器   
  92. }
  93. void Timer1Init1()
  94. {
  95. TMOD|= 0x01;
  96.    TH0 = 0x0D8;
  97.     TL0 = 0x0F0;
  98.     ET0 = 1;
  99.     TR0 = 1;  
  100. }
  101. void main()
  102. {
  103.     Timer1Init1();
  104. Timer1Init();  //定时器1初始化

  105. while(1)
  106. {   
  107.       
  108.    value=34;
  109.   if(timer1>200)  //PWM周期为1000*1us
  110.   {
  111.    timer1=0;
  112.   }
  113.   if(timer1 <value)
  114.   {
  115.    PWM=1;
  116.   }
  117.   else
  118.   {
  119.    PWM=0;
  120.   }
  121.   
  122. }  
  123. }
  124.     void Time(void) interrupt 1  //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断
  125. {
  126.       TH0 = 0x0D8;
  127.     TL0 = 0x0F0;
  128. count++ ;
  129.        if(count==20)
  130.        {count=0;
  131.    
  132.        datapros();  //数据处理函数
  133.   DigDisplay();//数码管显示函数
  134.           }

  135. }
  136. void Time1(void) interrupt 3    //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断
  137. {
  138. TH1 = 0xFF;
  139. TL1 = 0xff;   //1us
  140. timer1++;
  141.       
  142. }
复制代码

回复

使用道具 举报

ID:269211 发表于 2018-6-10 13:16 来自手机 | 显示全部楼层
建议你加入数值处理的算法,使用多数据采样
回复

使用道具 举报

ID:289777 发表于 2018-6-10 17:08 | 显示全部楼层
chaoself 发表于 2018-6-10 13:16
建议你加入数值处理的算法,使用多数据采样

等于没说
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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