久久久国产精品视频袁燕,99re久久精品国产,亚洲欧美日韩国产综合v,天天躁夜夜躁狠狠久久,激情五月婷婷激情五月婷婷

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

電子時(shí)鐘的制作與學(xué)習(xí)

電子時(shí)鐘由8位共陽數(shù)碼管、stc12c5a60s2單片機(jī)、74HC373、74hc245和三個(gè)按鍵組成。單片機(jī)的P1口接245并串電阻來驅(qū)動(dòng)數(shù)碼管的位選,P2口接373來驅(qū)動(dòng)數(shù)碼管的段選,還有三個(gè)按鍵接P0口來控制時(shí)分秒的加減。后續(xù)會(huì)加上時(shí)鐘芯片和備用電池做一個(gè)真正 的電子時(shí)鐘。目前這個(gè)階段想加個(gè)掉電記憶功能,來學(xué)習(xí)一下stc的EEPROM功能。

電子時(shí)鐘

全部回復(fù)(23)
正序查看
倒序查看
2016-09-02 11:22
等著看后續(xù)更新嘞~
0
回復(fù)
2016-09-02 11:26
已經(jīng)被添加到社區(qū)經(jīng)典圖庫嘍
http://www.15119.cn/bbs/classic/
0
回復(fù)
2016-09-03 08:28
@電源網(wǎng)-fqd
已經(jīng)被添加到社區(qū)經(jīng)典圖庫嘍http://www.15119.cn/bbs/classic/
好的,希望大家提出好的建議。
0
回復(fù)
2016-09-06 17:07
@lihui710884923
好的,希望大家提出好的建議。

    做的怎樣了,兄弟,你的電子時(shí)鐘完成的如何了?

    個(gè)人覺得還是比較簡(jiǎn)單的,不需要自己焊接的,直接買一塊開發(fā)板,基本上都可以實(shí)現(xiàn)的.


0
回復(fù)
2016-09-07 08:26
@hello-no1
  做的怎樣了,兄弟,你的電子時(shí)鐘完成的如何了?  個(gè)人覺得還是比較簡(jiǎn)單的,不需要自己焊接的,直接買一塊開發(fā)板,基本上都可以實(shí)現(xiàn)的.
自己搭建電路雖說比較麻煩,學(xué)到的東西不少,我剛開始用373驅(qū)動(dòng)數(shù)碼管,結(jié)果就一個(gè)數(shù)碼管顯示0,還是微亮,應(yīng)該是驅(qū)動(dòng)能力不夠的額原因,后來加了個(gè)245才正常顯示了。
0
回復(fù)
2016-09-07 08:35
@lihui710884923
自己搭建電路雖說比較麻煩,學(xué)到的東西不少,我剛開始用373驅(qū)動(dòng)數(shù)碼管,結(jié)果就一個(gè)數(shù)碼管顯示0,還是微亮,應(yīng)該是驅(qū)動(dòng)能力不夠的額原因,后來加了個(gè)245才正常顯示了。
    驅(qū)動(dòng)數(shù)碼管經(jīng)典的常規(guī)方法是通過74HC595驅(qū)動(dòng),我一般均采用這個(gè)芯片驅(qū)動(dòng),效果很好.
0
回復(fù)
2016-09-10 10:21
@hello-no1
  驅(qū)動(dòng)數(shù)碼管經(jīng)典的常規(guī)方法是通過74HC595驅(qū)動(dòng),我一般均采用這個(gè)芯片驅(qū)動(dòng),效果很好.
#include 
#define uchar unsigned char
#define uint unsigned int
uchar code xianshi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 
	0x80,0x90};//共陽數(shù)碼管0到9顯示BCD碼
