导航:首页 > 操作系统 > 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