⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.c

📁 电子指南针
💻 C
字号:
/*
   本程序实现寻迹,时间显示,调速,方向控制,平衡等功能;
   P0口用来实现寻迹,检测道路状态;
   P1口用来进行AD转换,对角度传感器进行测量;
   P2口用来控制PWM控制电机转速以及方向控制;



*/
#include<reg51.h>
#include <stdio.h>
#include<intrins.h>


sbit dis_DIN=P1^0; /*显示串行数据输入端*/ 

sbit dis_LOAD=P1^1; /*显示数据锁存端*/ 

sbit dis_CLK=P1^2; /*显示时钟输入端*/ 



sbit   SPI_SCK   =    P1^7 ;
sbit   SPI_MISO     =    P1^6 ;
sbit   SPI_MOSI    =    P1^5 ;
sbit   SPI_CS    =    P1^4 ;


#define NoOp 0x00 /*空操作*/ 

#define Digit0 0x01 /*数码管1*/ 

#define Digit1 0x02 /*数码管2*/ 

#define Digit2 0x03 /*数码管3*/ 

#define Digit3 0x04 /*数码管4*/ 

#define Digit4 0x05 /*数码管5*/ 

#define Digit5 0x06 /*数码管6*/ 

#define Digit6 0x07 /*数码管7*/ 

#define Digit7 0x08 /*数码管8*/ 

//=========================工作模式设置================================

#define ShutDown 0x0c     /*掉电模式寄存器地址*/ 
#define ShutdownMode1 0x01 /*掉电方式工作  0  关闭  1  开启*/ 
#define ShutdownMode0 0x00

#define DecodeMode 0x09  /*译码模式寄存器地址*/ 
#define DecodeDigit 0x00 /*译码位数设置*/ 


#define Intensity 0x0a      /*亮度寄存器地址*/ 
#define IntensityGrade 0x01 /*显示亮度级别设置*/ 


#define ScanLimit 0x0b /*扫描界限*/ 
#define ScanDigit 0x07 /*扫描位数设置*/ 


#define DisplayTest 0x0f /*显示测试 0 普通模式  1显示测试模式*/ 
#define TestMode 0x01 /*显示测试方式*/ 
#define TextEnd 0x00 /*显示测试结束,正常工作*/ 


/*-------------------------------------------------------- 

10ms延时子程序 

---------------------------------------------------------*
*/
void delayX10ms(unsigned char count) 

{ 

unsigned char j,k; 

while(count--!=0) 

{ 

//for(j=0;j<86;j++) 

for(k=0;k<73;k++) 

; 

} 

} 



0x23,0x00
unsigned char znz_send(unsigned char Cmd)
                     
{  
    unsigned int t;
    unsigned char i,j,Temp;
    SPI_MOSI=0;
    SPI_SCK=0;
    SPI_CS=0;
 	
	for(i=0;i<8;i++)
	{
	 if(Cmd&0x80)		 //5
		  SPI_MOSI=1;		   //2
     else 
		  SPI_MOSI=0;		   //1
											  
		  SPI_SCK=1;  		 //1			  //上升沿
          Cmd<<=1;		     //6
	      SPI_SCK=0;       //1        
		  Temp<<=1;        //6        //暂存数据左移一位
		  if(SPI_MISO)		            //读取从机数据
		  Temp|=0x01;      //7    
	}

	t=20;
	while(t--);
     SPI_CS=1;
     return Temp;
}



//=========================工作模式设置结束===========================

unsigned char data DisBuffer[8]={0,0,0,0,0,0,0,0}; /*显示缓存区*/ 
unsigned char code dispaly_list[]= {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b, /*0,1,2,3,4,5,6,7,8,9*/ 

                                    0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff,0x00}; /*A,B,C,D,E,F,P,U,全亮,全灭*/ 
//向MAX7219写入字节(8位)============================================ 


void SendChar(unsigned char ch) 

{ 

unsigned char i,temp; 

_nop_(); 

for (i=0;i<8;i++) 

{ 

temp=ch&0x80; 

ch=ch<<1; 

if(temp) 

{ 

dis_DIN=1; 

dis_CLK=0; 

dis_CLK=1; 

} 

else 

{ 

dis_DIN=0; 

dis_CLK=0; 

dis_CLK=1; 

} 

} 

} 



//向MAX7219写入字(16位)=============================================


void WriteWord (unsigned char addr,unsigned char num) 

{ 

dis_LOAD=0; 

_nop_(); 

SendChar (addr); 

_nop_(); 

SendChar (num); 

_nop_(); 

dis_LOAD=1; 

} 


//MAX7219初始化 =======================================================
void InitDis (void) 
{
WriteWord (ScanLimit,ScanDigit); /*设置扫描界限*/ 

WriteWord (DecodeMode,DecodeDigit); /*设置译码模式*/ 

WriteWord (Intensity,IntensityGrade); /*设置亮度*/ 

WriteWord (ShutDown,ShutdownMode1); /*设置电源工作模式*/ 
}





// 显示函数
void display(unsigned int temp1,unsigned int temp0)
{


DisBuffer[0]=dispaly_list[temp0%10]; 
temp0=temp0/10;
DisBuffer[1]=dispaly_list[temp0%10]; 
temp0=temp0/10;
DisBuffer[2]=dispaly_list[temp0%10]; 
temp0=temp0/10;
DisBuffer[3]=dispaly_list[temp0%10]; 

DisBuffer[4]=dispaly_list[temp1%10]; 
temp1=temp1/10;
DisBuffer[5]=dispaly_list[temp1%10]; 
temp1=temp1/10;
DisBuffer[6]=dispaly_list[temp1%10]; 
temp1=temp1/10;
DisBuffer[7]=dispaly_list[temp1%10]; 



WriteWord (Digit0,DisBuffer[0]); 

WriteWord (Digit1,DisBuffer[1]); 

WriteWord (Digit2,DisBuffer[2]); 

WriteWord (Digit3,DisBuffer[3]); 

WriteWord (Digit4,DisBuffer[4]); 

WriteWord (Digit5,DisBuffer[5]); 

WriteWord (Digit6,DisBuffer[6]); 

WriteWord (Digit7,DisBuffer[7]); 
}


//主函数

void main()

{	
unsigned char data1,data2,data5,data6;
unsigned int data3,data4;	
InitDis (); 
 // display();
	while(1)
	

	{ 
	    znz_send(0xa0);//硬件补偿模式
	    znz_send(0x00);
	    //旋转一周
	    znz_send(0xa1);//退出补偿
	    znz_send(0x00);
		  znz_send(0xa6);//读磁偏角,低8位
		  data1=znz_send(0x00);
//		  delayX10ms(10);
		  znz_send(0xa7);//读磁偏离角第9位
      data2=znz_send(0x00);
      data3=(data2<<8)+data1;
	    
	    znz_send(0x5a);//读方向角低8位
	    data5=znz_send(0x00);
		//delayX10ms(10);
		  znz_send(0x5b);
		  data6=znz_send(0x00);//读方向角第9位

	    data4=(data6<<8)+data5;
		  display(data4,data3);//显示
	
		 data3=10000;          //延时,无意义
		 while(data3--);
		}
	 
	    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -