导航:首页 > 操作系统 > at98c51单片机原理图

at98c51单片机原理图

发布时间:2023-05-23 06:45:58

❶ MCS-51单片机电子时钟 原理图和程序 主芯片AT89C51

//我不收费的,只求多加点经验
#include <reg51.h> /*定义头文件*/
/************************************************************************************/
typedef unsigned char BYTE; /*自定义字节类型*/
/************************************************************************************/
#define Set_Bit(BIT) (BIT = 1) /*定义置1函数*/
#define Clear_Bit(BIT) (BIT = 0) /*定义清0函数*/
#define HD7279_TEST 0xbf //测试
#define HD7279_RLC 0xa3 //循环左移
#define HD7279_RRC 0xa2 //循环右移
#define HD7279_RL 0xa1 //左移
#define HD7279_RR 0xa0 //右移
#define DECODE0 0x80 //译码方式0
#define HD7279_DECODE1 0xc8 //译码方式1
#define UNDECODE 0x90 //译码方式2: 不译码
#define HD7279_HIDE 0x98 //消隐
#define HD7279_FLASH 0x88 //闪烁 闪烁
#define HD7279_SEGON 0xe0 //段亮
#define HD7279_SEGOFF 0xc0 //段灭
#define CMD_READ 0x15 //读

/************************************************************************************/
void Led_On(BYTE); /*定义点亮LED灯函数*/
void Led_Off(BYTE); /*定义熄灭LED灯函数*/
void write7279(BYTE,BYTE); /*定义HD7279写函数*/
BYTE read7279(BYTE); /*定义HD7279读函数*/
void Send_Byte(BYTE); /*定义HD7279发送字节函数*/
BYTE Receive_Byte(void); /*定义HD7279接收字节函数*/
void Short_Delay(void); /*定义短延时函数*/
void Long_Delay(void); /*定义长延时函数*/
void Mcu_Init(void); /*定义MCU初始化函数*/
void Delay_200_mS(void); /*定义200ms延时函数*/
void distime(void);//显示时间
void discalendar(void);//显示日历
void disweek(void);//显示星期
void disclock(void);//显示时钟
/************************************************************************************/
BYTE Key_number; /*定义键值变量*/
unsigned char second=0,minute=30,hour=18,weekday,cs=0,cm=00,ch=0,nextcs; //时间闹钟变量
unsigned int day=27,month=9,year=2010,Flag=0,mark=0,XQ,i,j,clock,wait_cnter=0;//年月日等变量
/************************************************************************************/
sbit key=P3^3; /*定义HD7279中断硬件连接--->INT1*/
sbit HD7279_Clk=P1^0; /*定义HD7279时钟硬件连接*/
sbit HD7279_Data=P1^1; /*定义HD7279数据硬件连接*/
sbit HD7279_CS=P2^6;
sbit D1=P1^4; //闹钟标志
/************************************************************************************/

unsigned char x; //闪烁
void main(void)
{
Mcu_Init();
/*i=((year/1000)*10+(year/100)%10);
j=((year/10)%10+year%10);
XQ=(j+(j/4)+(i/4)-2*i+(26*(month+1)/10)+day-1)%7;*/
while(1)
{
if(clock==20)
{clock=0;
second++;} //一秒计时
if(second==60)
{second=0;
minute++;} //分进位
if(minute==60)
{minute=0;
hour++;} //时进位
if(hour==24)
{hour=0; //天进位

day++;
}
if(((month%2)==0&&month<=6)||month==9||month==11)//2,4,6,9,11月
{if(month==2)
if(month==2)
{
if(day==29) //非闰年的进位
{
if(year%4==0&&year%100!=0||year%400==0)
mark=1; //mark闰年标志位
else
mark=2; }

if(mark==2) //2月为28天的
{
day=1;
month++;
if(month==13)
{
month=1;
year++; }
}
else //2月为29天的
{
if(day==30)
{
day=1;
month++; }
if(month==13)
{
month=1;
year++; }
}
}
if (day==31)
{ day=1;
month++;}
if (month==13)
{ month=1;
year++;
}
}

if(((month+1)%2==0&&month<8)||month==8||month==10||month==12)//1,3,5,7,8,10,12月
{if (day==32)
{ day=1;
month++;}
if (month==13)
{ month=1;
year++;
}
}
if(cs==60) //闹铃的设置
cs=0;
if(cm==60)
cm=0;
if(ch==24)
ch=0;
if(month==13)
{month=1;}
if(XQ==8)
{XQ=1;}
if(Flag==0) //显示日历
{discalendar();
}
if(Flag==2) //显示时间
{distime();

}
if(Flag==4) //显示星期

{if(month==1||month==2) //1,2特殊算法
{month+=12;
year--;
XQ=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
XQ=XQ+1;
if(month==13||month==14)
{month=month-12;
year++;
}}
XQ=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
XQ=XQ+1;
disweek();}
if(Flag==6) //显示闹钟
{disclock();}
if(second==cs&&minute==cm&&hour==ch) //闹铃设置时间与时钟一致
{

{ D1=0; }
nextcs=cs+30;}
if(second==nextcs&&minute==cm&&hour==ch) //定时30s
D1=1;
}
}

void Mcu_Init(void) /*MCU初始化函数*/
{
Set_Bit(EX1); /*外部中断1使能*/
Set_Bit(IT1); /*外部中断1下降沿触发*/
Set_Bit(ET0);
Set_Bit(TR0);
Set_Bit(EA); /*中断使能*/
TMOD=0X01;
TH0=0X4C;
TL0=0X00;
HD7279_CS=0;
Send_Byte(0xa4); /*HD7279复位*/

}
/************************************************************************************/

