用单片机控制一个8段数码管,其循环显示数字0到9,每位数字显示时间为一秒,定时功能用单片机中断显示
有一个一模一样的提问,好吧,俺再发布一次
给你一份我自己写的,利用四位数码管显示模拟时钟的程序吧,供你研究
另外,再给你一个一位数码管的,是你要求的那种
这两个都是利用单片机的定时器中断来产生秒信号的
下面这个是 四位数码管的,最下边的是一位数码管的,端口不一样的话,自己改下
/***************************************************************************/
#include
sbit p20=P3^7; sbit p21=P3^6; sbit led=P2^7;//按键及LED端口定义
sbit Axs=P1^3; sbit Bxs=P1^2; sbit Cxs=P1^1; sbit Dxs=P1^0;//数码管位选端口
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
unsigned int h,m,s,t,n;
/***************************************************************************/
void YS(char hs)//延时函数
{char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}
/***************************************************************************/
void XS(int xh,int xm) //显示子函数
{
char d1,d2,d3,d4;
d1=(xh/1)%10; d2=(xh/10)%10;//分离小时
d3=(xm/1)%10; d4=(xm/10)%10;//分离分钟
P0=table[d1];Cxs=0;YS(10);Cxs=1;//小时个位
P0=table[d2];Dxs=0;YS(10);Dxs=1;//小时十位
P0=table[d3];Axs=0;YS(10);Axs=1;//分钟个位
P0=table[d4];Bxs=0;YS(10);Bxs=1;//分钟十位
P0=0x7f; P1=0xfd; YS(10); P1=0xff;//小数点
}
/***************************************************************************/
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定时器初始化
while(1)//主循环
{
if(p20==0){YS(10);if(p20==0){h++;if(h>23){h=0;}}while(!p20){XS(h,m);}}
if(p21==0){YS(10);if(p21==0){m++;if(m>59){m=0;}}while(!p21){XS(h,m);}}
XS(h,m);//调用数码管显示函数
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;t++;
if(t>500){t=0;led=~led;}//LED闪烁
if(n>1000){n=0;s++;}//如果达到一秒,秒加一
if(s>59){s=0;m++;}//如果达到一分,分加一
if(m>59){m=0;h++;}//如果达到一小时,小时加一
if(h>23){h=0;}//如果达到24小时,小时清零
}
/***************************************************************************/
/***************************************************************************/
#include
sbit Axs=P1^3;//数码管位选端口
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
unsigned int h,m,s,t,n;
/***************************************************************************/
void YS(char hs)//延时函数
{char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}
/***************************************************************************/
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定时器初始化
while(1)//主循环
{
P0=table[m];Axs=0;YS(10);Axs=1;//小时个位
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;
if(n>1000){n=0;m++;}//如果达到一秒,秒加一
if(m>9){m=0;}//如果达到一小时,小时加一
}
/***************************************************************************/
在主函数加一个判断语句就可以。上电复位的函数里吧所有位致零,
只控制一位数码管没啥意思,如果只是研究一下倒是可以的
给你一份我自己写的,利用四位数码管显示模拟时钟的程序吧,供你研究
另外,再给你一个一位数码管的,是你要求的那种
这两个都是利用单片机的定时器中断来产生秒信号的
下面这个是 四位数码管的,最下边的是一位数码管的,端口不一样的话,自己改下
/***************************************************************************/
#include<reg51.h>
sbit p20=P3^7; sbit p21=P3^6; sbit led=P2^7;//按键及LED端口定义
sbit Axs=P1^3; sbit Bxs=P1^2; sbit Cxs=P1^1; sbit Dxs=P1^0;//数码管位选端口
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
unsigned int h,m,s,t,n;
/***************************************************************************/
void YS(char hs)//延时函数
{char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}
/***************************************************************************/
void XS(int xh,int xm) //显示子函数
{
char d1,d2,d3,d4;
d1=(xh/1)%10; d2=(xh/10)%10;//分离小时
d3=(xm/1)%10; d4=(xm/10)%10;//分离分钟
P0=table[d1];Cxs=0;YS(10);Cxs=1;//小时个位
P0=table[d2];Dxs=0;YS(10);Dxs=1;//小时十位
P0=table[d3];Axs=0;YS(10);Axs=1;//分钟个位
P0=table[d4];Bxs=0;YS(10);Bxs=1;//分钟十位
P0=0x7f; P1=0xfd; YS(10); P1=0xff;//小数点
}
/***************************************************************************/
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定时器初始化
while(1)//主循环
{
if(p20==0){YS(10);if(p20==0){h++;if(h>23){h=0;}}while(!p20){XS(h,m);}}
if(p21==0){YS(10);if(p21==0){m++;if(m>59){m=0;}}while(!p21){XS(h,m);}}
XS(h,m);//调用数码管显示函数
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;t++;
if(t>500){t=0;led=~led;}//LED闪烁
if(n>1000){n=0;s++;}//如果达到一秒,秒加一
if(s>59){s=0;m++;}//如果达到一分,分加一
if(m>59){m=0;h++;}//如果达到一小时,小时加一
if(h>23){h=0;}//如果达到24小时,小时清零
}
/***************************************************************************/
/***************************************************************************/
#include<reg51.h>
sbit Axs=P1^3;//数码管位选端口
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
unsigned int h,m,s,t,n;
/***************************************************************************/
void YS(char hs)//延时函数
{char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}
/***************************************************************************/
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定时器初始化
while(1)//主循环
{
P0=table[m];Axs=0;YS(10);Axs=1;//小时个位
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;
if(n>1000){n=0;m++;}//如果达到一秒,秒加一
if(m>9){m=0;}//如果达到一小时,小时加一
}
/***************************************************************************/
独立键盘控制8段数码管 单片机电子钟设计 4个独立按键 1个总开始 1...
既然你要的是编法 那我就不写完整的程序了 如果需要完整的程序 告诉我你要C还是汇编的 首先定义一个mode变量 用来判断当前是否在设置模式 初始化为0 K2 K3 K4无效 主程序中打出 8位数码管的子程序 然后另外开启定时器 用来计数(这里需要做一个变量的开关 方便做时钟停止)独立按键我就不用讲了 ...
编写一完整的程序,使一个8段码LED(共阴)重复显示数字9-8-7^1--0-9...
include<reg51.h>#define uchar unsigned charuchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};uchar time,num=9;void t0isr() interrupt 1{TH0=(65536-50000)\/256;TL0=(65536-50000)%256;time++;if(time>=20) { time=0; P0=table[num]; if(num>0...
如何编写一段程序,单片机是51系列的,要求编写8个LED灯有三种以上的闪烁...
给你最简单的,看得清楚易懂的,P1口接8位LED,有多种闪烁方式。P2(扫描端在P2口,P3为位选端,注意看代码)口接上两位数码管的话还可以显示00-99的数字:ZHUCX: MOV A,#11111110B MOV P1,A ACALL YANSHI MOV A,#11111100B MOV P1,A ACALL YANSHI MOV A,#11111000B MOV P1,A ACALL...
8段数码管的原理
单片机i\/o的应用最典型的是通过i\/o口与7段led数码管构成显示电路,我们从常用的led显示原理开始,详尽讲解利用单片机驱动led数码管的电路及编程原理,目的在于通过这一编程范例,让初学者了解i\/o口的编程原理,意在起举一反三,抛砖引玉的作用。led的发光原理,稍有电子技术基础的人士都很清楚,我们不...
求一段简单51单片机程序,8个led按顺序每个闪4次
include<reg51.h> define uchar unsigned char void delay(uchar a){ uchar i,j;for(i=0;i<a;i++)for(j=0;j<120;j++);} main(){ uchar LED=0xfe,i;while(1){ for(i=0;i<4;i++){ P0=LED;delay(100);P0=0xff;delay(100);} LED=(LED<<1)|0x01;if(LED==0xff)LED=...
共阳极四位8段数码管与单片机接口怎样连接?
1、2、3、4为控制极,A、B、C、D、E、F、G、dp对应数码管显示段位。图是前几天自己对着实物画的,把这12个脚都接到单片机的IO口上,让它怎么亮就看程序怎么写了~~~
利用AT89S51单片机来制作一个手动00-99计数器。
teble里的值就是共阴8 段(含小数点)数码管的段码。8 段从上面一横开始顺时针依次为a、b、c、d、e、f、g(中间的横)和h(小数点),分别接在IO口的0~7 例如要显示0,则段码为0011 1111 即0x3f 。其它,你可自行推出。
用AT89C51单片机控制两位8段LED数码管采用动态显示的方式显示出201211458...
include "reg51.h"define uchar unsigned char uchar display_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar time[8]={2,0,1,2,1,1,4,5};\/\/uchar time[3]={0,0,0};void delay(void){ uchar i;for(i=250;i>0;i--);} void display(){ P2=0x80...
51单片机怎么实现数码管1-8循环(间隔一秒)计数和4组流水灯间隔两秒同时...
一个数码管实现的话还是比较简单了 首先搞清楚8段数码管的显示原理,将1到8所对应的2进制码写出来,将数码管插线接到p0口,编程序时每个数字显示完后加上一个延时程序,延时程序就是用两个内部寄存器实现的,对应一秒你可以算一下,具体算法就是用一秒除以机器周期,看它能循环多少次,这里可以看看书...
51单片机控制8个数码管并显示1-8
数码管段选连接到单片机P0口,位选连接到P2口 ORG 0000h MAIN:CALL DISPLAY AJMP MAIN DISPLAY:MOV R0,#0 MOV R1,#0x01 MOV DPTR,#TAB LOOP:INC R0 MOV A,R0 MOVC A,@A+DPTR MOV P0,#0 ;消隐 MOV P0,A ;送段码 CALL DELAY MOV A,R1 ;送位码 RL A ;移位 MOV P2,A MOV ...
赫司小儿: 展开全部#include#define uchar unsigned char#define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; uchar num; uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x07,0x7d,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//我用的是573 还有延时也很...
东坡区13636606734: 单片机驱动8位数码管 - ?
赫司小儿: 设位码接P1; uchar buf[8] = {0}; void display( ){ //1ms运行一次 static uchar w = 0; P1 = 0; P0 = duan[buf[w]]; P1 = (1 << w); w = (w + 1) % 8; //循环+1 }
东坡区13636606734: 求大神做一个C51单片机的程序.问题如下:实现8位共阴数码管循环显示数字20121111,顺便求图.不胜感激!?
赫司小儿:;项目五 ;任务2 ;点亮8位8段LED数码管 ;CA 共阳 - Common Anode 共同正极 ;CC 共阴 - Common Cathode 共同负极 PORT_O0 EQU P0;DIGITRON字符输出 PORT_O1 EQU P2;DIGITRON字位输出 ORG 0000H LJMP MAIN ORG 0030H ...
东坡区13636606734: 单片机开发板数码管编程 8个数码管依次显示5,每个显示1S,循环 - ?
赫司小儿: 看你的数码管怎么接,比如段接P1口,位接P2口 #include<reg52.h> #include <intrins.h>unsigned char a;void main(void) {P1=0x6d;//5的段码P2=0;a=0x80; TMOD=0x01;TH0=0xd8;TL0=0xf0; EA=1;ET0=1;TR0=1;while(1){P2=a;} } ...
东坡区13636606734: 可以请问下单片机里边74LS164控制八段数码管的显示应该如何设置CLR和CLK还有DATA端得数值来控制八段数码管 - ?
赫司小儿: CLR 为清零端,低电平有效,该脚加低电平时,输出被置零,用一个I/O来控制它,起到灭零作用.CLK为脉冲计数输入端,用单片机的某个I/O口输出脉冲给它 DATA的8个输出端用来接8个LED
东坡区13636606734: 单片机是怎么控制8个数字的数码管?8个数字要64个引脚,单片机总共才40个引脚? - ?
赫司小儿: 驱动的方法有很多,你说的这是单片机直接静态驱动,这种驱动方式编程上最简单,但是消耗IO口太多,一般2位以上的数码管都不用它. 使用单片机直接动态驱动,8位数码管只需要占用16个IO口,其中8个输出段选信号,8个输出片选信号,这种方式比较常用,编程上也不是特别麻烦. 使用锁存器(比如74HC573)通过IO口分时复用来实现,8位数码管只需要8个IO口,段选和片选共用这8个IO口. 最终极的办法:通过串入并出移位寄存器级联驱动,这种方法是静态驱动,无论多少位数码管,只需占用2个IO口,单片机将段选信号串行发出,静态驱动没有片选信号.
东坡区13636606734: 用单片机控制数码管工作 - ?
赫司小儿: 1. 接电源:vcc(pin40)、gnd(pin20).加接退耦电容0.1uf 2. 接晶体:x1(pin18)、x2(pin19).注意标出晶体频率(选用12mhz),还有辅助电容30pf 3. 接复位:res(pin9).接上电复位电路,以及手动复位电路,分析复位工作原理 4. 接配置:ea(...
东坡区13636606734: 单片机,P0显示P2控制,8个数码管让第1个显示0~9然后第2个,8个循环显示,用汇编写,也就是asm后缀的文件 - ?
赫司小儿: 定义8个显示缓冲,8个数码管对应8个显示缓冲,改变显示缓冲的数据就改变了数码管显示内容
东坡区13636606734: 在单片机AT89C51的8位数码管上依次循环"7 - 0" 做程序 做图 - ?
赫司小儿: ORG 0000HJMP BEGINORG 0030H TABLE: ; 共阴极数码管显示代码表DB 3FH,06H,5BH,4FH,66H ;01234DB 6DH,7DH,07H,7FH,6fh ;56789 DELAY: MOV R5,#20 LOOP4: MOV R6,#50H ;延时20X20ms LOOP5: MOV R7,#100DJNZ R...
东坡区13636606734: 用89c52单片机怎么通过74ch595芯片控制8位数码管呢??
赫司小儿: 用89c52单片机 的 任意 3 个 IO 口 通过74ch595芯片(串转并), 用 扫描显示的方法 控制8位数码管 的显示, 一片 为 段码 输出,一片为 位选 输出.