A. 用單片機設計一個時鍾,可顯示時和分,可以調時間,也要有鬧鍾功能,要有設計的電路圖
其實不用定時中斷也能實現功能:
#include<reg51.h> 主函數
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};定義0-9數組
unsigned int tmp;定義變數
void delay(unsigned int xms)定義延時函數
{unsigned int j,i;
for(i=0;i<xms;i++)
for(j=0;j<100;j++);
}
void disp()定義子函數
{
P1=tmp;
delay(1);
P2=0xff;
tmp=tmp<<1;
}
void main( )
{
unsigned char z,s=00,m=00,h=00;給時鍾初始值
while(1)
{
for(z=0;z<100;z++)
{
tmp=0x01;
P2=tab[h/10];小時顯示
disp();
P2=tab[h%10];
disp();
P2=tab[m/10];分鍾顯示
disp();
P2=tab[m%10];
disp();
P2=tab[s/10];秒顯示
disp();
P2=tab[s%10];
disp();
}
s++;
while(s==60)秒進一位,到60清0
{
m++;
s=00;
}
while(m==60)分鍾進一位,到60清0
{
h++;
m=00;
}
while(h==24)小時進一位,到24清0
{
h=00;
}
}
}
B. 請畫出最小單片機系統的復位電路圖和振盪電路圖
(不好意思哦!沒有具體的圖樓上的回答了,我在發些怎麼使用的給的咯!!)
單片機的最小系統是由組成單片機系統必需的一些元件構成的,除了單片機之外,還需要包括電源供電電路、時鍾電路、復位電路。單片機最小系統電路(單片機電源和地沒有標出)如圖2-7所示。
圖2-7 單片機最小系統
下面著重介紹時鍾電路和復位電路。
1)時鍾電路
單片機工作時,從取指令到解碼再進行微操作,必須在時鍾信號控制下才能有序地進行,時鍾電路就是為單片機工作提供基本時鍾的。單片機的時鍾信號通常有兩種產生方式:內部時鍾方式和外部時鍾方式。
內部時鍾方式的原理電路如圖2-8所示。在單片機XTAL1和XTAL2引腳上跨接上一個晶振和兩個穩頻電容,可以與單片機片內的電路構成一個穩定的自激振盪器。晶振的取值范圍一般為0~24MHz,常用的晶振頻率有6MHz、12 MHz、11.0592 MHz、24 MHz等。一些新型的單片機還可以選擇更高的頻率。外接電容的作用是對振盪器進行頻率微調,使振盪信號頻率與晶振頻率一致,同時起到穩定頻率的作用,一般選用20~30pF的瓷片電容。
外部時鍾方式則是在單片機XTAL1引腳上外接一個穩定的時鍾信號源,它一般適用於多片單片機同時工作的情況,使用同一時鍾信號可以保證單片機的工作同步。
時序是單片機在執行指令時CPU發出的控制信號在時間上的先後順序。AT89C51單片機的時序概念有4個,可用定時單位來說明,包括振盪周期、時鍾周期、機器周期和指令周期。
振盪周期:是片內振盪電路或片外為單片機提供的脈沖信號的周期。時序中1個振盪周期定義為1個節拍,用P表示。
時鍾周期:振盪脈沖送入內部時鍾電路,由時鍾電路對其二分頻後輸出的時鍾脈沖周期稱為時鍾周期。時鍾周期為振盪周期的2倍。時序中1個時鍾周期定義為1個狀態,用S表示。每個狀態包括2個節拍,用P1、P2表示。
機器周期:機器周期是單片機完成一個基本操作所需要的時間。一條指令的執行需要一個或幾個機器周期。一個機器周期固定的由6個狀態S1~S6組成。
指令周期:執行一條指令所需要的時間稱為指令周期。一般用指令執行所需機器周期數表示。AT89C51單片機多數指令的執行需要1個或2個機器周期,只有乘除兩條指令的執行需要4個機器周期。
了解了以上幾個時序的概念後,我們就可以很快的計算出執行一條指令所需要的時間。例如:若單片機使用12MHz的晶振頻率,則振盪周期=1/(12MHz)=1/12us,時鍾周期=1/6us,機器周期=1us,執行一條單周期指令只需要1us,執行一條雙周期指令則需要2us。
2)復位電路
無論是在單片機剛開始接上電源時,還是運行過程中發生故障都需要復位。復位電路用於將單片機內部各電路的狀態恢復到一個確定的初始值,並從這個狀態開始工作。
單片機的復位條件:必須使其RST引腳上持續出現兩個(或以上)機器周期的高電平。
單片機的復位形式:上電復位、按鍵復位。上電復位和按鍵復位電路如下。
圖2-9 單片機復位電路
C. 8051單片機時鍾電路
呵呵,這個不是很難的。實現時鍾有兩種方案:
1。 用8051的定時器實現,定時器為1S,每1S加一,滿60清零,分鍾加一,滿60清零,小時加一。
2。用8051+時間晶元,例如DS1302,DS12887等。
我手上沒有現成的例子。不過你可以參考一下郭天祥十天學會單片機和C語言編程。第10講介紹了 第一種方案,第十一講介紹了第二種方案。你可以參考一下,希望對你有幫助。
D. 單片機數字時鍾程序及電路圖
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
sbit SPK=P3^0;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
uchar Display_Buffer[16]=" ";
uchar Count,hour=12,min=12,sec=12;
bit flag,H_or_M;
uchar display[]="This is colck";
void _delay_ms(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
/**********************************************************************
*函數名稱:LCD_Write_Command
*輸 入:uchar cmd
*輸 出:無
*功 能:向LCD1602寫指令
**********************************************************************/
void LCD_Write_Command(uchar cmd)
{
LCD_RS=0;//根據規定,RS和R/W同時為低電平時,可以寫入指令
LCD_RW=0;
LCD_EN=0;//EN置低電平
P0=cmd;//將數據送入P2口,即寫入指令或地址
LCD_EN=1;//EN置高電平
_delay_ms(1);//稍延時,給硬體反應時間
LCD_EN=0;//當EN由高電平跳變成低電平時,液晶模塊開始執行命令
}
/**********************************************************************
*函數名稱:LCD_Write_Data
*輸 入:uchar dat
*輸 出:無
*功 能:向LCD1602寫數據
**********************************************************************/
void LCD_Write_Data(uchar dat)
{
LCD_RS=1;//RS為高電平,RW為低電平時,可以寫入數據
LCD_RW=0;
LCD_EN=0;//EN置低電平
P0=dat;//將數據送入P0口,即將數據寫入液晶模塊
LCD_EN=1;//EN置高電平
_delay_ms(1);//稍延時,給硬體反應時間
LCD_EN=0;//當EN由高電平跳變成低電平時,液晶模塊開始執行命令
}
/**********************************************************************
*函數名稱:Init_LCD
*輸 入:無
*輸 出:無
*功 能:初始化LCD1602
**********************************************************************/
void Init_LCD(void)
{
LCD_Write_Command(0x38);//顯示模式設置:16×2顯示,5×7點陣,8位數據介面
_delay_ms(1);
LCD_Write_Command(0x06);//顯示模式設置:游標右移,字元不移
_delay_ms(1);
LCD_Write_Command(0x0c);//顯示模式設置:顯示開,無游標,游標不閃爍
_delay_ms(1);
LCD_Write_Command(0x01);//清屏幕指令,將以前的顯示內容清除
_delay_ms(1);
}
/**********************************************************************
*函數名稱:LCD_POS
*輸 入:uchar pos
*輸 出:無
*功 能:字元顯示位置
**********************************************************************/
void LCD_POS(uchar pos)
{
LCD_Write_Command(0x80|pos);//顯示位置的確定方法規定為"80H+地址碼x"
}
/**********************************************************************
*函數名稱:Show_String
*輸 入:uchar *str
*輸 出:無
*功 能:LCD1602顯示字元串處理函數
**********************************************************************/
void Show_String(uchar *str)
{
while(*str!='\0')//只要沒有寫到結束標志,就繼續寫
LCD_Write_Data(*str++);//將字元常量寫入LCD,並指向下一個字元
}
void song(void)
{
uchar i,j,k;
for(i=0;i<200;i++)
{
SPK=~SPK;
for(k=0;k<50;k++);
for(j=0;j<50;j++);
}
}
/////lcd1602液晶顯示//////
void Display_Time(uchar Hour,uchar Min,uchar Sec)
{
Display_Buffer[0]=Hour/10+'0';//小時十位
Display_Buffer[1]=Hour%10+'0';//小時個位
Display_Buffer[2]=':';//顯示:號
Display_Buffer[3]=Min/10+'0';//顯示分鍾十位
Display_Buffer[4]=Min%10+'0';//顯示分鍾個位
Display_Buffer[5]=':';//顯示:號
Display_Buffer[6]=Sec/10+'0';//顯示秒十位
Display_Buffer[7]=Sec%10+'0';//顯示秒個位
LCD_POS(0x40);//顯示在液晶第1行第0列
Show_String(Display_Buffer);
}
/////按鍵處理//////
void Set_time(void)
{
flag=0;
if(key1==0||key2==0||key3==0)//若key1,key2,key3其中有鍵按下,則為真
{
TR0=0;//定時器0停止
flag=1;//按鍵標志位為真
}
while(flag)//判斷那一個按鍵按下
{
if(key1==0)//判斷key1是否按下
{
while(!key1);//等待釋放
H_or_M=!H_or_M;//選擇是修改時還是分鍾
}
else if(key2==0)//判斷key2是否被按下
{
while(!key2);//等待釋放
if(H_or_M)//若H_OR_M為真,則修改小時
{
if(++hour==24)//若小時=24,則小時=0
hour=0;//小時加1
}
else//否則修改分鍾
{
if(++min==60)//若分鍾等於60,則分鍾等於0
min=0;//分鍾加1
}
}
else if(key3==0)//判斷key3是否被按下
{
while(!key3);//等待釋放
if(H_or_M)//若H_OR_M為真,則修改小時
{
if(--hour==0xff) //小時減1,若小時等於-1,則小時等於23
hour=23;
}
else//否則修改分鍾
{
if(--min==0xff)//分鍾減1,若分鍾等於-1,則分鍾等於59
min=59;
}
}
else if(key4==0)//判斷key4是否被按下
{
while(!key4);//等待釋放
flag=0;//按鍵標志清零
TR0=1;//定時器0啟動
}
Display_Time(hour,min,sec);//傳H,M,S值顯示到液晶
}
}
void timer0_init(void)//定時器0初始化
{
TMOD=0x01;//定時器0,方式1
ET0=1;//
EA=1;//總中斷允許
TR0=1;//啟動定時器0
TH0=(65535-50000)/256;//裝高8位初值
TL0=(65535-50000)%256;//裝低8位初值
}
void main(void)//主函數
{
//P0=0xff;
P1=0xff;//埠初始化
P3=0xff;
Init_LCD();//液晶初始化
timer0_init();//定時器0初始化
LCD_POS(0);//顯示在液晶第1行第0列
Show_String(display);
while(1)//無限循環
{
Display_Time(hour,min,sec);//液晶顯示時間
//_delay_ms(500);//延時
Set_time();//時間調整
}
}
void timer0() interrupt 1//定時器0中斷
{
TH0=(65535-50000)/256;//重裝定時器0高8位
TL0=(65535-50000)%256;//重裝定時器0低8位
Count++;//計數加1
if(Count==20)//如果COUNT等於20
{
Count=0;//計數清零
sec++;//秒加1
if(sec==60)//判斷秒是否等於60
{
sec=0;//秒清零
min++;//分鍾加1
if(min==60)//判斷分鍾是否等於60
{
min=0;//若等於60,則清零分鍾
hour++;//小時加1
if(hour==24)//判斷小時是否等於24
{
hour=0;//若小時等於24,則清零小時,分鍾,秒
min=0;
sec=0;
}
song();
}
}
}
}
E. 單片機時鍾電路有那兩種接法
單片機時鍾電路有兩種
晶體振盪器接法
外部時鍾源接法
詳見下圖
F. 時鍾電路原理及原理圖
時鍾電路就是一個振盪器,給單片機提供一個節拍,單片機執行各種操作必須在這個節拍的控制下才能進行。因此單片機沒有時鍾電路是不會正常工作的。時鍾電路本身是不會控制什麼東西,而是你通過程序讓單片機根據時鍾來做相應的工作。 在MCS-51單片機片內有一個高增益的反相放大器,反相放大器的輸入端為XTAL1,輸出端為XTAL2,由該放大器構成的振盪電路和時鍾電路一起構成了單片機的時鍾方式。根據硬體電路的不同,單片機的時鍾連接方式可分為內部時鍾方式和外部時鍾方式,如圖1所示。
內部時鍾原理圖 (就是一個自激振盪電路) 在內部方式時鍾電路中,必須在XTAL1和XTAL2引腳兩端跨接石英晶體振盪器和兩個微調電容構成振盪電路,通常C1和C2一般取30pF,晶振的頻率取值在1.2MHz~12MHz之間。對於外接時鍾電路,要求XTAL1接地,XTAL2腳接外部時鍾,對於外部時鍾信號並無特殊要求,只要保證一定的脈沖寬度,時鍾頻率低於12MHz即可。 晶體振盪器的振盪信號從XTAL2端送入內部時鍾電路,它將該振盪信號二分頻,產生一個兩相時鍾信號P1和P2供單片機使用。時鍾信號的周期稱為狀態時間S,它是振盪周期的2倍,P1信號在每個狀態的前半周期有效,在每個狀態的後半周期P2信號有效。CPU就是以兩相時鍾P1和P2為基本節拍協調單片機各部分有效工作的。
G. proteus中單片機時鍾電路怎麼畫
按照單片機時鍾一節的電路圖,畫出來就OK。
先把元件庫的所有元件看一遍,把有用的添加到你的工具裡面
再把元件拖到圖紙上面
H. 時鍾電路原理及原理圖
時鍾電路就是一個振盪器,給單片機提供一個節拍,單片機執行各種操作必須在這個節拍的控制下才能進行。因此單片機沒有時鍾電路是不會正常工作的。時鍾電路本身是不會控制什麼東西,而是你通過程序讓單片機根據時鍾來做相應的工作。 在MCS-51單片機片內有一個高增益的反相放大器,反相放大器的輸入端為XTAL1,輸出端為XTAL2,由該放大器構成的振盪電路和時鍾電路一起構成了單片機的時鍾方式。根據硬體電路的不同,單片機的時鍾連接方式可分為內部時鍾方式和外部時鍾方式,如圖1所示。
內部時鍾原理圖 (就是一個自激振盪電路) 在內部方式時鍾電路中,必須在XTAL1和XTAL2引腳兩端跨接石英晶體振盪器和兩個微調電容構成振盪電路,通常C1和C2一般取30pF,晶振的頻率取值在1.2MHz~12MHz之間。對於外接時鍾電路,要求XTAL1接地,XTAL2腳接外部時鍾,對於外部時鍾信號並無特殊要求,只要保證一定的脈沖寬度,時鍾頻率低於12MHz即可。 晶體振盪器的振盪信號從XTAL2端送入內部時鍾電路,它將該振盪信號二分頻,產生一個兩相時鍾信號P1和P2供單片機使用。時鍾信號的周期稱為狀態時間S,它是振盪周期的2倍,P1信號在每個狀態的前半周期有效,在每個狀態的後半周期P2信號有效。CPU就是以兩相時鍾P1和P2為基本節拍協調單片機各部分有效工作的。