uchar second=0;//秒計(jì)數(shù)定義并初始化變量
uchar min=0;//分計(jì)數(shù)
uchar hour=0;//時(shí)計(jì)數(shù)
uchar m=0;//中斷計(jì)數(shù)
sbit a1=P0^0;// 秒按鍵
sbit a2=P0^1;//分按鍵
sbit a3=P0^2;//時(shí)按鍵
void delay(uchar k);//延時(shí)函數(shù)
void timechuli();//時(shí)間處理函數(shù)
void anjian();//按鍵掃描函數(shù)
void timexianshi();//時(shí)間顯示函數(shù)
void delay(uchar k)
{
	uchar i;
	while((k--)!=0)
	{
	for(i=0;i<100;i++);
	
	}
}
void timechuli()
{
	if(second==60)
	{
		second=0;
		min++;
		if(min==60)
		{
			min=0;
			hour++;
			if(hour==24)
			{hour=0;}
			
		}
	}
}
void anjian()
{
	if(a1==0)
	{
		delay(30);//按鍵消抖
		if(a1==0)
		{
		second++;
	}
}
	if(a2==0)
	{
		delay(30);
		if(a2==0)
		{
			min++;
	}
}
	if(a3==0)
	{
		delay(30);
		if(a3==0)
		{
			hour++;
		}
	}
}
	void timexianshi()                                
	{
		P2=0x01;
		P1=xianshi[second%10];//顯示秒的個(gè)位
		delay(5);
		P2=0x02;
		P1=xianshi[second/10];//顯示秒的十位
		delay(5);
		P2=0x08;
		P1=(xianshi[min%10])|0x80;//顯示分的個(gè)位
		delay(5);
		P2=0x10;
		P1=xianshi[min/10];//顯示分的十位
		delay(5);
		P2=0x40;
		P1=(xianshi[hour%10])|0x80;//顯示時(shí)的個(gè)位
		delay(5);
		P2=0x80;
		P1=xianshi[hour/10];//顯示時(shí)的個(gè)位
		delay(5);
	}
	void timer0() interrupt 1
	{
		TH0=(65536-45872)/256;         //放入初值,11.0592M,50ms
	  TL0=(65536-45872)%256;
		m++;
		if(m==20)
		{
			m=0;
			second++;
		}
	}
	void main()
	{
		P0=0xff;
	AUXR &= 0x7F;		//定時(shí)器時(shí)鐘12T模式
	TMOD &= 0xF0;		//設(shè)置定時(shí)器模式
	TMOD |= 0x01;		//設(shè)置定時(shí)器模式
	TH0=(65536-45872)/256;         //放入初值,11.0592M,50ms
	TL0=(65536-45872)%256;
	TF0 = 0;		//清除TF0標(biāo)志
	TR0 = 1;		//定時(shí)器0開始計(jì)時(shí)
	EA=1;		//開總中斷
	EX0=1;
	ET0=1;                        //開定時(shí)器0中斷
	
			while(1)
			{
			timexianshi();//時(shí)間顯示函數(shù)
			anjian();//按鍵掃描函數(shù)
			timechuli();//時(shí)間處理函數(shù)
			
			}
		}
