找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC8单片机12位AD转换显示程序

[复制链接]
跳转到指定楼层
楼主
ID:710173 发表于 2022-9-5 19:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<STC8.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define ulong unsigned long
  5. //***********y延时声明**************************
  6. void Delay(uint t);
  7. void LCD_Delay(uint t);
  8. //***********LCD1602声明***********************************
  9. void lcd_init(void);
  10. void DisplayOneChar(uint X, uint Y, uint DData);
  11. //**********************************************
  12. sbit LED0=P7^1;
  13. //**********************************************
  14. uchar xdata table1[]={"                "};
  15. uchar xdata table2[]={"ADC_V:          "};
  16. //**********************************************
  17. uint ADC_Result;uint ADC_count; ulong ADC_sum;uint xdata ADC_data[100]; uint ADC_flag;
  18. void Display_line(uchar y,uchar *DData)
  19. {   
  20.         uchar i;
  21.         for(i=0;i<16;i++)
  22.         {
  23.            if(y==0) DisplayOneChar(i,0,DData[i]);
  24.                 else  if(y==1)  DisplayOneChar(0x40+i,1,DData[i]);
  25.         }
  26. }
  27. void table2_charge()
  28. {
  29.         table2[8]=ADC_Result%10000/1000+0x30;
  30.         table2[9]=ADC_Result%1000/100+0x30;
  31.         table2[10]=ADC_Result%100/10+0x30;
  32.         table2[11]=ADC_Result%10+0x30;
  33. }
  34. void ADC_init()
  35. {
  36.    P1M0 &=0xBF; //设置 P0.6 为 ADC 口    M1为1,M0为0,高阻输入   1011 1111   0100 0000
  37.    P1M1 |= 0x40;
  38.    ADCCFG = 0x0f; //设置 ADC 时钟为系统时钟/2/16/16  数据左对齐
  39.    ADC_CONTR = 0x8E; //使能 ADC 模块      使能  1000 1110  通道P0.6
  40.    EADC = 1; //使能 ADC 中断
  41.    EA = 1;
  42.    ADC_CONTR |= 0x40; //启动 AD 转换
  43. }
  44. void ADC_filter(uint *P)
  45. {
  46.         uint i,j,temp;
  47.         ulong sum=0;

  48.         
  49.     for(j=0;j<99;j++)
  50.         for(i=0;i<99-j;i++)
  51.         {
  52.                 if(*(P+i)>*(P+i+1))
  53.                 {
  54.                         temp=*(P+i);
  55.                         *(P+i)=*(P+i+1);
  56.                         *(P+i+1)=temp;
  57.                 }
  58.          }
  59.             if(ADC_flag!=0)
  60.         {                for(i=45;i<55;i++)
  61.                 {
  62.                   sum+=P[i];
  63.                 }
  64.                 //ADC_Result=sum/10;
  65.                 ADC_Result=(uint)((float)(sum/10*2.5/4.096));
  66.          }
  67. }
  68. void main()
  69. {
  70.         LED0=0;
  71.         lcd_init();
  72.         ADC_init();
  73.         ADC_count=0;ADC_flag=0;
  74.         while(1)
  75.         {
  76. //            LED0=!LED0;
  77. //                LCD_Delay(5);
  78.                 table2_charge();
  79.                 Display_line(0,table1);
  80.                 Display_line(1,table2);
  81.                 ADC_filter(ADC_data);

  82.         }
  83. }
  84. void ADC_Isr() interrupt 5
  85. {
  86. ADC_CONTR &= ~0x20; //清中断标志
  87. ADC_data[ADC_count]= (ADC_RESL>>4)+ADC_RES*16; //读取 ADC 结果
  88. ADC_CONTR |= 0x40; //继续 AD 转换
  89.         
  90. ADC_count++;

  91. if( ADC_count>100) {ADC_count=0; ADC_flag++; if(ADC_flag>=2) ADC_flag=1;}

  92. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:513213 发表于 2022-9-8 17:59 | 只看该作者
一下程序呢?
//***********y延时声明**************************
void Delay(uint t);
void LCD_Delay(uint t);
//***********LCD1602声明***********************************
void lcd_init(void);
void DisplayOneChar(uint X, uint Y, uint DData);
回复

使用道具 举报

板凳
ID:28625 发表于 2022-12-2 20:56 | 只看该作者
楼主,没有完呀
回复

使用道具 举报

地板
ID:28625 发表于 2022-12-2 20:56 | 只看该作者
没有完
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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