/************************************************************************************/
void int1_HD7279key(void) interrupt 2 /*外部中断1函数*/
{Key_number=read7279(CMD_READ); //读取键盘的值
Key_number=Key_number&0x0f;
while(!key); wait_cnter=0; //等待
if(Flag==0)
{
switch(Key_number)
{ case 0x00: write7279(DECODE0, (day+=1)%10); write7279(DECODE0, day/10);break; //调节日
case 0x01: write7279(DECODE0+2,(month+=1)%10); write7279(DECODE0+2,month/10);break; //调节月
case 0x02: write7279(DECODE0+4, (year+=1)%10); write7279(DECODE0+4, year/10);break; //调节年
case 0x03: Flag=1; break;
default : break;
}
while(!key); wait_cnter=0;
}
if(Flag==2)
{
switch(Key_number)
{
case 0x00: write7279(DECODE0, (second+=1)%10); write7279(DECODE0, second/10);break; //调节秒
case 0x01: write7279(DECODE0+3,(minute+=1)%10); write7279(DECODE0+3,minute/10);break; //调节分
case 0x02: write7279(DECODE0+6, (hour+=1)%10); write7279(DECODE0+6, hour/10);break; //调节时
case 0x03: Flag=3; break;
default : break;
}
while(!key); wait_cnter=0;
}

if(Flag==4)
{
switch(Key_number)
{
case 0x00: ;break;
case 0x01: ;break;
case 0x02: ;break;
case 0x03: Flag=5; break; //
default : break;
}
while(!key); wait_cnter=0;
}
if(Flag==6)
{
switch(Key_number)
{
case 0x00: write7279(DECODE0, (cs+=1)%10); write7279(DECODE0, cs/10);break; //调节闹钟秒
case 0x01: write7279(DECODE0+3,(cm+=1)%10); write7279(DECODE0+3,cm/10);break; //调节闹钟分
case 0x02: write7279(DECODE0+6, (ch+=1)%10); write7279(DECODE0+6, ch/10);break; //调节闹钟时
case 0x03: Flag=0; break;
default : break;
}
while(!key); wait_cnter=0;
}
if(Flag==1)
Flag=2;
if(Flag==3)
Flag=4;
if(Flag==5)
Flag=6;
}
void int_HD7279key(void) interrupt 1 /*定时中断0函数*/
{ TH0=0X4C;
TL0=0X00;
clock++;
}

/************************************************************************************/

void Short_Delay(void) /*短延时函数*/
{
BYTE i;
for(i=0;i<0x08;i++);
}
/************************************************************************************/
void Long_Delay(void) /*长延时函数*/
{
BYTE i;
for(i=0;i<0x30;i++);
}

/************************************************************************************/
void write7279(BYTE Command,BYTE Data) /*HD7279写函数*/
{
Send_Byte(Command);
Send_Byte(Data);
}
/************************************************************************************/
BYTE read7279(BYTE Command) /*HD7279读函数*/
{
Send_Byte(Command);
return(Receive_Byte());
}
/************************************************************************************/

void Send_Byte(BYTE Data_Out) /*HD7279发送字节函数*/
{
BYTE i;
Long_Delay();
for(i=0;i<8;i++)
{
if(Data_Out&0x80)
Set_Bit(HD7279_Data);
else Clear_Bit(HD7279_Data);
Set_Bit(HD7279_Clk);
Short_Delay();
Clear_Bit(HD7279_Clk);
Short_Delay();
Data_Out=Data_Out<<1;
}
Clear_Bit(HD7279_Data);
}
/************************************************************************************/

BYTE Receive_Byte(void) /*HD7279接收字节函数*/
{
BYTE i,Data_In;
Set_Bit(HD7279_Data);
Long_Delay();
for(i=0;i<8;i++)
{
Set_Bit(HD7279_Clk);
Short_Delay();
Data_In=Data_In<<1;
if(HD7279_Data)
Data_In=Data_In|0x01;
Clear_Bit(HD7279_Clk);
Short_Delay();
}
Clear_Bit(HD7279_Data);
return(Data_In);
}
/************************************************************************************/void distime(void)
{
write7279(DECODE0, second%10);
write7279(DECODE0+1,second/10);

write7279(UNDECODE+2,0x01);

write7279(DECODE0+3,minute%10);
write7279(DECODE0+4,minute/10);

write7279(UNDECODE+5,0x01);

write7279(DECODE0+6,hour%10);
write7279(DECODE0+7,hour/10);
}
/************************************************************************************/
void discalendar(void)
{
write7279(DECODE0, day%10);
write7279(DECODE0+1,day/10);

write7279(DECODE0+2, month%10);
write7279(DECODE0+3, month/10);

write7279(DECODE0+4, year%10);
write7279(DECODE0+5, (year/10)%10);
write7279(DECODE0+6, (year/100)%10);
write7279(DECODE0+7, year/1000);
}
/************************************************************************************/
void disweek(void)
{
write7279(DECODE0, XQ%10);
write7279(DECODE0+1,0x0F);
write7279(DECODE0+2, 0x0F);
write7279(DECODE0+3, 0x0F);
write7279(DECODE0+4, 0x0F);
write7279(DECODE0+5, 0x0F);
write7279(DECODE0+6, 0x0F);
write7279(DECODE0+7, 0x0F);
}
/************************************************************************************/
void disclock(void)
{
write7279(DECODE0, cs%10);
write7279(DECODE0+1,cs/10);

write7279(UNDECODE+2,0x01);

write7279(DECODE0+3,cm%10);
write7279(DECODE0+4,cm/10);

write7279(UNDECODE+5,0x01);

write7279(DECODE0+6,ch%10);
write7279(DECODE0+7,ch/10);
}
/************************************************************************************/

❷ 51单片机最小系统原理图

我是一名单片机工程师,下面的讲解你参考一下.

.

51单片机共有40只引脚.下面这个就是最小系统原理图,就是靠这四个部分,这个单片机就可以运行起来了.(看下面的数字标记,1234)

