急!51单片机中,用一个按键控制数码管暂停,再次按下时继续计数。下面是我写的程序,谁能帮我看看错在哪
其实,控制秒表的启动和停止,很简单。要做秒表,一定要用定时器吧,假如用T0,那开始初始化时,不写TR0=1,先不启动。
当按一下键,再启动,TR0=1,就开始计时了。
再 按一下键,就停止,TR0=0,就不计时了。
程序好写,先 定义一个按键
sbit key=P1^1; //具体是哪个 键,你自己改
主程序中,判断按键和启动/停止
if(key==0)
{
delay(); //具体延时时间自己定
if(key==0)
{
TR0=!TR0; //每按一次,取反 一次
while(key==0);
}
}
#include
#define uchar unsigned char;
uchar LED1,LED2;
uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar num=0;sec,key;
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
void display()
{
LED1=sec/10;
LED2=sec%10;
P2=0x01;
P0=distab[LED1];
delay(3);
P2=0x02;
P0=distab[LED2];
delay(3);
}
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num>=20)
{
num=0;
sec++;
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
LED1=0;
LED2=0;
while(1)
{
key=P1;
if((key&0x0f)!=0x0f)
{
delay(10);
key=P1&0x0f;
if(key!=0x0f)
{
switch(key)
{
case 0x0e:TR0=0;break;
case 0x0d:sec++;break;
case 0x0b:sec--;break;
case 0x07:TR0=1;break;
default:break;
}
}
}
)
display();
}
}
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
}
这里错了,一是没编完吧,只是中断什么都没有处理呀,二是号错了,应该为1
另外,你的显示和键盘扫描都用延时,会有冲突,漏扫,漏显等会出现
void T0_time()interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
//应该还有处理程序吧
}
TR0=1少了一句话开启中断的语句
STC51单片机中PCON寄存器怎么用呀
在STC51单片机中,PCON寄存器的GF1和GF0位被视为通用工作标志位。这些位通常不被单片机系统使用,因此留给了用户以便自由配置。例如,以下代码片段展示了如何使用这些标志位:1. 将数值NUM0移入累加器A,并清除CS位。2. 将数值NUM1移入累加器A,并再次清除CS位。3. 将累加器A中的值移至GF1位,并...
51单片机中 (!TI)和(!RI)是什么意思?
51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一...
mcs-51单片机中,惟一一个用户不能直接使用的寄存器是___。
在MCS-51单片机中,唯一一个用户不能直接使用的寄存器是程序计数器(PC)。MCS-51单片机是一款经典的8位微控制器,它拥有一系列的寄存器,这些寄存器在单片机的运行过程中起着至关重要的作用。其中,大部分寄存器都是用户可以直接访问和操作的,比如累加器A、寄存器B、数据指针DPTR、堆栈指针SP以及R0-R7等...
51单片机中的电容有什么作用?
单片机中用到的电容通常有这样两种:第一种是并联到晶振两侧,是帮助晶振起振的。第二种是复位电路上,上电他会充电,给单片机复位用的。还有就是IC设计过程中,会在IC的Vcc和GND间并联一个电容,这个电容式滤波、去耦等作用,看电容大小而定。\\x0d\\x0a51单片机是对所有兼容Intel 8031指令系统的单...
如果函数的输入参数超过3个,51单片机怎么办
如果使用的是51单片机,而函数需要传递超过3个参数,有几种方法可以解决这个问题。1. 使用数组 将所有参数存储在一个数组中,然后将该数组传递给函数。函数可以通过数组索引查找和访问每个参数。这种方法需要使用一些额外的代码来处理数组和索引,但可以简化函数调用,并允许传递更多的参数。2. 使用结构体 ...
51单片机中的定时器中断是怎么用的 ?
\/\/实现led灯一秒亮灭闪烁 void main(){ TMOD=0x01;\/\/设置定时器0为工作方式1(M1 M0为01)TH0=(65536-45872)\/256;\/\/装初值11.0582晶振定时50ms数为45872 TL0=(65536-45872)%256;EA=1;\/\/开总中断 ET0=1;\/\/开定时器0中断 TR0=1;\/\/启动定时器0 while(1);\/\/程序停止在这里等待中断...
51单片机中一个变量最多用几个字节
c51中一般指针变量占用多少字节存储 查看全部5个回答 帐号已注销 TA获得超过75.6万个赞 咨询成为第5378位粉丝 是三个字节,第一个字节表示存储器类型,第二,三个字节是指向数据地址的高字节和低字节。如果将首位作为符号位 即1为负数 0为整数 则 一字节存的最小数为 11111111(-128)最大数为 01...
51单片机中蜂鸣器发声为什么要用npn
51单片机中蜂鸣器发声要用npn因为 51单片机对电磁式蜂鸣器的驱动 蜂鸣器发声原理是电流通过电磁线圈,使电磁圈产生磁场来驱动振动膜发声的。因此需要一定的电流才能驱动它,而单片机I...此时若使用NPN型三极管来驱动蜂鸣器,则此三极管的集电极和发射极因为受到基极的高电平驱动会出现“导通”
51单片机wr\/rd脚怎么用的?
51单片机wr\/rd脚一般作为片外数据存储器和I\/O等接口芯片扩展时的数据写或读控制,在程序中不用你去控制。当你的程序在访问片外数据存储器时根据数据传送到方向,单片机自动发出写命令或读命令,使wr引脚变为低电平或使rd引脚变为低电平,控制芯片进行写操作或读操作。单片机 单片机(Microcontrollers)是一...
51单片机中什么是中断?其作用是什么?怎么用?
(循环中断)\\x0d\\x0a \\x0d\\x0a以51单片机16位定时计数器0(T0)来讲,\\x0d\\x0a计数是T1是一个能盛65536(十六位时)滴水的水盆,在水龙头下水一滴滴地滴入盆中。如果盆是空的那水在滴完65536滴水时盆子的水就满了再滴一滴的时候就溢出了。这时就会产生中断。\\x0d\\x0a如果盆里面...
颜趴齐索: /*-----------------------------------------------名称:单个共阳数码管动态显示变化数字内容:通过循环检测P1口按键输入值,然后用数码管输出,没有按键按下时原值不变 ------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况...
祥云县17741595865: 我要用51如何单片机实现一个按键控制功能.? - ?
颜趴齐索: 这个很简单,用单片机按键掷标志和计数就可以解决了
祥云县17741595865: 51单片机里用一个按键让一个两位数加一并显示在两个数码管上,但是在按着按键不放时第一个数码管总是会 - ?
颜趴齐索: 你的数码管显示应该是扫描方式,所以按键按下时,单片机不能直行显示扫描了,只会亮一个.你可以在定时器中显示数码管.
祥云县17741595865: 单片机可以实现一个独立按键控制数码管多个数字吗? - ?
颜趴齐索: 一个按键控制4个数码管显示4个数,最简单的方法是按一次键计一个数,最大数是9999,即可显示四位数.再简单点,按一次键开始自动计数,最大数还是9999,再按一次键停止计数.这样控制程序好写.长按和短按对于初学者有点难,当然了,要能写出程序来是最好啦.
祥云县17741595865: 51单片机怎么用一个按键控两个数码管,按一下改变两个数字的显示速度 - ?
颜趴齐索: #include #define uchar unsigned char; uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0到f uchar number,dat,dattop=10,cnt=0; sbit keyu=P1^0; sbit keyd=P1^1; void t0isr() interrupt 1 { TH0...
祥云县17741595865: 现有硬件为AT89C51单片机一个,四位七段数码管,精确到0.01,四个按键控制,要求用一个按键控制开始计数、 - ?
颜趴齐索: //我的理解#include<reg52.h>#define uchar unsigned char #define uint unsigned int uchar tt,num; sbit key1=P2^0; //开始计数 sbit key2=P2^1; //清零 sbit key4=P2^3; //继续计数 sbit key3=P2^2; //暂停计数 char code table[]={ 0x3f,0x06,0x5b,0x...
祥云县17741595865: 使用89C51单片机单个按键控制一个数码管,当按键按下时数码管显示1,再次按下时显示0. - ?
颜趴齐索: SBUF=dispcode[num0];//第回1位答 while(!TI); TI=0; led0=0; delay(2); led0=1; SBUF=dispcode[num1];//第2位 while(!TI); TI=0; led1=0; delay(2); led1=1; SBUF=dispcode[num2];//第3位 while(!TI); TI=0; led2=0; delay(2); led2=1;
祥云县17741595865: 在51单片机中用c语言keil写程序实现用一个按键控制6个灯的亮和灭(按下按 - ?
颜趴齐索: #include<reg51.h> sbit key=P1^0; sfr LED=P0; main() { while(1) if(key==0)P0=0xc0; else P0=0xff; }
祥云县17741595865: 想给51单片机写一段程序 就是用独立按键控制变量 就是按一次可以控制 - ?
颜趴齐索: 你好! 因为按键操作涉及寄存器配置和按键防抖,因此写了你也不一定用得上.而且你这个的逻辑比较简单,建议自己写.主要注意几个地方就可以了: 按键I/O口电平的配置:要结合硬件电路确认按键是低电平触发还是高电平触发.在程序中设置正确的I/O口电平. I/O口的输入输出状态的配置:I/O口作为按键输入必须是准双向模式或输入模式,这个不同单片机配置寄存器方式不同但大同小异. 按键防抖:在按键按下时有时会有短暂的接触不良,因此会多次判断按键按下和断开,因此一般在按键按下或断开时增加几十毫秒的防抖处理,具体就是连续多个循环判断按键是否是一个状态,如果状态不变,再进行下一步处理.
祥云县17741595865: 51单片机用计数器中断实现100以内的按键计数,汇编语言程序 - ?
颜趴齐索: 试试下列程序: ORG 0000H JMP START ORG 000BH JMP T0_INT;------------------------------ START: MOV TMOD, #06H MOV TH0, #255 MOV TL0, #255 MOV IE, #82H SETB TR0 MOV R2, #0 MOV R3, #0 MOV DPTR, #TAB;------------------------------ ...