?? 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 + -