.

这个脚是存储器使用选择脚,当这个脚接”地”时,那么就是告诉单片机,选择使用外部存储器,当这个脚接”5V”时,说明单片机使用内部存储器.

如果选择外部的存储器,太浪费单片机仅有的资源,所以这一脚永远接电源5V(如上图所示),使用单片机的内部存储器.

5 如果内部存储器不够容量,最多选择更高级的容量,就可以解决容量不够的问题了,就是这么简单

.

一天入门51单片机:点我学习

.

我是岁月哥,愿你学习愉快!

❸ 求:用AT89C51单片机实现直流电机PWM调速原理图,protues仿真、程序

/************头文件*********/
#include<reg51.h>
#include<absacc.h>
#include <intrins.h>
/************************** /

/********自定义变量********/
#define uint unsigned int //自定义变量
#define uchar unsigned char
char gw,sw,bw,qw;
uchar j; //定时次数,每次20ms
uchar f=5; //计数的次数
sbit P10=P1^0; //PWM输出波形1
sbit P11=P1^1; //PWM输出波形2
sbit P12=P1^2; //正反转
sbit P13=P1^3; //加速
sbit P14=P1^4; //减速
sbit P15=P1^5; //停止
sbit P16=P1^6; //启动
uchar k;
uchar t; //脉冲加减
/**************************/*
/*********控制位定义********************/
uchar code smg[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x73,0x71};//程序存储区定义字型码表
char data led[4]={0x08,0x04,0x02,0x01}; //位码
uint x; //数码管显示的数值
display(); //数码管显示
delays(); //延时函数
key();
displays();
/*****************************************/

/***************主函数********************/
main (void)
{
TMOD=0x51; //T0方式1 定时计数 T1方式1计数
TH0=0xb1; //装入初值 20MS
TL0=0xe0;
TH1=0x00; // 计数567
TL1=0x00;
TR0=1; //启动 t0
TR1=1; //启动t1
gw=sw=bw=qw=0; //数码管初始化
P0=0xc0;
P2=1;
while(1) //无限循环
{
display(); //数码管显示
key();

}
}
/*****************************************/

/***************数码管显示****************/
display()
{
uchar i;
gw=x%10; //求速度个位值,送到个位显示缓冲区
sw=(x/10)%10; //求速度十位值,送到十位显示缓冲区
bw=(x/100)%10; //求速度百位值,送到百位显示缓冲区
qw=x/1000; //求速度千位值,送到千位显示缓冲区
for(i=0;i<4;)
{
P2=led[i];
if(i==0) //显示个位
{
P0=smg[gw];
delays();
}
else if(i==1) //显示十位
{
P0=smg[sw];
delays();
}
else if(i==2) //显示百位
{
P0=smg[bw];
delays();
}
else if(i==3) //显示千位
{
if(k==0) //正转时显示"三"
{
P0=0x49;
delays();
}
else
{
P0=0x71; //反转时显示"F"
}
}
i++;
}
}
/*******************************************************/

/*****************延时函数*************************/
delays()
{
uchar i;
for(i=5000;i>0;i--);
}
/************************************************/

/*********t0定时*中断函数*************/
void t0() interrupt 1 using 2
{
TH0=0xb1; //重装t0
TL0=0xe0;
f--;
if(k==0)
{
if(f<t)
P10=1;
else
P10=0;
P11=0;
}
else
{
if(f<t)
P11=1;
else
P11=0;
P10=0;
}
if(f==0)
{
f=5;
}
j++;
if(j==50)
{
j=0;
x=TH1*256+TL1; //t1方式1计数,读入计数值
TH1=0x00;
TL1=0x00;
x++;
display();
}
}
/****************按键扫描**************/
key()
{
if(P12==0) //如果按下,
{
while(!P12) //去抖动
display();
k=~k;
}
if(P16==0) //启动
{
while(P16==0);
IE=0x8a;
}
if(P13==0) //加速
{
while (P13==0);
t++;
}
if(t>=5)
t=5;
if(P14==0) //减速
{
while(P14==0);
t--;
}
if(t<1)
t=1;
if(P15==0) //停止
{
while(P15==0);

EA=0;
P10=0;
P11=0;
}
}
/******************************************************/

❹ AT89C51单片机的结构原理与引脚功能

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图所示

主要特性:

·与MCS-51兼容

·4K字节可编程闪烁存储器

·寿命:1000写/擦循环

·数据保留时间:10年

·全静态工作:0Hz-24MHz

·三级程序存储器锁定

·128×8位内部RAM

·32可编程I/O线

·两个16位定时器/计数器

·5个中断源

·可编程串行通道

·低功耗的闲置和掉电模式

·片内振荡器和时钟电路

管脚说明:

VCC:供电电压。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:

口管脚备选功能

P3.0RXD(串行输入口)

P3.1TXD(串行输出口)

P3.2/INT0(外部中断0)

P3.3/INT1(外部中断1)

P3.4T0(记时器0外部输入)

P3.5T1(记时器1外部输入)

P3.6/WR(外部数据存储器写选通)

