求用单片机89C52 3位数码管做一个电子跑表的程序 救急啊

作者&投稿:岑到 (若有异议请与网页底部的电邮联系)
求问大神stc89c52单片机中7seg-mpx2-cc数码管根据led灯亮显示时间的c语言程序怎么写~

定义有参函数的一般形式为:类型名 函数名 (形式参数表列) {函数体}
形参用于接收实参传递的值,并参与函数体的运算。

原理图都没画完,至少和你描述的不一样啊。流水灯呢,单片机不能并行运行程序,同一时刻只能执行一条语句。你要数码管走时的情况下还要流水灯显示花样,可能有点够呛。其它的都是小意思。

#include <reg51.h>
//LCD的口线
sbit E=P3^5;
sbit RW=P3^6;
sbit RS=P3^7;
//8字LED的连接方法
//P0.7,P0.6,P0.5,P0.4,P0.3,P0.2,P0.1,P0.0
//G, F A E B H C D

unsigned char code ledcode[]={0x84,0xf5,0x46,0x54,0x35,0x1c,0x0c,0xd5,
0x04,0x14,0x05,0x2c,0x8e,0x64,0x0e,0x0f}; //数码管段码表

unsigned char js100ms,jsgw,jssw,t0100ms,t0sm;

void time0(void);

void main(void)
{
E=0; //取消LCD对LED的影响
RW=0;
RS=1;

js100ms=0x00;
jsgw=0x00;
jssw=0x00;
t0100ms=0x14;
t0sm=0x01; //从第一个LED开始显示
TH0=0xee;
TL0=0x00;
TMOD=0x01;
TR0=1;
IE=0x82;
while(1)
{}
}

void time0(void) interrupt 1
{
TH0=0xee;
TL0=0x00;
t0100ms--;
if(t0100ms==0x00)
{
t0100ms=0x14;
js100ms++;
if(js100ms==0x0a)
{
js100ms=0x00;
jsgw++;
if(jsgw==0x0a)
{
jsgw=0x00;
jssw++;
if(jssw==0x0a)
{jssw=0x00;}
}
}
}
t0sm++;
if(t0sm==0x04)
{t0sm=0x01;}
P0=0xff;
switch(t0sm)
{
case 0x01: { P2=0xdf;P0=ledcode[js100ms];}break;
case 0x02: { P2=0xef;P0=ledcode[jsgw]&0xFB;}break;
case 0x03: { P2=0xf7;P0=ledcode[jssw];}break;
default: break;
}
}
或者汇编
JS100MS EQU 32H ;计数器0.1S
JSGW EQU 30H ;计数器的个位
JSSW EQU 31H ;计数器的十位

T0_100MS EQU 33H ;产生1S
LEDSM EQU 34H ;现在扫到第几个LED
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIME0_1

ORG 0050H
MAIN:

MOV JS100MS,#00H ;上电时从00.0开始
MOV JSSW,#00H ;
MOV JSGW,#00H ;
MOV T0_100MS,#14H ;5MS*20=100MS
MOV LEDSM,#01H
MOV TH0,#0EEH ;16位的定时器,定时5MS
MOV TL0,#00H
MOV TMOD,#01H
SETB TR0
MOV IE,#82H ;定时器0中断
SJMP $

ORG 0100H
TIME0_1: MOV TH0,#0EEH
MOV TL0,#00H
DJNZ T0_100MS,TODISP
MOV T0_100MS,#14H
INC JS100MS
MOV A,JS100MS
CJNE A,#0AH,TODISP
MOV JS100MS,#00H
INC JSGW
MOV A,JSGW
CJNE A,#0AH,TODISP
MOV JSGW,#00H
INC JSSW
MOV A,JSSW
CJNE A,#0AH,TODISP
MOV JSSW,#00H ;溢出99.9则回到00.0
TODISP: MOV P0,#0FFH ;在位选时关显示
INC LEDSM
MOV A,LEDSM
CJNE A,#04H,TODISP1
MOV LEDSM,#01H ;扫完第三个又从第一个开始
TODISP1: MOV A,LEDSM
CJNE A,#01H,TODISP2
MOV P2,#0DFH
MOV A,JS100MS
MOV DPTR,#LEDCODE
MOVC A,@A+DPTR
AJMP TOP0
TODISP2: CJNE A,#02H,TODISP3
MOV P2,#0EFH
MOV A,JSGW
MOV DPTR,#LEDCODE
MOVC A,@A+DPTR
CLR ACC.2 ;把H点点亮
AJMP TOP0
TODISP3: MOV P2,#0F7H
MOV A,JSSW
MOV DPTR,#LEDCODE
MOVC A,@A+DPTR
TOP0: MOV P0,A
RETI

