㈠ 单片机的电路怎么设计
单片机的电路要实现控制LED灯,需要以单片机最小系统的方式来实现,单片机最小系统由2部分构成:
第1部分:单片机复位电路。硬件组成:电容+电阻构成复位电路。
第2部分:单片机时钟电路。电阻组成:12MHz晶振+11pF陶瓷电容,提供单片机的工作周期。
完成单片机最小系统后再完成LED灯的控制,LED灯与单片机的IO端口连接时,需要将LED灯串联220Ω的电阻限流。然后单片机的一组IO口最多串联2个LED灯,如果要多个LED灯,那最多可以在单片机的IO口并联4组2个串接在一起的LED灯。单片机有32个IO口,如此算下来,你一个IO口做多可以控制8个LED灯,那么32个IO口,单片机可以控制256个LED灯。
关于LED的一闪一闪的问题,这个采用单片机的内部定时器即可,51单片机内部有T0、T1供给2个定时器,可以根据需要自行设定。
生活不止有眼前的苟且,还有诗和远方
头像账号也是腾讯账号。有问题可以添加@
㈡ 单片机如何实现控制电路
建议你仔细看看它的一些IO端口结构图,然后配合看这些端口的控制和数据寄存器,以及端口相关的汇编指令.注意哦,一定要看汇编的指令才有用,C的看不出来.
实际上,最终端口的输入和输出,都是由端口对应的数据寄存器来控制的.
输入的时候,端口上所呈现的外部电路的状态,就呈现在输入寄存器里,用单片机的程序读出来,就是表示该状态的数据.比如说读到了0xF0,就表示该端口的高4条IO处于高电平,低4条IO处于低电平.
同样的,输出的时候,就是单片机的程序将数据写入到端口的输出寄存器里,这样就可以在对应的端口上呈现出对应的状态,用于控制外部的电路.同样的,比如说你输出一个0x0F,就表示将该端口的高4条IO置为低电平,而低4条IO置为高电平.
当然,单片机的结构有很多种,有些单片机不分输入和输出寄存器,有些单片机也没有控制寄存器,但也有很多单片机具有这些寄存器.
控制寄存器的作用,是配置端口的各种功能和模式.
比如说要将某端口的某几条IO引脚设为带弱上拉的输入,那么就应该打开弱上拉寄存器的对应几bit,并且打开输入输出控制寄存器的对应几bit,部分片子还需要关闭输入状态,这样就将该端口的指定几条IO引脚配置为了输入状态.而输出的配置也类似,无非就是几个寄存器的值不同.
配置好了之后,这些端口和这些IO就可以完成实际的输入和输出控制了.
如果是标准的MCS51单片机,例如AT89C51/52之类的,则端口要简单得许多,没有这么多的控制寄存器,也部分输入和输出寄存器.建议你找它们的用户手册仔细看看端口结构那一部分.
一般来说,这些资料要在"用户手册"中才有,普通的"数据手册"里面不一定有.
希望以上回答能让你大致了解单片机是如何实现具体控制的了.
㈢ 基于51单片机控制交通灯的电路图与C语言程序
思路:
红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换。四个方向各有一个红、黄、绿显示和两个数码管。
东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。
三、硬件电路设计
此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。
四、软件程序(C语言)
以下是整个设计的软件程序,直接可以编译成*。Hex代码。通过以上电路,下载到单片机,可直接运行。
//*****************************//
//程序名:十字路口交通灯控制
//编写人:黄庭剑
//初写时间:2009年1月2日
//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换.
//CPU说明:AT89C51型单片机;24MHZ晶体振荡器
//完成时间:2009年1月6日
//*****************************//
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
sfrp0=0x80;
sfrp1=0x90;
sfrp2=0xA0;
sfrp3=0xb0;//这部分内容其实在“#include<reg51.h>”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51.h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51.h里面的内容。其实两者是一样的。
sbitsw=p0^0;
sbitOE=P0^6;
sbitLE=P0^7;//74LS373锁存器控制端定义
chardisplay[]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};//p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;
//函数声明begin
voiddelay1(intcount);
voiddelay_long(intnumber1,intnumber2);
voidpeople_car_drive();
//函数声明end
//***********************//延时子程序
voiddelay1(intcount)
{inti;
for(i=count;i>0;i--)
{;}
}
voiddelay_long(intnumber1,intnumber2)
{
inta,b;
for(a=number1;a>0;a--)
{
for(b=number2;b>0;b--)
{_nop_();}
}
}
//**********************//延时子程序
voidpeople_car_drive()
{
intp_1=2,i,j=9,p_2=6;//****************//行人通行时,延时20秒
p2=0x09;//南北红灯亮
p3=0x24;//东西绿灯亮
while(p_1-->0)
{LE=1;
OE=0;
if(p_1==0){OE=1;}//当十位数减到0时,只显示个位数
p1=display[p_1];
delay1(1000);
LE=0;
j=9;
for(i=10;i>0;i--)
{
if(p_1==0&&j==3)break;//减到3时退出循环,让其黄灯闪烁显示
p1=display[j--];
delay_long(16000,2);
if(sw==1)return;
}
}
//*******************************************************************************//
p2=0x12;//南北黄灯闪烁三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
//*****************以下是车辆通行时延时60秒//
p2=0x24;//南北绿灯亮
p3=0x09;//东西红灯亮
while(p_2-->0)
{LE=1;
OE=0;
if(p_2==0){OE=1;}//当十位数减到0时,只显示个位数
p1=display[p_2];
delay1(1000);
LE=0;
j=9;
for(i=10;i>0;i--)
{
if(p_2==0&&j==3)break;//减到2时退出循环
p1=display[j--];
delay_long(16000,2);
if(sw==1)return;
}
}
p2=0x12;//南北黄灯闪烁三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);//南北黄灯闪烁三秒完毕
}
voidmain()//主函数入口处
{
p0=0x01;
p1=0x00;
p2=0x00;
p3=0x00;//初始化各端口
{while(1)
{
if(sw==0)
{people_car_drive();}
else
{
p2=0x00;
p3=0x00;//关闭所有交通灯
}
}
}
}
详情访问:http://hi..com/hjiannew/
㈣ 单片机控制电机的正反转 程序及电路图
这个很简单,我教你怎么玩,下面是思路和方式
思路:有三个输入,分别是一个按钮、两个霍尔传感器(也就是接近开关),我用p0.0到p0.2来代替;输出2个或以上(这看你接什么显示器,如果是pc的话,就不用数字量输出,直接串口就可以了)控制正反转的继电器管脚用p1.0、p1.1;
ps:显示那块我不知道你怎么处理,但是需要与一个全局变量转动次数k连接起来,另外两个输入接近开关选用npn传感器或用光电隔离,总之有效信号能把管脚电压拉低就可以了,具体硬件要注意什么,有需要就问我
现在我们来写程序:
#include
//选用晶振11.0592mhz
unsigned
char
k=0;
//k表示正反转次数
sbit
x0=p3^2;
//调节按钮
sbit
x1=p1^1;
//上限位接近开关信号
sbit
x2=p1^2;
//下限位接近开关信号
sbit
y1=p0^0;
//电机上升(注意:我使用的是管脚输出为0时候,电机运动,这样可以避免启动时候,单片机自复位对电机点动的影响)
sbit
y2=p0^1;
//电机下降
void
delay50ms(unsigned
int
i)
{
unsigned
int
j;
for
(i;i>0;i--)
for(j=46078;j>0;j--);
}
main()
{
it0=1;
//下降沿触发
ex0=1;
//开p3.2外部中断
ea=1;
//总中断开
while(1)
while(k)
{
y1=0;
//正转
while(x1==1);
//等待正转接近开关反应
y1=1;
//正转停
delay50ms(1);
//停止时间50ms
y2=0;
//反转
while(x2==1);
//等待反转接近开关反应
y2=1;
//反转停
k--;
//圈数减一
}
}
void
counter0(void)
interrupt
0
{
k++;
//外部中断控制圈数加一
//这个位置可以加你显示程序
}
程序已经通过测试,放上去就能用,很好玩哟,呵呵
㈤ 设计单片机控制6位数码管动态显示电路,并编程实现让数码管同时显示
#include #include #define uchar unsigned char#define uint unsigned intuchar code DSY_CODE[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};void DelayMS(uint x){ uchar t;while(x--)for(t=120;t>0;t--);}void main(){ uchar i=0;P0=0x00;while(1){ P0=~DSY_CODE[i];i=(i+1)%16;/*显示0-f*/DelayMS(400);}}
㈥ 怎么设置单片机控制电路
单片机直接驱动不了继电器,你要用一个功率放大器,用一个三极管也可以
如果你的继电器线圈电流在100mA以下,则用三极管S9012即可,不过要加续流二极管,还可以用ULN2803,这个是8路的,可以同时驱动8个500mA以下的继电器,且内部已经有各种保护电路,用起来很方便的。
还可以用MIC5801BN,这个继电器驱动芯片功能很强大,除了有ULN2803的功能以外,还可以用单片机并行总线扩展的方式去进行操作,具有三态门和锁存输出功能,另外MIC5801BN的输入和输出可以不同电压,也就是说输入端可以直接接单片机的IO口进行高低5V电平控制,而输出则可以接不同的电压(如常用DC12V,DC24V继电器等都可以)。在大规模的IO口扩展电路中用的很多,比方说继电器切换板,有4路驱动和8路驱动两种。
㈦ 绘制一单片机最小系统电路图,编写程序控制P1.7口输出低电平,并点亮发光二极管。求大神解答哇😭
编程实现对 8 个 LED 的输出控制 将实验箱中的 8255 片选信号连接到 218H~21FH,将 8255 的 4 个寄存器地址(A、B、 C 端口及控制字寄存器端口)设置为 218H~21BH。将 8255 的端口 A 的 8 个引脚:PA0~PA7 与 8 个 LED 对应相连,然后打开实验箱电源,最后编程对 8 个 LED 进行显示控制。
程序清单:
CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,21BH
MOV AL,80H
OUT DX,AL ;工作方式初始化
MOV DX,218H
MOV AL,0FEH ;设置输出数据,即显示模式
MOV CX,80 ;设置循环次数
LN: OUT DX,AL
ROL AL,1
CALL DELAY ;调用延迟程序
LOOP LN
MOV AH,4CH
INT 21H ;返回 dos
DELAY PROC ;延迟子程序
PUSH CX
MOV BX,2000
A0: MOV CX,3000
A1: LOOP A1
DEC BX
JNZ A0
POP CX
RET DELAY
ENDP
CODE ENDS
END START。吴鉴鹰单片机开发板。
从刚开始接触单片机,到现在已经有4年的时间了,在这期间学习和使用了51单片机、飞思卡尔单片机,LPC2138,PIC16F887等系列的单片机,每接触一款单片机,都会经历熟悉其基本开发,然后将其用于项目中的过程,对于如何学习一款单片机,自己做了如下的总结。
大家都知道,51单片机是最容易入门的,不仅因为其编程简单,更重要的是网上的资料非常丰富。所以一般学习单片机开发的都将51单片机作为入门开发的首选。我学习51单片机的时候是采用这样的一个步骤进行学习的:
第一步(熟悉的过程):买了一款51单片机开发板,然后就开始了我的学习之旅,刚开始的时候没有去看视频教程,而是对着一本实验教材进行学习,那本实验教材的名字记不清楚了,但是其内容就是围绕单片机的LED灯进行控制,将51单片机内部的各个功能部件全部都使用到了,这样就能使我在很短的时间内,通过控制LED灯的亮、灭熟悉了51单片机的内部的各种资源,这时对51单片机也就没有感到陌生了。所以,个人觉得,学习单片机,要从实验入手,先熟悉单片机再说,开发语言开始使用的是C语言。
第二步(进阶的过程):有了第一步的基础之后,接下来的便是进阶的过程,当时,我看的是郭天祥十天学会单片机的视频教程,因为这个教程从基础到复杂的编程慢慢深入,讲的比较的全面,而且也生动,所以那一阶段,也是我学习单片机进步最快的阶段,每次听课的时候,按照上面的实验,以及课堂上面调试程序时出现的一些问题,自己认真的在电脑上进行调试,并分析产生故障的原因,让我有了一定的开发基础。在看完了视频教程之后,后面又对基础的知识进行了下补习,主要是看单片机原理性的教材,因为有些细节性的东西还是要从教材上面获得。
㈧ 就机电大神指导单片机 如果用一个传感器当一个控制电路的开关,怎么给单片机编程,这个电路如何设计
其实这个电路应该很简单,无非就是一个输入 控制一个输出的问题,中间由单片机进行判断和控制输出动作。
首先前面的传感器信号,可能是微弱的变化信号,这个不管了,如厅燃果信号微弱可以通过放大电路整形后最终是一个开关信号,即你说的肌肉收缩到一定程度这个开信号,这个信号直接需要控制电压大小,满足单片机大含识别即可,如:肌肉伸开时电压低于1V,收缩时高于3V但小于5V(一般情况,还要根据单片机类型,比如工作电压时3.3V的要另外讨论了。) 单片机识别到这个变化信扮仿虚号(0V-->3V,或者3V-->0v )输出一路信号,这个信号算个执行或者说是反馈信号吧。比如肌肉收缩单片机控制灯亮,肌肉伸开灯灭。
如 51单片机 汇编指令
org 00h
sjmp 30H
ORG 30H
mov r1=#200
wait: setB p1.0 ‘ 假如这个信号接在P1.0上
jnb p1.0,wait '一直等待信号变高
djnz r1,wait '防抖动,去干扰 延时检测
setb p3.0 '让单片机的这个端口置高 控制别的东西,或者起到指示反馈的作用
。。。。。后面要根据你要实现的功能来编程。
㈨ 单片机I/O口控制电路,要求c语言程序
可以使用Proteus先进行仿真,然后再到实物上验证。
㈩ 单片机:设计一个8灯闪烁控制电路,系统晶振为12HMz,编程实现8灯轮流闪烁,每盏灯点亮时间为2秒 求大神!
LED负极接单片机IO口,本程序接P1,低电平点亮
#include<reg52.h> //52系列单片机头文件
#include<intrins.h>
#defineuintunsignedint //宏定义
#defineucharunsignedchar
voiddelayms(uint); //声明子函数
ucharaa;
voidmain() //主函数
{
aa=0xfe; //赋初值11111110
while(1) //大循环
{
P1=aa;
delayms(2000); //延时2秒
aa=_crol_(aa,1); //将aa循环左移1位后再赋给aa
}
}
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}