0
回復(fù)
2016-09-10 10:25
@lihui710884923
#include#defineucharunsignedchar#defineuintunsignedintucharcodexianshi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽數(shù)碼管0到9顯示BCD碼ucharsecond=0;//秒計(jì)數(shù)定義并初始化變量ucharmin=0;//分計(jì)數(shù)ucharhour=0;//時(shí)計(jì)數(shù)ucharm=0;//中斷計(jì)數(shù)sbita1=P0^0;//秒按鍵sbita2=P0^1;//分按鍵sbita3=P0^2;//時(shí)按鍵voiddelay(uchark);//延時(shí)函數(shù)voidtimechuli();//時(shí)間處理函數(shù)voidanjian();//按鍵掃描函數(shù)voidtimexianshi();//時(shí)間顯示函數(shù)voiddelay(uchark){uchari;while((k--)!=0){for(i=0;i
這是電子時(shí)鐘的源代碼,寫程序時(shí)從上到下這種寫法咋樣,比如開始初始化變量,聲明子函數(shù),然后把主函數(shù)放到最后寫。
0
回復(fù)
2016-09-10 23:14
@lihui710884923
#include#defineucharunsignedchar#defineuintunsignedintucharcodexianshi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽數(shù)碼管0到9顯示BCD碼ucharsecond=0;//秒計(jì)數(shù)定義并初始化變量ucharmin=0;//分計(jì)數(shù)ucharhour=0;//時(shí)計(jì)數(shù)ucharm=0;//中斷計(jì)數(shù)sbita1=P0^0;//秒按鍵sbita2=P0^1;//分按鍵sbita3=P0^2;//時(shí)按鍵voiddelay(uchark);//延時(shí)函數(shù)voidtimechuli();//時(shí)間處理函數(shù)voidanjian();//按鍵掃描函數(shù)voidtimexianshi();//時(shí)間顯示函數(shù)voiddelay(uchark){uchari;while((k--)!=0){for(i=0;i
很好,值得我學(xué)習(xí)。
0
回復(fù)
2016-09-12 11:19
帖子已被設(shè)置為頭條,恭喜樓主可添加電源網(wǎng)私人官網(wǎng)微信(dianyuan_com)為好友,領(lǐng)取現(xiàn)金紅包(備注信息:頭條紅包)

      注:現(xiàn)金紅包僅限當(dāng)日領(lǐng)取

      活動(dòng)介紹:http://www.15119.cn/bbs/1531738.html

     

0
回復(fù)
2016-09-15 08:37
@電源網(wǎng)-fqd
帖子已被設(shè)置為頭條,恭喜樓主可添加電源網(wǎng)私人官網(wǎng)微信(dianyuan_com)為好友,領(lǐng)取現(xiàn)金紅包(備注信息:頭條紅包)     注:現(xiàn)金紅包僅限當(dāng)日領(lǐng)取     活動(dòng)介紹:http://www.15119.cn/bbs/1531738.html     [圖片]
我手里有個(gè)時(shí)鐘芯片HT1381,不知程序這塊咋寫
0
回復(fù)
2016-09-16 14:37
@lihui710884923
#include#defineucharunsignedchar#defineuintunsignedintucharcodexianshi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽數(shù)碼管0到9顯示BCD碼ucharsecond=0;//秒計(jì)數(shù)定義并初始化變量ucharmin=0;//分計(jì)數(shù)ucharhour=0;//時(shí)計(jì)數(shù)ucharm=0;//中斷計(jì)數(shù)sbita1=P0^0;//秒按鍵sbita2=P0^1;//分按鍵sbita3=P0^2;//時(shí)按鍵voiddelay(uchark);//延時(shí)函數(shù)voidtimechuli();//時(shí)間處理函數(shù)voidanjian();//按鍵掃描函數(shù)voidtimexianshi();//時(shí)間顯示函數(shù)voiddelay(uchark){uchari;while((k--)!=0){for(i=0;i

學(xué)習(xí)中

0
回復(fù)
2016-09-18 11:57
@lihui710884923
我手里有個(gè)時(shí)鐘芯片HT1381,不知程序這塊咋寫
#include "reg51.h"
#include "intrins.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

/*Declare SFR associated with the IAP */
sfr IAP_DATA    =   0xC2;           //Flash data register
sfr IAP_ADDRH   =   0xC3;           //Flash address HIGH
sfr IAP_ADDRL   =   0xC4;           //Flash address LOW
sfr IAP_CMD     =   0xC5;           //Flash command register
sfr IAP_TRIG    =   0xC6;           //Flash command trigger
sfr IAP_CONTR   =   0xC7;           //Flash control register

/*Define ISP/IAP/EEPROM command*/
#define CMD_IDLE    0               //Stand-By
#define CMD_READ    1               //Byte-Read
#define CMD_PROGRAM 2               //Byte-Program
#define CMD_ERASE   3               //Sector-Erase