;8字LED的连接方法
;P0.7,P0.6,P0.5,P0.4,P0.3,P0.2,P0.1,P0.0
;G, F A E B H C D

;LED字段码表
LEDCODE: DB 84H ;0
DB 0F5H ;1
DB 46H ;2
DB 54H ;3
DB 35H ;4
DB 1CH ;5
DB 0CH ;6
DB 0D5H ;7
DB 04H ;8
DB 14H ;9
DB 05H ;A
DB 2CH ;B
DB 8EH ;C
DB 64H ;D
DB 0EH ;E
DB 0FH ;F

END
如果发电路可以量身打造哦QQ514586810

//**************************************************

//程序功能:时钟,前两位显示分钟,后两位显示秒
//P1.7按键功能,开始计时
//P1.6按键功能,停止计时
//P1.5按键功能,清零,重新开始

//*************************************************

#include<reg51.h>
#include <math.h>
#include <intrins.h>
code unsigned char seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xff}; //共阳数码管段码

unsigned int cnt=0; //由于底下的cnt用到了4000,所以这时不能定义成char类型(最大才255)
static unsigned int sec=0;
static unsigned int min=0;
static unsigned int hour=0;
sbit P1_7=P1^7;//P1.7按键功能,开始计时
sbit P1_6=P1^6;//P1.6按键功能,停止计时
sbit P1_5=P1^5;//P1.5按键功能,清零,重新开始

void delay1ms()
{
unsigned char i;
for(i=124;i>0;i--); //延时124*8+10=1002us
}

delay10ms() //延时10ms
{
unsigned i,j;
for(i=0;i<50;i++)
for(j=0;j<100;j++);
}

void KEY(void) //按键判断子程序
{
if(P1_7==0) //P1.7按键功能,开始计时
{
delay10ms(); //软件去抖动
if(P1_7==0)
{
TH0=0x19; //11.0529MHZ的晶振,250us的定时中断
TL0=0x19;
TR0=1;
}
}

else if(P1_6==0) //P1.6按键功能,停止计时
{
delay10ms();
if(P1_6==0)
{ TR0=0;}
}

else if(P1_5==0) //P1.5按键功能,清零,重新开始
{
delay10ms();
if(P1_5==0)
{sec=0;}
}

}

void LED_display() //显示
{
P1=0xfe; //P1.0=0,选通第一位
P2=seg7code[min/10]; //显示分的第一位
delay1ms();
P2=0xff; //消隐

P1=0xfd; //P1.1=0,选通第二位
P2=seg7code[min%10]; //显示分的第一位
delay1ms();
P2=0xff; //消隐

P1=0xfb; //P1.2=0,选通第三位
P2=seg7code[sec/10]; //显示秒的第一位
delay1ms();
P2=0xff; //消隐

P1=0xf7; //P1.3=0,选通第四位
P2=seg7code[sec%10]; //显示秒的第二位
delay1ms();
P2=0xff; //消隐
}

void timer0 (void) interrupt 1 using 0
{
cnt++; //每过250us,cnt加一
if(cnt==4000) //250*4000=1s
{
cnt=0;
sec++;
if(sec==60) //60秒,重新计数,分钟加一
{ sec=0;
min++;
if(min==60) //60分,重新计数,小时加一
{
min=0;
hour++;
if(hour==12) //12个小时,重新计数
{hour=0;}
}

}
}
}

