找回密码
 立即注册

QQ登录

只需一步,快速开始

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

新手请教,各位大佬可以帮我看看我写的单片机ATT7022程序有啥问题

[复制链接]
跳转到指定楼层
楼主
本帖最后由 nngd 于 2021-5-2 08:44 编辑

调试的时候SPI的通信口的SCLK有波形,DIN、CS全是低电平,恳求大佬指导一下
下面是单片机程序:
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include <intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define DATA_LCD P2

  7. sbit KEY1  =  P0^0;
  8. sbit KEY2  =  P0^1;
  9. sbit KEY3  =  P0^2;
  10. sbit KEY4  =  P0^3;
  11. sbit RS    =  P0^5;
  12. sbit RW    =  P0^6;
  13. sbit E     =  P0^7;
  14. sbit DOUT  =  P1^1;
  15. sbit DIN   =  P1^2;
  16. sbit SCLK  =  P1^3;
  17. sbit CS    =  P1^4;
  18. sbit RST   =  P3^2;
  19. sbit SIG   =  P3^3;

  20. /*********************1ms延时****************************************************************/
  21. void delay_1ms(uint x)
  22. {
  23.         uint i,j;
  24.         for(i=1;i<x;i++)
  25.         for(j=1;j<110;j++);
  26. }

  27. /**********************LCD判忙******************************************************************/
  28. void check_BF(void)
  29. {
  30.        P2=0xff;
  31.        E=0;
  32.        RS=0;
  33.        RW=1;
  34.        E=1;
  35.        E=0;
  36.        RS=1;
  37.        RW=0;        
  38. }

  39. /**********************LCD写指令******************************************************************/
  40. void write_cmd(uchar com)
  41. {
  42.         check_BF();
  43.         E=0;
  44.         RS=0;
  45.         RW=0;
  46.         DATA_LCD=com;
  47.         delay_1ms(2);
  48.         E=1;
  49.         delay_1ms(2);
  50.         E=0;
  51.         RS=1;
  52.         RW=1;
  53. }

  54. /*********************LCD初始化*************************************************************/
  55. void Init_LCD(void)
  56. {
  57.         write_cmd(0x38);                                                         //ÏÔê¾Ä£ê½éèÖà éèÖÃ8λ¸ñê½£¬2DD5X7
  58.         write_cmd(0x08);                                                         //Tune off screen
  59.         write_cmd(0x01);                                                         //ÏÔê¾ÇåÆá
  60.         write_cmd(0x06);                                                         //ÏÔê¾1a±êòƶˉéèÖÃ
  61.         write_cmd(0x0c);                                                         //ÏÔ꾿a¼°1a±êéèÖà                 
  62. }

  63. /**********************LCD写数据*******************************************************************/
  64. void write_data(uchar chardata)
  65. {
  66.         check_BF();
  67.         E=0;
  68.                                 RS=1;
  69.         RW=0;
  70.         DATA_LCD=chardata;
  71.         delay_1ms(2);
  72.         E=1;
  73.         delay_1ms(2);
  74.         E=0;
  75.         RS=0;
  76.         RW=1;
  77. }

  78. /**********************LCD定位*******************************************************************/
  79. void set_xy(uchar x,uchar y)
  80. {
  81.         uchar add;
  82.         if(x==0)
  83.                 add=0x80+y;
  84.         else
  85.                 if(x==1)
  86.                         add=0xc0+y;
  87.         else
  88.                 if(x==2)
  89.                         add=0x90+y;
  90.         else
  91.                 if(x==3)
  92.                         add=0xd0+y;
  93.         write_cmd(add);
  94. }

  95. /**********************LCD显示***********************************************************************/
  96. void displayL(uchar x,uchar y,uchar *s)
  97. {
  98.         set_xy(x,y);
  99.         while(*s)
  100.         {
  101.                 DATA_LCD=*s;
  102.                 write_data(*s);
  103.                 s++;
  104.         }
  105. }

  106. /********1us延时********/
  107. void delay()
  108. {
  109.         
  110.                 _nop_();
  111.         
  112. }

  113. /**********ATTT7022读操作************/
  114. unsigned long int RSpi(uchar Com)
  115. {
  116.         uchar n,h;
  117.         unsigned long int d=0;
  118.         CS=1;
  119.         SCLK=0;
  120.         CS=0;
  121.         for(n=7;n>=0;n--)
  122.         {
  123.                 SCLK=1;
  124.                 if(Com&0x80)
  125.                         DIN=1;
  126.                 else
  127.                         DIN=0;
  128.                 Com<<=1;
  129.                 SCLK=0;
  130.         }
  131.         delay();delay();delay();
  132.         for(n=23;n>=0;n--)
  133.         {
  134.                 SCLK=1;
  135.                 if(DOUT&0x01)
  136.                         h=1;
  137.                 else
  138.                         h=0;
  139.                 d=(d<<1)|h;
  140.     SCLK=0;
  141.         }
  142.         CS=1;
  143.         return d;
  144. }

  145. /***************ATT7022写操作**************/
  146. void WSpi(uchar Com,unsigned long int d)
  147. {
  148.         uchar n;
  149.         CS=1;
  150.         SCLK=0;
  151.         CS=0;
  152.         for(n=7;n>=0;n--)
  153.         {
  154.                 SCLK=1;
  155.                 if(Com&0x80)
  156.                         DIN=1;
  157.                 else
  158.                         DIN=0;
  159.                 Com<<=1;
  160.                 SCLK=0;
  161.         }
  162.         for(n=23;n>=0;n--)
  163.         {
  164.                 SCLK=1;
  165.                 if(d&0x800000)
  166.                         DIN=1;
  167.                 else
  168.                         DIN=0;
  169.                 d<<=1;
  170.                 SCLK=0;
  171.         }
  172.         CS=1;
  173. }

  174. /****************显示电压电流功率因数*************************************************************/
  175. unsigned long int displayUAF(uchar a,uchar x,uchar y,uchar z)
  176. {
  177.         unsigned long int U,A,F,h;
  178.         uchar UAF[19]=" :    V   .  A 0.  ";
  179.         UAF[0]=a;
  180.         U=RSpi(x)/8192;
  181.         A=RSpi(y)/8192*100;
  182.         h=RSpi(z);
  183.         if(h>8388608)
  184.                 h=h-16777216;
  185.         else
  186.                 h=h;
  187.         F=h/8388608*100;
  188.         UAF[3]=U/100+0x30;
  189.         UAF[4]=U%100/10+0x30;
  190.         UAF[5]=U%10+0x30;
  191.         UAF[8]=A/1000+0x30;
  192.         UAF[9]=A%1000/100+0x30;
  193.         UAF[11]=A%100/10+0x30;
  194.         UAF[12]=A%10+0x30;
  195.         UAF[17]=F/10+0x30;
  196.         UAF[18]=F%10+0x30;
  197.         return(UAF[19]);
  198. }

  199. /*****************显示无功 有功 视在功率************************************************************/
  200. unsigned long int displaySPQ(uchar a,uchar x,uchar y,uchar z)
  201. {
  202.         unsigned long int S,S1,P,P1,Q,Q1;
  203.         uchar SPQ[22]=" :    vA     W     Var";
  204.         SPQ[0]=a;
  205.         S1=RSpi(x);
  206.         if(S1>8388608)
  207.                 S1=S1-16777216;
  208.         else
  209.                 S1=S1;
  210.         S=S1/256;
  211.         if(RSpi(y)>8388608)
  212.                 P1=RSpi(y)-16777216;
  213.         else
  214.                 P1=RSpi(y);
  215.         P=P1/256;
  216.         if(RSpi(z)>8388608)
  217.                 Q1=RSpi(z)-16777216;
  218.         else
  219.                 Q1=RSpi(z);
  220.         Q=Q1/256;
  221.         SPQ[2]=S/1000+0x30;
  222.         SPQ[3]=S%1000/100+0x30;
  223.         SPQ[4]=S%1000%100/10+0x30;
  224.         SPQ[5]=S%10+0x30;
  225.         SPQ[9]=P/1000+0x30;
  226.         SPQ[10]=P%1000/100+0x30;
  227.         SPQ[11]=P%1000%100/10+0x30;
  228.         SPQ[11]=P%10+0x30;
  229.         SPQ[15]=Q/1000+0x30;
  230.         SPQ[16]=Q%1000/100+0x30;
  231.         SPQ[17]=Q%1000%100/10+0x30;
  232.         SPQ[18]=Q%10+0x30;
  233.         return(SPQ[22]);
  234. }
  235.         
  236. /*****ATT7022初始化 校表*****/
  237. void check()
  238. {
  239.         RST=0;
  240.         delay_1ms(1);
  241.         RST=1;
  242.         delay_1ms(1000);
  243.         WSpi(0xC3,0x000000);
  244.         WSpi(0xC9,0x000000);
  245.         
  246.         WSpi(0x20,0x000022);
  247.         
  248.         WSpi(0x1E,0x000000);
  249.         
  250.         WSpi(0x02,0x000000);
  251.         WSpi(0x03,0x000000);
  252.         WSpi(0x04,0x000000);
  253.         WSpi(0x05,0x000000);
  254.         
  255.         WSpi(0x86,0x12293737);
  256.         WSpi(0x89,0x12293737);
  257.         
  258.         WSpi(0x87,0x9277740);
  259.         WSpi(0x8A,0x9277740);
  260.         
  261.         WSpi(0x88,0x9438312);
  262.         WSpi(0x8B,0x9538312);
  263.         
  264.         WSpi(0x0C,0);
  265.         WSpi(0x0D,0);
  266.         WSpi(0x0E,0);
  267.         WSpi(0x0F,0);
  268.         WSpi(0x10,0);
  269.         
  270.         WSpi(0x11,0);
  271.         WSpi(0x12,0);
  272.         WSpi(0x13,0);
  273.         WSpi(0x14,0);
  274.         WSpi(0x15,0);
  275.         
  276.         WSpi(0x16,0);
  277.         WSpi(0x17,0);
  278.         WSpi(0x18,0);
  279.         WSpi(0x19,0);
  280.         WSpi(0x1A,0);
  281.         
  282.         WSpi(0x9B,15689803);
  283.         WSpi(0x9C,1006951);
  284.         WSpi(0x9D,71697);
  285.         WSpi(0xA6,8880843);
  286.         WSpi(0xA7,8476057);
  287.         WSpi(0xA8,8503241);
  288.         
  289.         WSpi(0x2C,0x000003);
  290.         WSpi(0xB0,0x5678);
  291.         WSpi(0xAE,0x3584);
  292.         WSpi(0xC9,0x000001);
  293.         WSpi(0xC6,0x000011);
  294. }

  295. /*********主函数**************/
  296. void main()
  297. {
  298.         Init_LCD();
  299.         check();
  300.         while(1)
  301.         {
  302.                 if(KEY1==0)
  303.                 {
  304.                         displayL(0,0,displayUAF(65,0x0D,0x10,0x14));
  305.                         displayL(1,0,displayUAF(66,0x0E,0x11,0x15));
  306.                         displayL(2,0,displayUAF(67,0x0F,0x12,0x16));
  307.                 }
  308.                 if(KEY2==0)
  309.                 {
  310.                         displayL(0,0,displaySPQ(65,0x09,0x01,0x05));
  311.                         displayL(1,0,displaySPQ(66,0x0A,0x02,0x06));
  312.                         displayL(2,0,displaySPQ(67,0x0B,0x03,0x07));
  313.                 }
  314.         }
  315. }
复制代码

下面是原理图:

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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