1T和12T單片機(jī)的區(qū)別
標(biāo)準(zhǔn)51單片機(jī)是12T的,就是說12個(gè)時(shí)鐘周期(晶振周期,例如12M的,周期是1/12M,單位秒),機(jī)器做一個(gè)指令周期,剛好就是1/12M*12=1uS,常見指令例如_nop_就是一個(gè)周期,剛好1uS,其他的大多多于一個(gè)周期,乘除法更多。所以如果計(jì)算指令時(shí)間可以這樣算。
而現(xiàn)在很多51核的單片機(jī)工藝質(zhì)量上去后,頻率大大提高,增強(qiáng)型51有6T的,如果接12M的話,一個(gè)nop就只需要0.51uS,如果是STC的部分單片機(jī)1T的話,那只需要1/12uS。
單片機(jī)的晶振不是隨便選,要看技術(shù)手冊(cè),看最高頻率,看支持類型等等。一般12M,接串口的話11.0592M。如果是PIC,很多4M,8M。
不是越高越好,對(duì)很多不需要大量處理,只是控制的情況,為了增加可靠性,降低編程難度,降低功耗,往往可選用低頻的,例如實(shí)時(shí)時(shí)鐘的32768晶振。故計(jì)算nT單片機(jī)的指令周期公式為:
例如: 使用12M晶振的1T單片機(jī)的指令周期為: T = 1 / 12 * 1 = 1 / 12 us
1T和12T單片機(jī)的編程注意事項(xiàng):
定時(shí)器部分不用改。1T單片機(jī)的計(jì)時(shí)器是兼容傳統(tǒng)12T單片機(jī)的。也就是說只是執(zhí)行一般的指令會(huì)快12倍,但是它的定時(shí)器卻是先進(jìn)行12分頻,再計(jì)時(shí)的,與原來的一樣。只是用軟件延時(shí)的話,就要改。
1T和12T單片機(jī)軟件延時(shí)程序?qū)嵗龑?duì)比:
1.對(duì)于使用12M晶振的12T單片機(jī),如:STC90C52RC
延時(shí)n個(gè)10us的程序:
void DelayXus(unsigned char n)
{
while( n-- )
{
_nop_();
_nop_();
}
}
2.而對(duì)于使用12M晶振的1T單片機(jī),如:STC12C5206AD
延時(shí)n個(gè)1us的程序
void DelayXus(unsigned char n)
{
while( n-- )
{
_nop_();
_nop_();
}
}
對(duì)比可見,相同的程序在不同時(shí)鐘周期的單片機(jī)下延時(shí)是不同的,所以當(dāng)我們?cè)诓煌瑫r(shí)鐘周期的單片機(jī)中移植程序的時(shí)候要注意軟件延時(shí)需要修改成適當(dāng)?shù)某绦?,否則會(huì)造成不必要的錯(cuò)誤。
1T單片機(jī)和12T單片機(jī)延時(shí)程序:
/*
* 文 件 名:Delay.c
* 芯 片:STC12C5A60S2
* 晶 振:12MHz
* 創(chuàng) 建 者:冷月
* 創(chuàng)建日期:2010.8.20
* 修 改 者:
* 修改日期:
* 功能描述:?jiǎn)纹瑱C(jī)us和ms級(jí)延時(shí),適用于12MHz的12T和1T單片機(jī) */
#include “Delay.h”
#define uchar unsigned char
#define uint unsigned int /*
* 函 數(shù) 名:DelayUs12T
* 功能描述:12T單片機(jī)us級(jí)延時(shí),7us~515us,精度2us
* 輸入參數(shù):delayUsVal = (t-5)/2
* 返 回 值:無
*/
void DelayUs12T(uchar delayUsVal)
{
while (--delayUsVal);
}
/*
* 函 數(shù) 名:DelayUs1T
* 功能描述:1T單片機(jī)us級(jí)延時(shí),2us~85us,精度1us
* 輸入?yún)?shù):delayUsVal = 3t - 3
* 返 回 值:無
*/
void DelayUs1T(uchar delayUsVal)
{
while (--delayUsVal);
}
/*
* 函 數(shù) 名:DelayMs12T
* 功能描述:12T單片機(jī)ms級(jí)延時(shí)
* 輸入?yún)?shù):delayMsVal:延時(shí)多少ms,1ms~65535ms
* 返 回 值:無
*/
void DelayMs12T(uint delayMsVal)
{
uchar i, j;
while (delayMsVal--)
for (i = 0; i《3; i++)
for (j = 0; j《106; j++);
/*
* 函 數(shù) 名:DelayMs1T
* 功能描述:1T單片機(jī)ms級(jí)延時(shí)
* 輸入?yún)?shù):delayMsVal:延時(shí)多少ms,1ms~65535ms
* 返 回 值:無 */
void DelayMs1T(uint delayMsVal) {
uchar i, j;
while (delayMsVal--)
for (i = 0; i《10; i++)
for (j = 0; j《169; j++); }
Delay.h /*
* 模 塊 名:Delay.h
* 芯 片:STC12C5A60S2
* 晶 振:12MHz
* 創(chuàng) 建 者:冷月
* 創(chuàng)建日期:2010.8.20
* 修 改 者:
* 修改日期:
* 功能描述:12T單片機(jī)和1T單片機(jī)的us級(jí)和ms級(jí)延時(shí)函數(shù)(12T單片機(jī)未測(cè)試),適用于晶振12MHz
*/
#ifndef _DELAY_H_
#define _DELAY_H_
#define uchar unsigned char
#define uint unsigned int /*
* 函 數(shù) 名:DelayUs12T
* 調(diào) 用:DelayUs12T(1);
* 延時(shí)7us
* DelayUs12T(255);
* 延時(shí)515us
* 功能描述:12T單片機(jī)us級(jí)延時(shí),delayUsVal = (t-5)/2
* 延時(shí)時(shí)間t = 2delayUsVal+5,7us~515us,精度2us */
void DelayUs12T(uchar delayUsVal);
/*
* 函 數(shù) 名:DelayUs1T
* 調(diào) 用:DelayUs1T(2);
* 延時(shí)1us
* DelayUs1T(254);
* 延時(shí)85us
* 功能描述:1T單片機(jī)us級(jí)延時(shí),delayUsVal = 3t - 3 》 1
* 延時(shí)時(shí)間t = (delayUsVal+3)/3,2us~85us,精度1us
*/
void DelayUs1T(uchar delayUsVal);
/*
* 函 數(shù) 名:DelayMs12T
* 調(diào) 用:DelayMs12T(100);
* 延時(shí)100ms
* 功能描述:12T單片機(jī)ms級(jí)延時(shí),可延時(shí)1ms~65535ms
*/
void DelayMs12T(uint delayMsVal);
*
* 函 數(shù) 名:DelayMs1T
* 調(diào) 用:DelayMs1T(100);
* 延時(shí)100ms
* 功能描述:12T單片機(jī)ms級(jí)延時(shí),可延時(shí)1ms~65535ms
*/
void DelayMs1T(uint delayMsVal);
#endif
評(píng)論
查看更多