main()
{
TMOD=0x02; //T0,方式2

EA=1; //开总中断
ET0=1; //开定时器T0中断

while(1)
{
KEY();
LED_display();
}
}

能不能把你设计的文献综述和正文发给我参考下。464238559@qq.com

代做,可以联系我。


STC89C52RC与普通89C52有什么区别?
STC89C52RC与普通89C52的主要区别在于STC89C52RC是一款增强型8051单片机,而普通89C52是标准的8051单片机。首先,在硬件特性上,STC89C52RC相较于普通89C52具有更高的集成度和更多的功能。STC89C52RC内置了更丰富的外设接口,如更多的I\/O端口、串口通信、定时器等,使得在开发过程中可以更加灵活地满足各种需求。...

89C52与89S52单片机在用法和功能上有哪些区别?
89C52与89S52单片机区别在于:1、89C56不支持在系统编程,89S52支持。2、89C52具有一个数据指针DPTR,而89S52具有两个数据指针DPTR0和DPTR1。3、89S52含有一个看门狗定时器,具有断电标志POF;而89C852无。单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随...

急求89C52单片机的原理及引脚功能
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I\/O口,可接收输出4个TTL门电流。当P3口写入“1” 后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输 出电流(ILL)这是由于上拉的缘故。P3口作为AT89C51...

利用单片机设计59秒计时器
利用89c52单片机设计一个59秒计时器,使用两位共阳极LED数码管将其显示出来 我不是大屁股 | 浏览1463 次 |举报 我有更好的答案推荐于2017-12-16 18:22:21 最佳答案 我写的STC89C52的利用定时器1在六位数码管前三位显示秒表。精确到0.01秒,你可以参考下,改下IO口。不知道你的硬件设计只能给予程序参考。#inclu...

如何用89c52单片机控制继电器
用89c52单片机控制继电器的方法如下,单片机控制继电器一般是两种方式:一是单片机-三极管(PNP)-继电器,二是单片机-光电耦合器-三极管(NPN)-继电器,后者由于采用了光电隔离,故起抗干扰能力相对前者要强.前者选用PNP型主要是考虑控制逻辑,采用低电平触发的控制逻辑能够防止单片机复位时候产生的误动作.后者NPN是为了...

用89c52单片机写一个交通灯程序。没有LED 用发光二极管 、、_百度...
include "reg51.h" \/\/#define uint unsigned int#define uchar unsigned char#define ON 0 \/\/0的时候灯亮#define OFF 1 \/\/1的时候灯亮\/\/管脚定义\/\/南北道 黄灯亮3秒 红灯亮 30秒 黄灯3秒 绿灯38秒\/\/东西道 黄灯亮3秒 绿灯亮 28秒 黄灯3秒 红灯40秒sbit PortDX_Yellow = P1^0; \/...

单片机89c51与89c52的区别是什么?
第一,ROM89c51是4K,但89c52是8K。第二,RAM89c51是128字节,但89c52256字节\\x0d\\x0a\\x0d\\x0a就编程来说区别不大,主要是硬件资源的区别。\\x0d\\x0a区别如下:\\x0d\\x0a1、RAM空间增大:AT89C51有128字节的内部RAM,AT89C52的内部RAM扩展为256字节;\\x0d\\x0a2、内部FLASH变大:AT89C51有...

请问89c52单片机一个IO口可以带动多少颗LED?
最多4颗,两两串联再并联,每一路电流不超过10ma, 2 路合起来电流不超过20ma 对于蓝色和白色LED,由于其工作电压在2.5V以上,如果说串联,5V电压不能驱动,因此,只能两个并联。实际上应用中,一般一个IO口只驱动一个发光二极管,以保证单片机的安全和发光二极管的亮度,虽然单个IO引脚下的输出 电流...

89c52单片机蜂鸣器程序编程
简易蜂鸣器程序:include<reg52.h> define uchar unsigned char define uint unsigned int sbit P36=P3^6;\/\/我的系统板蜂鸣器口定义 sbit k1=P1^4; \/\/按钮1 sbit k2=P1^5; \/\/按钮2 void Delay(uint num)\/\/延时函数 {uchar i,j;for(i=0;i<255;i--){for(j=0;j>0;j++)} } main...

89c52单片机与89s52单片机的区别是什么
STC89C52单片机与AT89S52是完全兼容的,就是原来用的是AT89S52,STC89C52是完全可以直接替换的。硬件和程序都不用做改动。两者的区别就在于烧录程序上。AT89S52需要电脑的并口下载线,这是早期的电脑才有并口的,现在电脑连串口都没有了。所以,要烧录程序要买一条USB转ISP线,可是网上能买的USB转ISP线又...

顺河回族区15973633152: 求一个简单的单片机用数码管显示计时60秒的C语言程序,程序一定要带有解释和Proteus 仿真电路图. -
涂婵盐酸: /***程序仿真用89c52 数码管用共阳极数码管 P0口段选,P3.0和P3.1位选 定时器2用法见百度“T2CON”***/ #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar code num[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf...

顺河回族区15973633152: 单片机89c52如何控制多个数码管? -
涂婵盐酸: 只想用P3口的话,必须另加控制元件. 1一种方法是用两个锁存器来锁存数码管的段码和位码,进行动态扫描显示. 2另一方法是,用P3口的4位接一个BCD译码器控制数码管的段码,再P3口的3位接一个3-8译码器来控制数码管的位进行动态扫描. 3再就是可以用P3口的两根串行线接串并转换IC,来驱动数码管.

顺河回族区15973633152: 寻求89C52单片机+蜂鸣器报警同时LED灯亮+数码管显示的程序,汇编\C语言都可以,谢谢. -
涂婵盐酸: 给你个程序参考吧,#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit d=P3^4; void delay200ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=132;j>0;j--) for(k=150;k>0;k--); } void main() {uchar r...

顺河回族区15973633152: 89C52应该如何连接三位数码管,求图 -
涂婵盐酸: 如果是画仿真图,三位数码管可用四位一体的数码管,多一位可以不显示,用P0和P2口直接连接就行.如下图所示.

顺河回族区15973633152: 89c52单片机C语言动态扫描7段数码管程序 -
涂婵盐酸: 如果有电路图就好了... 下面的程序是适合: P0接的是数码管的a-g.高时字段亮 P1接的是三极管基极,低时选中显示位.. #include<reg51.h> #define uchar unsigned char; uchar code CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /...

顺河回族区15973633152: 用单片机c语言写一个数码管从00到99的数字显示,要用到锁存器!!!求大神指教 -
涂婵盐酸: /*******************************************************************************************************//*******************************************************************************************************/#include //通用89C52头文件 sbit AA=P3^4;//数码管显示用IO端...

顺河回族区15973633152: 求助:89c52单片机实现数码管进位显示c程序 -
涂婵盐酸: 昏,给点分被,把问题解释清楚,进位显示是啥意思,你是想要啥?,不说清楚,别人怎么回答

顺河回族区15973633152: 用89C52单片机,用独立按键控制数码管的程序问题 -
涂婵盐酸: 数组下标越界,注意re的取值只能是0、1、2、3把switch中的re取值都减1就可以了

顺河回族区15973633152: 求89C52单片机按1键亮数码管,并闪两个灯,按2键亮数码管,并左移灯的汇编语言程 -
涂婵盐酸: KEY EQU P1.0 //按键 LED1 EQU P1.1 LED2 EQU P1.2 SMG_SWITCH EQU 30H //数码管开关 ORG 0000H JMP MAIN ORG 000BH JMP INIT0 ORG 0030H MAIN_INIT: MOV SMG_SWITCH,#0 MOV TMOD,#1 MOV TH0,#0D8H MOV TL0,#0EFH//...

顺河回族区15973633152: 89C52单片机怎么点亮8个数码管 -
涂婵盐酸: 8个数码管如果显示不同内容,那么一般需要动态扫描显示,才能消耗最小的硬件资源.如果显示同一个内容,那么就直接送段码,位控全开就可以了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网