/*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/
//#define ENABLE_IAP 0x80           //if SYSCLK<30MHz
//#define ENABLE_IAP 0x81           //if SYSCLK<24MHz
#define ENABLE_IAP  0x82            //系統(tǒng)工作時(shí)鐘<20MHz 時(shí),對(duì)IAP_CONTR 寄存器設(shè)置此值
//#define ENABLE_IAP 0x83           //if SYSCLK<12MHz
//#define ENABLE_IAP 0x84           //if SYSCLK<6MHz
//#define ENABLE_IAP 0x85           //if SYSCLK<3MHz
//#define ENABLE_IAP 0x86           //if SYSCLK<2MHz
//#define ENABLE_IAP 0x87           //if SYSCLK<1MHz

//Start address for STC11/10xx EEPROM
#define IAP_ADDRESS 0x0400

void Delay(BYTE n);//延時(shí)用
void IapIdle();//關(guān)閉iap
BYTE IapReadByte(WORD addr);
void IapProgramByte(WORD addr, BYTE dat);
void IapEraseSector(WORD addr);

void eep_main()
{
    WORD i;

    P1 = 0xfe;                      //1111,1110 System Reset OK
    Delay(10);                      //Delay
    IapEraseSector(IAP_ADDRESS);    //Erase current sector
    for (i=0; i<512; i++)           //Check whether all sector data is FF
    {
        if (IapReadByte(IAP_ADDRESS+i) != 0xff)
            goto Error;             //If error, break
    }
    P1 = 0xfc;                      //1111,1100 Erase successful
    Delay(10);                      //Delay
    for (i=0; i<512; i++)           //Program 512 bytes data into data flash
    {
        IapProgramByte(IAP_ADDRESS+i, (BYTE)i);
    }
    P1 = 0xf8;                      //1111,1000 Program successful
    Delay(10);                      //Delay
    for (i=0; i<512; i++)           //Verify 512 bytes data
    {
        if (IapReadByte(IAP_ADDRESS+i) != (BYTE)i)
            goto Error;             //If error, break
    }
    P1 = 0xf0;                      //1111,0000 Verify successful
    while (1);
Error:
    P1 &= 0x7f;                     //0xxx,xxxx IAP operation fail
    while (1);
}

/*----------------------------
Software delay function
----------------------------*/
void Delay(BYTE n)
{
    WORD x;

    while (n--)
    {
        x = 0;
        while (++x);
    }
}

/*----------------------------
Disable ISP/IAP/EEPROM function
Make MCU in a safe state
----------------------------*/
void IapIdle()//關(guān)閉IAP
{
    IAP_CONTR = 0;                  //Close IAP function
    IAP_CMD = 0;                    //Clear command to standby
    IAP_TRIG = 0;                   //Clear trigger register
    IAP_ADDRH = 0x80;               //Data ptr point to non-EEPROM area
    IAP_ADDRL = 0;                  //Clear IAP address to prevent misuse
}

/*----------------------------
Read one byte from ISP/IAP/EEPROM area
Input: addr (ISP/IAP/EEPROM address)
Output:Flash data
----------------------------*/
BYTE IapReadByte(WORD addr)//讀EEPROM數(shù)據(jù)
{
    BYTE dat;                       //Data buffer

    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
    IAP_CMD = CMD_READ;             //Set ISP/IAP/EEPROM READ command
    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
    IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
    IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
    dat = IAP_DATA;                 //Read ISP/IAP/EEPROM data
    IapIdle();                      //Close ISP/IAP/EEPROM function

    return dat;                     //Return Flash data
}

/*----------------------------
Program one byte to ISP/IAP/EEPROM area
Input: addr (ISP/IAP/EEPROM address)
       dat (ISP/IAP/EEPROM data)
Output:-
----------------------------*/
void IapProgramByte(WORD addr, BYTE dat)
{
    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
    IAP_CMD = CMD_PROGRAM;          //Set ISP/IAP/EEPROM PROGRAM command
    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
    IAP_DATA = dat;                 //Write ISP/IAP/EEPROM data
    IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
    IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
    IapIdle();
}

