久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20761|回復: 40
收起左側

51單片機+AT24C02+按鍵+Proteus仿真時鐘源程序

  [復制鏈接]
ID:50996 發表于 2013-6-17 03:17 | 顯示全部樓層 |閱讀模式
   時間很準確,跑了2個小時才慢1S,這可是用Proteus仿真軟件仿真哦!而且里面有詳細的說明,具體到每一步。還有AT24C02的中文資料,希望對新手有用。不過在調試程序的過程中發現了一點小問題,一直沒有找到解決的辦法,就是在調節時間時光標移動有時出現問題,但是又并不影響調節,具體在程序中有說明,希望有高手能夠指點一下!在此先感謝!
0.png

單片機定時器時鐘.zip (63.28 KB, 下載次數: 548)
回復

使用道具 舉報

ID:1 發表于 2013-6-17 03:50 | 顯示全部樓層
下面是主程序:
/**************************************
名稱:89c52+at24c02+鍵盤時鐘程序 
工具:protues仿真軟件 
作者:kwx618
時間:2011-09-10
**************************************/
#include <reg52.h>
#include <intrins.h>
#include"at24c02.h"
#define uchar unsigned char 
#define uint unsigned int
sbit LCD_RS=P0^0;
sbit LCD_RW=P0^1;
sbit LCD_EN=P0^2;
sbit S1=P1^2;
sbit S2=P1^3;
sbit S3=P1^4;
sbit S4=P1^5;
char year,mounth,day,hour,minute,second;
uchar num,count;
bit write=0;  //寫2402標志 
uchar code nyr_table[]=" 20  -  -  ";
uchar code sfm_table[]="   :  :  ";

/************延時1ms函數***************/
void delay1ms(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=112;y>0;y--);
}

/**************LCD1602程序***********/
void LCD_BUSY()
{
	P2=0x00;
	LCD_RS=0;
	LCD_RW=1;
	LCD_EN=1;
	while(P2&0x80);
	LCD_EN=0;
}

void writeLCD_command(uchar cmd)
{
  	LCD_BUSY();
	LCD_RS=0;
	LCD_RW=0;
	P2=cmd;
    _nop_();
	LCD_EN=1;
	_nop_();
	LCD_EN=0;	
}

void writeLCD_data(uchar date)
{
	LCD_BUSY();
	LCD_RS=1;
	LCD_RW=0;
	P2=date;
	_nop_();
	LCD_EN=1;
	_nop_();
	LCD_EN=0;		
}

void write_nyrsfm(char add,char date)
{
	char shiwei,gewei;
	shiwei=date/10;
	gewei=date%10;
	writeLCD_command(0x80|add);
	delay1ms(1);
	writeLCD_data(0x30+shiwei);
	delay1ms(1);
	writeLCD_data(0x30+gewei);
	delay1ms(1);
}
 
void LCD_init()
{ 
 	uchar num1,num2;
	year=0;mounth=1;day=1;
	hour=23;minute=59;second=59;
	LCD_BUSY();
	writeLCD_command(0x38);//設置16*2顯示,5*7點陣,8位數據接口 
	delay1ms(5);           //此處必須加延時,否則LCD不顯示	
	writeLCD_command(0x0c);//開顯示,光標不顯示 
	delay1ms(5);           //此處必須加延時,否則光標不會移動 
    writeLCD_command(0x06);//讀或寫字符后,光標自動加1,整屏不移動 
	delay1ms(5);
	writeLCD_command(0x02);//數據指針清0
	delay1ms(5);
	writeLCD_command(0x80|0x02);
	for(num1=0;num1<11;num1++)  
	{
		writeLCD_data(nyr_table[num1]);	
	}
	writeLCD_command(0x80|0x43);
	for(num2=0;num2<9;num2++)
	{
		writeLCD_data(sfm_table[num2]);	
	}
	write_nyrsfm(0x80|0x05,year);
	_nop_();
	write_nyrsfm(0x80|0x08,mounth);
	_nop_();
	write_nyrsfm(0x80|0x0b,day);
	_nop_();
	write_nyrsfm(0x80|0x44,hour);
	_nop_();
	write_nyrsfm(0x80|0x47,minute);
	_nop_();
	write_nyrsfm(0x80|0x4a,second);
	_nop_();
	TMOD=0x01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	EA=1;
	ET0=1;
	TR0=1;	  
}

/**************************************************
         名稱:按鍵程序 
		   S1: 設置鍵 
		   S2:時間加 
		   S3:時間減 
**************************************************/
void keyscan()
{ 
	if(S1==0)
	{
		delay1ms(10);
		if(S1==0)
			num++;	       
			while(!S1);
			switch(num)
			{
				case 1: TR0=0;
					    writeLCD_command(0x80|0x4b);
					    delay1ms(1);
				        writeLCD_command(0x0f);
					    delay1ms(1);
						break;	
				case 2:	TR0=0;
					    writeLCD_command(0x80|0x48);
				        writeLCD_command(0x0f);
						break;
				case 3:	TR0=0;
					    writeLCD_command(0x80|0x45);
				        writeLCD_command(0x0f);
					   	break;
				case 4:	TR0=0;
					    writeLCD_command(0x80|0x0c);
					    writeLCD_command(0x0f);
					    break;
				case 5:	TR0=0;
					    writeLCD_command(0x80|0x09);
					    writeLCD_command(0x0f);
					  	break;
				case 6:	TR0=0;
					    writeLCD_command(0x80|0x06);
					    writeLCD_command(0x0f);
					   	break;
				case 7:	num=0;
				        writeLCD_command(0x0c);
						TR0=1;
						break;
				default:break;	
			}			
    }
}

void up_downsetkey()
{
    //keyscan();
	if(num!=0)
	{
		if(S2==0)
		{
			delay1ms(10);
			if(S2==0)
				while(!S2);
				switch(num)
				{
					case 1: second++;
							if(second==60)
								second=0;		
					       	write_nyrsfm(0x80|0x4a,second);
							delay1ms(5);
							write2402_data(1,second);
							delay1ms(5);
							break;
					case 2: minute++;
							if(minute==60)
								minute=0;		
					       	write_nyrsfm(0x80|0x47,minute);
							delay1ms(5);
							write2402_data(2,minute);
							delay1ms(5);
							break;
					case 3: hour++;
							if(hour==24)
								hour=0;		
					       	write_nyrsfm(0x80|0x44,hour);
							delay1ms(5);
							write2402_data(3,hour);
							delay1ms(5);
							break;
					case 4: day++;
							if(day==30)
								day=0;		
					       	write_nyrsfm(0x80|0x0b,day);
							delay1ms(5);
							write2402_data(4,day);
							delay1ms(5);
							break;
					case 5: mounth++;
							if(mounth==12)
								mounth=0;		
					       	write_nyrsfm(0x80|0x08,mounth);
							delay1ms(5);
							write2402_data(5,mounth);
							delay1ms(5);
							break;
					case 6: year++;
							if(year==99)
								year=0;		
					       	write_nyrsfm(0x80|0x05,year);
							delay1ms(5);
							write2402_data(6,year);
							delay1ms(5);
							break;
				    default:break;
				}
		}
		if(S3==0)
		{
			delay1ms(10);
			if(S3==0)
				while(!S3);
				switch(num)
				{
					case 1: second--;
							if(second==-1)
								second=59;		
					       	write_nyrsfm(0x80|0x4a,second);
							delay1ms(1);
							write2402_data(1,second);
							break;
					case 2: minute--;
							if(minute==-1)
								minute=59;		
					       	write_nyrsfm(0x80|0x47,minute);
							write2402_data(2,minute);
							break;
					case 3: hour--;
							if(hour==-1)
								hour=23;		
					       	write_nyrsfm(0x80|0x44,hour);
							write2402_data(3,hour);
							break;
					case 4: day--;
							if(day==-1)
								day=30;		
					       	write_nyrsfm(0x80|0x0b,day);
							write2402_data(4,day);
							break;
					case 5: mounth--;
							if(mounth==-1)
								mounth=12;		
					       	write_nyrsfm(0x80|0x08,mounth);
							write2402_data(5,mounth);
							break;
					case 6: year--;
							if(year==-1)
								year=99;		
					       	write_nyrsfm(0x80|0x05,year);
							write2402_data(6,year);
							break;
				    default:break;
				}
		}	
	}	
}

