C8050F02x单片机FLASH读写(Keil C编程心得)

在单片机编程中往往需要长期保存某些数据,尤其是一些配置参数,这样掉电后这些数据仍然还在。于是就开始了FLASH读写的编程,经过了一天多的努力,终于把FLASH的读写调通了。主要有三点:

一、读FLASH

要用MOVC指令才能读FLASH,这个比较简单。

二、写FLASH

严格按照下面的流程即可完成写操作

1. 禁止中断。

2. 置位FLWEFLSCL.0),以允许由用户软件写/擦除FLASH

3. 置位PSEEPSCTL.1),以允许

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是C8051f02x芯片串口自发自收的C语言代码示例: ```c #include <C8051F020.h> // 定义波特率为9600 #define BAUDRATE 9600 // 定义定时器1的计数值 #define TIMER1_COUNT -(SYSCLK/BAUDRATE/16) // 定义接收缓冲区大小 #define BUFFER_SIZE 64 // 定义接收缓冲区和发送缓冲区 unsigned char buffer[BUFFER_SIZE]; unsigned char sendBuffer[BUFFER_SIZE]; // 定义接收缓冲区和发送缓冲区的指针 unsigned char xdata *bufferPtr; unsigned char xdata *sendBufferPtr; // 定义接收缓冲区和发送缓冲区的头尾指针 unsigned char xdata *headPtr; unsigned char xdata *tailPtr; unsigned char xdata *sendHeadPtr; unsigned char xdata *sendTailPtr; // 定义接收缓冲区是否已满的标志 bit bufferFull; // 初始化串口 void initUART0(void) { // 关闭串口0 SCON0 = 0x00; // 使能定时器1,用于波特率发生器 TCON |= 0x40; // 初始化定时器1 TMOD &= 0x0F; TMOD |= 0x20; CKCON |= 0x10; TH1 = TIMER1_COUNT / 0x100; TL1 = TIMER1_COUNT % 0x100; // 使能串口0接收中断 IE |= 0x10; // 使能串口0 SCON0 = 0x50; } // 串口0接收中断服务函数 void UART0_ISR(void) interrupt 4 { if (RI0 == 1) { // 接收到数据 *bufferPtr = SBUF0; bufferPtr++; if (bufferPtr == tailPtr) { bufferPtr = headPtr; bufferFull = 1; } RI0 = 0; } if (TI0 == 1) { // 发送完成 sendBufferPtr++; if (sendBufferPtr == sendTailPtr) { // 发送完成,禁用发送中断 sendBufferPtr = sendHeadPtr; TI0 = 0; } else { // 继续发送下一个字节 SBUF0 = *sendBufferPtr; } } } // 向串口0发送数据 void sendUART0(unsigned char xdata *data, unsigned char length) { // 复制数据到发送缓冲区 unsigned char i; for (i = 0; i < length; i++) { *sendTailPtr = *data; data++; sendTailPtr++; if (sendTailPtr == tailPtr) { sendTailPtr = headPtr; } } // 使能发送中断 TI0 = 1; } // 从串口0接收数据 unsigned char receiveUART0(unsigned char xdata *data, unsigned char length) { // 等待数据接收完成 while (bufferFull == 0 && (bufferPtr != tailPtr || RI0 == 0)); // 复制数据到接收缓冲区 unsigned char i; for (i = 0; i < length; i++) { *data = *bufferPtr; bufferPtr++; if (bufferPtr == tailPtr) { bufferPtr = headPtr; bufferFull = 0; } data++; } return i; } // 主函数 void main(void) { // 初始化串口 initUART0(); // 初始化接收缓冲区和发送缓冲区 bufferPtr = buffer; sendBufferPtr = sendBuffer; headPtr = buffer; tailPtr = buffer + BUFFER_SIZE; sendHeadPtr = sendBuffer; sendTailPtr = sendBuffer + BUFFER_SIZE; bufferFull = 0; // 向串口0发送数据 unsigned char sendData[] = "Hello, World!"; sendUART0(sendData, sizeof(sendData)); // 从串口0接收数据 unsigned char receiveData[sizeof(sendData)]; receiveUART0(receiveData, sizeof(receiveData)); // 死循环 while (1); } ``` 上述代码中,使用定时器1作为波特率发生器来控制串口通信速度,通过串口0接收中断来实现自发自收功能。在主函数中,先向串口0发送数据,然后从串口0接收数据,并将接收到的数据复制到接收缓冲区中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值