P3.7/RD(外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:来自反向振荡器的输出。

振荡器特性:

XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

❺ 求教基于AT89C51单片机控制的开关电源原理图 (输出电压12-24V 电流1A)

没有实用意义,笔者维修多年没有见过单片机控制的开关电源。输出电压12-24V 电流1A,用单片电源IC可以搞定,简单。

❻ c51单片机复位电路的工作原理

如S22复位键按下时:RST经1k电阻接VCC,获得10k电阻上所分得电压,形成高电平,进入“复位状态”

当S22复位键断开时:RST经10k电阻接地,电流降为0,电阻上的电压也将为0,RST降为低电平,开始正常工作

(6)at98c51单片机原理图扩展阅读:

复位电路是一种用来使电路恢复到起始状态的电路设备,它的操作原理与计算器有着异曲同工之妙,只是启动原理和手段有所不同。复位电路,就是利用它把电路恢复到起始状态。就像计算器的清零按钮的作用一样,以便回到原始状态,重新进行计算。

和计算器清零按钮有所不同的是,复位电路启动的手段有所不同。一是在给电握绝路通电时马上进行复位操作;二是在必要时可以由手动操作;三是根据程序或者电路运行的需要自动地进行。复位电路都是比较简单的大都是只有电阻和电容猜行组合就可以办到了,再复杂点就有三极管等配合程序来进行了。

单片机复位电路主要有四种类型:

(1)微分型复位电路:

(2)积分型复位电路:

(3)比较器型复位电路:

比较器型复位电路的基本原理。上电复位时,由于组成了一个RC低通网络,所以比较器的正相输入端的电压比负相端输入电压延迟一定时间.而比较器的负相端网络的时间常数远远小于正相端RC网络的时间常数。

因此在正端电压还没有超过负端电压时,比较器输出低电平,经反相器后产生高电平.复位脉冲的宽度主要取决于正常电压上升的速度.由于负端电压放电回路时间常数较大,因此对电源电压的波动不敏感.但是容易产生以下二种不利现象:

(1)电源二次开关间隔太短时,复位不可靠:

(2)当电源电压中有浪涌现象时,可能在浪涌消失后不能产生复位脉冲。

为此,将改进比较器重定电路,如图9所示.这个改进电路可以消除第一种现象,并减少第二种现象的产生.为了彻底消除这二种现象,可以利用数字逻辑的方法和比较器配合,设计的比较器穗皮哗重定电路。此电路稍加改进即可作为上电复位和看门狗复位电路共同复位的电路,大大提高了复位的可靠性。

❼ AT89S51单片机八路抢答器工作原理

基于MCS-51系列单片机AT89S51的八路抢答器

基于MCS-51系列单片机AT89S51的八路抢答器

前言

随着现代电子电路的快速发展,以及电子行业对现有电子工程技术的不断需求,特别是对实际操作实践的电子人才的需求越来越多,所以加强学生动手能力、重视实践应该是电子发展需求的必然趋向。实践动手能力的培养是一种综合能力,这种能力当然是在一定难度的前提下完成的,通过一定数量的实践才能逐步形成的。因此在培养实践能力的同时,要通过实践来不断的发现问题和解决问题的途径和方法,从而提高实践能力。

近年来,随着单片机档次的不断提高,功能的不断完善,其应用日趋成熟、应用领域日趋扩大,特别是工业测控、尖端武器和日用家电等领域更是因为有了单片机而生辉增色。单片机应用技术已成为一项新的工程应用技术。本次实习设计的题目为基于单片机的抢答器。

在本次的课程设计中我主要负责了该系统的印制电路板PCB的制作

一、方案论证

方案一:系统各部分采用中小规模集成数字电路,用机械开关按钮作为控制开关,完成抢答输入信号的触发。该方案的特点是中小规模集成电路应用技术成熟,性能可靠,能方便地完成选手抢答的基本功能,但是由于系统功能要求较高,所以电路连接集成电路相对较多,而且过于复杂,并且制作过程工序比较烦琐,使用不太方便。

方案二:该系统采用MCS-51系列单片机AT89S51作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现。由于用了单片机,使其技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改性。CS-51单片机特点如下:

1>可靠性好:单片机按照工业控制要求设计,抵抗工业噪声干扰优于一般的CPU,程序指令和数据都可以烧写在ROM许多信号通道都在同一芯片,因此可靠性高。

2>易扩充:单片机有一般电脑所必须的器件,如三态双向总线,串并行的输入及输出引脚,可扩充为各种规模的微电脑系统

3>控制功能强:单片机指令除了输入输出指令,逻辑判断指令外还有更丰富的条件分支跳跃指令。原理框图如1-1所示;

图1-1

方案比较及其选用依据,显然方案二比方案一简单的多,不但从性能上优于方案一,而且在使用上及其功能的实现上都较方案一简洁,并且由于单片机具有优越的高集成电路性,使其工作速度更快、效率更高。另外AT89S51单片机采用12MHz的晶振,提高了信号的测量精度,并且使该系统可以通过软件改进来扩张功能。而方案一采用了中小规模集成电路,有其复杂的电路性能,从而可能会使信号的输入输出产生延时及不必要的误差。依此依据选择方案二比较适合。

二、原理分析

1.本电路采用单片机AT89C51作为控制芯片,单片机的P0口外接八个发光二极管,每个发光二极管分别作为八位选手的信号指示灯。并在各个外接电路上并接开关按键,按键另一端接地。发光二极管采用共阳极接法,由于P0口为高电平呈输入状态,当有按键按下时,P0口呈低电平与按键对应的发光二极管满足点亮条件点亮。在程序编程上采用查询,查询P0口P0。0到P0。7的八个端口呈低电平,即查询是哪个选手先按键,然后将选手号码的字节数据送至串行口输出并在数码管上显现出来。

2.蜂鸣器是利用三极管处于开关状态是的导通与截止工作,在三极管导通时蜂鸣器工作,三极管截止时蜂鸣器不工作。三极管采用8550PNP型基极接于P1。2口置其低电平时三极管导通,置其高电平时三极管截止。

3.数码管采用共阳极七段显示,其内部发光二极管为共阳极接高电平,当对应发光二极管一端为低电平时发光二极管点亮,显示的数字或字符由送入的字节数据控制,字节数据的输出采用串形口工作模式0,8位串行字节数据的输出通过RXD端口送出,TXD端用于送出同步移位脉冲,作为外接器件的同步移位信号。数据的发送是在TI=0的情况下,由一写发送缓冲器的指令开始CPU执行完该指令,串行口即将8位数据从RXD端送出,同时TXD端发出同步移位脉冲。8位数据发送完毕后由硬件置位TI=1,通过查询TI位来确定是否发送完一组数据,TI=1表示发送缓冲器已空,当要发送下一组数据时用软件使TI清零,然后即可发送下一组数据。

4.软件设计分析首先在程序的开始为选手设置了一段违规程序,该程序的作用是为了防止选手在主持人没有按下抢答键时,有的选手已经提前抢答了,本次抢答为无效抢答,并有报警和记录下该位选手的选号,做违规处理,如果选手超出了在规定的提前抢答次数,则该选手将被取消以后的抢答资格。如果在主持按下抢答键时再抢答,该次抢答被视为有效抢答,在主持按下回答问题的键时选手就可以在规定的时间内回答问题了

图1-2

<1>选手查询程序:

ORG0000H

START:CLRA

MOVA,#0FFH

MOVP0,A

LOP:JNBP2。4,LP

JNBP0。0,SA1

JNBP0。1,SA2

JNBP0。2,SA3

JNBP0。3,SA4

JNBP0。4,SA5

JNBP0。5,SA6

JNBP0。6,SA7

JNBP0。7,SA8

SJMPLOP

SA1:AJMPSB1

SA2:AJMPSB2

SA3:AJMPSB3

SA4:AJMPSB4

SA5:AJMPSB5

SA6:AJMPSB6

SA7:AJMPSB7

SA8:AJMPSB8

LP:MOVR0,#9

LOP1:LCALLLED

LCALLDEL

JNBP0。0,SIP1

JNBP0。1,SIP2

JNBP0。2,SIP3

JNBP0。3,SIP4

JNBP0。4,SIP5

JNBP0。5,SIP6

JNBP0。6,SIP7

JNBP0。7,SIP8

DECR0

CJNER0,#0,LOP1

MOVR0,#0

LCALLLED

LCALLDEL

SJMPLOP

SIP1:AJMPDIP1

SIP2:AJMPDIP2

SIP3:AJMPDIP3

SIP4:AJMPDIP4

SIP5:AJMPDIP5

SIP6:AJMPDIP6

SIP7:AJMPDIP7

SIP8:AJMPDIP8

SB1:MOVR2,#1

LCALLLED1

LCALLDE

SJMPLP1

SB2:MOVR2,#2

LCALLLED1

LCALLDE

SJMPLP1

SB3:MOVR2,#3

LCALLLED1

LCALLDE

SJMPLP1

SB4:MOVR2,#4

LCALLLED1

LCALLDE

SJMPLP1

SB5:MOVR2,#5

LCALLLED1

LCALLDE

SJMPLP1

SB6:MOVR2,#6

LCALLLED1

LCALLDE

SJMPLP1

SB7:MOVR2,#7

LCALLLED1

LCALLDE

SJMPLP1

SB8:MOVR2,#8

LCALLLED1

LCALLDE

SJMPLP1

LP1:JNBP2。4,LOP2

SJMPLP1

DIP1:MOVR2,#1

LCALLLED1

LCALLDE

SJMPLH1

DIP2:MOVR2,#2

LCALLLED1

LCALLDE

SJMPLH1

DIP3:MOVR2,#3

LCALLLED1

LCALLDE

SJMPLH1

DIP4:MOVR2,#4

LCALLLED1

LCALLDE

SJMPLH1

DIP5:MOVR2,#5

LCALLLED1

LCALLDE

SJMPLH1

DIP6:MOVR2,#6

LCALLLED1

LCALLDE

SJMPLH1

DIP7:MOVR2,#7

LCALLLED1

LCALLDE

SJMPLH1

DIP8:MOVR2,#8

LCALLLED1

LCALLDE

SJMPLH1

LH1:JNBP2。4,LOOP

SJMPLH1

LOP2:MOVA,#11H

MOVSBUF,A

JNBTI,$

CLRTI

LCALLDEL

AJMPLOP

<2>串行输出程序:

该部分程序的设计利用了单片机的串行模式0输出,该输出方式占用IO口少。可以省去许多IO口作为功能的扩展使用。在该模式下,我们采用了输出查询的方式,就是要借助发送标志TI,当程序执行到发送标志位时,查询其标志位TI的值,只要TI的值是0程序就继续查询,知道查询到TI为1时才结束,然后在进入下一组数据的发送。由于串行输出时送进去的数都是十进制数,以致计算机不能识别,所以还要把送进去的十进制数转化成而进制数,这样才能输出。因此在输出程序前必须有拆字程序,把原来送进去的十进制数转化成二进制数,然后在输出并通过数码管显示出来。但是如果在显示选手选号与显示选手回答问题所用的到计同用一段串行输出程序时就会造成程序的混乱,所以在此处设计了两段初始值不同的显示程序,从而可能增加了程序的烦琐化。

LED1:MOVA,R2

MOVB,#10

DIVAB

MOVR1,A

MOVR3,B

MOVA,R1

MOVDPTR,#TAB

MOVCA,@A+DPTR

MOVSBUF,A

JNBTI,$

CLRTI

MOVA,R3

MOVCA,@A+DPTR

MOVSBUF,A

JNBTI,$

CLRTI

RET。

LED:MOVA,R0

MOVB,#10

DIVAB

MOVR1,A

MOVR3,B

MOVA,R1

MOVDPTR,#TAB

MOVCA,@A+DPTR

MOVSBUF,A

JNBTI,$

CLRTI

MOVA,R3

MOVCA,@A+DPTR

MOVSBUF,A

JNBTI,$

CLRTI

RET

DE:CLRP1。2

LCALLDEL01

SETBP1。2

LCALLDEL01

RET

TAB:DB11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H

RET

<3>倒计时程序

该程序为选手回答问题时的30秒倒计时程序,其中前25秒为正常的倒计时,在后5秒倒计时时伴随有报警声,用于提示选手回答问题的剩余时间。如果该选手在正常的倒计时内没有完成问题的回答,那么倒计时将被清零。

LOOP:MOVR0,#30

LPP:LCALLLED

LCALLDEL

JNBP2。4,LOP2

DECR0

CJNER0,#5,LPP

MOVR0,#5

LPP1:JNBP2。4,LOP2

LCALLLED

LCALLDE

DECR0

CJNER0,#0,LPP1

MOVR0,#0

LCALLLED

LCALLDEL

LJMPSTART

<4>延时程序

该系统设计了两段延时程序,一段1秒延时,是为了30秒倒计时调用和程序中一秒延时所用;另一段为0。5秒延时,用于报警。程序的设计中报警时间为一秒,但是由于在硬件的设计时只设计了一个按键,这样就会造成连续按键时会使所设定的报警声不断的响,这是设计中不允许的,所以在软件编程时设计了一个0。5秒的延时,被报警时所调用,这样就使报警声能很清楚地区分出来了

DEL:MOVR6,#20DEL01:MOVR6,#10

DEL1:MOVR5,#100DEL11:MOVR5,#100

DEL2:MOVR4,#250DEL21:MOVR4,#250

DJNZR4,$DJNZR4,$

DJNZR5,DEL2DJNZR5,DEL21

DJNZR6,DEL1DJNZR6,DEL11

RETRET

<5>报警程序

该段程序主要是用于本系统中的所有报警使用,报警时间延时为1秒钟。

DE:CLRP1。2

LCALLDEL01

SETBP1。2

LCALLDEL01

RET

三、制作过程

五、参考文献

曾峰,巩海洪,曾波,电子工业出版社,印刷电路板(PCB)设计与制作2005.8

梅海凤,王艳秋,张军,汪毓铎,清华大学出版社单片机原理与接口技术2004.2

北京交通大学出版社

第二个文献:基于51单片机八路抢答器设计程序及电路图

基于51单片机八路抢答器设计程序及电路图

说明:本人的这个设计改进后解决了前一个版本中1号抢答优先的问题,并增加了锦囊的设置,当参赛选手在回答问题时要求使用锦囊,则主持人按下抢答开始键,计时重新开始。

;八路抢答器电路请看下图是用ps仿真的,已经测试成功

<单片机八路抢答器电路图>

;============================================================

;================单片机八路抢答器程序=====================

;================51hei=======================

;================2008年5月=======================

;============================================================

OKEQU20H;抢答开始标志位

RINGEQU22H;响铃标志位

ORG0000H

AJMPMAIN

ORG0003H

AJMPINT0SUB

ORG000BH

AJMPT0INT

ORG0013H

AJMPINT1SUB

ORG001BH

AJMPT1INT

ORG0040H

MAIN:MOVR1,#30;初设抢答时间为30s

MOVR2,#60;初设答题时间为60s

MOVTMOD,#11H;设置未定时器/模式1

MOVTH0,#0F0H

MOVTL0,#0FFH;越高发声频率越高,越尖

MOVTH1,#3CH

MOVTL1,#0B0H;50ms为一次溢出中断

SETBEA

SETBET0

SETBET1

SETBEX0

SETBEX1;允许四个中断,T0/T1/INT0/INT1

CLROK

CLRRING

SETBTR1

SETBTR0;一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了

;=====查询程序=====

START:MOVR5,#0BH

MOVR4,#0BH

MOVR3,#0BH

ACALLDISPLAY;未开始抢答时候显示FFF

JBP3.0,NEXT;ddddddd

ACALLDELAY

JBP3.0,NEXT;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询

ACALLBARK;按键发声

MOVA,R1

MOVR6,A;送R1->R6,因为R1中保存了抢答时间

SETBOK;抢答标志位,用于COUNT只程序中判断是否查询抢答

MOVR7,#01H;读抢答键数据信号标志,这里表示只读一次有用信号

MOVR3,#0AH;抢答只显示计时,灭号数

AJMPCOUNT;进入倒计时程序,"查询有效抢答的程序"在COUNT里面

NEXT:JNBP1.0,FALSE1

JNBP1.1,FALSE2

JNBP1.2,FALSE3

JNBP1.3,FALSE4

JNBP1.4,FALSE5

JNBP1.5,FALSE6

JNBP1.6,FALSE7

JNBP1.7,FALSE8

AJMPSTART

;=====非法抢答处理程序=====

FALSE1:MOVR3,#01H

AJMPERROR

FALSE2:MOVR3,#02H

AJMPERROR

FALSE3:MOVR3,#03H

AJMPERROR

FALSE4:MOVR3,#04H

AJMPERROR

FALSE5:MOVR3,#05H

AJMPERROR

FALSE6:MOVR3,#06H

AJMPERROR

FALSE7:MOVR3,#07H

AJMPERROR

FALSE8:MOVR3,#08H

AJMPERROR

;=====INT0(抢答时间R1调整程序)=====

INT0SUB:MOVA,R1

MOVB,#0AH

DIVAB

MOVR5,A

MOVR4,B

MOVR3,#0AH

ACALLDISPLAY;先在两个时间LED上显示R1

JNBP3.4,INC0;P3.4为+1s键,如按下跳到INCO

JNBP3.5,DEC0;P3.5为-1s键,如按下跳到DECO

JNBP3.1,BACK0;P3.1为确定键,如按下跳到BACKO

AJMPINT0SUB

INC0:MOVA,R1

CJNEA,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。

MOVR1,#00H

ACALLDELAY1

AJMPINT0SUB

ADD0:INCR1

ACALLDELAY1

AJMPINT0SUB

DEC0:MOVA,R1

JZSETR1;如果R1为0,R1就置99,

DECR1

ACALLDELAY1

AJMPINT0SUB

SETR1:MOVR1,#63H

ACALLDELAY1

AJMPINT0SUB

BACK0:RETI

;=====INT1(回答时间R2调整程序)=====

INT1SUB:MOVA,R2

MOVB,#0AH

DIVAB

MOVR5,A

MOVR4,B

MOVR3,#0AH

ACALLDISPLAY

JNBP3.4,INC1

JNBP3.5,DEC1

JNBP3.1,BACK1

AJMPINT1SUB

INC1:MOVA,R2

CJNEA,#63H,ADD1

MOVR2,#00H

ACALLDELAY1

AJMPINT1SUB

ADD1:INCR2

ACALLDELAY1

AJMPINT1SUB

DEC1:MOVA,R2

JZSETR2

DECR2

ACALLDELAY1

AJMPINT1SUB

SETR2:MOVR2,#63H

ACALLDELAY1

AJMPINT1SUB

BACK1:RETI

;=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)=====

