#include <STC12C5A.H>
#include"intrins.h"
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define CMD_IDLE 0 //IAP等待
#define CMD_READ 1 //读flash
#define CMD_PROGRAM 2 //写入
#define CMD_ERASE 3 //擦除
#define IAP_EN 0x83
#define iap_ADDRESS 0x0000 //地址
void delay(int k) //延时函数
{
int i,j;
for(i=0;i<184;i++)
for(j=0;j<k;j++);
}
//使硬件或软件操作停止
void iap_IDLE()
{
IAP_CONTR=0; //禁止IAP读写擦除
IAP_CMD=0; //等待
IAP_TRIG=0; //命令未触发
IAP_ADDRH=0x80; //高位数据地址
IAP_ADDRL=0; //低位
}
//从数据里面读取数据
uchar iap_READ(uint addr)
{ uchar datas;
IAP_CONTR=IAP_EN; //控制允许位
IAP_CMD=CMD_READ; //写入读命令
IAP_ADDRL=addr; //自定义地址
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a; //命令有效
IAP_TRIG=0xa5;
_nop_();
datas=IAP_DATA;
iap_IDLE();
return datas; //返回读出的数据
}
//写一个比特ISP写到某个地方
void iap_PROGRAM(uint addr,uchar datas)
{
IAP_CONTR=IAP_EN;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=datas;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
iap_IDLE();
}
//擦掉某个区域
void iap_ERASE(uint addr)
{
IAP_CONTR=IAP_EN;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
iap_IDLE();
}
void uart_init(void) //串口的初始化
{
TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2
TH1=0xfd;//设置波特率为9600
TL1=0xfd;
TR1=1;//启动定时器/计数器1
SCON=0x50; //0101 0000.串口工作方式1,允许串行控制
PCON=0x00;//设置SMOD=0
IE=0x90; //CPU允许中断,串行允许中断
ti=1;//直接使用printf必须加入此句才能实现发送
}
main()
{
int i;
union
{
float x;
uchar s[4];
}fasong;
fasong.x=3.4;
iap_ERASE(iap_ADDRESS); //擦除扇区
for(i=0;i<4;i++)
{
iap_PROGRAM(iap_ADDRESS+i,fasong.x);//向这个区间512字节里面写东西
}
uart_init(); //串口初始化
while(1)
{
for(i=0;i<4;i++)
{
printf("iap_READ[%d]=%.1f
",i,iap_READ(iap_ADDRESS+i)); //在串口上输出
delay(500);
}
}
}
请各位大神看看,是哪有问题呀?
一周热门 更多>