📄 ptr8000.c
字号:
//陈广大,发射部分程序,发射信息加累加校验。
/*******************
按键使用5个键P2.4~P2.7
液晶屏P2.1~P2.3 依次是RS,RW,E,
蜂鸣器起到按键提示作用
//注意全局变量尽量少用为好
/*************火箭发射点火系统******************/
#include <STC12C5410AD.h>
#include <intrins.h>
#include <string.h>
#include <absacc.h>
/*****************************/
#define uchar unsigned char
#define uint unsigned int
#define BYTE_BIT0 0x01
#define BYTE_BIT1 0x02
#define BYTE_BIT2 0x04
#define BYTE_BIT3 0x08
#define BYTE_BIT4 0x10
#define BYTE_BIT5 0x20
#define BYTE_BIT6 0x40
#define BYTE_BIT7 0x80
bdata uchar DATA_BUF;
#define DATA7 ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0 ((DATA_BUF&BYTE_BIT0) != 0)
/*-----------------------------------------------
nrf905命令控制字
------------------------------------------------*/
#define WC 0x00 // Write configuration register command
#define RC 0x10 // Read configuration register command
#define WTP 0x20 // Write TX Payload command
#define RTP 0x21 // Read TX Payload command
#define WTA 0x22 // Write TX Address command
#define RTA 0x23 // Read TX Address command
#define RRP 0x24 // Read RX Payload command
/*------------------液晶屏命令--------------------*/
#define clear 0x01 //清屏幕,约1.6ms
#define home 0x02 //光标回零(左上角)/
#define f_set 0x30 //并行、基本指令
#define dis_on 0x0f //打开显示,光标,闪烁功能
#define in_mode 0x06 //输入方式,地址增1,光标右移
/**************************端口定义***************************/
sbit P_RS=P2^1;//液晶屏
sbit P_RW=P2^3;
sbit P_E= P2^2;
sbit FMQ=P3^5; //低电平响
sbit TX_EN=P2^0;//PTR8000控制脚
sbit PWR= P1^2;
sbit TRX_CE=P1^3;
sbit MISO=P1^6;
sbit MOSI=P1^5;
sbit SCK=P1^7;
sbit CSN=P1^4;
sbit AM = P1^0;//NRF905状态IO
sbit CD = P1^1;
sbit DR = P3^7;//最好接到中断口上
data uint T_key = 0x0000;//秒分时标记用
data uint second = 0x0000;//秒位,
data uchar SendBuffer[4],screen[5],st; // RF发送缓冲区
idata uchar str2[3];//显示字符串用
bdata uchar ab;
sbit abit0=ab^0; sbit abit1=ab^1; sbit abit2=ab^2; sbit abit3=ab^3;
sbit abit4=ab^4; sbit abit5=ab^5; sbit abit6=ab^6; sbit abit7=ab^7;
/*******************************/
void Delay(int x)
{
unsigned int i;
for(i=0;i<x;i++);
}
/********************************************/
void rst_wdog(void) //看门狗
{
WDT_CONTR=0x3c; //1.1377s
}
/*------------------------------------------*/
/* 液晶屏程序 */
/*------------------------------------------*/
void bit8_serial_input(uchar ix)
{
data uchar i,j,nc;
P_E=0;
ab=ix;
for(i=0;i<8;i++){
P_RW=abit7;
ab<<=1;
P_E=1;
for(j=0;j<10;j++)nc=0;
P_E=0;
}
}
/*-------------------------------------*/
void instruct(uchar dat)
{
data uchar ch;
P_RS=1; //选通
ch=0xf8;
bit8_serial_input(ch);
ch=dat&0xf0;
bit8_serial_input(ch);
ch=dat<<4;
bit8_serial_input(ch);
P_RS=0; //结束作业
}
/****************************************/
void write_abyte(uchar dat)
{
data uchar ch;
P_RS=1; //读数据--不选通
ch=0xfa; //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat&0xf0; //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat<<4;
bit8_serial_input(ch);
P_RS=0; //结束作业
}
/*---写一个汉字到x,Y坐标处其中X为8列y为4行---*/
void write_word(uint w)
{
data uchar ch,cl;
ch=w>>8;
cl=w;
write_abyte(ch);
write_abyte(cl);
}
/*----- ----------------------------*/
dis_hz_str(uchar x, uchar y, uint *p_hz)
{
data uchar loc;
data uint *p;
code uchar xline[5]={0,1,3,2,4};
x=xline[x];
instruct(home);
loc=((x<<3)+y-9)|0x80;
instruct(loc); p=p_hz;
while(*p){
write_word(*p++);
}
}
/*------显示字母数字在x,y处------*/
void dis_str(uchar x, uchar y, uchar *str)
{
data uchar loc,*p;
code uchar xline[5]={0,1,3,2,4};
p=str;
x=xline[x];
instruct(home);
loc=(16*(x-1)+y-1);
if(loc&0x01){
loc/=2;
instruct(loc|0x80);
write_abyte(' ');
}
else{
loc/=2;
instruct(loc|0x80);
}
while(*p){
write_abyte(*p++);
}
}
/*----------屏初始化-----------------*/
void initial(void)
{
data uchar i,j;
P_RS=0; //串行--不选通
P_E=0; //串行方式
instruct(f_set); //0x30; //8位并行接口 基本指令
for(i=0;i<30;i++){}
for(i=0;i<250;i++){}
for(i=0;i<250;i++){}
instruct(f_set); //0x30; //8位并行接口 基本指令
for(i=0;i<30;i++){}
for(i=0;i<250;i++){}
for(i=0;i<250;i++){}
instruct(dis_on); //0x0f; //开启屏幕 光标 闪烁
for(i=0;i<30;i++){}
instruct(clear); //0x01); //清屏幕 clear
for(j=0;j<10;j++){
for(i=0;i<250;i++){}
}
instruct(in_mode); //0x06); //光标右移、地址增1 方式
for(i=0;i<30;i++){}
instruct(home); //0x02 //光标回零(左上角)
}
/*-------------------------------------
void itoa(int x,unsigned char *str2)
{
data uint n;
idata uchar chn,*p,*p2,str1[5];
data uchar i,j;
p2=str2;
if(x<0){
*p2++='-';
x=-x;
}
n=x;
p=&str1;
j=0;
while(n!=0){
chn=n%10;
n=n/10;
*p++=chn+'0';
j++;
}
if(j!=0){
p--;
for(i=0;i<j;i++)*p2++=*p--;
}
else *p2++='0';
*p2=0;
return;
}
/*--------------------数据结构----------------------
void display_run_data(uchar lin,uchar colum, uint x)
{
uchar str3[6],L;
//bit flag_neg;
//if(x<0){flag_neg=1; x=-x;}else flag_neg=0;
itoa(x,str3);
L=strlen(str3);
switch(L){
case 1:
str3[4]=str3[0]; str3[3]='.';str3[2]='0'; str3[1]=' '; str3[0]=' '; //1位 0.x
break;
}
str3[5]=0; //字符串结束
dis_str(lin,colum,str3);
}
/*********************************************/
void clr_screen(void)
{
uchar i,j;
instruct(clear);
for(j=0;j<10;j++){
for(i=0;i<250;i++){}//不加延时就不好使
}
}
/*************************************/
void SpiWrite(uchar send) //SPI写 将单片机中数据写到ptr8000中
{
uchar i;
DATA_BUF=send;
for (i=0;i<8;i++)
{
if (DATA7) //总是发送最高位
{
MOSI=1;
}
else
{
MOSI=0;
}
SCK=1;
DATA_BUF=DATA_BUF<<1;
SCK=0;
}
}
/**********************************/
void Config905(void) //配置nRF905
{ CSN=1;
SCK=0;
PWR=1;
TRX_CE=0;
TX_EN=0;
Delay(2);
CSN=0;
SpiWrite( 0x00); //配置命令//
SpiWrite( 0x4C); //CH_NO,配置频段在430MHZ 4c
SpiWrite( 0x0C); //输出功率为10db,不重发,节电为正常模式 0c
SpiWrite( 0x44); //地址宽度设置,为4字节
SpiWrite( 0x04);
SpiWrite( 0x04); //接收发送有效数据长度为1字节
SpiWrite( 0x19); //接收地址 4字节
SpiWrite( 0x85);
SpiWrite( 0x06);
SpiWrite( 0x27);
SpiWrite( 0x58); //16位CRC校验,CRC充许,16M晶振
CSN=1;
}
/********************发送数据打包**********************/
void TxPacket1(void)//unsigned long nRF_rxaddr) // 参数为接收端的地址,即:发送给谁?
{
uchar i;
PWR=1; //待机和SPI编程模式
TRX_CE=0;
TX_EN=1;
CSN=0;
SpiWrite(WTA); // Write address command 写发送地址,后面跟4字节地址//
SpiWrite(0x19); //0x19
SpiWrite(0x85); //0x85
SpiWrite(0x06); //0x06
SpiWrite(0x28); //0x28,接收
CSN=1;
//Delay(20); //延时1/6ms 可以不加延时
CSN=0;
SpiWrite(WTP); //写发送数据命令,后面跟一字节数据//
for(i=0;i<4;i++)
SpiWrite(SendBuffer[i]); //发送到数据
CSN=1;
//Delay(20); 可以不加延时
TRX_CE=1; //使能发射模式//
rst_wdog();
Delay(255); //等带发送完成//延时2ms???这个时间很重要!!!!时间短了不行
rst_wdog();
TRX_CE=0;
}
/***************************************/
void portint(void)
{
P1M0=0xff;//P1口设为OC门
P1M1=0xff;
P2M0=0x01;
P2M1=0x0f;
P3M0=0x80;
P3M1=0x80;
}
/*---------------定时器0中断1ms----------------*/
void t0int(void) interrupt 1 using 2
{
TH0=-11059/256;//-921/256;
TL0=-11059%256;//-921%256;
//T_5ms++;T_key++;T_51ms++;T_52ms++;T_53ms++;
T_key++;
if(T_key>=1000){ //1s
T_key=0;second++;
}
}
/*--------------------初始化-----------------------*/
void init(void)
{
TMOD=0x01;//定时器0方式1
TH0=-11059/256;//-921/256;
TL0=-11059%256;//-921%256;
TR0=1;;
ET0=1;
EA=1;
}
/*********************************************/
void main()
{
uchar i;
AUXR=0X80;//定时器0用1分频方式设定!!!,定时器1按照12分频
init();
portint();
Config905(); //P1口初始化
initial();//液晶屏初始化
clr_screen();//清屏
instruct(0x0c);//光标归零
dis_hz_str(2,1,"发射点火控制器\0");
dis_hz_str(3,3,"北华大学\0");
st=1;
for(i=0;i<4;i++){SendBuffer[i]=i;
screen[i]=i+'0'; }//发送4个字0123
while(1)
{
rst_wdog();
if(second>=3){
second=0; T_key=0;
TxPacket1();
dis_str(4, 1,screen);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -