求一份设计一个以51单片机为核心的数字钟,要求能够实时显示小时、分钟、秒钟三个数据。
我以前做过一个,我待会发去你邮箱。。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;系统名称: 数字钟
;创健人:济南, 日期:2005.6.19
;系统功能描述:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;修改人: 修改日期:
;修改原因:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;蕊片型号:AT89C51 晶振:12MHZ
;-------------硬件连接---------------------
;
;
;-----------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称: 声明区
;功能描述: 声明各常量和变量
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SECOND EQU 30H ;存储妙
MINITE EQU 31H ;存储分
HOUR EQU 32H ;存储时
SPEAKER BIT P3.7
HOURK BIT P3.2 ;时键
MINITEK BIT P3.3 ;分键
SECONDK BIT P3.0 ;妙键
FLAG BIT 00H
FLAG1S BIT 01H ;1S到标志位.
DISPBUF EQU 40H ; 段选标志
DISPBIT EQU 48H ; 位选通标志
T2SCNTA EQU 49H ; 中断次数
T2SCNTB EQU 4AH ; 中断次数
TEMP EQU 4BH ; 初始化位
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:主程序
;功能描述;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0 ;T0中断入口
START: MOV SECOND,#00H ;妙初始化0
MOV MINITE,#00H ;分初始化0
MOV HOUR,#12 ;时始化送12
MOV DISPBIT,#00H ;位选通标志
MOV T2SCNTA,#00H ;标志
MOV T2SCNTB,#00H ;标志
CLR FLAG
CLR FLAG1S
SETB SPEAKER
MOV TEMP,#07FH ;初始位,让第一个位选通
LCALL DISP ;调用显示处理程序
MOV TMOD,#01H ;方式1
MOV TH0,#0F8H ;赋值20MS
MOV TL0,#030H
SETB TR0 ;开中断启动
SETB ET0
SETB EA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:按键程序
;功能描述;调整分,时
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WT: JNB FLAG,CC
LCALL SPEAKING
CC: JB SECONDK,NK1 ;妙末按下,转去判断分键
LCALL DELY10MS ;按下,延时,消抖动
JB SECONDK,NK1 ;再次判断是否按下?
INC SECOND ;按下,按下一次加1
MOV A,SECOND ;送A判断
CJNE A,#60,NS60 ;妙末到60转分
MOV SECOND,#00H ;到了,回0
NS60: LCALL DISP
JNB SECONDK,$ ;等待妙键释放
NK1: JB MINITEK,NK2 ;跟妙键分析相似
LCALL DELY10MS
JB MINITEK,NK2
INC MINITE
MOV A,MINITE
CJNE A,#60,NM60
MOV MINITE,#00H
NM60: LCALL DISP
JNB MINITEK,$
NK2: JB HOURK,NK3 ;时键
LCALL DELY10MS
JB HOURK,NK3
INC HOUR
MOV A,HOUR
CJNE A,#24,NH24
MOV HOUR,#00H
NH24: LCALL DISP
JNB HOURK,$ ;等待时键释放
NK3: LJMP WT ;返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:显示处理程序
;功能描述;,该程序实现时,分,秒计时转换为BCD码并存储在以47H起始地址的显示
;输出数据存储单元里,即显示缓冲区47H至40H单元
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP:
MOV A,#DISPBUF ;送40H
ADD A,#7 ;加8
;DEC A
MOV R1,A ;送47H
MOV A,HOUR ;送时
MOV B,#10
DIV AB
MOV @R1,A ;存储时十位
DEC R1 ;指向时个位
MOV A,B ;送时个位
MOV @R1,A ;存储时个位
DEC R1
MOV A,#10
MOV @R1,A
DEC R1
MOV A,MINITE ; 送分,处理与时处理类似
MOV B,#10
DIV AB
MOV @R1,A
DEC R1
MOV A,B
MOV @R1,A
DEC R1
MOV A,#10
MOV @R1,A
DEC R1
MOV A,SECOND ;送秒
MOV B,#10
DIV AB
MOV @R1,A
DEC R1
MOV A,B
MOV @R1,A
DEC R1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:显示程序
;功能描述;在LED上显示为12-12-12显示模式.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INT_T0:
MOV TH0,#0F8H ;重赋值
MOV TL0,#030H
MOV A,#DISPBUF ;段偏移存储
ADD A,DISPBIT ;位偏移量
MOV R0,A ;段偏移存储
MOV A,@R0 ;段偏移量
MOV DPTR,#TABLE ;指向字形表
MOVC A,@A+DPTR ;取字形
MOV P0,#0 ;防闪烁
MOV P0,A ; 字形选P1口显示
MOV A,DISPBIT ;位移偏量
MOV DPTR,#TAB ;指向位选
MOVC A,@A+DPTR ;取位选通
MOV P2,A ;位送P3口选通
INC DISPBIT ;位偏移加1
MOV A,DISPBIT ;位偏移送A
CJNE A,#08H,KNA ;八个数管码扫描完不?
MOV DISPBIT,#00H ;描完重新开始
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:1秒计时程序
;功能描述;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KNA: INC T2SCNTA
MOV A,T2SCNTA
CJNE A,#100,DONE
MOV T2SCNTA,#00H
INC T2SCNTB
MOV A,T2SCNTB
CJNE A,#05H,DONE
SETB FLAG1S
MOV T2SCNTB,#00H
INC SECOND ;秒加1
MOV A,SECOND
CJNE A,#50,BB ;50S到.
MOV A,MINITE
CJNE A,#59,BB ;59分
SETB FLAG ;打开正点响标志.
BB: MOV A,SECOND
CJNE A,#60,NEXT ;秒超过60了没有? 没有,调用显示处理程序
MOV SECOND,#00H
INC MINITE ;分加1
MOV A,MINITE
CJNE A,#60,NEXT
MOV MINITE,#00H ;分超过60,清0
INC HOUR ;并时加1
MOV A,HOUR
CJNE A,#24,NEXT ;是否超过24小时?不是,则跳至NEXT
MOV HOUR,#00H
NEXT: LCALL DISP ; 调用显示处理程序
DONE: RETI ;中断返回
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H ;0到9字形(40表示横扛)
TAB: DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:正点报时子程序
;功能描述; 前十秒报第一声,每隔一秒报一声.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SPEAKING:MOV R5,#6
AA: CLR SPEAKER
JNB FLAG1S,$ ;延时1S.
CLR FLAG1S
SETB SPEAKER
JNB FLAG1S,$
CLR FLAG1S
DJNZ R5,AA
CLR FLAG
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:延时子程序
;功能描述;按键消抖调用.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELY10MS:MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
P1口接8个按键
P2低四位接74ls48P2.4接数码管dp高三位接74ls138
#include<reg51.h> //头文件//
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
#define tn0h 0x70
#define tn0l 0x00
#define tn1h 0x70
#define tn1l 0x01
uchar signtime[8]={0x00,0x06,0x0f,0x03,0x00,0x0f,0x00,0x00};
uchar signdate[8]={0x00,0x08,0x0f,0x00,0x04,0x0f,0x02,0x03};
uchar tcount,tflag=0;
uchar flag=1;
//***********10ms延时*************//
void delay10ms(void)
{uchar i=255;
uchar j=255;
while(i>0)
{j=255;
while(j>0)
j--;
i--;
}
}
//***********延时*************//
void delay(uchar s)
{uchar l;
for(l=0;l<=s;l++);
}
//***********键盘扫描 时间修改*************//
void keyscan()
{uchar key=0;
if(P1!=0xff)
{delay10ms();
if(P1==0x7f)flag++;
if(flag>1)flag=0;
if(flag==1)
{if(P1==0xfe)signtime[0]++;
if(P1==0xfd)signtime[1]++;
if(P1==0xfb)signtime[3]++;
if(P1==0xf7)signtime[4]++;
if(P1==0xef)signtime[6]++;
if(P1==0xdf)signtime[7]++;
if(signtime[0]>2)
signtime[0]=0;
if(signtime[1]>9)
signtime[1]=0;
if(signtime[3]>5)
signtime[3]=0;
if(signtime[4]>9)
signtime[4]=0;
if(signtime[6]>5)
signtime[6]=0;
if(signtime[7]>9)
signtime[7]=0;
if(signtime[0]==2&&signtime[1]==4)
{signtime[0]=0;
signtime[1]=0;} }
if(flag==0)
{if(P1==0xfe)signdate[0]++;
if(P1==0xfd)signdate[1]++;
if(P1==0xfb)signdate[3]++;
if(P1==0xf7)signdate[4]++;
if(P1==0xef)signdate[6]++;
if(P1==0xdf)signdate[7]++;
if(signdate[0]>9)
signdate[0]=0;
if(signdate[1]>9)
signdate[1]=0;
if(signdate[3]>1)
signdate[3]=0;
if(signdate[4]>9)
signdate[4]=0;
if(signdate[6]>3)
signdate[6]=0;
if(signdate[7]>9)
signdate[7]=0;
if(signdate[3]==1&&signdate[4]==3)
{signdate[3]=0;
signdate[4]=1;}
if(signdate[6]==3&&signdate[7]==2)
{signdate[6]=0;
signdate[7]=1;} }
}
}
//***********时间刷新*************//
void timechange()
{signtime[7]+=1;
if(signtime[7]==10)//秒
{signtime[7]=0;
signtime[6]+=1;}
if(signtime[6]==6)//秒
{signtime[6]=0;
signtime[4]+=1;}
if(signtime[4]==10)//分
{signtime[4]=0;
signtime[3]+=1;}
if(signtime[3]==6)//分
{signtime[3]=0;
signtime[1]+=1;}
if(signtime[1]==10)//时
{signtime[1]=0;
signtime[0]+=1;}
if(signtime[0]==2&&signtime[1]==4)//时
{signtime[0]=0;
signtime[1]=0;
signdate[7]++;}
//大月31天
if((signdate[3]==0&&signdate[4]==1)||(signdate[3]==0&&signdate[4]==3)||(signdate[3]==0&&signdate[4]==5)||(signdate[3]==0&&signdate[4]==7)||(signdate[3]==0&&signdate[4]==8)||(signdate[3]==1&&signdate[4]==0)||(signdate[3]==1||signdate[4]==2))
{if(signdate[7]==10)//日
{signdate[7]=0;
signdate[6]+=1;}
if(signdate[6]==3&&signdate[7]==2)//日
{signdate[6]=0;signdate[7]=1;
signdate[4]+=1;}
if(signdate[4]==10)//月
{signdate[4]=0;
signdate[3]+=1;}
if(signdate[3]==1&&signdate[4]==2)//月
{signdate[3]=0;signdate[4]=1;
signdate[1]+=1;}
if(signdate[1]==10)//年
{signdate[1]=0;
signdate[0]+=1;} }
//小月30天
if((signdate[3]==0&&signdate[4]==4)||(signdate[3]==0&&signdate[4]==6)||(signdate[3]==0&&signdate[4]==9)||(signdate[3]==1&&signdate[4]==1))
{if(signdate[7]==10)//日
{signdate[7]=0;
signdate[6]+=1;}
if(signdate[6]==3&&signdate[7]==1)//日
{signdate[6]=0;signdate[7]=1;signdate[4]+=1;}
if(signdate[4]==10)//月
{signdate[4]=0;
signdate[3]+=1;}
if(signdate[3]==1&&signdate[4]==3)//月
{signdate[3]=0;signdate[4]=1;signdate[1]++;}
if(signdate[1]==10)//年
{signdate[1]=0;
signdate[0]+=1;} }
//2月28天
if(signdate[3]==0&&signdate[4]==2)
if(signdate[6]==2&&signdate[7]==9)
{signdate[7]=1;signdate[6]=0;signdate[4]+=1; } }
//***********一秒定时 50ms扫描键盘*************//
void t1(void) interrupt 3 using 2
{TR1=0;
TH1=tn1h;
TL1=tn1l;
TR1=1;
tcount++;
if(tcount==50) //一秒定时
{tflag=1;
tcount=0;
timechange();
}
keyscan();
}
//************显示程序************//
void display(void)
{uchar i=0;
uchar a=0;
for(i=0;i<8;i++)
{if(flag==1)
P2=signtime[i]+a;
else
P2=signdate[i]+a;
a+=32;
delay(50);
}
}
//*************主程序*************//
void main()
{TMOD=0x11; //定时器工作模式 方式一
TH0=tn0h; //
TL0=tn0l; //
TH1=tn1h; //
TL1=tn1l; //
TR1=1; //启动定时器一
ET0=0; //允许定时器0中断
ET1=1; //允许定时器1中断
EA=1;
while(1)
{display();
}
}
求单片机大神帮忙设计一个电路,51单片机制作led呼吸灯的
proteus仿真按理来说是不可能达得到效果的,因为这种仿真得有非常快的处理速度。我刚动手试了下和自己的想法相同,LED只会间断的闪烁。我是用AVR单片机,用51也是一样的。我这个程序也在实物试过效果很好。演示定时器1的快速PWM输出@利用快速PWM输出控制LED的亮度变化,达到呼吸灯的效果*\/ include<iom8...
利用51单片机,6个数码管设计一秒表。要求:刚开始时间为12点(120000...
define uint unsigned int define show P2 code table[16]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };code tuble[9]= { 0x00,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe };uchar t_h,t_m,t_s;bit KEY=1;sbit wela=...
基于51单片机的LED点阵显示屏系统的设计与实现的论文
以16×16显示器为例,你可以用并行扩展芯片8255实现点阵的行扫描,8255可以将单片机一个8位并行I\/O口扩展成16位(8255的PA口、PB口同时使用);列扫描的16位可以用两个TTL门74LS164(8位移位寄存器),74LS164再接ULN2803以对电流放大后再接16×16点阵。74LS164的移位触发端A、B可以接上一片的相邻输出...
简单的51单片机设计,用8个按键独立控制8个灯的程序!(高分!)要求如下...
include<reg52.h> define uint unsigned int define uchar unsigned char void delay(uint z);void main(){ uchar a;a=0x00;P0=0x00;\/\/P0输出; led共阴接法 P1输入按键另一端接地 P0加上拉电阻 P1=0xff;while(1){ P0=0x00;if(P1!=0xff){ a=P1;switch(a){ case 0xfe: P0=0x...
51单片机 串口设计c语言程序简单设计
第一题,已经测试成功:include <reg52.h> define uchar unsigned char define uint unsigned int uchar flag, a;sbit d = P0^0;void init(){ TMOD = 0x20; \/\/设置定时器1为工作方式2 TH1 = 0xfd;TL1 = 0xfd;TR1 = 1; \/\/开定时器1 REN = 1; \/\/开串口通信.SM0 = 0; ...
【急求】设计一个延时大约0.5秒的延时子程序(晶振频率12HZ);要求...
几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响。500ms延时子程序程序:(晶振12MHz,一个机器周期1us。)void delay500ms(void){ unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(...
51单片机 ,设计一个跑马灯程序,用软件延时,p0输出,怎么设计c语言,用p...
51单片机是单片机接触最早的,下边这个程序希望能帮到你。(只有主函数,就不进行硬件什么定义以及头文件包含什么的了)void delay(int times){\/\/延时函数,times控制延时时间 int i, j;for(i = 0; i < times; i++)for(j = 0; j < 210; j++);} int main(void){ unsigned char data, ...
用51单片机设计一个16位的跑马灯 要求通过一个开关控制3种不同的模式...
一个开关,比如导通了1秒一个模式,3秒一个模式,5秒一个模式。要么在一定时间内,检测开关导通的次数 我觉得应该弄的直观点,从51上接4个led做指示用,一个灯表示待运行,还有3个灯,亮一个表示模式1,亮两个表示模式2,亮3个表示模式3 开机的时候,待运行灯亮,等待设定模式,这时候开始按按键...
用51单片机设计一个秒表,计时范围从00:00-59:59.
include<reg51.h>#include "intrins.h"#include "absacc.h"#define uchar unsigned charuchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0xff};\/\/0-9unsigned char sec=0,min=0,scanled;unsigned char key=0,mode,time; unsigned char disdat[4];...
使用51单片机设计一个简易计数器,要求能够: 1)测量方波脉冲个数 2...
电子计数器测频有两种方式:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。直接测频法适用于高频信号的频率测量,间接测频法适用于低频信号的频率测量 这样可以么?
贠复弗奇: 自己做的,带年月日的 P1口接8个按键 P2低四位接74ls48P2.4接数码管dp高三位接74ls138#include<reg51.h> //头文件//#define uchar unsigned char#define uint unsigned int#define ulint unsigned long int #define tn0h 0x70#define tn0l 0x00#...
丽水市17696388896: 用51单片机设计简单的一个程序, - ?
贠复弗奇: #include<reg52.h> code unsigned char led[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};#define uint unsigned int#define uchar unsigned char sbit K1=P3^2; sbit K2=P3^3; char i=0; // //全局变量 void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=...
丽水市17696388896: 有没有什么基于51单片机的创意设计 - ?
贠复弗奇: 实例————旋转的时钟 有俩部分:电机部分和单片机控制发光二级管显示部分.功能:电动机带动一列发光数码管绕轴旋转,单片机控制发光二级管在旋转过程中的相应位置上点亮以指示时间和时刻.单片机内部进行时钟的计时操作,以控制旋转时钟显示正确的刻度.
丽水市17696388896: 求助:以51单片机为核心的课程设计 题目 总体方案 - ?
贠复弗奇: 单片机外接一个i2c总线的eeprom作为账户的存储器,通过程序比对键盘输入和存储器中存储的账户信息进行对比,正确则使一个输出引脚电平为高或低,具体根据硬件电路确定,使继电器吸合控制电子锁开门,密码错误,则给出提示.显示器可以使用lcd1602.基本思路就是这样.
丽水市17696388896: 基于51单片机的电子设计 - ?
贠复弗奇: 只要有兴趣都可以做的,智能车简单的那种,电路模块自己按电路焊接就可以了,至于编程也不是很难,尝试着做一下,我对那些也不是很懂,现在也在尝试做巡游避障智能车,也在学习中,就算失败了,也积累点经验不是什么坏事情,共勉吧
丽水市17696388896: 以MCS - 51系列单片机为核心,采用Intel8031或8051单片机设计时钟温度计 - ?
贠复弗奇: 摘要 2 Abstract 3 引言 51.1 选题背景 51.2 设计过程及工艺要求 5 第二章 方案的比较和论证 62.1 温度传感器的选择 62.2湿度传感器的选择 72.3信号采集通道的选择 7 第三章 系统总体设计 93.1 信号采集 103.1.1 温度传感器 103.1.2 湿度传感器 ...
丽水市17696388896: 以51单片机为核心器件,组成一个电子时钟系统. - ?
贠复弗奇: 调用定时器中断,发出一个频率1s的脉冲,用这个来计数.加上几个按键,按键接收到一个电平信号这个数也+1.满60清零,分钟那个数+1,分钟满60清零,小时加1.在循环中不停的和你设定的定时时间做对比,一旦相同就启动蜂鸣器提醒.
丽水市17696388896: 求一份51单片机的简单工程,比如流水灯,要有程序,可编译,还要有工程 - ?
贠复弗奇: 给你个51跑马灯流水灯的程序,比较经典还不难理解,包含编程的基本单元,我加了标注 //描述: 跑马灯程序 #include #include//延时子程序ms级别的 void delayms(unsigned char ms) { unsigned char i; while(ms--) { for(i = 0; i
丽水市17696388896: 求51单片机的简单开发项目 - ?
贠复弗奇: 做个基于51的DDS频率合成器吧,用AD9851. ① 要求其输出信号的幅值、脉宽、频率、持续时间等均可调 ② 具有历史数据存储与回放的功能 ③ 通过键盘设置波形和频率,由1602显示 一个AD9851大概50块,元器件成本大概就90不到吧,开板费100,板子费几块钱 (也可以去淘宝上直接买样板)总之两三百够了 QQ联系:355571829做不出来可提供源代码
丽水市17696388896: 以51单片机为控制核心,设计并开发直流转速控制系统,实现对普通小功率直流电机的转速测量和转速调节 - ?
贠复弗奇: 普通51单片机,定时器产生PWM输出,控制转速,H桥控制换向,普通直流电机加码盘测速,根据码盘脉冲反馈控制PWM的输出来控制转速,回答完毕.