/*----------------------------
Erase one sector area
Input: addr (ISP/IAP/EEPROM address)
Output:-
----------------------------*/
void IapEraseSector(WORD addr)//擦除扇區(qū)
{
    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
    IAP_CMD = CMD_ERASE;            //Set ISP/IAP/EEPROM ERASE command
    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
    IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
    IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
    IapIdle();
}
0
回復(fù)
2016-09-18 12:00
@lihui710884923
#include"reg51.h"#include"intrins.h"typedefunsignedcharBYTE;typedefunsignedintWORD;/*DeclareSFRassociatedwiththeIAP*/sfrIAP_DATA=0xC2;//FlashdataregistersfrIAP_ADDRH=0xC3;//FlashaddressHIGHsfrIAP_ADDRL=0xC4;//FlashaddressLOWsfrIAP_CMD=0xC5;//FlashcommandregistersfrIAP_TRIG=0xC6;//FlashcommandtriggersfrIAP_CONTR=0xC7;//Flashcontrolregister/*DefineISP/IAP/EEPROMcommand*/#defineCMD_IDLE0//Stand-By#defineCMD_READ1//Byte-Read#defineCMD_PROGRAM2//Byte-Program#defineCMD_ERASE3//Sector-Erase/*DefineISP/IAP/EEPROMoperationconstforIAP_CONTR*///#defineENABLE_IAP0x80//ifSYSCLK
這是掉電記憶功能的例程,我想把電子時(shí)鐘斷電的數(shù)據(jù)保存,不知道保存那個(gè)數(shù)據(jù),怎么把這個(gè)數(shù)據(jù)加到這個(gè)例程里
0
回復(fù)
2016-09-26 10:22
@lihui710884923
這是掉電記憶功能的例程,我想把電子時(shí)鐘斷電的數(shù)據(jù)保存,不知道保存那個(gè)數(shù)據(jù),怎么把這個(gè)數(shù)據(jù)加到這個(gè)例程里
E2prom程序這幾天就出來,非常期待,正在驗(yàn)證
0
回復(fù)
sheng_ge520
LV.2
17
2016-09-27 16:19
@lihui710884923
這是電子時(shí)鐘的源代碼,寫程序時(shí)從上到下這種寫法咋樣,比如開始初始化變量,聲明子函數(shù),然后把主函數(shù)放到最后寫。
本來就是這樣的順序
0
回復(fù)
sheng_ge520
LV.2
18
2016-09-27 16:28
@lihui710884923
E2prom程序這幾天就出來,非常期待,正在驗(yàn)證

有現(xiàn)成的,其它無關(guān)的程序已經(jīng)刪除,IC為HT46F47E,其它IC只需要做些相應(yīng)的變化

//EECR
#define _cs			_02_4
#define _sk			_02_5
#define _di			_02_6
#define _do			_02_7
uchar _EECR			@0x40;

uchar Shift(uchar buf, uchar cnt)
{
	do
	{
		if(buf & 0x80)
			_di = 1;
		else
			_di = 0;
		
		_sk = 1;
	
		buf<<=1;

		if(_do)
			buf |= 0x01;
		else
			buf &= 0xfe;

		
		_sk = 0;
	
	}while(--cnt);
	
	return buf;
}

//==============================================================================
//Subroutine:	ChkBusy
//Function:		
//==============================================================================
void ChkBusy(void)
{
	_cs = 1;

	while(1)
	{
		_nop();
		_nop();
		_sk = 1;
		_nop();
		if(_do)
			break;
			
		_nop();
		_sk = 0;
	}
	
	_sk = 0;
	_cs = 0;
}	

void EWEN()
{	
	_cs = 1;
	
	Shift(0x80,3);			//OP Code
	Shift(0xc0,7);
	
	_cs = 0;

}
void EWDS()
{
	_cs = 1;
	
	Shift(0x80,3);			//OP Code
	Shift(0x00,7);
	
	_cs = 0;
}
void WRITE(uchar EEADDR,uchar EEDATA)
{	
	_cs = 1;
	
	Shift(0xa0,3);			//OP Code
	EEADDR<<=1;	
	Shift(EEADDR,7);			//Address
	Shift(EEDATA,8);			//Address
//	Shift(minute,8);			//Address	
//	Shift(hour,8);			//Address
//	Shift(day,8);			//Address	
	_cs = 0;
	
	ChkBusy();
}
uchar READ(uchar EEADDR)
{	uchar EEDATA;
	uchar cnt;
	cnt=8;
	_cs = 1;
	
	Shift(0xc0,3);				//OP Code
	EEADDR<<=1;
	Shift(EEADDR,7);			//Address
	EEDATA = Shift(0x00,8);

//	minute = Shift(0x00,8);

//	hour = Shift(0x00,8);	

//	day = Shift(0x00,8);	
	_cs = 0;
	return(EEDATA);	
}

