A. 单片机电子时钟如何识别按键或开关按下与否
单片机由运算器、控制器、存储器、输入输出设备构成。
单片机自动完成赋予它的任务的过程,也就是单片机执行程序的过程,即一条条执行的指令的过程,所谓指令就是把要求单片机执行的各种操作用的命令的形式写下来,这是在设计人员赋予它的指令系统所决定的,一条指令对应着一种基本操作;单片机所能执行的全部指令,就是该单片机的指令系统,不同种类的单片机,其指令系统亦不同。为使单片机能自动完成某一特定任务,必须把要解决的问题编成一系列指令(这些指令必须是选定单片机能识别和执行的指令),这一系列指令的集合就成为程序,程序需要预先存放在具有存储功能的部件——存储器中。存储器由许多存储单元(最小的存储单位)组成,就像大楼房有许多房间组成一样,指令就存放在这些单元里,单元里的指令取出并执行就像大楼房的每个房间的被分配到了唯一一个房间号一样,每一个存储单元也必须被分配到唯一的地址号,该地址号称为存储单元的地址,这样只要知道了存储单元的地址,就可以找到这个存储单元,其中存储的指令就可以被取出,然后再被执行。程序通常是顺序执行的,所以程序中的指令也是一条条顺序存放的,单片机在执行程序时要能把这些指令一条条取出并加以执行,必须有一个部件能追踪指令所在的地址,这一部件就是程序计数器PC(包含在CPU中),在开始执行程序时,给PC赋以程序中第一条指令所在的地址,然后取得每一条要执行的命令,PC在中的内容就会自动增加,增加量由本条指令长度决定,可能是1、2或3,以指向下一条指令的起始地址,保证指令顺序执行。
应用:
单片机作为计算机发展的一个重要分支领域,根据发展情况,从不同角度,单片机大致可以分为通用型/专用型、总线型/非总线型及工控型/家电型。通用型:这是按单片机适用范围来区分的。例如,80C51式通用型单片机,它不是为某种专门用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路。
总线型:这是按单片机是否提供并行总线来区分的。总线型单片机普遍设置有并行地址总线、 数据总线、控制总线,这些引脚用以扩展并行外围器件都可通过串行口与单片机连接,另外,许多单片机已把所需要的外围器件及外设接口集成一片内,因此在许多情况下可以不要并行扩展总线,大大减省封装成本和芯片体积,这类单片机称为非总线型单片机。
B. 怎么用89C51单片机实现用一个开关控制8个流水灯,要求开关按下去松开是亮的,再按下去松开是灭的
开关,接在 P2.7 与地之间。
#include <AT89X51.H> //预处理命令
void w(unsigned char k)
{
unsigned int a; //定义变量a 为int 类型
if (k) {
while(P2_7); //没有按就循环,等待按下
for (a = 0; a < 600; a++); //延时消抖
while(P2_7); //没有按就循环
}
else while(!P2_7); //按下就循环,等待松开
}
void main(void) //主函数名
{
while(1) {
w(1); P1_0 = 0; w(0); P1_0 = 1;
w(1); P1_1 = 0; w(0); P1_1 = 1;
w(1); P1_2 = 0; w(0); P1_2 = 1;
w(1); P1_3 = 0; w(0); P1_3 = 1;
w(1); P1_4 = 0; w(0); P1_4 = 1;
w(1); P1_5 = 0; w(0); P1_5 = 1;
w(1); P1_6 = 0; w(0); P1_6 = 1;
w(1); P1_7 = 0; w(0); P1_7 = 1;
}
}
C. 按下开关输出低电平,松开开关输出高电平(5v)并驱动单片机,请问该如何实现
按下开关输出低电平,松开开关输出高电平(5v)并驱动单片机,
可以这样实现,
开关一端接地,
另一端输出,
输出端到正5伏连接5千欧电阻。
D. 51单片机,开关控制LED,开始流水灯,按一下停止,再按一下继续流水灯
#include<reg51.h>
#include<intrins.h>
#define
uchar
unsigned
char
sbit
button=P1^0;
uchar
press=0;
void
Delay(uchar
z)
{
uchar
x,y;
for(x=z;x>0;x--)
for(y=255;y>0;y--);
}
void
Led_Continue()
{
P2=0xfe;
while(press==0|press==2)
{
P2=_crol_(P2,1);
Delay(255);
}
}
void
Led_Stop()
{
P2=0xff;
}
void
Keyscan()
{
if(button==0)
{
Delay(20);
if(button==0)
{
press+=1;
if(press==1)
{
Led_Stop();
}
if(press==2)
{
press=0;
}
}
}
}
void
main()
{
while(1)
{
Keyscan();
Led_Continue();
}
}
试试这个,在mian中要一直去扫描,否则就扫描一次不能达到目的。
然后你问用中断怎么完成,告诉你中断更简单,定时器用作延时用,键盘只需要写当这个按键按下时
TRx=~TRx
就是每一次按下,定时器开关都和上一次状态不一样,这样每按一次都会停止、开始、停止、开始......
希望我的回答能帮助到你。
E. 单片机按下开关灯就亮,5秒后灭掉
//假设晶振12MHZ,按键输入P1.0,LED控制P2.0,都是低电平有效
#include "reg51.h"
unsigned int YSJS=0;
sbit KEY=P1^0;按键
sbit LED=P2^0;灯
void Timer1Init(void) //500微秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0x0C; //设置定时初值
TH1 = 0xFE; //设置定时初值
TF1 = 0; //清除TF1标志
ET1 = 1; //使能定时器1中断
EA =1; //开总中断
}
void main(void)
{
LED=1;
while(1)
{
if(KEY==0)
{
LED=0;
TR1=1; //定时器1开始计时
}
}
}
void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组
{
TH1 = 0XFE; //定时器1定时时间=500us
TL1 = 0X0C;
YSJS++;
if(YSJS==10000) //500uS*10000=5000000us=5s
{
LED=1;
TR1=0;
}
}
F. 单片机在检测按钮是否按下时,需要注意什么问题如果要解决应如何处理
检测按键是否按下,一要注意是”消抖“;二要注意按键的”抬起“和按下状态。前者一般加几十毫秒延时。后者看程序要求,是确定按下后,等待抬起才退出键盘检测,还是直接退出。
G. 单片机如何接收按钮信号,比如我按下开关,线路接通,单片机如何知道...
如图:两种方法,一个地点平触发(开关在下),一个高电平触发(开关在上)。如果连接的是普通的IO口,则采用
轮询
方式,就是
程序
要不停地判断
端口
是否有变化。如果连接的中断脚的话,
单片机
内部需要对触发类型做设置,开关在下的设置为
低电平
触发,开关在上的设置为高电平触发,这样不用你在程序里面不停的去轮询端口的
电平
变化,只需要在中断服务里编写你要执行的功能即可,这样当外界有相应的电平变化的时候,单片机就自动的跳到了你的
中断服务程序
里执行了,执行完了,就会退出,等待下一个
脉冲
的到来。这样你的程序就灵活多了。
H. 单片机按下按键1,灯亮,按下按键2,灯灭,按下按键3,灯闪烁,求代码
主要程序如下:
flag是用来记忆按键状态,按下key3,flag置1,程序中检测到flag是1才闪烁,松手后LED仍然闪烁,同时下一轮还可以检测另外两个按键
while(1)
{
if(key1==0)//判断按键是否按下
{
Delay1ms(10);//延时消抖
if(key1==0)
{
while(key1==0);//等待按键抬起
LED=1;
flag=0;
}
}
if(key2==0)//判断按键是否按下
{
Delay1ms(10);//延时消抖
if(key2==0)
{
while(key2==0);//等待按键抬起
LED=0;
flag=0;
}
}
if(key3==0)//判断按键是否按下及是否在走时
{
Delay1ms(10);//延时消抖
if(key3==0)
{
while(key3==0);//等待按键抬起
flag=1;
}
if(flag==1)
{
LED=!LED;
Delay1ms(200);
}
}