📄 5045应用 计数与转换.txt
字号:
#include <reg52.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>//atoi定义
//x5045和51的连接方法
sbit CS = P0^0;
sbit SO = P0^4;
sbit SI = P0^3;
sbit SCK = P0^2;
//定义寄存器指令
#define WREN 0x06 // 写入使能指令(WREN)
#define WRDI 0x04 // 写入禁止指令(WRDI)
#define WRSR 0x01 // 写入状态寄存器指令(WRSR)
#define RDSR 0x05 // 读取状态寄存器指令(RDSR)
#define WRITE 0x02 // 写入存储器指令(WRITE)
#define READ 0x03 // 读取存储器指令(READ)
#define STATUS_REG 0x00 // 要写入到状态寄存器的值
#define MAX_POLL 0x99 // 最在查询次数m number of
#include<stdio.h>
int fun(char*s);
#define N 50
void delayms(unsigned int ms) //void delayms(unsigned int ms);
{ unsigned int j;
while(ms--)
{
for(j=0;j<120;j++);
}
}
void outbyt(unsigned char write_data)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
SCK = 0;
SI = (bit)(write_data & 0x80); //传送一个位到SI
write_data <<= 1;
SCK = 1;
}
SI = 0;
}
unsigned char inbyt()
{
unsigned char i;
unsigned char read_data=0;
for(i = 0; i < 8; i++)
{
SCK = 0;
read_data <<= 1;
SCK = 1;
read_data |= (unsigned char)SO;
}
return read_data;
}
void wren_cmd()
{
CS = 0;
outbyt(WREN); // 传送写入使能指令
CS = 1;
}
unsigned char rdsr_cmd()
{
unsigned char status;
CS = 0;
outbyt(RDSR); // 传送状态寄存器读取指令
status = inbyt(); // 读取状态寄存
CS = 1;
return status;
}
void wip_poll()
{
unsigned char i; // 设置最大的查询次数
//// 如果WIP位为'1'并且未达到最大查询次数, 则继续查询
//// 如果WIP位为'0', 则写入周期完成, 返回
for(i = 0; i < MAX_POLL; i++)
{
if(rdsr_cmd() & 0x01) // 读取状态寄存器
{
continue;
}
return;
}
}
void byte_write(unsigned int addr,unsigned int dat)
{
wren_cmd();
CS = 0;
if(addr & 0x100)
outbyt(WRITE | 0x08); //传送写入指令和地址最高位"1"
else
outbyt(WRITE); // 传送写入指令和地址最高位"0"
outbyt(addr); // 传送地址低字节
outbyt(dat); // 传送数据字节
CS = 1;
wip_poll(); // 检测写入进度
}
unsigned char byte_read(unsigned int addr)
{
unsigned char read_data;
CS = 0;
if(addr & 0x100)
outbyt(READ | 0x08);// 传送读取指令和地址最高位"1"
else
outbyt(READ); // 传送读取指令和地址最高位"0"
outbyt(addr); // 传送地址低字节
read_data = inbyt(); // 读取字节
CS = 1;
return read_data;
}
/*
void init_serialcomm(void)
{ TMOD = 0x21; // 定时器1工作于8位自动重载模式, 用于产生波特率
// 定时器0工作于16位模式, 用于定时
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
}
*/
void send_char_com(unsigned int ch)
{ //向串口发送一个字符
SBUF=ch;
while(!TI);
TI=0;
}
void init_serialcomm(void)
{
SCON = 0x50; //串口方式1,允许接收
TMOD = 0x20; //定时器1 定时方式 2
TCON = 0x40; //设定时器1开始计数
TH1 = 0xfd; //11.0592MHz 1200波特率
TL1 = 0xfd;
TI = 1;
TR1 = 1; //启动定时器
}
/*************************************************************************************************************/
unsigned int read5045(int g)//16转10进制
{
int e,f,a,d,c,b,tdat,s[1];
tdat= byte_read(g);
b=tdat;
a=tdat/16;
c=a*16;
d=b-c;
s[0]=a;s[1]=d;
switch(s[0])
{
case 0x00 :a=0;break;
case 0x01 :a=1;break;
case 0x02 :a=2;break;
case 0x03 :a=3;break;
case 0x04 :a=4;break;
case 0x05 :a=5;break;
case 0x06 :a=6;break;
case 0x07 :a=7;break;
case 0x08 :a=8;break;
case 0x09 :a=9;break;
case 0x0a :a=10;break;
case 0x0b :a=11;break;
case 0x0c :a=12;break;
case 0x0d :a=13;break;
case 0x0e :a=14;break;
case 0x0f :a=15;break;
}
a=a*16;
switch(s[1])
{
case 0x00 :e=0;break;
case 0x01 :e=1;break;
case 0x02 :e=2;break;
case 0x03 :e=3;break;
case 0x04 :e=4;break;
case 0x05 :e=5;break;
case 0x06 :e=6;break;
case 0x07 :e=7;break;
case 0x08 :e=8;break;
case 0x09 :e=9;break;
case 0x0a :e=10;break;
case 0x0b :e=11;break;
case 0x0c :e=12;break;
case 0x0d :e=13;break;
case 0x0e :e=14;break;
case 0x0f :e=15;break;
}
f=a+e;
return f;
}
/*************************************************************************************************************/
//计数写5045前 计数写
unsigned long int ready()
{
int h,i,j,k;
unsigned int l1,l2,l3,l4;
unsigned long int l;
//unsigned long l,l5,l6,l7;
j=0;
h=1;
k=0;
i=read5045(1);//地址1的值
if (i==255)
{
byte_write(1,0);
i=read5045(2);
if (i==255)
{
byte_write(2,0);
i=read5045(3);
if (i==255)
{
byte_write(3,0);
i=read5045(4);
if (i==255)
{byte_write(4,0);
i=read5045(5);
if (i==255)
{byte_write(5,0);
i=read5045(6);
if (i==255)
{ i=read5045(7);k=i+1;byte_write(7,k);}
else
{k=i+1;byte_write(6,k);}
}
else
{k=i+1;byte_write(5,k);}
}
else
{k=i+1;byte_write(4,k);}
}
else
{k=i+1;byte_write(3,k);}
}
else
{k=i+1;byte_write(2,k);}
}
else
{k=i+5;byte_write(1,k);}
// l=read5045(1);//+read5045(2)*255+read5045(3)*255*255+read5045(4)*255*255*255+read5045(5)*255*255*255*255+read5045(6)*255*255*255*255*255+read5045(7)*255*255*255*255*255;
// l=1000000;
l1=read5045(1);
l2=read5045(2)*255;
l3=read5045(3)*255*255;
l4=read5045(4)*255*255*255;
// l5=read5045(5)*255*255*255*255;
// l6=read5045(6)*255*255*255*255*255;
// l7=read5045(7)*255*255*255*255*255*255;
l=l1+l2+l3+l4;//+l5+l6+l7;
//printf (" %d",l);
return l;
}
/****************************************************************************************************************/
void main(void)
{
unsigned long int h;
init_serialcomm();
// byte_write(1,0);byte_write(2,0);byte_write(3,0);byte_write(4,0);byte_write(5,0);byte_write(6,0);byte_write(7,0);
while(1)
{
// byte_write(4,2);
//delayms(200);
//h=4294967295;
h=ready();delayms(500);
printf (" %lu\n",h);delayms(500);
//h=read5045(4);
//printf ("%d",h);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -