是要仿真实现吗,还是实物开发板?
这程序是要针对仿真图或实物开发板的,不能只写程序,没有效果呀。仿真图如下
程序如下
#include<reg51h>
sbit k1=P3^2;
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main()
{
unsigned char n;
P0=tab[0];
while(1)
{
if(k1==0&&n<9)
{
n++;
P0=tab[n];
while(k1==0);
}
}
}
你是不是用2了锁存器啊。
P2=led_table[ten];
led_ten=1;//打开锁存器
led_ten=0;//关闭锁存期
存储10位
P2=led_table[single];
led_single=1;//打开锁存器
led_single=0;//关闭锁存器
存储个位
另外led_ten,led_single 你要先定义一下吧
/数显秒表,范围0~9999/
/源程序默认硬件环境:52单片机,12MHz晶振,4位共阳数码管,P0 口段选,P10~P13 高电平位选(NPN三极管驱动),P13为最高位数码管/
#include"reg52h" //包含52头文件
#define TRUE 1 //定义布尔量'1':真
#define FALSE 0 //定义布尔量'0':假
#define uchar unsigned char //定义 无符号字符型数据 简称
#define uint unsigned int //定义 无符号整型数据 简称
#define th0 0xfc
#define tl0 0x18 //1ms at 12MHz(定时器工作模式1 状态)
#define SEG_Num 4 //数码管位数
#define SEG_Data P0 //数码管段驱动接口
#define SEG_En P1 //数码管位驱动接口
#define SEG_AllOff (SEG_En&=0xf0) //关闭所有数码管(位驱动)
#define DisTimeAt1msCount 4 //单'位'数码管显示时间,数码管刷新频率f=1/(N×t),其中 N为数码管位数, t为单'位'数码管显示时间
#define T1sAt1msCount 1000 //1秒 计数值(在定时器为1ms 情况下计数)
#define TimesEnd 10000 //显示内容范围 0~9999
uchar code SEG_B_List[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管代码表"0-9"
uint Sec;
uchar bdata Flag=1;
sbit DisplayFlag=Flag^0; //显示标志位
sbit TimesUpFlag=Flag^1; //时间更新标志位
void Timer0() interrupt 1 //定时器0中断函数
{
static uchar t1ms; //定义静态变量 t1ms 定时计数寄存空间
static uint t1ms_sec;
TL0=tl0;
TH0=th0; //重赋 1ms 定时初值
t1ms=++t1ms%DisTimeAt1msCount; //先计数值加1,后对计数范围进行限制0~(DisTimeAt1msCount-1)
if(!t1ms) DisplayFlag=TRUE; //若定时计数值归0,则表示计数值曾到达 单'位'显示时间(DisTimeAt1msCount),显示标志 置位
t1ms_sec=++t1ms_sec%T1sAt1msCount; //在 T1sAt1msCount(1000) 范围内加1
if(!t1ms_sec) TimesUpFlag=TRUE; //若 归0,则1s 时间到,时间更新标志位 置位
}
void SystemInit() //系统初始化函数
{
TMOD=0x01; //关闭定时器1,开启定时器0,且工作在模式1(16位定时器)
TH0=th0;
TL0=tl0; //装定时初值(1ms at 12MHz)
TR0=1; //启动计时
ET0=1; //允许定时器0中断
EA=1; //开启系统中断功能
}
float Pow_Self(float x,uint y)//自编简易 x 的 y 次方函数,y只能是 非负整数
{
float sum;
if(x==0 && y==0) return; //0 的 0 次方无意义
else if(x==0) sum=0; //可有可无,y!=0的情况已经包含x=0,不加不影响结果,但影响运算速度
else if(y==0) sum=1; //除上述情况外,任何数的 0 次方均为 1
else if(y==1) sum=x; //任何数的 1 次方 均为 本身
else if(y>1) sum=Pow_Self(x,--y)x; //递归调用,降幂
return sum; //返回计算结果
}
void TimesUpdata() //时间更新 函数
{
if(TimesUpFlag) //若 时间更新标志 为真
{
Sec=++Sec%TimesEnd; //Sec (秒)在 TimesEnd (0~999) 范围内加1
TimesUpFlag=FALSE; //清 时间更新标志位
}
}
void Display(uint dis_num) //显示函数,显示内容为 无符号整型数据 dis_num
{
static uchar dis_loca; //定义静态变量 显示位置
if(DisplayFlag) //若显示标志位为真(单'位'显示时间结束),则执行以下任务
{
DisplayFlag=FALSE; //清显示标志位
dis_loca=++dis_loca%SEG_Num; //先对 显示位置 加1,后对变量范围进行限制 0~(SEG_Num-1)
SEG_AllOff; //关闭所有数码管显示(位驱动)
SEG_Data=SEG_B_List[(dis_num/(uint)(Pow_Self(10,dis_loca)))%10]; //将显示内容(dis_num) 本次需显示的位(dis_loca)上的数值转成代码,并送到数据端口
SEG_En|=1<<dis_loca; //开启本次需要显示的位驱动
}
}
void main() //主函数
{
SystemInit(); //调用 系统初始化函数
while(1) //循环系统
{
TimesUpdata(); //调用 时间更新函数
Display(Sec); //调用 显示函数 显示内容为 Sec
}
}
1、新建项目,做好准备。
2、数码管段选表。
3、延时函数。
4、uchar i; 变量i;wk = 1;打开位选,P0 = 0xf7;1111 0111第4位数码管显示,wk = 0;关闭位选。
5、while(1) //死循环效果{} 。
6、dk = 1; //打开段选,P0 = leddata[i];,dk = 0; //关闭段选,delay(100);//延时效果。
7、选择效果,限制i值的循环范围。
我这里有个上学时候的51程序,选了几行有用的你回去改一下。
int i[10]={0x3f,0x06,0x05b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/数码字模/
void display(int k)
{int b,d[4]={0,0,0,0}; 四个位拆开 暂存缓冲
d[3]=k%10;
d[2]=k/10%10;
d[1]=k/100%10;
d[0]=k/1000; 提取四个位的数
for(b=0;b<4;b++) 疯狂扫描
{P1=0xff;
P2=~i[d[b]];
P1=~(1<<b);
delaya(); 这个延时可能要改,它决定显示的对比度
P1=0xff; 关显示
}
}
void delaya(void) 延时函数,没啥说的。
{int i,j;
for(i=0;i<20;i++)
{for(j=0;j<10;j++);
}
}
int main(void) 主程序,你往里面加点你自己的东西就行了。
{
display(k);
}
这个就是从0000-9999的。
//倒计时 60s
#include <reg51h>
#define SEG P2
#define SCANP P1
#define count_M1 50000
#define TH_M1 (65536-count_M1)/256
#define TL_M1 (65536-count_M1)%256
int count_T0=0;
#define count_M2 250
#define TH_M2 (256-count_M2)
#define TL_M2 (256-count_M2)
char count_T1=0;
char TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char disp[]={0xc0 ,0x82};
char seconds=60;
char scan=1;
void delay(void)
{ int i;
for(i=0;i<2400;i++);}
main()
{
IE=0x8a;
TMOD=0x21;
TH0=TH_M1;
TL0=TL_M1;
TR0=1;
TH1=TH_M2;
TL1=TL_M2;
TR1=1;
while(1) ;
}
void T0_1s(void) interrupt 1
{
TH0=TH_M1;
TL0=TL_M1;
if(++count_T0==20)
{ count_T0=0;
seconds--;
if(seconds==0)
{ seconds=60;
}
}
disp[1]=TAB[seconds/10];
disp[0]=TAB[seconds%10];
}
void T1_8ms(void) interrupt 3
{
if(++count_T1==32)
{ count_T1=0;
scan++;
if(scan>2) scan=1;
SCANP=scan;
SEG=disp[scan-1];
}
}
实验四 七段数码管显示电路一、实验目的实现十六进制计数显示。二、硬件需求EDA/SOPC实验箱一台。三、实验原理七段数码管分共阳极与共阴极两种。共阳极数码管其工作特点是,当笔段电极接低电平,公共阳极接高电平时,相应笔段可以发光。共阴极数码管则与之相反,它是将发光二极管的阴极短接后作为公共阴极,当驱动信号为高电平、公共阴极接低电平时,才能发光。图2-13为共阳极数码管和共阴极数码管的内部结构图。图2-13 共阳极数码管和共阴极数码管的内部结构图用七段数码管除了可以显示0~9的阿拉伯数字外,还可以显示一些英语字母。下表是常见的字母与7段显示关系(共阴极数码管)。
段字母 a b c d e f g
A 0 0 0 1 0 0 0
B 1 1 0 0 0 0 0
C 0 1 1 0 0 0 1
D 1 0 0 0 0 1 0
E 0 1 1 0 0 0 0
F 1 0 0 0 1 1 1
H 0 1 1 0 1 1 1
四、实验内容编写一个0~F轮换显示的电路(注意:选用实验箱中的共阳数码管DP1A,FPGA上P25引脚连接50MHz时钟。实验时为了便于观察,要将50MHz时钟经过分频得到1Hz时钟)。五、实验步骤(1)实验程序LIBRARY IEEE;USE IEEEstd_logic_1164all;USE IEEEstd_logic_unsignedall;ENTITY exp2 ISGENERIC(n:INTEGER :=6);port(clk: IN std_logic;led: OUT std_logic_vector(6 DOWNTO 0));END exp2;ARCHITECTURE example OF exp2 ISSIGNAL sel:INTEGER RANGE 0 TO n-1 :=0;SIGNAL f_out:std_logic;SIGNAL count:INTEGER RANGE 0 TO 15 :=0;
BEGINPROCESS(clk)BEGINIF clk'event and clk='1' THENIF sel>n-2 THEN sel<=0;ELSEIF sel>=n/2 THENf_out<='1';ELSEf_out<='0';END IF;sel<=sel+1;END IF;END IF;END PROCESS;PROCESS(f_out)BEGINIF f_out'event and f_out='1' THENIF count<=15 THENcount<=count+1;ELSEcount<=0;END IF;END IF;END PROCESS;PROCESS(count)BEGINCASE count ISWHEN 0 => led <="0000001";WHEN 1 => led <="1001111";WHEN 2 => led <="0010010";WHEN 3 => led <="0000110";WHEN 4 => led <="1001100";WHEN 5 => led <="0100100";WHEN 6 => led <="0100000";WHEN 7 => led <="0001111";WHEN 8 => led <="0000000";WHEN 9 => led <="0000100";WHEN 10 => led <="1110111";WHEN 11 => led <="0011111";WHEN 12 => led <="1001110";WHEN 13 => led <="0111101";WHEN 14 => led <="1001111";WHEN 15 => led <="0111000";
¥
59
百度文库VIP限时优惠现在开通,立享6亿+VIP内容
立即获取
可编程逻辑器件实验EDA-七段数码管显示电路
实验四 七段数码管显示电路
一、实验目的
实现十六进制计数显示。
二、硬件需求
EDA/SOPC实验箱一台。
三、实验原理
七段数码管分共阳极与共阴极两种。共阳极数码管其工作特点是,当笔段电极接低电平,公共阳极接高电平时,相应笔段可以发光。共阴极数码管则与之相反,它是将发光二极管的阴极短接后作为公共阴极,当驱动信号为高电平、公共阴极接低电平时,才能发光。图2-13为共阳极数码管和共阴极数码管的内部结构图
以上就是关于用共阳式数码管设计一个按键加1计数器,每按键一次,计数器加1,加到9停止。全部的内容,包括:用共阳式数码管设计一个按键加1计数器,每按键一次,计数器加1,加到9停止。、51单片机的程序(c语言版),用数码管进行倒计时。、用4个动态数码管显示,实现0~9999计数功能,延时为1s,用c语言。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)