运用51单片机实现4位8段LED数码管的动态数字显示,写出C语言程序

运用51单片机实现4位8段LED数码管的动态数字显示,写出C语言程序,第1张

动态显示的是有固定格式的,赋值,开显示,延时,关显示,假设p0口接数据显示位,p2口低4位接片选,

p2=tab[1];

//赋值

p3_0=0;

//开第一位显示

for(i=0;i<200:i++);//延时

p3_0=1;

//关第一位显示

p2=tab[2];

p3_1=0;

//开第二位显示

for(i=0;i<200:i++);

p3_1=1;

这个程序就是让两个数码管分别显示1和2,注意程序开头包含头文件regx52h,如果是包含reg52h编译不了的

这里给出一种基于Arduino平台的单片机数字0到9显示的程序代码,可供参考:

c++

Copy code

int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; //定义LED引脚

int numPins[][7] = { //定义数字0~9的LED点阵图形

{1, 1, 1, 1, 1, 1, 0}, //0

{0, 1, 1, 0, 0, 0, 0}, //1

{1, 1, 0, 1, 1, 0, 1}, //2

{1, 1, 1, 1, 0, 0, 1}, //3

{0, 1, 1, 0, 0, 1, 1}, //4

{1, 0, 1, 1, 0, 1, 1}, //5

{1, 0, 1, 1, 1, 1, 1}, //6

{1, 1, 1, 0, 0, 0, 0}, //7

{1, 1, 1, 1, 1, 1, 1}, //8

{1, 1, 1, 1, 0, 1, 1} //9

};

void setup() {

for (int i = 0; i < 10; i++) { //初始化LED引脚为输出模式

pinMode(ledPins[i], OUTPUT);

}

}

void loop() {

for (int num = 9; num >= 0; num--) { //从数字9到0循环

for (int i = 0; i < 7; i++) { //依次点亮数字的7个LED

digitalWrite(ledPins[i], numPins[num][i]); //控制LED引脚输出高低电平

}

delay(1000); //延时1秒

}

}

该程序利用数组存储数字09的LED点阵图形,并通过循环依次点亮每个数字的7个LED,从而实现数字09的循环显示。可以根据需要对延时时间进行调整,以达到合适的显示效果。

前面是序列号 像N10 N20 俗称段号 段号后面是功能代码,也就是运动指令,接着是尺寸数字。最后是M S T F这些转速,刀号,进给的参数,最后是结束符号。N100 GO1 X100 Z100 S3000 F200: 数控编程是非常容易的,难得是工艺,所以不用担心数控编程方面。

/电子时钟源代码/

#include<graphicsh>

#include<stdioh>

#include<mathh>

#include<dosh>

#define PI 31415926 /定义常量/

#define UP 0x4800 /上移↑键:修改时间/

#define DOWN 0x5000 /下移↓键:修改时间/

#define ESC 0x11b /ESC键 : 退出系统/

#define TAB 0xf09 /TAB键 : 移动光标/

/函数声明/

int keyhandle(int,int); /键盘按键判断,并调用相关函数处理/

int timeupchange(int); /处理上移按键/

int timedownchange(int); /处理下移按键/

int digithour(double); /将double型的小时数转换成int型/

int digitmin(double); /将double型的分钟数转换成int型/

int digitsec(double); /将double型的秒钟数转换成int型/

void digitclock(int,int,int ); /在指定位置显示时钟或分钟或秒钟数/

void drawcursor(int); /绘制一个光标/

void clearcursor(int);/消除前一个光标/

void clockhandle(); /时钟处理/

double h,m,s; /全局变量:小时,分,秒/

double x,x1,x2,y,y1,y2; /全局变量:坐标值/

struct time t[1];/定义一个time结构类型的数组/

main()