/*void display()     //開始的時候采用這種邊顯示邊寫2402的方式,但是程序寫不到2402,
{					 //很郁悶。不過調整時間時光標很正常,一直想找個方法讓光標正常而且能寫進
	if(count==20)	  // 2402的方法,但是沒有想出來 
	{
		second++;
		count=0;
		if(second==60)
		{
			second=0;
			minute++;
			if(minute==60)
			{
				minute=0;
				hour++;
				if(hour==24)
				{								 
					hour=0;
					day++;
					if(day==31)
					{
						day=0;
						mounth++;
						if(mounth==13)
						{
							mounth=0;
							year++;
							write_nyrsfm(0x80|0x05,year);
							delay1ms(1);
							write2402_data(6,year);
							delay1ms(1);	
						}
						write_nyrsfm(0x80|0x08,mounth);
						delay1ms(1);
						write2402_data(5,mounth);
						delay1ms(1);
					}
					write_nyrsfm(0x80|0x0b,day);
					delay1ms(1);
					write2402_data(4,day);
					delay1ms(1);
				}
				write_nyrsfm(0x80|0x44,hour);
				delay1ms(1);
				write2402_data(3,hour);
				delay1ms(1);
			}
			write_nyrsfm(0x80|0x47,minute);
			delay1ms(1);
			write2402_data(2,minute);
			delay1ms(1);
		}
		write_nyrsfm(0x80|0x4a,second);
		delay1ms(1);
		write2402_data(1,second);
		delay1ms(1);
	}	
} */

/************顯示程序****************/ 
void display()
{ 
	//year=0;mounth=1;day=0;	   // 開始的時候不寫這兩句,顯示的結果就是2000-0/-0/  23-0/-0/ , 
	//hour=23;minute=59;second=59; // 解決辦法是先在加上這兩句,然后把初始化里的那兩句屏蔽掉,然后編譯顯示, 
   	write_nyrsfm(0x80|0x05,year);   // 在回過頭來去掉初始化里的屏蔽,把這兩句刪掉編譯就顯示正常了,具體為什么會 
   	delay1ms(1);			   		//這樣,我也不清楚,有待解決。 
   	write_nyrsfm(0x80|0x08,mounth);
	delay1ms(1);
	write_nyrsfm(0x80|0x0b,day);
	delay1ms(1);
	write_nyrsfm(0x80|0x44,hour);
	delay1ms(1);
	write_nyrsfm(0x80|0x47,minute);
	delay1ms(1);
	write_nyrsfm(0x80|0x4a,second);
	delay1ms(1);
}


void main()
{
	init_2402();
	delay1ms(5);
	LCD_init();
	delay1ms(5);            //此處也必須加延時,否則不會在指定的位置顯示 
	second =read_data(0);	//讀出24c02保存的值賦于sec
    if(second>60)		   //防止首次讀出錯誤數據 
    	second=0;	
	delay1ms(5);
    minute=read_data(1);   //讀出24c02保存的值賦于sec
	if(minute>60)		  //防止首次讀出錯誤數據 
   		 minute=0;	
    delay1ms(5);
	hour=read_data(2);	  //讀出24c02保存的值賦于sec
	if(hour>24)			 //防止首次讀出錯誤數據 
    hour=0;
	delay1ms(5);
	day=read_data(3);	//讀出24c02保存的值賦于sec
    if(day>30)				   //防止首次讀出錯誤數據 
    	day=0;	
	delay1ms(5);
    mounth=read_data(4);	  //讀出24c02保存的值賦于sec
	if(mounth>12)				   //防止首次讀出錯誤數據 
   		 mounth=0;	
    delay1ms(5);
	year=read_data(5);	  //讀出24c02保存的值賦于sec
	if(year>12)				   //防止首次讀出錯誤數據 
    	year=0;
	delay1ms(5);
	while(1)
	{   
		display();
		delay1ms(1);
		keyscan();
		delay1ms(1);
		up_downsetkey();
		delay1ms(1);
		if(write==1)
    	{
		    write2402_data(0,second);
			delay1ms(1);
     	    write2402_data(1,minute);
	    	delay1ms(1);
	    	write2402_data(2,hour);
	    	delay1ms(1);
			write2402_data(3,day);
			delay1ms(1);
     	    write2402_data(4,mounth);
	    	delay1ms(1);
	    	write2402_data(5,year);
	    	delay1ms(1); 
			write=0; //清0	 
		}  
	}
}

