📄 1.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 + -