{

int driver, mode=0,i,j;

driver=DETECT; /自动检测显示设备/

initgraph(&driver, &mode, "");/初始化图形系统/

setlinestyle(0,0,3); /设置当前画线宽度和类型:设置三点宽实线/

setbkcolor(0);/用调色板设置当前背景颜色/

setcolor(9); /设置当前画线颜色/

line(82,430,558,430);

line(70,62,70,418);

line(82,50,558,50);

line(570,62,570,418);

line(70,62,570,62);

line(76,56,297,56);

line(340,56,564,56); /画主体框架的边直线/

/arc(int x, int y, int stangle, int endangle, int radius)/

arc(82,62,90,180,12);

arc(558,62,0,90,12);

setlinestyle(0,0,3);

arc(82,418,180,279,12);

setlinestyle(0,0,3);

arc(558,418,270,360,12); /画主体框架的边角弧线/

setcolor(15);

outtextxy(300,53,"CLOCK"); /显示标题/

setcolor(7);

rectangle(342,72,560,360); /画一个矩形,作为时钟的框架/

setwritemode(0); /规定画线的方式。mode=0, 则表示画线时将所画位置的原来信息覆盖/

setcolor(15);

outtextxy(433,75,"CLOCK");/时钟的标题/

setcolor(7);

line(392,310,510,310);

line(392,330,510,330);

arc(392,320,90,270,10);

arc(510,320,270,90,10); /绘制电子动画时钟下的数字时钟的边框架/

/绘制数字时钟的时分秒的分隔符/

setcolor(5);

for(i=431;i<=470;i+=39)

for(j=317;j<=324;j+=7){

setlinestyle(0,0,3);

circle(i,j,1); /以(i, y)为圆心,1为半径画圆/

}

setcolor(15);

line(424,315,424,325); /在运行电子时钟前先画一个光标/

/绘制表示小时的圆点/

for(i=0,m=0,h=0;i<=11;i++,h++){

x=100sin((h60+m)/360PI)+451;

y=200-100cos((h60+m)/360PI);

setlinestyle(0,0,3);

circle(x,y,1);

}

/绘制表示分钟或秒钟的圆点/

for(i=0,m=0;i<=59;m++,i++){

x=100sin(m/30PI)+451;

y=200-100cos(m/30PI);

setlinestyle(0,0,1);

circle(x,y,1);

}

/在电子表的左边打印帮助提示信息/

setcolor(4);

outtextxy(184,125,"HELP");

setcolor(15);

outtextxy(182,125,"HELP");

setcolor(5);

outtextxy(140,185,"TAB : Cursor move");

outtextxy(140,225,"UP : Time ++");

outtextxy(140,265,"DOWN: Time --");

outtextxy(140,305,"ESC : Quit system!");

outtextxy(140,345,"Version : 20");

setcolor(12);

outtextxy(150,400,"Nothing is more important than time!");

clockhandle();/开始调用时钟处理程序/

closegraph(); /关闭图形系统/

return 0; /表示程序正常结束,向 *** 作系统返回一个0值/

}

void clockhandle()

{

int k=0,count;

setcolor(15);

gettime(t);/取得系统时间,保存在time结构类型的数组变量中/

h=t[0]ti_hour;

m=t[0]ti_min;

x=50sin((h60+m)/360PI)+451; /时针的x坐标值/

y=200-50cos((h60+m)/360PI); /时针的y坐标值/

line(451,200,x,y);/在电子表中绘制时针/

x1=80sin(m/30PI)+451; /分针的x坐标值/

y1=200-80cos(m/30PI); /分针的y坐标值/

line(451,200,x1,y1); /在电子表中绘制分针/

digitclock(408,318,digithour(h)); /在数字时钟中,显示当前的小时值/

digitclock(446,318,digitmin(m)); /在数字时钟中,显示当前的分钟值/

setwritemode(1);

/规定画线的方式,如果mode=1,则表示画线时用现在特性的线

与所画之处原有的线进行异或(XOR) *** 作,实际上画出的线是原有线与现在规定

的线进行异或后的结果。因此, 当线的特性不变, 进行两次画线 *** 作相当于没有

画线,即在当前位置处清除了原来的画线/

for(count=2;k!=ESC;){ /开始循环,直至用户按下ESC键结束循环/

setcolor(12);/淡红色/

sound(500);/以指定频率打开PC扬声器,这里频率为500Hz/

delay(700);/发一个频率为500Hz的音调,维持700毫秒/

sound(200);/以指定频率打开PC扬声器,这里频率为200Hz/

delay(300);

/以上两种不同频率的音调,可仿真钟表转动时的嘀哒声/

nosound(); /关闭PC扬声器/

s=t[0]ti_sec;

m=t[0]ti_min;

h=t[0]ti_hour;

x2=98sin(s/30PI)+451; /秒针的x坐标值/

y2=200-98cos(s/30PI); /秒针的y坐标值/

line(451,200,x2,y2);

/绘制秒针/

/利用此循环,延时一秒/

while(t[0]ti_sec==s&&t[0]ti_min==m&&t[0]ti_hour==h)

{ gettime(t);/取得系统时间/

if(bioskey(1)!=0){

k=bioskey(0);

count=keyhandle(k,count);

if(count==5) count=1;

}

}

setcolor(15);

digitclock(485,318,digitsec(s)+1);/数字时钟增加1秒/

setcolor(12); /淡红色/

x2=98sin(s/30PI)+451;

y2=200-98cos(s/30PI);

line(451,200,x2,y2);

/用原来的颜色在原来位置处再绘制秒针,以达到清除当前秒针的目的/

/分钟处理/

if(t[0]ti_min!=m){ /若分钟有变化/

/消除当前分针/

setcolor(15); /白色/

x1=80sin(m/30PI)+451;

y1=200-80cos(m/30PI);

line(451,200,x1,y1);

/绘制新的分针/

m=t[0]ti_min;

digitclock(446,318,digitmin(m)); /在数字时钟中显示新的分钟值/

x1=80sin(m/30PI)+451;

y1=200-80cos(m/30PI);

line(451,200,x1,y1);

}

/小时处理/

if((t[0]ti_hour60+t[0]ti_min)!=(h60+m)){ /若小时数有变化/

/消除当前时针/

setcolor(15); /白色/

x=50sin((h60+m)/360PI)+451;/50:时钟的长度(单位:像素),451:圆心的x坐标值/

y=200-50cos((h60+m)/360PI);

line(451,200,x,y);

/绘制新的时针/

h=t[0]ti_hour;

digitclock(408,318,digithour(h));

x=50sin((h60+m)/360PI)+451;

y=200-50cos((h60+m)/360PI);

line(451,200,x,y);

}

}

}