void intputtime0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	count++;
	if(count==16)//此處應該是20,但是用protues仿真時會發現誤差很大,所以我調到了16,時間剛好。 
	{
		second++;
		count=0;
		if(second==60)
		{
			second=0;
			minute++;
			if(minute==60)
			{
				minute=0;
				hour++;
				if(hour==24)
				{								 
					hour=0;
					day++;
					if(day==31)
					{
						day=0;
						mounth++;
						if(mounth==13)
						{
							mounth=0;
							year++;

						}

					}

				}

			}

		}

			write=1;
	}	
}
	
	
回復

使用道具 舉報

ID:51343 發表于 2013-7-1 16:06 | 顯示全部樓層
51Hei(51黑)論壇有你更精彩
回復

使用道具 舉報

ID:55734 發表于 2013-10-9 03:10 | 顯示全部樓層
看看學習學習
回復

使用道具 舉報

ID:52286 發表于 2013-10-13 23:27 | 顯示全部樓層
不錯過來看看
回復

使用道具 舉報

ID:55815 發表于 2013-10-23 14:16 | 顯示全部樓層
很好  學習  謝謝
回復

使用道具 舉報

ID:58854 發表于 2014-1-18 22:55 | 顯示全部樓層
學習學習
回復

使用道具 舉報

ID:45225 發表于 2014-8-31 23:03 | 顯示全部樓層
admin 發表于 2013-6-17 03:50
下面是主程序:

/**************************************

好像proteus仿真通不過,檢測到沒有聲明write2402_data子函數,程序中也沒有寫這個子函數。
回復

使用道具 舉報

ID:65699 發表于 2014-9-2 10:19 | 顯示全部樓層
謝謝分享,贊一個
回復

使用道具 舉報

ID:55815 發表于 2014-9-2 11:30 | 顯示全部樓層
謝謝 很好
回復

使用道具 舉報

ID:66181 發表于 2014-9-15 12:33 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:66338 發表于 2014-9-18 16:18 | 顯示全部樓層
很好  學習  謝謝
回復

使用道具 舉報

ID:67068 發表于 2014-10-8 10:18 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

ID:67070 發表于 2014-10-8 10:29 | 顯示全部樓層
有圖嗎
回復

使用道具 舉報

ID:67085 發表于 2014-10-8 11:02 | 顯示全部樓層
很好,學習了哈。
回復

使用道具 舉報

ID:67370 發表于 2014-10-14 17:51 | 顯示全部樓層
馬虎了。
回復

使用道具 舉報

ID:72399 發表于 2015-1-30 13:49 | 顯示全部樓層
沒有仿真圖唉
回復

使用道具 舉報

ID:72565 發表于 2015-2-2 01:11 | 顯示全部樓層
51Hei(51黑)論壇有你更精彩
回復

使用道具 舉報

ID:29438 發表于 2015-2-2 13:21 | 顯示全部樓層
又學到新東西。
回復

使用道具 舉報

ID:85152 發表于 2015-7-9 09:49 | 顯示全部樓層
不知道有沒有電路原理圖
回復

使用道具 舉報

ID:90114 發表于 2015-9-14 21:12 | 顯示全部樓層
時鐘的時間如何修改?
回復

使用道具 舉報

ID:93891 發表于 2015-10-28 17:23 | 顯示全部樓層
有圖么
回復

使用道具 舉報

ID:94340 發表于 2015-11-1 19:14 | 顯示全部樓層
非常好
回復

使用道具 舉報

ID:102367 發表于 2016-1-14 14:10 | 顯示全部樓層
admin 發表于 2013-6-17 03:50
下面是主程序:

/**************************************

我要認真的好好學習學習!
回復

使用道具 舉報

ID:110278 發表于 2016-3-22 22:32 | 顯示全部樓層
不錯,有電路圖就更好了。
回復

使用道具 舉報

ID:110417 發表于 2016-3-23 19:04 | 顯示全部樓層
好東西呀,正在學習,多謝了
回復

使用道具 舉報

ID:111074 發表于 2016-3-27 23:19 | 顯示全部樓層
很不錯,值得大家學習
回復

使用道具 舉報

ID:151629 發表于 2016-12-3 09:36 | 顯示全部樓層
到底有沒有仿真
回復

使用道具 舉報

ID:153935 發表于 2016-12-11 18:06 | 顯示全部樓層
很好  學習
回復

使用道具 舉報

ID:69481 發表于 2016-12-12 14:22 | 顯示全部樓層
學習下,很不錯!
回復

使用道具 舉報

ID:127421 發表于 2017-1-2 14:47 | 顯示全部樓層
學習了。
回復

使用道具 舉報

ID:171173 發表于 2017-3-16 11:26 | 顯示全部樓層
借鑒了一下,對我學習單片機很有作用,多謝
回復

使用道具 舉報

ID:169957 發表于 2017-4-5 14:37 | 顯示全部樓層
24c02是干什么用的
回復

使用道具 舉報

ID:238731 發表于 2017-10-31 09:06 | 顯示全部樓層
謝謝樓主的教程,回去好好研究一下~~
回復

使用道具 舉報

ID:214494 發表于 2018-1-19 15:45 | 顯示全部樓層
學習一下
回復

使用道具 舉報

ID:303520 發表于 2018-5-21 10:37 | 顯示全部樓層
謝謝樓主的教程,正研究2402
回復

使用道具 舉報

ID:631767 發表于 2019-10-29 19:37 | 顯示全部樓層
很好,收藏了
回復

使用道具 舉報

ID:854719 發表于 2020-12-18 13:52 | 顯示全部樓層
向大佬學習學習
回復

使用道具 舉報

ID:1097263 發表于 2023-11-25 10:13 | 顯示全部樓層
謝謝壇主的無私分享,都是干貨的。
回復

使用道具 舉報

ID:34149 發表于 2023-11-25 22:35 | 顯示全部樓層
學習了,依然在學習的路上!感謝版主和樓主的無私奉獻!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.一区二区 | 欧美在线 | 欧美精品在线播放 | 久久久片| 精品一区精品二区 | 日韩91 | 日韩在线中文 | 国产美女自拍视频 | 日韩毛片播放 | 超碰在线播 | 中文字幕一区二区三区四区五区 | 日韩精品中文字幕一区二区三区 | 91精品国产91久久久久游泳池 | 亚洲综合无码一区二区 | 九色在线观看 | 91福利影院 | 男人天堂网站 | 久久最新| 亚洲一区自拍 | 在线观看中文字幕 | 国产不卡一区 | 国产精品欧美一区二区三区不卡 | 在线第一页 | 日日淫| 一区二区三区视频在线 | 亚洲精品中文字幕 | 少妇性l交大片免费一 | 伊人春色成人 | 欧美福利| 狠狠躁18三区二区一区 | 欧美日韩一区在线播放 | 一区二区三区精品视频 | 久久一本 | 99精品视频在线观看 | 亚洲一区毛片 | 欧美综合一区 | 日韩精品一区二区三区中文在线 | 精品视频亚洲 | 亚洲精品久久久久久久久久久久久 | 欧美性受xxxx白人性爽 | 国产一区二区三区四区五区3d |