導航:首頁 > 操作系統 > 51單片機110592

51單片機110592

發布時間:2022-11-19 22:12:32

❶ 我在學習單片機的過程中知道110592能夠產生標準的波特率 但是該怎麼判斷其他頻率的晶振產生的波特

f/12/32/波特率=「整數」就是「標准」,如果不是整數就是非標准。

❷ 為什麼單片機晶振實際是11.0592MHz,而不是12MHz

因為11.0592MHz能夠准確地劃分成時鍾頻率,與UART(通用非同步接收器/發送器)量常見的波特率相關。特別是較高的波特率(19600,19200),不管多麼古怪的值,這些晶振都是准確,常被使用的。

用11.0592晶振的原因是51單片機的定時器導致的,用51單片機的定時器做波特率發生器時,如果用11.0592Mhz的晶振,根據公式算下來需要定時器設置的值都是整數;如果用12Mhz晶振,則波特率都是有偏差的。

比如9600,用定時器取0XFD,實際波特率10000,一般波特率偏差在4%左右都是可以的,所以也還能用STC90C516晶振12M波特率9600,倍數時誤差率6.99%,不倍數時誤差率8.51%,數據肯定會出錯。

這也就是串口通信時大家喜歡用11.0592MHz晶振的原因,在波特率倍速時,最高可達到57600,誤差率0.00%。用12MHz,最高也就4800,而且有0.16%誤差率,但在允許范圍,所以沒多大影響。

(2)51單片機110592擴展閱讀:

單片機晶振的選擇:

晶振好比單片機的心臟,晶振選擇太高不太合適,具體晶振上限是多少,恐怕測不出來,只能按照單片機的要求,一般STC系列單片機上限是35M或40M,stc單憑上寫的有,如STC11F16XE 35I-LQFP44G其中35I就是晶振最高35M的工業級晶元。

如果用於串口通信,建議選用11.0592M的或22.184M,選擇晶振最主要還是參照說明書。

❸ C51單片機,110592晶振,發射38Khz紅外,求代碼

#include<reg51.h>
sbit Ir=P1^0;
void t0isr() interrupt 1
{
Ir=~Ir;
}
main()
{
TMOD=0x02;
TH0=256-13;
TL0=256-13;
TR0=1;
ET0=1;
EA=1;
while(1);
}

❹ 51單片機設定中斷函數

你這個z永遠等於0啊
另外中斷一次多少毫秒,這個都是提前根據晶振算出來的,沒必要在程序裡面算

❺ 51單片機紅外解碼C程序

單片機採用外部中斷P3.3管腳和紅外接收頭的信號線相連,中斷方式為邊沿觸發方式。並用定時器0計算中斷的間隔時間,來區分前導碼、二進制的「1」、「0」碼。並將8位操作碼提取出來在數碼管上顯示。
// 解碼值在Im[2]中,當IrOK=1時解碼有效。 
/* 51單片機紅外遙控解碼程序 */
//用遙控器對准紅外接收頭,按下遙控器按鍵,在數碼管前兩位上就會顯示對應按鍵的編碼
#include <reg52.h>
#define uchar unsigned char 
sbit la=P2^6;
sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar f;
#define Imax 14000    //此處為晶振為11.0592時的取值, 
#define Imin 8000    //如用其它頻率的晶振時,
#define Inum1 1450    //要改變相應的取值。
#define Inum2 700 
#define Inum3 3000
unsigned char Im[4]={0x00,0x00,0x00,0x00};
uchar show[2]={0,0};
unsigned long m,Tc;
unsigned char IrOK;
void delay(uchar i)
{
  uchar j,k; 
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}
void display()
{
   la=0;
   P0=table[show[0]];
   la=1;
   la=0;
   wela=0;
   P0=0xfe;
   wela=1;
   wela=0;
   delay(5);
   P0=table[show[1]];
   la=1;
   la=0;
   P0=0xfd;
   wela=1;
   wela=0;
   delay(5);
} //外部中斷解碼程序
void intersvr1(void) interrupt 2 using 1
{
 Tc=TH0*256+TL0;                                               //提取中斷時間間隔時長
 TH0=0; 
    TL0=0;              //定時中斷重新置零
 if((Tc>Imin)&&(Tc<Imax))
      { 
  m=0;
        f=1;
  return;
      }       //找到啟始碼
   if(f==1)
      {
        if(Tc>Inum1&&Tc<Inum3) 
    {
   Im[m/8]=Im[m/8]>>1|0x80; m++; 
       }
      if(Tc>Inum2&&Tc<Inum1) 
        {
         Im[m/8]=Im[m/8]>>1; m++; //取碼
  }
  if(m==32) 
   {
         m=0;  
         f=0;
         if(Im[2]==~Im[3]) 
      {
           IrOK=1; 
   }
        else IrOK=0;   //取碼完成後判斷讀碼是否正確
     }
               //准備讀下一碼
   }
}
/*演示主程序*/
void main(void)
{
    unsigned int  a;
 m=0;
    f=0;
 EA=1;
 IT1=1;EX1=1;
 TMOD=0x11;  
 TH0=0;TL0=0;
 TR0=1;//ET0=1;
 while(1)
 {
       if(IrOK==1) 
  {
      show[1]=Im[2] & 0x0F;     //取鍵碼的低四位
           show[0]=Im[2] >> 4;  
           IrOK=0;
  }
           for(a=100;a>0;a--)
          {
    display();
   }
 }
}
解碼程序這個就能實現

❻ 51單片機如何用一個按鍵和一個定時器來模擬PWM控制一個LED燈的亮度

使用定時器T0產生PWM方波,
用按鍵調整占空比,20級可調
控制led燈的亮度等級.
#include "my51.h"
#include "timer0.h"

#define grading 20 //亮度20級變化
sbit keyS3=P3^5; //按鍵調整占空比,PWM_keyChange++
sbit keyS4=P3^6; // PWM_keyChange--

u8 PWM_keyChange=10; //初值,按鍵調整在1~20之間變化
//占空比 PWM_keyChange/grading

void T0_work() //本函數由T0定時器中斷函數調用
{
if(timeMultiple1Flag)
{
led=off(7); //關閉7號燈
timeMultiple1Flag=0; //清定時器復用置位標志
}

if(timeMultiple2Flag)
{
led=on(7); //打開7號燈
timeMultiple2Flag=0; //清定時器復用置位標志
}
}

void main() //測試
{
u8 keyFlag=1; //程序中沒有消抖處理,只是簡易的按鍵進出自鎖標志
led0=ledon; //先打開0號燈,用於和7號燈對比亮度
initT0(1,10,grading); //1毫秒的基本定時,亮的時間1*10毫秒,暗1*(grading-10)毫秒
while(1)
{
if(0==keyS3)
{
if(keyFlag) //防止一次按鍵中多次執行
{
keyFlag=0; //清標志,類似同步鎖
if(++PWM_keyChange>grading)
{
PWM_keyChange=grading; //占空比最大100%
}
initT0(1,PWM_keyChange,grading);
}
}
else if(0==keyS4)
{
if(keyFlag)
{
keyFlag=0;
if(0==--PWM_keyChange) //占空比減小
{
PWM_keyChange=1; //最小占空比 1/20
}
initT0(1,PWM_keyChange,grading); //占空比減小
}
}
else
{
keyFlag=1; //按鍵鎖釋放標志,下一次按鍵時允許調整占空比
}
}
}

C代碼
#ifndef _MY51_H
#define _MY51_H
#include <reg52.h>
//#include <math.h>
#include <intrins.h>
#include <stdio.h>
#include "mytype.h"

#ifndef _51LED_
#define _51LED_
#define led P1 //P1匯流排連8個led燈,燈連573鎖存器,P1置低電平點亮
#define LED led
#define ON(x) P1&(~(1<<(x))) //打開某個燈,開多個燈用 ON(m) & ON(n)
#define OFF(x) P1|(1<<(x)) //關閉某個燈,關多個燈用 OFF(m)| OFF(n)
#define on(x) ON(x) //包含大小寫
#define off(x) OFF(x)

#define ledon 0 //某個燈,打開
#define ledoff 1 //某個燈,關閉

sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit ledLock=P2^5; //鎖定當前8個led的狀態,0鎖定 ,1不鎖定

#endif

/*************二進制輸入宏****************************/
#ifndef _LongToBin_
#define LongToBin(n) \
( \
((n >> 21) & 0x80) | \
((n >> 18) & 0x40) | \
((n >> 15) & 0x20) | \
((n >> 12) & 0x10) | \
((n >> 9) & 0x08) | \
((n >> 6) & 0x04) | \
((n >> 3) & 0x02) | \
((n ) & 0x01) \
)
#define bin(n) LongToBin(0x##n##l)
#define BIN(n) bin(n)
#define B(n) bin(n)
#define b(n) bin(n)
#endif