REPEAT:MOVA,R2;使用锦囊时重新计时

MOVR6,A

CLRRING

COUNT:MOVR0,#00H;重置定时器中断次数

MOVTH1,#3CH

MOVTL1,#0B0H;重置定时器

RECOUNT:MOVA,R6;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6

MOVB,#0AH

DIVAB;除十分出个位/十位

MOV30H,A;十位存于(30H)

MOV31H,B;个位存于(31H)

MOVR5,30H;取十位

MOVR4,31H;取个位

MOVA,R6

SUBBA,#07H

JNCLARGER;大于5s跳到LARGER,小于等于5s会提醒

MOVA,R0

CJNEA,#0AH,FULL;1s中0.5s向下运行

CLRRING

AJMPCHECK

FULL:CJNEA,#14H,CHECK;下面是1s的情况,响并显示号数并清R0,重新计

SETBRING

MOVA,R6

JZQUIT;计时完毕

MOVR0,#00H

DECR6;一秒标志减1

AJMPCHECK

LARGER:MOVA,R0

CJNEA,#14H,CHECK;如果1s向下运行,否者跳到查"停/显示"

DECR6;计时一秒R6自动减1

MOVR0,#00H

CHECK:JNBP3.1,QUIT;如按下停止键退出

JNBOK,CHECKK;只在回答倒计时才有效

