標題:
新手請教,各位大佬可以幫我看看我寫的單片機ATT7022程序有啥問題
[打印本頁]
作者:
nngd
時間:
2021-4-30 21:16
標題:
新手請教,各位大佬可以幫我看看我寫的單片機ATT7022程序有啥問題
本帖最后由 nngd 于 2021-5-2 08:44 編輯
調(diào)試的時候SPI的通信口的SCLK有波形,DIN、CS全是低電平,懇求大佬指導(dǎo)一下
下面是單片機程序:
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define DATA_LCD P2
sbit KEY1 = P0^0;
sbit KEY2 = P0^1;
sbit KEY3 = P0^2;
sbit KEY4 = P0^3;
sbit RS = P0^5;
sbit RW = P0^6;
sbit E = P0^7;
sbit DOUT = P1^1;
sbit DIN = P1^2;
sbit SCLK = P1^3;
sbit CS = P1^4;
sbit RST = P3^2;
sbit SIG = P3^3;
/*********************1ms延時****************************************************************/
void delay_1ms(uint x)
{
uint i,j;
for(i=1;i<x;i++)
for(j=1;j<110;j++);
}
/**********************LCD判忙******************************************************************/
void check_BF(void)
{
P2=0xff;
E=0;
RS=0;
RW=1;
E=1;
E=0;
RS=1;
RW=0;
}
/**********************LCD寫指令******************************************************************/
void write_cmd(uchar com)
{
check_BF();
E=0;
RS=0;
RW=0;
DATA_LCD=com;
delay_1ms(2);
E=1;
delay_1ms(2);
E=0;
RS=1;
RW=1;
}
/*********************LCD初始化*************************************************************/
void Init_LCD(void)
{
write_cmd(0x38); //ÏÔê¾Ä£ê½éèÖà éèÖÃ8λ¸ñê½£¬2DD5X7
write_cmd(0x08); //Tune off screen
write_cmd(0x01); //ÏÔê¾ÇåÆá
write_cmd(0x06); //ÏÔê¾1a±êòƶˉéèÖÃ
write_cmd(0x0c); //ÏÔ꾿a¼°1a±êéèÖÃ
}
/**********************LCD寫數(shù)據(jù)*******************************************************************/
void write_data(uchar chardata)
{
check_BF();
E=0;
RS=1;
RW=0;
DATA_LCD=chardata;
delay_1ms(2);
E=1;
delay_1ms(2);
E=0;
RS=0;
RW=1;
}
/**********************LCD定位*******************************************************************/
void set_xy(uchar x,uchar y)
{
uchar add;
if(x==0)
add=0x80+y;
else
if(x==1)
add=0xc0+y;
else
if(x==2)
add=0x90+y;
else
if(x==3)
add=0xd0+y;
write_cmd(add);
}
/**********************LCD顯示***********************************************************************/
void displayL(uchar x,uchar y,uchar *s)
{
set_xy(x,y);
while(*s)
{
DATA_LCD=*s;
write_data(*s);
s++;
}
}
/********1us延時********/
void delay()
{
_nop_();
}
/**********ATTT7022讀操作************/
unsigned long int RSpi(uchar Com)
{
uchar n,h;
unsigned long int d=0;
CS=1;
SCLK=0;
CS=0;
for(n=7;n>=0;n--)
{
SCLK=1;
if(Com&0x80)
DIN=1;
else
DIN=0;
Com<<=1;
SCLK=0;
}
delay();delay();delay();
for(n=23;n>=0;n--)
{
SCLK=1;
if(DOUT&0x01)
h=1;
else
h=0;
d=(d<<1)|h;
SCLK=0;
}
CS=1;
return d;
}
/***************ATT7022寫操作**************/
void WSpi(uchar Com,unsigned long int d)
{
uchar n;
CS=1;
SCLK=0;
CS=0;
for(n=7;n>=0;n--)
{
SCLK=1;
if(Com&0x80)
DIN=1;
else
DIN=0;
Com<<=1;
SCLK=0;
}
for(n=23;n>=0;n--)
{
SCLK=1;
if(d&0x800000)
DIN=1;
else
DIN=0;
d<<=1;
SCLK=0;
}
CS=1;
}
/****************顯示電壓電流功率因數(shù)*************************************************************/
unsigned long int displayUAF(uchar a,uchar x,uchar y,uchar z)
{
unsigned long int U,A,F,h;
uchar UAF[19]=" : V . A 0. ";
UAF[0]=a;
U=RSpi(x)/8192;
A=RSpi(y)/8192*100;
h=RSpi(z);
if(h>8388608)
h=h-16777216;
else
h=h;
F=h/8388608*100;
UAF[3]=U/100+0x30;
UAF[4]=U%100/10+0x30;
UAF[5]=U%10+0x30;
UAF[8]=A/1000+0x30;
UAF[9]=A%1000/100+0x30;
UAF[11]=A%100/10+0x30;
UAF[12]=A%10+0x30;
UAF[17]=F/10+0x30;
UAF[18]=F%10+0x30;
return(UAF[19]);
}
/*****************顯示無功 有功 視在功率************************************************************/
unsigned long int displaySPQ(uchar a,uchar x,uchar y,uchar z)
{
unsigned long int S,S1,P,P1,Q,Q1;
uchar SPQ[22]=" : vA W Var";
SPQ[0]=a;
S1=RSpi(x);
if(S1>8388608)
S1=S1-16777216;
else
S1=S1;
S=S1/256;
if(RSpi(y)>8388608)
P1=RSpi(y)-16777216;
else
P1=RSpi(y);
P=P1/256;
if(RSpi(z)>8388608)
Q1=RSpi(z)-16777216;
else
Q1=RSpi(z);
Q=Q1/256;
SPQ[2]=S/1000+0x30;
SPQ[3]=S%1000/100+0x30;
SPQ[4]=S%1000%100/10+0x30;
SPQ[5]=S%10+0x30;
SPQ[9]=P/1000+0x30;
SPQ[10]=P%1000/100+0x30;
SPQ[11]=P%1000%100/10+0x30;
SPQ[11]=P%10+0x30;
SPQ[15]=Q/1000+0x30;
SPQ[16]=Q%1000/100+0x30;
SPQ[17]=Q%1000%100/10+0x30;
SPQ[18]=Q%10+0x30;
return(SPQ[22]);
}
/*****ATT7022初始化 校表*****/
void check()
{
RST=0;
delay_1ms(1);
RST=1;
delay_1ms(1000);
WSpi(0xC3,0x000000);
WSpi(0xC9,0x000000);
WSpi(0x20,0x000022);
WSpi(0x1E,0x000000);
WSpi(0x02,0x000000);
WSpi(0x03,0x000000);
WSpi(0x04,0x000000);
WSpi(0x05,0x000000);
WSpi(0x86,0x12293737);
WSpi(0x89,0x12293737);
WSpi(0x87,0x9277740);
WSpi(0x8A,0x9277740);
WSpi(0x88,0x9438312);
WSpi(0x8B,0x9538312);
WSpi(0x0C,0);
WSpi(0x0D,0);
WSpi(0x0E,0);
WSpi(0x0F,0);
WSpi(0x10,0);
WSpi(0x11,0);
WSpi(0x12,0);
WSpi(0x13,0);
WSpi(0x14,0);
WSpi(0x15,0);
WSpi(0x16,0);
WSpi(0x17,0);
WSpi(0x18,0);
WSpi(0x19,0);
WSpi(0x1A,0);
WSpi(0x9B,15689803);
WSpi(0x9C,1006951);
WSpi(0x9D,71697);
WSpi(0xA6,8880843);
WSpi(0xA7,8476057);
WSpi(0xA8,8503241);
WSpi(0x2C,0x000003);
WSpi(0xB0,0x5678);
WSpi(0xAE,0x3584);
WSpi(0xC9,0x000001);
WSpi(0xC6,0x000011);
}
/*********主函數(shù)**************/
void main()
{
Init_LCD();
check();
while(1)
{
if(KEY1==0)
{
displayL(0,0,displayUAF(65,0x0D,0x10,0x14));
displayL(1,0,displayUAF(66,0x0E,0x11,0x15));
displayL(2,0,displayUAF(67,0x0F,0x12,0x16));
}
if(KEY2==0)
{
displayL(0,0,displaySPQ(65,0x09,0x01,0x05));
displayL(1,0,displaySPQ(66,0x0A,0x02,0x06));
displayL(2,0,displaySPQ(67,0x0B,0x03,0x07));
}
}
}
復(fù)制代碼
下面是原理圖:
捕獲.JPG
(178.19 KB, 下載次數(shù): 63)
下載附件
2021-4-30 21:16 上傳
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1