void motor_control()
{if(timeout==0) 
			{	_bp = 1;
				_mp1 = 0x40;
				EWEN();
				_clrwdt();

				WRITE(2,minute);
				WRITE(3,hour);
				WRITE(4,day);

				_clrwdt();		
				EWDS();
			}
}
//******************************************************
//**********************祘**************************
void main()
{

	safeguard_init();
	for(_mp0=0x40;_mp0<0xff;_mp0++)
	{_iar0=0;}
	user_init();
	_clrwdt();
	_bp = 1;
	_mp1 = 0x40;
	EWEN();
	_clrwdt();
	minute=READ(2);
	hour=READ(3);
	day=READ(4);
	_clrwdt();		
	EWDS();

}

0
回復(fù)
2016-09-29 08:21
@sheng_ge520
有現(xiàn)成的,其它無關(guān)的程序已經(jīng)刪除,IC為HT46F47E,其它IC只需要做些相應(yīng)的變化//EECR#define_cs_02_4#define_sk_02_5#define_di_02_6#define_do_02_7uchar_EECR@0x40;ucharShift(ucharbuf,ucharcnt){do{if(buf&0x80)_di=1;else_di=0;_sk=1;buf
好的非常感謝
0
回復(fù)
2016-09-29 21:45
@lihui710884923
好的非常感謝
你要是用e2prom的話,每隔一段時(shí)間寫一次e2prom的話,這樣寫的頻率太高了,就一萬次,這樣壽命大大縮減,斷電瞬間去保存最好了
0
回復(fù)
2016-10-09 21:50
@liuxiaofei126
你要是用e2prom的話,每隔一段時(shí)間寫一次e2prom的話,這樣寫的頻率太高了,就一萬次,這樣壽命大大縮減,斷電瞬間去保存最好了
斷電瞬間要加大電容才可以保存數(shù)據(jù)
0
回復(fù)
2016-10-12 08:40
@lihui710884923
斷電瞬間要加大電容才可以保存數(shù)據(jù)
#include 
#include 

//宏定義,11.0592M晶振
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//位定義
sbit a1=P0^0;// 秒按鍵
sbit a2=P0^1;//分按鍵
sbit a3=P0^2;//時(shí)按鍵
//數(shù)碼管顯示數(shù)組
uchar code xianshi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 
	0x80,0x90};//共陽數(shù)碼管0到9顯示BCD碼
//變量聲明
bit Time_FLAG=0;//定義一個(gè)時(shí)間間隔標(biāo)志,用來控制寫EEPROM間隔時(shí)間
uchar Sec;//秒計(jì)數(shù)定義并初始化變量
uchar Min;//分計(jì)數(shù)
uchar Hour;//時(shí)計(jì)數(shù)
uchar m=0;//中斷計(jì)數(shù)
uchar cnt=0;
//定義IAP/ISP/EEPROM命令
#define CMD_IDLE    0               //空閑模式
#define CMD_READ    1             //IAP字節(jié)讀命令
#define CMD_PROGRAM 2         //IAP字節(jié)編程命令
#define CMD_ERASE   3             //IAP扇區(qū)擦除命令

#define ENABLE_IAP  0x82        //if SYSCLK<20MHz

#define IAP_ADDRESS 0x0000           //定義EEPROM地址
void delay(uchar k);//延時(shí)函數(shù)
void timechuli();//時(shí)間處理函數(shù)
void anjian();//按鍵掃描函數(shù)
void timexianshi();//時(shí)間顯示函數(shù)