AJMPNEXTT

CHECKK:JNBP3.0,REPEAT;判断是否使用锦囊

NEXTT:ACALLDISPLAY

JBOK,ACCOUT;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)

AJMPRECOUNT

ACCOUT:

MOVA,36H

JNBACC.0,TRUE1

JNBACC.1,TRUE2

JNBACC.2,TRUE3

JNBACC.3,TRUE4

JNBACC.4,TRUE5

JNBACC.5,TRUE6

JNBACC.6,TZ1

JNBACC.7,TZ2

AJMPRECOUNT

TZ1:JMPTRUE7

TZ2:JMPTRUE8

QUIT:CLROK;如果按下了"停止键"执行的程序

CLRRING

AJMPSTART

;=====正常抢答处理程序=====

TRUE1:ACALLBARK

MOVA,R2

MOVR6,A;抢答时间R2送R6

MOVR3,#01H

CLROK;因为答题的计时不再查询抢答,所以就锁了抢答

AJMPCOUNT

TRUE2:ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#02H

CLROK

AJMPCOUNT

TRUE3:ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#03H

CLROK

AJMPCOUNT

TRUE4:ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#04H

CLROK

AJMPCOUNT

TRUE5:ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#05H

CLROK

AJMPCOUNT

TRUE6:ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#06H

CLROK