/*************單個數據位的置位宏*********************/
#ifndef _BIT_
#define BIT(n) (1<<n)
#define bit(n) BIT(n)
#endif

#define high 1 //高電平
#define low 0 //低電平

sbit beep=P2^3; //蜂鳴器

extern void delayms(u16 ms);
extern void delayXus(u8 us); //函數執行(8+6x)個機器周期, 即t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////

#endif

C代碼
#ifndef _TIMER0_H
#define _TIMER0_H
#include "my51.h"

extern u8 timeMultiple1Flag; //中斷時間復用置位標志,須手動清零
extern u8 timeMultiple2Flag; //中斷時間復用置位標志,須手動清零
extern void T0_work(); //該函數未實現,需外部實現
extern void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) ; //定時器初始化

#endif

C代碼
#include "timer0.h"

u8 TH0Cout=0 ; //初值
u8 TL0Cout=0 ;
u16 T0IntCouts1=0; //中斷計數
u16 T0IntCouts2=0; //中斷計數
u16 timeMultiple1=0; //中斷復用時間的倍數
u16 timeMultiple2=0; //中斷復用時間的倍數
u8 timeMultiple1Flag=0; //中斷時間復用置位標志,須手動清零
u8 timeMultiple2Flag=0; //中斷時間復用置位標志,須手動清零

//開啟定時器,定時完成後需要手動關閉TR0,否則將循環定時
//參數一是定時的毫秒數,參數二和三是定時基時的倍率數(定時復用)
void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) //定時器初始化設定,ms取值不超過65
{
u16 N=11059.2*ms/12; //定時器總計數值
TR0=STOP; //停掉定時器
ET0=CLOSE; //關定時器中斷

//對於110592晶振,ms為5的整數倍時沒有計算誤差,但ms最大不超過71毫秒
TH0Cout =(65536-N)/256; //裝入計時值零頭計數初值
TL0Cout =(65536-N)%256;
if(0==t_multiple1) //0倍的基準時間是不合理的,至少1倍
{
t_multiple1=1;
}
if(0==t_multiple2) //0倍的基準時間是不合理的,至少1倍
{
t_multiple2=1;
}
timeMultiple1=t_multiple1; //倍時
timeMultiple2=t_multiple2; //倍時
TMOD &= 0xf0; //清定時器0配置
TMOD |= 0x01; //配置定時器0的工作方式為1

EA =OPEN; //打開總中斷
ET0=OPEN; //打開定時器中斷

TH0=TH0Cout; //定時器裝入初值
TL0=TL0Cout;
TR0=START; //啟動定時器
}
void T0_times() interrupt 1 //T0定時器中斷函數
{
TH0=TH0Cout; //重裝初值
TL0=TL0Cout;
if(++T0IntCouts1==timeMultiple1) //判斷是否復用定時器
{
T0IntCouts1=0; //中斷次數清零,重新計時
timeMultiple1Flag=1; //復用定時器標志,須在T0_work()中手動清零
}
if(++T0IntCouts2==timeMultiple2) //判斷是否復用定時器
{
T0IntCouts1=0; //這個也要清,防止到達最小公倍數時亂掉
T0IntCouts2=0; //中斷次數清零,重新計時
timeMultiple2Flag=1; //復用定時器標志,須在T0_work()中手動清零
}
T0_work(); //調用工作函數
}

❼ 51單片機串口通訊程序 使用12M晶振 單片機沒有1T模式 波特率為9600 那位哥們知道給點提示也好啊 先謝了

12m/9600=1250你需要的就是把時鍾分頻與波特率的分頻設置好,是他們相乘等於1250.分頻的設置應該都在時鍾的寄存器與串口通訊的寄存器里吧。

❽ 求紅外線接收和發射電路,我我要做一個51單片機的水位監測系統。

#include <regX52.h>

