求用单片机89C52 3位数码管做一个电子跑表的程序 救急啊
定义有参函数的一般形式为:类型名 函数名 (形式参数表列) {函数体}
形参用于接收实参传递的值,并参与函数体的运算。
原理图都没画完,至少和你描述的不一样啊。流水灯呢,单片机不能并行运行程序,同一时刻只能执行一条语句。你要数码管走时的情况下还要流水灯显示花样,可能有点够呛。其它的都是小意思。
#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线又...
涂婵盐酸: /***程序仿真用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个数码管如果显示不同内容,那么一般需要动态扫描显示,才能消耗最小的硬件资源.如果显示同一个内容,那么就直接送段码,位控全开就可以了.