AJMPCOUNT

TRUE7:ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#07H

CLROK

AJMPCOUNT

TRUE8:ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#08H

CLROK

AJMPCOUNT

;=====犯规抢答程序=====

ERROR:MOVR0,#00H

MOVTH1,#3CH

MOVTL1,#0B0H

MOV34H,R3;犯规号数暂存与(34H)

HERE:MOVA,R0

CJNEA,#06H,FLASH;0.3s向下运行->灭并停响

CLRRING

MOVR3,#0AH

MOVR4,#0AH

MOVR5,#0AH;三灯全灭

AJMPCHECK1

FLASH:CJNEA,#0CH,CHECK1;下面是0.8s的情况,响并显示号数并清R0,重新计

SETBRING

MOVR0,#00H

MOVR3,34H;取回号数

MOVR5,#0BH

MOVR4,#0BH;显示FF和号数

AJMPCHECK1

CHECK1:JNBP3.1,QUIT1

ACALLDISPLAY

AJMPHERE

QUIT1:CLRRING

CLROK

AJMPSTART

;=====显示程序=====

DISPLAY:MOVDPTR,#DAT1;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,

MOVA,R3

MOVCA,@A+DPTR

MOVP2,#0feH

MOVP0,A

ACALLDELAY2

MOVDPTR,#DAT2

MOVA,R5

MOVCA,@A+DPTR

MOVP2,#0fdH

MOVP0,A

ACALLDELAY2

MOVA,R4

MOVCA,@A+DPTR

MOVP2,#0fbH

MOVP0,A

ACALLDELAY2

RET

DAT1:DB00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H

;"灭","1","2","3","4","5","6","7","8","9","灭","F"

DAT2:DB3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H

;第一个为零,其他与上相同,因为十位如果为零显示熄灭

;====加减时间延时(起到不会按下就加N个数)======

DELAY1:MOV35H,#08H

LOOP0:ACALLDISPLAY

DJNZ35H,LOOP0

RET

;=====延时4236个机器周期(去抖动用到)=====

DELAY:MOV32H,#12H

LOOP:MOV33H,#0AFH

LOOP1:DJNZ33H,LOOP1