#define c(x) (x*110592/120000)
sbit Ir_Pin=P3^2;
sbit beep=P2^1;
//sbit RELAY=P2^0;
#define INBUF_LEN 4 //數據長度
unsigned char inbuf1[INBUF_LEN]={'0','0','0','0'};//發送緩沖區
unsigned char inbuf2[50];//接收緩沖區
unsigned char count3;
void init_serialcomm( void )
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
T2CON=0x30;
TH2=0x00;
TL2=0x00;
RCAP2H=0xFF;
RCAP2L=0xDC;
TR2=1;
}
//向串口發送一個字元
void send_char_com( unsigned char ch)
{
SBUF=ch;
while (TI== 0 );
TI= 0 ;
}
//向串口發送一個字元串,strlen 為該字元串長度
void send_string_com( unsigned char *str, unsigned int strlen)
{
unsigned int k= 0 ;
do
{
send_char_com(*(str + k));
k++;
} while (k < strlen);
}
//串口接收中斷函數
void serial () interrupt 4 using 3
{
if (RI) //RI==開始接收
{
unsigned char ch;
RI = 0 ; //軟體RI=0
ch=SBUF;
if (ch> 1 )
{
count3= 0 ;
inbuf2[count3]=ch;
}
else
{
count3++;
inbuf2[count3]=ch;
}
}
}

unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共陽極數碼顯示碼0-F.
unsigned char code Led_Sel[]={0x7f,0xbf,0xdf,0xef};
unsigned char dis_8[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','-'};

unsigned char Led_Buf[4]; //顯示緩沖區
char Led_Index; //位選

unsigned char Ir_Buf[4]; //用於保存解碼結果
void delay_50ms(unsigned int t)
{
unsigned int j;
for(;t>0;t--)
for(j=6245;j>0;j--)
{;}
}

//==============================================================
//數碼管掃描
timer0() interrupt 1 using 1
{
TL0=65536-1000;
TH0=(65536-1000)/256; //定時器0設定約1000us中斷一次,用於數碼管掃描
P0=0xff;
P3=Led_Sel[Led_Index]; //位選
P0=Led_Tab[Led_Buf[Led_Index]]; //段選

if(++Led_Index>3) Led_Index=0; //四個掃描完了,到第一個數碼管
}
//==============================================================
unsigned int Ir_Get_Low()
{
TL1=0;
TH1=0;
TR1=1;
while(!Ir_Pin && (TH1&0x80)==0);
TR1=0;
return TH1*256+TL1;
}
//=============================================================
unsigned int Ir_Get_High()
{
TL1=0;
TH1=0;
TR1=1;
while(Ir_Pin && (TH1&0x80)==0);
TR1=0;
return TH1*256+TL1;
}
//==============================================================
main()
{
unsigned int temp;
char i,j;
Led_Index=1;
init_serialcomm(); //初始化串口
TMOD=0x11;
TL0=65536-1000;
TH0=(65536-1000)/256; //定時器0設定約1000us中斷一次,用於數碼管掃描
EA=1;
ET0=1;
TR0=1;

Led_Buf[0]=0;
Led_Buf[1]=0;
Led_Buf[2]=0;
Led_Buf[3]=0; //顯示區設成0
do{
restart:
while(Ir_Pin);
temp=Ir_Get_Low();
if(temp<c(8500) || temp>c(9500)) continue;//引導脈沖低電平9000
temp=Ir_Get_High();
if(temp<c(4000) || temp>c(5000)) continue;//引導脈沖高電平4500
for(i=0;i<4;i++) //4個位元組
for(j=0;j<8;j++) //每個位元組8位
{
temp=Ir_Get_Low();
if(temp<c(200) || temp>c(800)) goto restart;
temp=Ir_Get_High();
if(temp<c(200) || temp>c(2000)) goto restart;
Ir_Buf[i]>>=1;
if(temp>c(1120)) Ir_Buf[i]|=0x80;
}
Led_Buf[0]=Ir_Buf[2]&0xf;
Led_Buf[1]=(Ir_Buf[2]/16)&0xf;
Led_Buf[2]=Ir_Buf[3]&0xf;
Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //顯示結果
inbuf1[0]=dis_8[Led_Buf[1]];
inbuf1[1]=dis_8[Led_Buf[0]];
inbuf1[2]=0x0d;
inbuf1[3]=0x0a;
send_string_com(inbuf1,INBUF_LEN);
P1=Ir_Buf[2];
beep=0;
delay_50ms(2);
beep=1;
//RELAY=0;
//delay_50ms(50);
//RELAY=1;

//while ( 1 )
//{

}

while(1);

}

❾ 51單片機接收上位機發送的多個位元組的串口通信

具體程序可以參考樓下的常式

串口通信的概念非常簡單,串口按位(bit)發送和接收位元組。盡管比按位元組(byte)的並行通信慢,但是串口可以在使用一根線發送數據的同時用另一根線接收數據。它很簡單並且能夠實現遠距離通信。比如IEEE488定義並行通行狀態時,規定設備線總長不得超過20米,並且任意兩個設備間的長度不得超過2米;而對於串口而言,長度可達1200米。典型地,串口用於ASCII碼字元的傳輸。
通信使用3根線完成:(1)地線,(2)發送,(3)接收。由於串口通信是非同步的,埠能夠在一根線上發送數據同時在另一根線上接收數據。其他線用於握手,但是不是必須的。串口通信最重要的參數是波特率、數據位、停止位和奇偶校驗。對於兩個進行通信的埠,這些參數必須匹配:

a,波特率:這是一個衡量通信速度的參數。它表示每秒鍾傳送的bit的個數。例如300波特表示每秒鍾發送300個bit。當我們提到時鍾周期時,我們就是指波特率例如如果協議需要4800波特率,那麼時鍾是4800Hz。這意味著串口通信在數據線上的采樣率為4800Hz。通常電話線的波特率為14400,28800和36600。波特率可以遠遠大於這些值,但是波特率和距離成反比。高波特率常常用於放置的很近的儀器間的通信,典型的例子就是GPIB設備的通信。

b,數據位:這是衡量通信中實際數據位的參數。當計算機發送一個信息包,實際的數據不會是8位的,標準的值是5、7和8位。如何設置取決於你想傳送的信息。比如,標準的ASCII碼是0~127(7位)。擴展的ASCII碼是0~255(8位)。如果數據使用簡單的文本(標准 ASCII碼),那麼每個數據包使用7位數據。每個包是指一個位元組,包括開始/停止位,數據位和奇偶校驗位。由於實際數據位取決於通信協議的選取,術語「包」指任何通信的情況。

c,停止位:用於表示單個包的最後一位。典型的值為1,1.5和2位。由於數據是在傳輸線上定時的,並且每一個設備有其自己的時鍾,很可能在通信中兩台設備間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,並且提供計算機校正時鍾同步的機會。適用於停止位的位數越多,不同時鍾同步的容忍程度越大,但是數據傳輸率同時也越慢。
d,奇偶校驗位:在串口通信中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。當然沒有校驗位也是可以的。對於偶和奇校驗的情況,串口會設置校驗位(數據位後面的一位),用一個值確保傳輸的數據有偶個或者奇個邏輯高位。例如,如果數據是011,那麼對於偶校驗,校驗位為0,保證邏輯高的位數是偶數個。

如果是奇校驗,校驗位位1,這樣就有3個邏輯高位。高位和低位不真正的檢查數據,簡單置位邏輯高或者邏輯低校驗。這樣使得接收設備能夠知道一個位的狀態,有機會判斷是否有雜訊干擾了通信或者是否傳輸和接收數據是否不同步。

❿ 51單片機晶振頻率分別為11.0592MHz機器周期分別為多少

12/11.0592微秒,51單片機的一個機器周期等於12個振盪周期(晶振頻率的倒數)。

1.大部分51單片機1個機器周期=12個時鍾周期(或振盪周期),有些增強型的1個機器周期=1個時鍾周期(或振盪周期),如stc12系列,stc15系列

2.51單片機的機器周期=1/晶振頻率;當晶振頻率=11.0592MHz,1個機器周期=12個時鍾周期(或振盪周期)時,機器周期=12/11.0592微秒。

(10)51單片機110592擴展閱讀:

1、使用用戶板的晶振:模擬器晶振旁有兩組跳線用來切換內部晶振和用戶板晶振,當兩個短路塊位於模擬器晶振一側時,默認使用模擬板上的晶振(11.0592MHz), 當兩個短路塊位於電容一側時,使用用戶板的晶振。

2、為便於調試帶看門狗的用戶板,模擬器的復位端未與用戶板復位端相連;故模擬器的復位按鈕只復位模擬器,不復位用戶板;若要復位用戶板,請使用用戶板復位按鈕。

閱讀全文

與51單片機110592相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:485
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:382
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163