##原理图
#include <reg52.h>
#define uint unsigned int // 宏
#define uchar unsigned char
sbit a = P1^0;
sbit b = P1^1;
sbit c = P1^2;
sbit d = P1^3;
uchar code table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极0-916进制编码
void delayms(uint); //延时函数声明
void display(uint); //自定义位选函数
uint num=0;
uchar shi=0;
void display(uint num)
{
d=1; //共阳极数码管高电平有效
P0=table[num%10]; //循环显示0-9
delayms(5); //刷新
P0=0XFF;
d=0;
c=1; //共阳极数码管高电平有效
P0=table[(num/10)%10]; //循环显示0-9
delayms(5); //刷新
P0=0XFF;
c=0;
}
void jishu() interrupt 1
{
if(shi==10)
{ //10*50MS定时时间为0.5秒
shi=0;
num++;
}
TH0=(65536-50000)/256; //重新赋值
TL0=(65536-50000)%256;
shi++; //50毫秒加1,加20次为一秒
}
void delayms(uint xms) //延时程序
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
TMOD=0X01; /*中断初始化*/
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //中断总开关
ET0=1; //请求中断
TR0=1; //允许中断
while(1)
{
//关闭其他位
a=0;
b=0;
display(num); //调用函数
}
}
本文介绍了一段使用51单片机控制共阳极数码管实现自动计数显示的程序代码。该程序通过定时中断的方式每0.5秒使数码管上的数字递增,并详细展示了如何进行位选、延时以及中断处理等关键操作。
3815





