找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3337|回复: 1
收起左侧

STC52单片机利用XPT2046实现AIN3的端口电压读取并显示在数码管上

[复制链接]
ID:864860 发表于 2021-1-31 17:05 | 显示全部楼层 |阅读模式
屏幕截图 2021-01-31 170446.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define   MAIN_Fosc    11059200UL


  6. typedef unsigned int INT16U;
  7. sfr  P4 = 0xe8;


  8. sbit DAOUT =P4^4;
  9. sbit DOUT = P2^5 ;
  10. sbit DIN  = P2^0 ;
  11. sbit CS   = P3^7 ;
  12. sbit DCLK = P2^1 ;
  13. sbit DU   =        P2^6 ;
  14. sbit WE   =        P2^7 ;


  15. uchar count,index;
  16. uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
  17. //数码管位选码
  18. uchar code SMGwei[] = {0xfe, 0xfd, 0xfb, 0xf7};
  19. uint  voltage;


  20. void  display(uint i){
  21.         uchar q, b, s, g;
  22.         static uchar wei;
  23.         q = i / 1000;
  24.         b = i % 1000 / 100;
  25.         s = i % 100 / 10;
  26.         g = i % 10;               
  27. //        P0 = 0XFF;//清除断码
  28.         WE = 1;//打开位选锁存器
  29.         P0 = SMGwei[wei];
  30.         WE = 0;//锁存位选数据
  31. //        P0 = 0XFF;//清除断码
  32.         switch(wei)
  33.         {
  34.                 case 0: DU = 1; P0 = SMGduan[q];        DU = 0; break;//0x80加上小数点
  35.                 case 1: DU = 1; P0 = SMGduan[b];         DU = 0; break;        [/b][b]
  36.                 case 2: DU = 1; P0 = SMGduan[s];         DU = 0; break;[/s][s]
  37.                 case 3: DU = 1; P0 = SMGduan[g];         DU = 0; break;               
  38.         }
  39.         wei++;
  40.         if(wei == 4)
  41.                 wei = 0;
  42. }


  43. void initP1(){
  44. EA  = 1;
  45. ET0 = 1;
  46. TR0 = 1;
  47. TMOD|=0x01;
  48. TH0 = 0xED;
  49. TL0 = 0xFF; //定时5ms
  50. }


  51. void initP3(){
  52. EA  = 1;
  53. ET1 = 1;
  54. TR1 = 1;
  55. TMOD|= 0x20;
  56. TH1 = 0xDC ;
  57. TL1 = 0xDC ;


  58. }






  59. void delayMS(INT16U Time){
  60.           INT16U i;
  61.           do{
  62.                   i=MAIN_Fosc/96000;
  63.                     while(--i);
  64.   }while(--Time);
  65. }


  66. void SPLWrite(uchar DATE){
  67.     uchar i;
  68.         for(i=0;i<8;i++){
  69.             DCLK=0;
  70.             if(DATE & 0x80)
  71.                          DIN = 1;
  72.                 else DIN = 0;
  73.                 DCLK = 1;
  74.                 DATE<<=1;
  75.         }
  76.         DIN=0;
  77. }


  78. uint ADvalue(){
  79.          uchar i;
  80.         uint value;
  81.         for(i=0;i<12;i++){
  82.            value<<=1;
  83.            DCLK = 1;
  84.            DCLK = 0;
  85.            if(DOUT)
  86.                            value|=0x01;
  87.         }
  88.         return(value);
  89. }


  90. uint ADInput(uchar DATE){
  91.           uint value1;
  92.           CS = 0;
  93.           SPLWrite(DATE);
  94.           DCLK = 0;
  95.       _nop_();
  96.           _nop_();
  97.           _nop_();
  98.       _nop_();
  99.       _nop_();
  100.         //  CS = 1;
  101.           value1= ADvalue();
  102.           //value1 = ADvalue();
  103.           return(value1);
  104. }


  105. void main(){
  106.         initP1();
  107.         initP3();
  108.         count=255;
  109.         while(1){
  110.          voltage = ADInput(0xe4);
  111. //         voltage=voltage * 1.2207 ;
  112.          delayMS(1000);
  113.         }


  114. }
  115. void interP1() interrupt 1{
  116.    TH0 = 0xED;
  117.    TL0 = 0xFF; //定时5ms
  118.    display(voltage);
  119. }
  120. void interP3() interrupt 3{
  121.    index++;
  122.    if(index<=count)
  123.                         DAOUT = 1;
  124.    else   DAOUT = 0;


  125. }
复制代码

评分

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

查看全部评分

回复

使用道具 举报

ID:115923 发表于 2021-2-6 10:42 | 显示全部楼层
那你只用了 AIN3吗?  不是还有 AIN0,1,2  还有DOUT呢?  有没有代码呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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