⑴ 利用51单片机驱动一个8段数码管,实现0—F计数
设置一个数码管段位表ledtable,共16个,值就是共阴8 段(含小数点)数码管的段码。 8 段从上面一横开始顺时针依次为a、b、c、d、e、f、g(中间的横)和h(小数点),分别接在单片机IO口的0~7 ,例如要显示0,则段码为0011 1111 即0x3f 。 其它,你可自行推出。
程序上实现:
ORG0000H
MAIN:
MOVR0,#0;
LOOP:
MOVA,RO
MOVDPTR,#LEDTABLE
MOVCA,@A+DPTR
MOVP1,A
ACALLDELAY
INCR0
MOVA,R0
DJNEA,#16,LOOP
MOVRO,#0
AJMPLOOP
DELAY:
NOP
RET
ORG0500H
LEDTABLE:
DB3FH,....
⑵ 单片机6位数码管计数器程序问题
#include<reg52.H>//STC头文件
#defineucharunsignedchar
#defineuintunsignedint
#definetimewe3
sbitwe=P2^7;
sbit=P2^6;
unsignedlongtemp;
uintjsms=0;
ucharcodean[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
ucharcodewei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
voiddelay(uinta)//1ms延时程序(12MHz10倍于51单片机速度时)
{
uinti;
while(--a!=0)
{
for(i=0;i<600;i++);
}
}
uchardisbuf[6];
voiddisplay()
{ ucharcodewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
staticuchara;
if(a>=6)a=0;
we=1;
P0=0xff;
we=0;
=1;
P0=an[disbuf[a]];
=0;
we=1;
P0=wei[a];
we=0;
a++;
}
/**********************************************/
/*主函数*/
/**********************************************/
voidmain(void)
{
temp=0;
while(1)
{
if(++jsms>=1000){
if(++temp==999999)
temp=0;
}
disbuf[0]=temp/100000;
disbuf[1]=temp%100000/10000;
disbuf[2]=temp%10000/1000;
disbuf[3]=temp%1000/100;
disbuf[4]=temp%100/10;
disbuf[5]=temp%10;
display();
delay(1);
}
}
⑶ C51单片机,控制数码管每隔3秒,循环数字1234,5678,9876,1368
用四位一体的共阴数码管,用定时器T0定时,实现3秒切换显示四组数字。仿真实现,仿真图如下
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴段码
uchar code disb[]={0xfe,0xfd,0xfb,0xf7};//位码
uchar buf[]={1,2,3,4,5,6,7,8,9,8,7,6,1,3,6,8};//显示四组数字
uchar t0n;//T0定时器中断计数
void delay()//延时子程序
{
uint y;
for(y=400;y>0;y--);
}
void display(uchar x)//显示子程序,x为显示起始位
{
uchar j;
for(j=0;j<4;j++)
{
P2=disb[j];//输出位码
P0=tab[buf[j+x]];//输出段码
delay();
}
}
void main()//主程序
{
uchar x;
TMOD=0x01;//T0方式1
TH0=0x3C;//晶振12MHz,定是50ms,时间常数,X=3CB0H
TL0=0xB0;
IE=0x82;
TR0 =1;
while(1)
{
display(x);
if(t0n>=60)
{
t0n=0;
x+=4;
if(x>12)x=0;
}
}
}
//定时器T0中断程序
void T0_ISR() interrupt 1
{
TH0=0x3C;
TL0=0xB0;
t0n++;
}
⑷ 51单片机定时器T1中断使数码管计数0—F,每秒加1,想要将if()函数写到main()函数中,如何实现。
把初始化程序 Timer1Init(); 放在while(1) 的上面,你现在这样,每次循环都初始化了,就永远也不计数了 。另外,开机是显示8,是因为,开机P0口全为1,要过1秒后开始从0开始显示,可以在while(1)上面加一行 P0=0x3f; 这样,开机就显示0了。另外,这种定时1秒,定时器最好定时长点,如50ms ,你现在是定时1ms ,这中断频率太高了,如果有其它程序就会影响主程序的执行。
还有,if 语句下面的
if(i==1000)
{
//TR1=0;//要这行,就计数一遍就停了,要不停地计数就要删掉
i=0;
P0=smgan[n++];
if(n==16) n=0;
}
⑸ 单片机程序:两位数码管记秒【加分】
1.单片机用89C51或者89C52,P0 P2进行显示数据的输出, P3.0键接按键。 数码管用共阴极数码管。
2.主要功能:按键控制,按一下计秒再按停止。技术显示从0到99循环开始。
采用定时计数器T0实现秒中断:
#include <REG52.H> //注意头文件,调试的时候你的软件里面是否有这个文件
#define pb P3_0
unsigned int int_count=0;//T0中断计数
unsigned char second=0;//秒计数
unsigned char count=0;//分支选择,计数器开和关
unsigned char reg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};//共阴极数码管码值表
void Key_delay()//按键延时
{unsigned char i,j;
for(i=100;i>0;i--)
for(j=248;j>0;j--);
}
void t0() interrupt 1 using 0 //T0中断函数 4000次一个循环 一个循环一秒
{int_count++;
if(int_count==4000)
{int_count=0;
second++;
if(second>99)
second=0;
}
}
void Key_scan()//按键扫描函数
{
if(pb==1)
{Key_delay();
if(pb==1)
Key_delay();//此延时主要考虑到个人的视觉感受和按键操作合理时间
count++;
switch(count)
case 0: break;
case 1: TR0=1;break;//开定时器
case 2: TR0=0;count=0;break;
}
}
void main()
{unsigned char sacn//按键扫描变量
TMOD=0X02;//8位自动重装
TH0=0x06;
TL0=0x06;//250us中断一次
ET0=1;
EA=1;//开单片机中断
while(1)//等待中断
{if(int_count)
{sacn=int_count;
if(!(scan%40))//10ms进行一次按键扫描
Key_scan();//调用按键扫描函数
P0=seg[second/10]//10位输出
P2=seg[second%10]//个位输出
}
}
}
注意共阴极数码管的连接方式:P0P2口低位到高位分别连接到两个数码管的a到g脚,因为连接方式决定了显示数据的编码方式;P0口务必要接上拉电阻。
⑹ 单片机数码管显示的数值编码
8位数据总线,16位地址总线的CPU;具有布尔处理能力和位处理能力;采用哈佛结构,程序存储器与数据存储器地址空间各自独立,便于程序设计;相同地址的64KB程序存储器和64KB数据存储器;
0-8KB片内程序存储器(8031无,8051有4KB,8052有8KB,89C55有20KB);128字节片内数据存储器(8051有256字节);
32根双向并可以按位寻址的I/O线;两个16位定时/计数器(8052有3个);一个全双工的串行I/O接口;多个中断源的中断结构,具有两个中断优先级;片内时钟振荡器。
(6)单片机数码管计数扩展阅读:
单片机工作的三个条件分别是电源、时钟晶振、复位。当单片机不能正常工作时,我们首先就要检查这三个条件,用电压表或者万用表检测他的电源和接地脚,检测两个引脚之间的电压是不是5V左右;对于时钟晶体振荡有没有正常工作。
最好用示波器进行检测,看能否检测到相应频率的正弦波脉冲;复位检测比较简单,单片机的复位电平一般是高电平复位,单片机在接通电源的时候一般复位引脚上会出现5V左右的高电平,另外在按下复位按键时,复位引脚上也会出现高电平,用一般的电压表或者万用表都可以进行检测。
⑺ 利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开始每1秒钟加1。
共阳数码管中断程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x83,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
uint num,a;
uchar ,shi,ge;
void init();
void delay(uint);
void display(uchar,ucharshi,ucharge);
uint fb();
uint fs();
uint fg();
void main()
{
init();
while(1)
{
display(fb(),fs(),fg());
}
}
void init()
{
num=0;
a=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display(uchar,ucharshi,ucharge)
{
P1=0xfd;
P0=table[];
delay(1);
P1=0xfb;
P0=table[shi];
delay(1);
P1=0xf7;
P0=table[ge];
delay(1);
}
void timeoff() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65526-50000)%256;
a++;
if(a%20==0)
{
num++;
if(num==999)
{
num=0;
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uint fb()
{
=num/100;
return ;
}
uint fs()
{
shi=num%100/10;
return shi;
}
uint fg()
{
ge =num%100%10;
return ge;
}
(7)单片机数码管计数扩展阅读
2个可编程定时/计数器·5个中断源,2个优先级(52有6个)
一个全双工串行通信口
外部数据存储器寻址空间为64kB
外部程序存储器寻址空间为64kB
逻辑操作位寻址功能·双列直插40PinDIP封装
单一+5V电源供电
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:用以存放程序、一些原始数据和表格;
I/O口:四个8位并行I/O口,既可用作输入,也可用作输出
T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为6M—12M。
参考资料来源:网络-51单片机
⑻ 单片机上数码管的位码是怎样计数出来
位码选择就是对应你的几个(一般是六个或者八个)数码管的哪几个亮,与段码区分开来,至于怎么确定位码就要看你连接位码用的是哪几个io端口了,然后一一对应起来,想点亮那个数码管就改变对应的那一个二进制位的电平就可以了。。。。
⑼ 单片机数码管动态显示0-100
给你简单的修改了一下,如果你的数码管编码没错,应该可以显示 0~99的
没添加百位显示,所以只有 0~99
//数码管动态显示+1,显示范围0-100,定时时间1s
#include<reg52.h>
sbit la=P2^6; //定义段选信号
sbit wela=P2^7; //定义位选信号
char aa,temp,,shi,ge;
char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay(int z); //延迟函数声明
void display(char d); //显示函数声明
void init(); //初始化函数声明
/*******************************************************************************/
/*******************************************************************************/
void main()
{
init(); //调用初始化子函数
while(1)
{
display(temp); //调用显示子函数
}
}
/*******************************************************************************/
/*******************************************************************************/
void delay(int z) //延迟子函数
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*******************************************************************************/
/*******************************************************************************/
void display(char d) //显示子函数
{
char d1,d2;
d2=d%10; //取个位 %求余
d1=(d/10)%10; //取十位
P0=table[d2]; la=0; delay(10); la=1;//个位显示
P0=table[d1]; wela=0; delay(10); wela=1;//十位显示
}
/*******************************************************************************/
/*******************************************************************************/
void init() //初始化子函数
{
la=0;
wela=0;
temp=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
/*******************************************************************************/
/*******************************************************************************/
void timer0() interrupt 1 //中断处理子函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //重载初值
aa++;
if(aa==20) //判断定时是否到达1s
{ aa=0; temp++ ; }
if(temp==100) //限制temp变化的范围,使之不超过100
{ temp=0; }
}
/*******************************************************************************/
/*******************************************************************************/
/*/////////////////////////////////////////////////////////////////////////////*/
⑽ 利用51单片机和3位数码管实现10分钟内的简易计时器
修改如下:
#include<reg51.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbitkey1=P2^7;
sbitkey2=P2^6;
sbitweiH=P3^0;
sbitweiM=P3^1;
sbitweiL=P3^2;
uintnum=0,ge=0,shi=0,fen=0,k;//num用来计数,ge为各位显示,shi为十位显示,fen为分钟显示
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
ucharkey1scan(void)
{if(key1==0)
{delayms(10);
if(key1==0)
{while(!key1);
return1;
}
return0;
}
ucharkey2scan(void)
{if(key2==0)
{delayms(10);
if(key2==0)
{while(!key2);
return1;
}
}
return0;
}
voidshowtime()interrupt1//时间显示
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
num++;
num%=3;
switch(num)
{
case0:
weiL=1;//显示秒的个位
P1=0xff;
P1=table[ge];
delayms(5);
weiL=0;
break;
case1:
weiM=1;//显示秒的十位
P1=0xff;
P1=table[shi];
delayms(5);
weiM=0;
break;
case2:
weiH=1;//显示分钟,只显示0-9
P1=0xff;
P1=table[fen];
delayms(5);
weiH=0;
break;
}
voidmain()
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
num=0;
while(1)
{
if((key1scan()==1)&&(key2scan()!=1))break;//按键1按下,按键2未按下开始计时
}
while(1)
{
delay(1000);
ge++;
if(ge>9)
{
ge=0;
shi++
if(shi>5)
{
fen++;
if(fen>9)fen=0;
}
}
showtime();
}
}