DJNZ32H,LOOP

RET

;=====延时4236个机器周期(显示用到)=====

DELAY2:MOV32H,#43H

LOOP3:MOV33H,#1EH

MOVA,R7;每隔60~70个机器周期读一次P1口,全为1时为无效数据,继续读,有一个不为1时,转到正常抢答处理

JNZAAAA1;没读到有效数据时继续转到AAAA1

LOOP2:DJNZ33H,LOOP2

DJNZ32H,LOOP3

RET

;=====读抢答按键数据口程序=====

;由于在读抢答数据口的时候,单片机首先进入倒计时程序,再调用显示程序,最后才检测按键口

;然而在检测按键口时动态扫描要调用三次(4ms)延时程序.这样就会导致读数据口出现滞后,造成1号优先最高.8号最低.

;故采用在延时子程序中加了读数据口程序.保证了灵敏度和可靠性

AAAA1:MOVA,P1

CJNEA,#0FFH,AA1;当不全为1时的数据为有效数据

AA0:MOV36H,A;将有效数据送到36H暂存

AJMPLOOP2

AA1:DECR7

AJMPAA0

;=====发声程序=====

BARK:SETBRING

ACALLDELAY1

ACALLDELAY1

CLRRING;按键发声

RET

;=====TO溢出中断(响铃程序)=====

T0INT:MOVTH0,#0ECH

MOVTL0,#0FFH

JNBRING,OUT;

CPLP3.6;RING标志位为1时候P3.6口不短取反使喇叭发出一定频率的声音

OUT:RETI

;=====T1溢出中断(计时程序)=====

T1INT:MOVTH1,#3CH

MOVTL1,#0B0H

INCR0

RETI

仅供参考。

❽ 急求基于AT89C51单片机的循迹避障小车电路原理图和主程序(避障模块是超声波测距的),感激不尽啊。

#include<reg51.h>

#define ucharunsignedchar

#defineuintunsignedint

sbitP1_O=P1^0;

sbitP1_1=P1^1;

sbitP1_2=P1^2;

sbitP1_3=P1^3;

sbitP0_2=P0^1;

sbitP0_3=P0^2;

voiddelaym1(uintz)

{

uinti;

for(i=0;i<z;i++);

}

voidmain(void)

{蔽拦

while(1);

{

TRIG=1;

delay(1);

TRIG=0;

while(ECHO==0);

while(ECHO==1)a++;//a每次加1,所时间约21us

delay(30);

a=((340*a*21)/1000)/2;

display();

scan();

z=a;

a=0;

delay(200);}

voidliudianji1()

{

uinti,j;

P0=0X00;

//走直线

for(i=0;i<200;i++)

{for(i=0;i<500;i++)

{

P0_O=1;

P0_1=0;

delaym1(280);

P0_O=0;

P0_1=0;

P0_2=1;

P0_3=0;

delaym1(420);

P0_2=0;

P0_3=0;

}

P0=0X00;

delaym1(30000);

delaym1(30000);}

//右转弯

voidliudianji2()

{for(j=0;j<300;j++)

{P0_O=1;

皮并樱P0_1=0;

delaym1(300);

P0_O=0;

P0_1=0;

P0_2=1;

P0_3=0;

delaym1(160);

P0_2=0;

P0_3=0;

}

P0=0X00;

delaym1(30000);

delaym1(30000);

//左转弯

voidliudianji3()

{for(i=0;i<600;i++)

{

P0_O=1;

P0_1=0;

delaym1(155);

P0_O=0;

P0_1=0;

P0_2=1;

P0_3=0;

delaym1(650);

P0_2=0;

P0_3=0;

}

P0=0X00;

燃丛delaym1(30000);

delaym1(30000);}

P0=0x00;

while(1);

}

}

voidmain(void)

{

while(1)

{

TRIG=1;

delay(1);

TRIG=0;

while(ECHO==0);

while(ECHO==1)a++;//a每次加1,所时间约21us

delay(30);

a=((340*a*21)/1000)/2;

if(a==50)

esle

{voidliudianji3();}

delay(200);

voidliudianji1();

z=a;

a=0;

delay(200);

}

❾ 如何用AT89C51单片机点亮32个LED灯求详细原理图。各位帮帮忙了!!!谢谢啦!

呵呵,最简单的,就是把四个端口的32条IO各连到一个LED的负极,然后每个LED各串一个电阻到电源.
不过这样的话,你的单片机就不能干别的事了.
当然也可以通过扩展,或者用矩阵,方法就很多了.

❿ 新手学习C51单片机(AT89C51),不懂晶振 能不能解释下下图的晶振电路

1、这是51系列单片机的晶振和复位电路。
2、C1,C2,X1构成晶振电路,X1是晶振,两个电容为负载电容,作用是容易启震和减小频率的温漂。
3、R1,C3组成复位电路,跟晶振没有关系。

阅读全文

与at98c51单片机原理图相关的资料

热点内容
浪潮服务器贵州销售云主机 浏览:840
amdlinux显卡安装 浏览:564
泰海科技云服务器如何卸载 浏览:122
有密码打开excel加密 浏览:818
java生成重复字符 浏览:282
串口服务器有什么用 浏览:330
linux安装red5 浏览:295
单片机中断时入口地址作用 浏览:148
程序员的工作是重复性的吗 浏览:67
照片怎么转换成pdf 浏览:133
女生学编程好吗 浏览:240
目前绝地求生怎么看服务器地址大全 浏览:825
论人类不平等的起源pdf 浏览:436
压缩机螺杆加工 浏览:370
怎么把网站服务器设置在境外 浏览:164
单片机编程取反 浏览:897
51单片机课程设计课题 浏览:900
手机淘宝登录怎么加密码 浏览:486
linux快捷方式图标 浏览:38
阳光车险的app叫什么名字 浏览:462