int keyhandle(int key,int count) /键盘控制 /

{ switch(key)

{case UP: timeupchange(count-1); /因为count的初始值为2,所以此处减1/

break;

case DOWN:timedownchange(count-1); /因为count的初始值为2,所以此处减1/

break;

case TAB:setcolor(15);

clearcursor(count); /清除原来的光标/

drawcursor(count); /显示一个新的光标/

count++;

break;

}

return count;

}

int timeupchange(int count) /处理光标上移的按键/

{

if(count==1){

t[0]ti_hour++;

if(t[0]ti_hour==24) t[0]ti_hour=0;

settime(t); /设置新的系统时间/

}

if(count==2){

t[0]ti_min++;

if(t[0]ti_min==60) t[0]ti_min=0;

settime(t); /设置新的系统时间/

}

if(count==3){

t[0]ti_sec++;

if(t[0]ti_sec==60) t[0]ti_sec=0;

settime(t); /设置新的系统时间/

}

}

int timedownchange(int count) /处理光标下移的按键/

{

if(count==1) {

t[0]ti_hour--;

if(t[0]ti_hour==0) t[0]ti_hour=23;

settime(t);/设置新的系统时间/

}

if(count==2) {

t[0]ti_min--;

if(t[0]ti_min==0) t[0]ti_min=59;

settime(t);/设置新的系统时间/

}

if(count==3) {

t[0]ti_sec--;

if(t[0]ti_sec==0) t[0]ti_sec=59;

settime(t);/设置新的系统时间/

}

}

int digithour(double h)/将double型的小时数转换成int型/

{int i;

for(i=0;i<=23;i++)

}

int digitmin(double m)/将double型的分钟数转换成int型/

{int i;

for(i=0;i<=59;i++)

}

int digitsec(double s) /将double型的秒钟数转换成int型/

{int i;

for(i=0;i<=59;i++)

}

void digitclock(int x,int y,int clock)/在指定位置显示数字时钟:时\分\秒/

{char buffer1[10];

setfillstyle(0,2);

bar(x,y,x+15,328);

if(clock==60) clock=0;

sprintf(buffer1,"%d",clock);

outtextxy(x,y,buffer1);

}

void drawcursor(int count) /根据count的值,画一个光标/

{switch(count)

{

case 1:line(424,315,424,325);break;

case 2:line(465,315,465,325);break;

case 3:line(505,315,505,325);break;

}

}

void clearcursor(int count) /根据count的值,清除前一个光标/

{switch(count)

{

case 2:line(424,315,424,325);break;

case 3:line(465,315,465,325);break;

case 1:line(505,315,505,325);break;

}

}

shell:

shell是系统的用户界面,提供了用户与内核进行交互 *** 作的一种接口。它接收用户输入的命令并把它送入内核去执行。

实际上shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。

命令行(命令提示符):

命令行一般指命令提示符。命令提示符是在 *** 作系统中,提示进行命令输入的一种工作提示符。在不同的 *** 作系统环境下,命令提示符各不相同。

终端:

终端terminal通常是指那些与集中式主机系统相连的“哑”用户设备。终端从用户接收键盘输入,并且将这些输入发送给主机系统。主机系统处理这个用户的键盘输入和命令,然后输出返回并显示在这个终端的屏幕上。