void IapIdle();
uchar IapReadunsigned_char(uint addr);
void IapProgramunsigned_char(uint addr, uchar dat);
void IapEraseSector(uint addr);
void Write_EEPROM();
//----------------------------
//關(guān)閉IAP,初始化函數(shù)
//---------------------------*/
void IapIdle()
{
        IAP_CONTR = 0;                  //關(guān)閉IAP功能
        IAP_CMD         = 0;              //清除命令寄存器
        IAP_TRIG         = 0;              //清除觸發(fā)寄存器
        IAP_ADDRH = 0x80;            //將地址設(shè)置到非IAP區(qū)域
        IAP_ADDRL = 0;
}

//---------------------------
//從ISP/IAP/EEPROM區(qū)域讀取一字節(jié)
//---------------------------
uchar IapReadunsigned_char(uint addr)
{
        uchar dat;                       //數(shù)據(jù)緩沖區(qū)

        IAP_CONTR = ENABLE_IAP;         //使能IAP
        IAP_CMD         = CMD_READ;      //設(shè)置IAP命令
        IAP_ADDRL = addr;               //設(shè)置IAP低地址
        IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
        IAP_TRIG         = 0x5a;               //寫觸發(fā)命令(0x5a)
        IAP_TRIG         = 0xa5;               //寫觸發(fā)命令(0xa5)
        _nop_();                        //等待ISP/IAP/EEPROM操作完成
        dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數(shù)據(jù)
        IapIdle();                      //關(guān)閉IAP功能
        return dat;                     //返回
}

//----------------------------
//寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域
//----------------------------
void IapProgramunsigned_char(uint addr, uchar dat)
{
        IAP_CONTR = ENABLE_IAP;         //使能IAP
        IAP_CMD         = CMD_PROGRAM;        //設(shè)置IAP命令
        IAP_ADDRL = addr;               //設(shè)置IAP低地址
        IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
        IAP_DATA         = dat;                //寫ISP/IAP/EEPROM數(shù)據(jù)
        IAP_TRIG         = 0x5a;               //寫觸發(fā)命令(0x5a)
        IAP_TRIG         = 0xa5;               //寫觸發(fā)命令(0xa5)
        _nop_();                        //等待ISP/IAP/EEPROM操作完成
        IapIdle();
}

//----------------------------
//扇區(qū)擦除
//---------------------------
void IapEraseSector(uint addr)
{
        IAP_CONTR = ENABLE_IAP;         //使能IAP
        IAP_CMD         = CMD_ERASE;          //設(shè)置IAP命令
        IAP_ADDRL = addr;               //設(shè)置IAP低地址
        IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
        IAP_TRIG         = 0x5a;               //寫觸發(fā)命令(0x5a)
        IAP_TRIG         = 0xa5;               //寫觸發(fā)命令(0xa5)
        _nop_();                        //等待ISP/IAP/EEPROM操作完成
        IapIdle();
}


