单片机c语言,设计一个计数器,中断一次,数码管数字从0起加1, 4位的数码管

如题所述

我直接拿一个现成的例子吧。这个是用定时器中断的,你可以改成外部中断。这是8位的数码管,对4位稍加修改就行了。
#include <reg52.h> //包括一个52标准内核的头文件
#include<intrins.h>
/****************************声明函数*****************************/
void x8led(unsigned long ddd);
void delay882us(void);
/*****************************定义IO******************************/
sbit P20=P2^0;
sbit P21=P2^1;
sbit S16=P3^0;
sbit S15=P3^1;
sbit S14=P3^2;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
bit f=0;//位变量
/***************************定时器2中断**************************/
timer2() interrupt 5
{
static unsigned char t;
TF2=0;
t++;
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
{
t=0;
f=1;//每次长时间的溢出,就置一个标记,以便主程序处理
}
}
/*****************************数码管扫描**************************/
void x8led(unsigned long ddd)
{
unsigned char q,r=0;
unsigned char l[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
//0-9的字段码
unsigned char xx[8]={0,0,0,0,0,0,0,0};
unsigned char y[8]={0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1};
xx[0]=ddd%10;
xx[2]=ddd/10%10;
xx[1]=ddd/100%10;
xx[3]=ddd/1000%10;
xx[4]=ddd/10000%10;
xx[6]=ddd/100000%10;
xx[5]=ddd/1000000%10;
xx[7]=ddd/10000000;//求出八位数,分别放在八个变量中
for(q=0;q<8;) //循环扫描
{
q++;
r++;
if(r==8)r=0;
P1=y[r];
P21=1;
delay882us();
P21=0;
P20=1;
P1=l[xx[r]];
delay882us();
P1=0xff;
P20=0;
}
}
/*******************************延时882us*************************/
void delay882us(void)
{
unsigned char i;
for(i=0;i<255;i++)
{
_nop_();
}
}
/*****************************主程序******************************/
void main(void)
{
unsigned long a=0;
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
RCAP2L =0x00;
TR2=1; //启动定时器
ET2=1; //打开定时器2中断
EA=1; //打开总中断
while(1)
{
if(f)//发现标记进入处理
{
f=0;//清除标记
a++;
if(a>99999999)a=0;
}
x8led(a);//将a的值送到数码管显示
}
}来自:求助得到的回答
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-11-28
这个简单了,需要找我。我在线,随时等待回复。

利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开...
void tr0 () interrupt 1 {

单片机实现4位一体数码管显示0000—FFFF的16进制(C语言编程)怎么编程...
\/\/段码由P0口输出,P2.3-P2.0依次接位选的高到低\\x0d\\x0a#include\\x0d\\x0atypedef unsigned char u8;\\x0d\\x0atypedef unsigned int u16;\\x0d\\x0avoid Delay(void);\\x0d\\x0avoid Disp(void);\\x0d\\x0au16 Cnt;\\x0d\\x0au8 code LED[]={\\x0d\\x0a0x3F,\/\/ 0\\x0d...

51单片机c语言编程序让两位数码管显示0-99,求指导!!急用!
参考下网上的程序,只要明白两个问题就不难了,第一是数码管的结构及显示原理;第二是动态显示

...按一下,数码管从0开始加1,加到9,用c语言单片机编写并且要用计数器...
P32=1则会一直在循环里,P32=0则进行下一步,在串口双机通信实验里也许还能用上 *\/ if(s1==9){s1==0;}\/\/如果是9就下一个显示0 else{s1++;}\/\/如果不是正常加一 } } P0=num[s1];\/\/刷新7seg值}}这程序我刚打的,我也不知道能不能行,你看看吧,试试。能帮上点...

用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1...
用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1...分内容转自:《51单片机C语言创新教程》温子祺等著。原理:软件设计方面使用动态驱动数码管的方式,即要保证当数码管显示时的效果没有闪烁的现象出现,亮 度一致,没有拖尾现象。由于人眼对频率大于对24Hz以上的光的闪烁不敏感,这是利用了...

设计一个单片机输入显示系统,要求每按一下按键数码管显示数据加1(数码...
设计一个单片机输入显示系统,要求每按一下按键数码管显示数据加1(数码管初始值为0,9加1 后显示0)。 我来答 1个回答 #活动# 《请回答2022》答题瓜分现金奖池 好学者百科 2022-12-14 · 百度认证:北京惠企网络技术有限公司官方帐号 好学者百科 科技生活门户网站,探索发现百科全书。 向TA提问 关注 ...

c51单片机按键每按一次同时数码管显示数字加一是什么?
\\x0d\\x0a用外部中断,\\x0d\\x0a每中断一次,中断服务程序将数组元素加一P0=Shuzu[ax++](或指针加一:P0=*P++)\\x0d\\x0a以上假设P0口驱动数码管!\\x0d\\x0a至于数码管使用的是共阳还是共阴,就把相对的数值存在数组中!\\x0d\\x0a-\\x0d\\x0a外部中断0的中断程序入口\\x0d\\x0avoid TI_0() interrupt...

用c语言编写程序,用于c51单片机四位共阴数码管显示,显示分秒的计时器...
用c语言编写程序,用于c51单片机四位共阴数码管显示,显示分秒的计时器。用proteus做的时钟 可以显示年月日时分秒 可调整时间 有图 \/ includereg52.h

c51单片机按键每按一次同时数码管显示数字加一是什么?
每中断一次,中断服务程序将数组元素加一P0=Shuzu[ax++](或指针加一:P0=*P++)以上假设P0口驱动数码管!至于数码管使用的是共阳还是共阴,就把相对的数值存在数组中!- 外部中断0的中断程序入口 void TI_0() interrupt 0 { --- } 都提示到这里了,下面自己该会吧?如果是新手的新手-...

用c语言编写一个计数器(单片机为51型,数码管为共阴)要求有三个按键分别...
如果这样的话挺简单的,51单片机的计数器io口记得好像是P3^0和P3^1,但不管怎么,首先设置TMOD,将C\/T位置1,这就改为计数器了,然后可以编写函数来对一个变量进行加减;同样利用51单片机的外部中断也可以实现计数功能,打开外部中断开关,在外部中断服务函数对计数变量进行加减;最简单的,直接利用io口...

相似回答