一些51单片机基础模块的程序
源代码在线查看: 宏晶eeprom.c
/********************************************************************
* 文件名 : 宏晶EEPROM.c
* 描述 : 该程序实现了对STC单片机的EEPROM的操作。每隔0.5秒钟,单片机对EEPROM进行一次
读、擦除和写操作,并把数值显示到数码管上。
确认试验是否成功:电源上电后,数码管的值在递增,观察值。关闭电源,待几秒后上电,
数码管显示的值会从断电钱的那个值开始显示。
* 创建人 : 东流,2009年4月9日
* 版本号 : 2.0
* 技术支持论坛:www.zidh.com/bbs(请进入“赞助商板块”中的“东流电子工作室”)
* 感谢“中国自动化资讯网”对本工作室的大力支持。
***********************************************************************/
#include
#include
/*以下是配置STC单片机的寄存器*/
/*相关资料在STC89C51RC的PDF的第35页开始*/
sfr ISP_DATA = 0xE2;
sfr ISP_ADDRH = 0xE3;
sfr ISP_ADDRL = 0xE4;
sfr ISP_CMD = 0xE5;
sfr ISP_TRIG = 0xE6;
sfr ISP_CONTR = 0xE7;
#define uint unsigned int
#define uchar unsigned char
#define ISP_BYTE_READ 1 //ISP字节读
#define ISP_BYTE_PROGRAM 2 //ISP直接编程
#define ISP_SECTOR_ERASE 3 //ISP扇区擦除
uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
uchar x,j;
for(j=0;j for(x=0;x }
/********************************************************************
* 名称 : ISP_ERASE()
* 功能 : EEPROM的扇区擦除
* 输入 : Address(擦除扇区的地址)
* 输出 : 无
***********************************************************************/
void ISP_ERASE(Address)
{
ISP_ADDRL = Address;
ISP_ADDRH = Address >> 8;
ISP_CONTR = 0x81;
ISP_CMD = ISP_SECTOR_ERASE;
ISP_TRIG = 0x46; //PDF手册中说先像 ISP_TRIG 中写入 0x46, 然后写入 0xb9
ISP_TRIG = 0xb9;
_nop_();
_nop_();
}
/********************************************************************
* 名称 : ISP_READ()
* 功能 : 从EEPROM相应的地址中读出值
* 输入 : Address(想要读取EEPROM的地址)
* 输出 : Read_Data(从EEPROM读出的值)
*********************************************************************/
uint ISP_READ(Address)
{
uchar Read_Data;
ISP_ADDRL = Address;
ISP_ADDRH = Address >> 8;
EA = 0;
ISP_CONTR = 0x81;
ISP_CMD = ISP_BYTE_READ;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
_nop_();
Read_Data = ISP_DATA;
return Read_Data;
}
/********************************************************************
* 名称 : ISP_PROGRAM()
* 功能 : 实现EEPROM的字节编程
* 输入 : Address为编程的地址,Data_temp为想要编程的值
* 输出 : 无
***********************************************************************/
void ISP_PROGRAM(Address, Data_temp)
{
ISP_DATA = Data_temp;
ISP_ADDRL = Address;
ISP_ADDRH = Address >> 8;
ISP_CONTR = 0x81;
ISP_CMD = ISP_BYTE_PROGRAM;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
_nop_();
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
uint i;
uchar LED_Buffer = 0;
while(1)
{
for(i=0; i {
LED_Buffer = ISP_READ(0x2c00);
P0 = table[LED_Buffer % 10];
P2 = 0x01;
Delay_1ms(6);
P0 = table[LED_Buffer / 10 % 10];
P2 = 0x02;
Delay_1ms(6);
}
LED_Buffer++;
ISP_ERASE(0x2c00); //注意:字节编程时必须要先要擦除整个扇区
ISP_PROGRAM(0x2c00, LED_Buffer);
}
}