void Write_EEPROM()//將數(shù)據(jù)寫入EEPROM
{
        IapEraseSector(IAP_ADDRESS);   //扇區(qū)擦除
        delay(2);                   //延時(shí)
        IapProgramunsigned_char(IAP_ADDRESS,Hour);//寫入時(shí)
        delay(2);                   //延時(shí)
        IapProgramunsigned_char(IAP_ADDRESS+1,Min);//寫入分
        delay(2);                   //延時(shí)
        IapProgramunsigned_char(IAP_ADDRESS+2,Sec); //寫入秒
        
                                
}
void delay(uchar k)
{
	uchar i;
	while((k--)!=0)
	{
	for(i=0;i<100;i++);
	
	}
}
void timechuli()
{
	if(Sec==60)
	{
		Sec=0;
		Min++;
		if(Min==60)
		{
			Min=0;
			Hour++;
			if(Hour==24)
			{Hour=0;}
			
		}
	}
}
void anjian()
{
	if(a1==0)
	{
		delay(30);//按鍵消抖
		if(a1==0)
		{
		Sec++;
	}
}
	if(a2==0)
	{
		delay(30);
		if(a2==0)
		{
			Min++;
	}
}
	if(a3==0)
	{
		delay(30);
		if(a3==0)
		{
			Hour++;
		}
	}
}
	void timexianshi()         //P2口位選 P1口段選                       
	{
		P2=0x01;
		P1=xianshi[Sec%10];//顯示秒的個(gè)位
		delay(5);
		P2=0x02;
		P1=xianshi[Sec/10];//顯示秒的十位
		delay(5);
		P2=0x08;
		P1=(xianshi[Min%10])|0x80;//顯示分的個(gè)位
		delay(5);
		P2=0x10;
		P1=xianshi[Min/10];//顯示分的十位
		delay(5);
		P2=0x40;
		P1=(xianshi[Hour%10])|0x80;//顯示時(shí)的個(gè)位
		delay(5);
		P2=0x80;
		P1=xianshi[Hour/10];//顯示時(shí)的個(gè)位
		delay(5);
	}
	void timer0() interrupt 1
	{
		TH0=(65536-45872)/256;         //放入初值,11.0592M,50ms
	  TL0=(65536-45872)%256;
		m++;
		
		if(m==20)
		{
			m=0;
			Sec++;
      cnt++;
			
			if(cnt==5)
			{
				Time_FLAG = 1;
			cnt=0;
			}
		}
	}
	void main()
	{
		P0=0xff;
	AUXR &= 0x7F;		//定時(shí)器時(shí)鐘12T模式
	TMOD &= 0xF0;		//設(shè)置定時(shí)器模式
	TMOD |= 0x01;		//設(shè)置定時(shí)器模式
	TH0=(65536-45872)/256;         //放入初值,11.0592M,50ms
	TL0=(65536-45872)%256;
	TF0 = 0;		//清除TF0標(biāo)志
	TR0 = 1;		//定時(shí)器0開始計(jì)時(shí)
	EA=1;		//開總中斷
	EX0=1;
	ET0=1;                        //開定時(shí)器0中斷
		//從EEPROM讀取時(shí)間信息
		    Hour        = IapReadunsigned_char(IAP_ADDRESS);  //小時(shí)
		delay(2);
        Min        = IapReadunsigned_char(IAP_ADDRESS+1); //分鐘
		delay(2);
        Sec        = IapReadunsigned_char(IAP_ADDRESS+2); //秒鐘
		delay(2);
	
			while(1)
			{
			timexianshi();//時(shí)間顯示函數(shù)
			anjian();//按鍵掃描函數(shù)
			timechuli();//時(shí)間處理函數(shù)
				
				//每隔一段時(shí)間,將Time_FLAG置1,寫一次EEPROM,這個(gè)時(shí)間看你自己需求了
					
				if(Time_FLAG==1)
                {
                        Write_EEPROM();//寫EEPROM
                        Time_FLAG = 0; //寫完EEPROM將Time_FLAG標(biāo)志清0
								}
			
			}

}

這是寫eeprom的程序,大家可以借鑒一下,希望親們指出缺點(diǎn),非常感謝

0
回復(fù)
于豆豆
LV.4
23
2016-10-13 17:58

1.在main函數(shù)第一句加上P2=0;

2. timexianshi() 改為:   

         P1=xianshi[second%10];//顯示秒的個(gè)位     

              P2=0x01;

delay(5);

P2=0x0;

P1=xianshi[second/10];//顯示秒的十位

P2=0x02;delay(5);

P2=0x0;..................

0
回復(fù)
2016-10-14 13:28
@于豆豆
1.在main函數(shù)第一句加上P2=0;2.timexianshi()改為:       P1=xianshi[second%10];//顯示秒的個(gè)位           P2=0x01;delay(5);P2=0x0;P1=xianshi[second/10];//顯示秒的十位P2=0x02;delay(5);P2=0x0;..................

不行,按鍵按的時(shí)候數(shù)碼管都會(huì)閃一下


0
回復(fù)
發(fā)