这个可以借鉴网上的一些资料,具体的看你的原理图,可以仿写

最重要的是自己掌握方法

可以到一些贴吧论坛讨论,相互学习

#include <reg52h>

typedef unsigned int uint;

typedef unsigned char uchar;

sbit wela = P2^7; //数码管位声明

sbit dula = P2^6; //数码管段选声明

sbit FM = P2^3;//蜂鸣器声明

uchar counter = 0, counter1 = 0, j = 0, flag = 0, flag1 = 0;

uchar num = 6, num1 = 0;

//数码管段选编码

uchar code table_du [] = {

0x3F, //"0"

0x06, //"1"

0x5B, //"2"

0x4F, //"3"

0x66, //"4"

0x6D, //"5"

0x7D, //"6"

0x07, //"7"

0x7F, //"8"

0x6F, //"9"

0x77, //"A"

0x7C, //"B"

0x39, //"C"

0x5E, //"D"

0x79, //"E"

0x71, //"F"

0x76, //"H"

0x38, //"L"

0x37, //"n"

0x3E, //"u"

0x73, //"P"

0x5C, //"o"

0x40, //"-"

0x00, //熄灭

0x00 //自定义

};

//数码管位选编码

uchar code table_we[] = {

0xfe,

0xfd,

0xfb,

0xf7,

0xef,

0xdf

};

void init();

void display();

void main()

{

init();

while(1)

{

if(counter1 == 30)

{

counter1 = 0;

display();

num--;

num1++;

if(num == 0)

{

num = 6;

}

if(num1 == 6)

{

num1 = 0;

}

}

if(counter == 200)//定时到4秒后,流水灯向右流动

{

counter = 0;//counter清零,

//关闭定时器0

TR0 = 0;

//ET0 = 0;

flag = 1; //标志变量置1后,定时器重新初始化

TH0 = 0xB8; //定时器0定时20毫秒

TL0 = 0x00;

TR0 = 1; //重新打开定时器0

//ET0 = 1;

j = 0;

}

}

}

//定时器初始化程序

void init()

{

//定时器0和定时器1初始化函数

TMOD = 0x11;//定义定时器1和0在工作方式1下

TH0 = 0xB8; //定时器0定时20毫秒

TL0 = 0x00;

TH1 = 0xFC; //定时器1定时20毫秒

TL1 = 0x67;

TR0 = 1; //打开定时器0

TR1 = 1; //打开定时器1

EA = 1; //打开总中断

ET0 = 1; //打开定时器0中断

ET1 = 1; //打开定时器1中断

}

//数码管显示子程序

void display()

{

dula = 1;

P0 = table_du[num];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = table_we[num1];

wela = 0;

dula = 1;

P0 = table_du[num];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = table_we[num1];

wela = 0;

dula = 1;

P0 = table_du[num];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = table_we[num1];

wela = 0;

dula = 1;

P0 = table_du[num];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = table_we[num1];

wela = 0;

dula = 1;

P0 = table_du[num];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = table_we[num1];

wela = 0;

dula = 1;

P0 = table_du[num];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = table_we[num1];

wela = 0;

}

//中断定时器0

void int_time0() interrupt 1

{

TH0 = 0xB8;

TL0 = 0x00;

counter++;

if(flag == 0)

{

if(counter % 10 == 0)//定时200毫秒

{

P1 = ~(1 << j++);//流水灯左移流动

if(j == 8)

{

j = 0;

}

}

}

else

{

if(counter % 5 == 0)

{

//counter = 0;

//流水灯右移流动

P1 = ~(0x80 >> j++);

FM = ~FM;

if(j == 8)

j = 0;

}

}

}

//中断定时器1

void int_time1() interrupt 3

{

TH1 = 0xFC;

TL1 = 0x67;

counter1++;

}

参考

选项→自定义→LAD/FBD标签→取消勾选“在地址处显示符号信息”。

可编程逻辑控制器,它采用一类可编程的存储器,用于其内部存储程序,执行逻辑运算、顺序控制、定时、计数与算术 *** 作等面向用户的指令,并通过数字或模拟式输入/输出控制各种类型的机械或生产过程。

以上就是关于运用51单片机实现4位8段LED数码管的动态数字显示,写出C语言程序全部的内容,包括:运用51单片机实现4位8段LED数码管的动态数字显示,写出C语言程序、单片机数字9到0显示程序代码、数控程序和程序段的格式是什么包括哪几类指令代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9860331.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存