1. 單片機的時鍾問題
參考一下這個模擬實例,或許會對你有所幫助,試試。
2. 用單片機製作一個簡易的時鍾。。
#include<reg52.h>
#include"segnumca.h"
#define uchar unsigned char
sbit _speak=P1^0; //蜂鳴器P1^0
uchar hello_[]={0x89,0x86,0xc7,0xc7,0xc0,0xf7}; //HELLO_
uchar con[]={0x01,0x02,0x04,0x08,0x10,0x20}; //位控制
uchar time0=100;
uchar i=0;
uchar s,m,h;
void delay(); //0.3s
void intr_(); //int0\1初始化
/*********************************
主函數
*********************************/
void main()
{
s=m=h=0;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
ET0=1;
EA=1;
intr_();
while(time0>10)
{
P2=con[i];
P0=hello_[i];
i++;
if(i>=6)i=0;
delay();
}
i=0;
while(1)
{
P2=con[i];
switch(i)
{
case 0:P0=seg[h/10];break;
case 1:P0=seg[h%10]+0x80;break;
case 2:P0=seg[m/10];break;
case 3:P0=seg[m%10]+0x80;break;
case 4:P0=seg[s/10];break;
case 5:P0=seg[s%10];break;
}
i++;
if(i>=6)i=0;
delay();
}
}
/****************************
T0
****************************/
void isr_time0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
time0--;
if(!time0)
{
time0=20;
s++;
if(s>=60)
{
s=0;
m++;
if(m>=60)
{
m=0;
h++;
if(h>=24)
{
h=0;
}
}
}
}
}
/*************************
外中斷初始化
*************************/
void intr_()
{
IT0=1;IT1=1;EX0=1;EX1=1;
}
/**************************
for延時
**************************/
void delay() //大約延時0.3秒
{
unsigned char delay0,delay1;
for(delay0=0;delay0<5;delay0++)
for(delay1=0;delay1<255;delay1++);
}
/*********************************************
INT0
*********************************************/
void intr_0() interrupt 0
{
m++;
if(m>=60)m=0;
}
/*********************************************
INT1
*********************************************/
void intr_1() interrupt 2
{
h++;
if(h>=24)h=0;
}
3. 單片機時鍾電路是干什麼的
單片機運行需要時鍾支持——就像計算機的CPU一樣,如果沒有時鍾電路來產生時鍾驅動單片機,那單片機就不能執行程序。
單片機可以看成是在時鍾驅動下的時序邏輯電路。
以MCS一5l單片機為例隨明:MCS一51單片機為l2個時鍾周期執行』條指令。也就是說單片機運行『條指令,必須要用r2個時鍾周期。沒有這個時鍾,單片機就跑不起來了,也沒有辦法定時和進行和時間有關的操作。
時鍾電路是微型計算機的心臟,它控制著計算機的二:作節奏。CPU就是通過復雜的時序電路完成不同的指令功能的。MCS一51的時鍾信號可以由兩種方式,生:『種是內部方式,利用晶元內部的振盪電路,產生時鍾信號:另一種為外部方式,時鍾信號由外部引入。
如果沒有時鍾電路來產生時鍾驅動單片機,單片機是無法工作的。
4. 單片機的時鍾是什麼,有什麼用時鍾信號有什麼用
時鍾相當於心跳,沒有心跳你覺得怎麼樣?
我特意從網上找到一個MCU設計的硬體描述語言設計代碼,地址:https://github.com/dangnhat/Simple_MCU/tree/master/NH%20cpu%20(VerilogProject)
摘抄幾句代碼來說一下:
always @ (posedge clock) //時鍾上升沿觸發
begin
if (nRst == 0) state <= S_Idle;
else
state <= next_state; //狀態機改變,至下一個狀態
end
always @ (state or opcode or r1 or r2 or rd or T or SROut or im)
//通過state狀態改變來進行指令運行(其他信號改變也可以觸發)
begin
....................
end
所以看出時鍾用來驅動MCU讀取指令運行的,如同心跳一樣,相同的是都是間隔一定時間發生改變(上升、下降或壓縮動作)都是周期性的動作,不同的是,MCU時鍾是來讀取運行指令的,人的心跳是來輸送養分的。
補充回答是因為老有一些無知的人秀下限
5. 單片機內部時鍾方式和外部時鍾方式什麼意思
一、內部時鍾方式:
利用單片機內部的振盪器,然後在引腳XTAL1(18腳)和XTAL2(19腳)兩端接晶振,就構成了穩定的自激振盪器,其發出的脈沖直接送入內部時鍾電路,外接晶振時,晶振兩端的電容一般選擇為30PF左右;這兩個電容對頻率有微調的作用,晶振的頻率范圍可在1.2MHz-12MHz之間選擇。為了減少寄生電容,更好地保證振盪器穩定、可靠地工作,振盪器和電容應盡可能安裝得與單片機晶元靠近。
二、外部時鍾方式:
此方式是利用外部振盪脈沖接入XTAL1或XTAL2。HMOS和CHMOS單片機外時鍾信號接入方式不同,HMOS型單片機(例如8051)外時鍾信號由XTAL2端腳注入後直接送至內部時鍾電路,輸入端XTAL1應接地。由於XTAL2端的邏輯電平不是TTL的,故建議外接一個上接電阻。對於CHMOS型的單片機(例如80C51),因內部時鍾發生器的信號取自反相器的輸入端,故採用外部時鍾源時,接線方式為外時鍾信號接到XTAL1而XTAL2懸空。如下圖
外接時鍾信號通過一個二分頻的觸發器而成為內部時鍾信號,要求高、低電平的持續時間都大於20ns,一般為頻率低於12MHz的方波。片內時鍾發生器就是上述的二分頻觸發器,它向晶元提供了一個2節拍的時鍾信號。
前面已提到,計算機工作時,是在統一的時鍾脈沖控制下一拍一拍地進行的。由於指令的位元組數不同,取這些指令所需要的時間也就不同,即使是位元組數相同的指令,由於執行操作有較大的差別,不同的指令執行時間也不一定相同,即所需的拍節數不同。為了便於對CPU時序進行分析,一般按指令的執行過程規定了幾中周期
單片機開發板學習有一套 單片機開發板最好,吳鑒鷹單片機開發板做得不錯,比較適合學習使用
6. 請問單片機的單時鍾是什麼意思什麼是單時鍾謝謝各位!
一般指令執行都有固定的周期數。
每個周期數:傳統的單片機都是12個時鍾周期,如51單片機。後來有的單片機也同時支持每周期6時鍾。這樣指令執行速度會變快一倍。後來由於晶元架構的升級,可以支持每個指令周期執行時間是1個時鍾周期。這樣指令運行速度更大大的提高,以適應更高的應用需求,這就是單時鍾。
時鍾周期就是外部晶振的震盪周期。如5MHZ的外部時鍾周期就是200ns。如果一條指令是2個指令周期,每周期是6時鍾周期的話,就是200*6*2=2400ns.。單時鍾就是400nS,可見單時鍾比6時鍾速度快了6倍
7. 單片機里的時鍾數啊什麼概念 具體點!
計數器是按機器周期算的
一個機器周期=12時鍾周期
不管時鍾多少,都按一個機器周期=12時鍾周期計算 //**** 關鍵 ****//
12MHZ時鍾換過來就是1M機器周期(1M/S)
1ms就是1000機器周期;
6MHZ時鍾換過來就是0.5M機器周期(0.5M/S)
1ms就是500機器周期
8位計數器最高范圍是65536,
如果我們要記時1s,可以以10ms為單位,循環記時100次
現在就是初始化,10ms為例
TL0=-10000; //對T0計數初始化賦值,用12M的JT,10ms也就是機器周期計數10000
TH0=-10000>>8;
這就是初始化,一次溢出10ms
(若用6M的JT,10ms也就是機器周期計數5000)
當然這只是其中一部分,具體還有比如TR0(1)的設置
溢出中斷允許等!
上面兩句等價於
TL0=55536;//(65536-10000)
TH0=55536>>8;
相當於從55536開始數,
數10000次(10ms)後溢出,為一個記數周期
100次後就是1s
上述過程是在中斷服務程序中的
8. 單片機中時鍾是指什麼
單片機是依照時鍾節拍來工作的,單片機主要是靠執行先前已經編譯好的程序來工作的,程序要一條條地被執行。這樣時鍾就給執行一條條的程序做一個標准,即時鍾的多少分頻----指令周期。
時鍾的來源主要有兩種:一是來源於單片機的外部,由時鍾輸入引腳xtal0輸入,xtal1懸掛即可。另外一種就是來源於單片機的內部時鍾源,但需要外部接晶體振盪器(接在xtal0和xtal1端)和電容,這兩個引腳的時鍾源是可以輸出到外部的,具體的使用應該還需要先接上分頻器再使用,和一般的時鍾源差不多。
9. 怎樣用單片機做時鍾
在電腦裡面翻翻,找到一個上學時候做的電子鍾程序。你將就看看吧。可以幫你找找思路。。。//*********************************////************電子時鍾**********////*********************************//#include <reg51.h>
#include <intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit P10=P1^0;
sbit P31=P3^1;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;uchar bdata SYSflag;
sbit HMexchangflag = SYSflag^0;uchar led[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0xff}; //0123456789 off/*定義並初始化變數*/
uchar second=0;
uchar minite=0;
uchar hour=12;
uchar sec20;
/*函數聲明*/
void delay(uchar k ); //延時子程序
void time( ); //時間處理子程序
void xianshi( ); //顯示子程序
void tiaozheng(); //時間調整子程序
void dingshi(); //定時子程序 /*****************************/
/*延時子程序*/
/****************************/
void delay (uchar k)
{
uchar j;
while((k--)!=0)
{
for(j=0;j<125;j++)
{;}
}
}
/**************************/
/*時間處理子程序*/
/**************************/
void time( void)
{
if(second==60) //秒鍾設為60進制
{ second=0;
minite++;
if( minite==60) //分鍾設為60進制
{ minite=0;
hour++;
if(hour==24) //時鍾設為24進制
{hour=0; }
}
}
}
/*****************************/
/* 顯示子程序*/
/*****************************/
void xianshi(void)
{
P2=0x01;
P1=led[hour/10]; //顯示小時的十位
delay(4);
P2=0x02;
P1=led[hour%10]; //顯示小時的個位
delay(4);
P2=0x04;
P1=led[minite/10]; //顯示分的十位
delay(4);
P2=0x08;
P1=led[minite%10]; //顯示分的個位
delay(4);
P2=0x10;
P1=led[second/10];
delay(4);
P2=0x20;
P1=led[second%10];
delay(4);
}
/**************************/
/**時間調整子程序*/
/*************************/
void tiaozheng()
{
if (P10==0)
{
delay(100);
if (P10==0)
{
if(HMexchangflag)
{
hour++;
if(hour==24)
{hour=0;}
}
else
{
minite++;
if(minite==59)
{minite=0;}
}
}
} }
/**************************/
/*主函數*/
/**************************/
void main(void)
{ P1=0xff; //初始化p1口,全設為1
TMOD=0x01; //time0為定時器,方式1
TH0=0x3c; //預置計數初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
while (1)
{
time( ); //時間處理
xianshi( ); //顯示時間
tiaozheng(); //調整時間
}
}
/********************************
外部中斷0服務子函數
*********************************/
void Exoint() interrupt 0
{
HMexchangflag= ~HMexchangflag;
}//定時Timer0中斷服務子程序-------------------
void timer0(void) interrupt 1 using 0 //定時器0方式1,100ms中斷一次
{
TH0=0x3c;
TL0=0xb0;
sec20++;
if(sec20==10)
{
second++;
sec20=0;
}
}