找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C51单片机ADC0808多AD路采集 计算后显示 代码+Proteus仿真

[复制链接]
跳转到指定楼层
楼主
C51通过ADC0808采集多路 AD 值   后  计算  结果
最终在lcd 屏上显示   通过按键切换 具体显示的 变量是哪个

压缩包里有 keil代码工程 和 protues 工程
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<stdio.h>
  4. #define uchar unsigned char
  5. uchar i,j,CH;
  6. sbit        EOC=P2^7;
  7. sbit        AE=P2^6;
  8. sbit        ST=P2^5;
  9. sbit        OE=P2^4;
  10. sbit        SWITCH=P3^3;
  11. sbit        ADDA=P2^0;
  12. sbit        ADDB=P2^1;
  13. sbit        ADDC=P2^2;
  14. sbit        RS=P3^0;
  15. sbit        LCDEN=P3^1;
  16. sbit        HLE=P3^5;
  17. sbit        HOE=P3^6;
  18. uchar        addata,f,KEY=0,ALERT,x,pro,y,z;
  19. uchar   lastKEY;
  20. uchar        code dis[]="Channel";
  21. uchar        code detalZ[]="IT      ";
  22. uchar        code disp1[]="OT     ";
  23. uchar        code disp2[]="ET    ";
  24. uchar        code disv1[]="YT   ";
  25. uchar        code disv2[]="QA    ";
  26. uchar        code result[]="result     ";

  27. unsigned int canshu_p = 2;
  28. unsigned int canshu_g = 9;
  29. //unsigned int CHA[6] ;
  30. unsigned int CHA[6] ;
  31. float  fenzi,fenmu;
  32. void delay()
  33. {
  34.         for(i=0;i<10;i++)
  35.                 for(j=0;j<100;j++);
  36. }
  37. void write_com(uchar com)
  38. {
  39. RS=0;
  40. delay();
  41. P1=com;
  42. delay();
  43. LCDEN=1;
  44. delay();
  45. LCDEN=0;
  46. delay();
  47. }
  48. void write_data(uchar dat)
  49. {
  50. RS=1;
  51. delay();
  52. P1=dat;
  53. delay();
  54. LCDEN=1;
  55. delay();
  56. LCDEN=0;
  57. delay();
  58. }

  59. void display()
  60. {                
  61.    
  62.     if(lastKEY!=KEY)
  63.     {
  64.         write_com(0x01);//清屏
  65.     lastKEY = KEY;
  66.     }

  67.    
  68.    
  69.    
  70.    
  71.         write_com(0x80);
  72.    
  73.             for(x=0;x<7;x++)
  74.         {
  75.                 write_data(dis[x]);
  76.         }
  77.    
  78.    
  79.         write_com(0x80+0x08);
  80.            
  81.         //write_data(KEY+0x30);
  82.     if(KEY==0){
  83.    
  84.              for(x=0;x<6;x++)
  85.         {
  86.                 write_data(detalZ[x]);
  87.         }   
  88.     }
  89.     if(KEY==1){
  90.            
  91.              for(x=0;x<2;x++)
  92.         {
  93.                 write_data(disp1[x]);
  94.         }   
  95.     }
  96.       if(KEY==2){
  97.                        
  98.              for(x=0;x<2;x++)
  99.         {
  100.                 write_data(disp2[x]);
  101.         }   
  102.     }  
  103.    
  104.         if(KEY==3){
  105.                
  106.              for(x=0;x<2;x++)
  107.         {
  108.                 write_data(disv1[x]);
  109.         }   
  110.     }
  111.         if(KEY==4){
  112.              for(x=0;x<2;x++)
  113.         {
  114.                 write_data(disv2[x]);
  115.         }   
  116.     }
  117.         
  118.        if(KEY==5){
  119.               
  120.              for(x=0;x<8;x++)
  121.         {
  122.                 write_data(result[x]);
  123.         }   
  124.     }
  125.    
  126.         write_com(0x80+0x47);
  127.         write_data(CHA[KEY]/100+0x30);
  128.         write_data(CHA[KEY]/10%10+0x30);
  129.         write_data(CHA[KEY]%10+0x30);
  130. }
  131. void init()
  132. {        HLE=0;
  133.         LCDEN=0;
  134.         write_com(0x38);//显示设置
  135.         write_com(0x0c);//显示开关
  136.         write_com(0x06);//屏幕不移动
  137.         write_com(0x01);//清屏

  138.         write_com(0x80);
  139.         for(x=0;x<7;x++)
  140.         {
  141.                 write_data(dis[x]);
  142.         }

  143.          CH=0;
  144.          IT1=1;
  145.          EX1=1;
  146.          EA=1;

  147.          TMOD=0x01;
  148.          TH0=(65536-1250)/256;
  149.          TL0=(65536-1250)%256;
  150.          ET0=1;
  151.          TR0=1;
  152.          

  153. }
  154. void gettem(uchar x)
  155. {       
  156.         switch(x)
  157.         {
  158.                 case 0:{ADDA=0;ADDB=0;ADDC=0;break;}
  159.                 case 1:{ADDA=0;ADDB=0;ADDC=1;break;}
  160.                 case 2:{ADDA=0;ADDB=1;ADDC=0;break;}
  161.                 case 3:{ADDA=0;ADDB=1;ADDC=1;break;}
  162.                 case 4:{ADDA=1;ADDB=0;ADDC=0;break;}
  163. //                case 5:{ADDA=1;ADDB=0;ADDC=1;break;}
  164. //                case 6:{ADDA=1;ADDB=1;ADDC=0;break;}
  165. //                case 7:{ADDA=1;ADDB=1;ADDC=1;break;}
  166.         }
  167.         OE=0;
  168.         AE=1;
  169.         ST=1;
  170.         AE=0;
  171.         ST=0;
  172.         while(!EOC);
  173.         OE=1;
  174.         addata=P0;
  175.         CHA[x]=addata;
  176. }
  177. main()
  178. {
  179.         init();
  180.         display();
  181.         while(1)
  182.         {       
  183.                 ALERT=0xff;
  184.                 z=0x7f;
  185.                 for(y=0;y<8;y++)
  186.                 {
  187.                         if(CHA[y]>30)
  188.                                 ALERT=ALERT&z;
  189.                                 z=_cror_(z,1);
  190.                 }
  191.                 HLE=1;
  192.                 P1=ALERT;
  193.                 delay();
  194.                 HLE=0;

  195.      
  196.       
  197.               fenzi = (float)CHA[0];
  198.               fenmu=(float)CHA[1];

  199.         CHA[5] = (unsigned int)((fenzi/fenmu)*100);
  200.                 display();
  201.         }
  202.           

  203. }
  204. void X1_ISR(void) interrupt 2
  205. {
  206.         if(SWITCH==0)               
  207.           {               
  208.                           delay();
  209.                         if(SWITCH==0)
  210.                         {
  211.                                 KEY++;
  212.                        
  213.                         }

  214.                         if(KEY==6)
  215.                                 KEY=0;
  216.                        
  217.                 }
  218.        
  219. }
  220. void T0_ISR(void) interrupt 1
  221. {
  222.         TH0=(65536-1250)/256;
  223.         TL0=(65536-1250)%256;
  224.         CH++;
  225.         if(CH==5)
  226.                 CH=0;
  227.         gettem(CH);
  228. }
复制代码


所有资料51hei提供下载:
多adc采集计算.zip (160.7 KB, 下载次数: 106)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:978036 发表于 2021-11-28 12:40 | 只看该作者
通过按键切换 具体显示的 变量是哪个???
回复

使用道具 举报

板凳
ID:1075678 发表于 2023-5-16 15:42 | 只看该作者
是只有显示电压的吗?没有其他电流或者电阻的吗?
回复

使用道具 举报

地板
ID:1006306 发表于 2023-5-18 13:27 | 只看该作者
还要单独价格ADC芯片,直接上最新的STC8H系列,自带10位或12位ADC
回复

使用道具 举报

5#
ID:1075678 发表于 2023-5-18 23:21 | 只看该作者
Proteus的版本太高,打不开,有谁可以帮忙截一个图吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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