四位数码管显示的数字钟设计与实现

合集下载

Arduino驱动MAX7219四位数码管显示时间

Arduino驱动MAX7219四位数码管显示时间

Arduino驱动MAX7219四位数码管显示时间Arduino驱动MAX7219四位数码管显示时间默认使用Pin 2为MOSI(数据发送)引脚,Pin 3为CS(片选)引脚,Pin 4为SCLK(时钟)引脚,如有需要请修改代码前三行的define。

#define MO 2#define CS 3#define CLK 4static int time_h = 21, time_m =25, time_s = 30; //此刻时间:时,分,秒int alarm_clock_h = 8, alarm_clock_m = 00; //闹钟时间unsigned long time = 0;unsigned char buffer_led[5] = { 0x00,};//缓存void SPI_init(void) //初始化SPI引脚{pinMode(CLK, OUTPUT);pinMode(MO, OUTPUT);pinMode(CS, OUTPUT);digitalWrite(CS, HIGH);digitalWrite(CLK, LOW);digitalWrite(MO, HIGH);}void SPI_send(unsigned char reg, unsigned char data) //spi 单向16位数据发送{int x;/*Serial.print("reg = ");Serial.print(reg, HEX);Serial.print(" data = ");Serial.println(data, HEX);*/digitalWrite(CS, LOW);for (x = 0; x < 8; x++){digitalWrite(MO, 0x80 & (reg << x)); //高位在前digitalWrite(CLK, HIGH);digitalWrite(CLK, LOW);}for (x = 0; x < 8; x++){digitalWrite(MO, 0x80 & (data << x)); //高位在前digitalWrite(CLK, HIGH);digitalWrite(CLK, LOW);}digitalWrite(CS, HIGH);}void lcd_init(void)//初始化Max7219配置{SPI_send(0x0b, 0x07); //scan-limitSPI_send(0x09, 0xff); //decode mode allSPI_send(0x0c, 0x01); //shutdown offSPI_send(0x0f, 0x00); //off display testSPI_send(0x0a, 0x04); //intensitydelay(100);}void clear(void)//清除显示{for (int i = 1; i <= 8; i++){SPI_send(i, 0x0F);}}void led_display(void)//显示时间{char cache = 0x00;if ((time_h / 10) == 0)buffer_led[0] = 0x00;else buffer_led[0] = time_h / 10;buffer_led[1] = time_h % 10 | 0x01;buffer_led[2] = time_m / 10;buffer_led[3] = time_m % 10;SPI_send(8, buffer_led[0]);SPI_send(7, buffer_led[1]);SPI_send(6, 0x0a);SPI_send(5, buffer_led[2]);SPI_send(4, buffer_led[3]);SPI_send(3, 0x0a);SPI_send(2, time_s / 10);SPI_send(1, time_s % 10);}void get_time()//获取时间并更新显示{static char ss = 1;static unsigned long time_cc = 0;if ((millis() - time_cc) > 1000 | millis() < 150)//秒{if (millis() <= 200) //若系统计时器溢出时时间,time_cc重计{time_cc = millis();time_s ++;delay(150);}else if (millis() > 200)//秒{time_s += (millis() - time_cc) / 1000;// time_cc = millis()-990; //时间快进time_cc = millis();buffer_led[4] = (0x01 & ss) << 5;ss = ~ss;}if (time_s > 59) //分{if (time_s - 60 > 1)//如果有延时间隔导致秒钟大于60秒,进行分钟缺失补偿 {time_m += time_s / 60;if (time_s % 60 == 0)time_m--;time_s = time_s - (time_s / 60) * 60;}else time_s = 0;time_m++;buffer_led[4] = 0x80;if (time_m > 59)//时{time_h++;time_m = (time_m - 60);buffer_led[4] = 0xf0;}if (time_h > 23){time_h = 0;time_s += 5; //时间误差补偿}}// Serial.print("millis="); // Serial.print(time_cc);// Serial.print(" time="); // Serial.print(time_h);// Serial.print(":");// Serial.print(time_m);// Serial.print(":");// Serial.println(time_s); led_display();//刷新数码管显示}}void setup(){Serial.begin(9600);SPI_init();lcd_init();clear();}void loop(){get_time();}。

单片机4位数码管电子时钟

单片机4位数码管电子时钟

单片机4位数码管电子时钟经过几天的努力,第一个51 单片机电子时钟终于出炉了,通过4 位数码管来显示时间,系统晶振11.0592MHZ,仿真图中用二极管代替时钟冒号闪烁,非门代替三极管,让仿真速度与真实速度达到一致,本设计用了6 个按钮来对时间及闹钟时间的调节、关闭,p3.2 接时间分加1 按钮,p3.3 接时间时加1 按钮,p3.4 接闹钟时间与当前时间切换按钮,按住不放显示闹钟的时间,闹钟初始化为00:00,放开按钮则显示当前时间,p3.5 接闹钟加1 按钮,p3.6 接闹钟时加1 按钮,p3.7 接关闭闹钟按钮有没有人会问1hei 本程序已经通过软件仿真和硬件制作.程序源代码:org 0000h ajmp main ;调至主程序org 000bh ;T0 中断入口地址ljmp inti0 org 001bh ;T1 中断入口地址ljmp inti1 org 0030hmain:mov tmod,#11h ;设T0、T1 为模式1 mov ie,#8ah ;开T0、T1 中断允许mov th0,#4ch ;赋T0 50ms初值mov tl0,#00h mov th1,#4ch ;赋T1 50ms 初值mov tl1,#00h mov sp,#60h ;设置堆栈指针mov r0,#20 ; T0 50ms 计数20 次mov 31h,#00 ;时间秒初始化mov32h,#00 ;时间分初始化mov 33h,#00 ;时间时初始化mov 38h,#00 ;闹钟分初始化mov 39h,#00 ;闹钟时初始化setb tr0 ;启动T0 setb tr1 ;启动T1loop:lcall display ;调用时间显示子程序lcall key ;调用时间调节按键子程序lcall keynz ;调用闹钟按键子程序ajmp loopinti0:push psw ;保护现场push acc clr ea ;关中断movth0,#4ch ;重赋50ms 初值mov tl0,#00h djnz r0,out ;对50ms 计数判断mov r0,#20 ;重赋50ms 计数值inc 31h ;秒加1 cpl p2.2 ;P2.2 取反输出mov a,31h cjne a,#60,out ;判秒是否加到60,没有加到中断返回mov 31h,#00 ;秒加到60,对秒清零inc 32h ;分加1 mov a,32h cjne a,#60,out ;判分是否加到60,没有加到就中断返回mov32h,#00 ;分加到60,对分清零inc 33h ;时加1 mov a,33h cjne a,#24,out ;判时是。

基于51单片机的4位数码管电子钟

基于51单片机的4位数码管电子钟

原理图附:源程序/***************************************************************************标题:定时器中断 24小时时钟程序效果:数码管显示24小时制时钟(具有调时功能)说明:使用12M晶振,key1=P3^7; key2=P3^6; key3=P3^5; key4=P3^4;数码管位选P1.0~P1.3 ,段选P0,共阳数码管******************************************************************************/ #include<reg52.h>#define uchar unsigned char;#define uint unsigned int;uchar position;uchar tt;uchar second;uchar minute;uchar hour;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0--9sbit smg_q = P1^0; //数码管千位引脚sbit smg_b = P1^1;sbit smg_s = P1^2;sbit smg_g = P1^3;sbit key1=P3^7; //按键定义sbit key2=P3^6;sbit key3=P3^5;sbit key4=P3^4;void keyscan(); //函数声明void display(unsigned char hour,unsigned char minute);void delay(unsigned int timer);void init();/***********************************************************主函数***********************************************************/ void main(){init();while(1){if(tt==20){tt=0;second++;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==24)hour=0;}}}keyscan();display(hour,minute);delay(1);}}/***********************************************************调时***********************************************************/ void keyscan(){if(key1==0) //小时加1{TR0=0;hour++;if(hour==24)hour=0;delay(200) ;TR0=1;}if(key2==0) // 小时减{TR0=0;hour--;if(hour<0)hour=23;delay(200) ;TR0=1;}if(key3==0) // 分钟加{TR0=0;minute++;if(minute==60)minute=0;delay(200) ;TR0=1;}if(key4==0) // 分钟减{TR0=0;minute--;if(minute<0)minute=59;delay(200) ;TR0=1;}}/***********************************************************初始化***********************************************************/ void init(){tt=0;position=0;second=0;minute=0;hour=0;smg_q=1;smg_b=1;smg_s=1;smg_g=1;key1=1;key2=1;TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}/***********************************************************定时器TO中断***********************************************************/ void t0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;}/***********************************************************显示***********************************************************/void display(unsigned char hour,unsigned char minute){P0=0XFF;switch(position){case 0:smg_g=1;smg_q=0;P0=table[hour/10];break;case 1:smg_q=1;smg_b=0;P0=table[hour%10];if(tt>=10)P0&=0x7f; //小数点以半秒的时间闪烁break;case 2:smg_b=1;smg_s=0;P0=table[minute/10];break;case 3:smg_s=1;smg_g=0;P0=table[minute%10];break;}position++;if(position>3)position=0;}/***********************************************************延时***********************************************************/ void delay(unsigned int time){unsigned int x,y;for(x=time;x>0;x--)for(y=110;y>0;y--);}。

4位简易秒表的设计与制作

4位简易秒表的设计与制作

4位秒表的设计与制作一、任务要求该任务要求设计并制作一个4位秒表,秒表有启动、停止和清零功能,显示时间为0到9999秒。

该任务是综合应用数码管动态显示、单片机定时计数器和中断系统设计一个具有启动、停止、清零和校时功能的,能显示0到9999秒的4位秒表。

二、设计方案提示4位秒表的设计与1位秒表设计基本相似,所不同的是4位秒表要显示4位数据,而且要有校时功能,所以它只是综合了键盘、定时器、中断系统和动态显示的应用。

多位数显示器是用数码管显示4位十进制数,如果采用数码管静态显示方法,4个数码管要占用4个I/O端口,将占用单片机的所有I/O口而无法实现其他功能,因此不能用静态显示方法实现多位数据的显示。

如何用单片机控制数码管实现多位数据的现实,而又不占用太多的I/O口呢?这就要用到--------数码管的动态显示。

4位秒表设计与1位秒表的设计在原理上是一样的,不同的是:4位秒表要显示4位数,利用前面的数码管显示方法需要4个并行I/0口,而启动停止和清零要占用2个I/O线,89C52单片机只有4个并行I/O口,因此这种显示方法不能满足4位秒表的功能。

那么,如何实现4位秒表的设计呢?这就是该任务的关键------数码管动态显示技术三、系统硬件设计参考:4位秒表电路原理图如图3-21所示,有启动停止、清零和校时电路;数码管的位选端分别接P2口的P2.0~P2.3,段选端接P0口,74LS245是驱动电路。

图3-21 4位秒表电路原理图硬件电路设计图3-17 4位数据显示器的硬件原理图图3-17是4位数据显示器的硬件原理图,数码管是共阳连接,P2口输出显示段码,74LS245驱动数码管显示,CE是片选端,低电平有效;4位数码管的公共端分别由P3.0、P3.1、P3.2、P3.3控制。

四、系统软件设计参考程序//功能:4位数码管动态显示“1234”//函数名:delay50ms//函数功能:采用定时器1、工作方式1实现50ms延时,晶振频率12MHz//形式参数:无//返回值:无void delay50ms(){ TH1=0x3c; // 置定时器初值TL1=0xb0;TR1=1; // 启动定时器1while(!TF1); // 查询计数是否溢出,即定时到,TF1=1TF1=0; // 50ms定时时间到,将定时器溢出标志位TF1清零}void main() //主函数{unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92}; //设置数字0~5字型码unsigned char i,w;TMOD=0x10; //设置定时器1工作方式1while(1) {w=0x01; //位选码初值为01Hfor(i=0;i<4;i++){P2=~w; //位选码取反后送位控制口P2口w<<=1; //位选码左移一位,选中下一位LEDP1=led[i]; //显示字型码送P1口delay50ms(); //延时50ms}}}4位秒表流程图如图3-22所示:包括主函数流程、定时器中断函数和显示函数流程图。

四位时钟设计方案

四位时钟设计方案

目录一.前言二.设计任务1.设计题目:4位数字时钟设计2.技术指标及设计要求3.给定条件及器件三.设计方案与实现1.硬件设计2.相关器件介绍3.数码管介绍4.数码管的驱动方式5.电路设计电路原理图如下,采用AT89C2051单片机制作,使用3~6V直流电源。

S1为复位按键,S2调时,S3调分;注意:1安装前检查元件,2元件安装极性和引脚方向。

此外J1 和J2是两根“飞线”,请先用电阻剪角焊接,然后焊接数码管。

四、总结五、附录元件清单六、参考文献一、前言当前,电子技术已经广泛应用于社会生活中,电子技术俨然成为了我们日常生活的必备技术,无论计算机、电视机、洗衣机还是手机、MP3播放器都不能缺少电子技术的支持。

电子技术综合课程设计是集电路分析、模拟电子技术、数字电子技术以及电路实验、模拟电子技术实验、数字电子技术实验等课程之后的一门理论与实践相结合的综合设计性课程。

作为电子信息领域的一员,无疑电子技术对我们的专业课学习至关重要,通过对《数字电子技术基础》、《模拟电子技术基础》等课程的学习,经过不懈的探讨努力,最终完成设计任务制作。

本次课程设计我们将设计一个四位数字时钟。

本系统采用以A T89C2051为主控芯片,实现电子时钟的设计并考虑节约系统的硬件,而且达到时钟功能为24小时的设计方式,显示时、分;具有快速校准时、分的功能,实现时间的调整,然后输出四位的显示器显示出来。

二、设计任务1、题目:4位数字时钟的设计2、技术指标及设计要求(1)显示小时、分钟时间(2)实现秒的量化显示(3)具有调整时间功能(4)手动复位显示功能3、综合条件及器件(1)单片机及相关外围器件(2)直流稳压电源4V(3)万用电路板(4)4联共阳数码管4、器件介绍1)数码管介绍数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。

四位电子钟电路和汇编源程序

四位电子钟电路和汇编源程序

RS T1P3.0(R XD)2P3.1(TXD)3XTAL24XTAL15P3.2(INT0)6P3.3(INT1)7P3.4(T0)8P3.5(T1)9GND 10P3.711P1.012P1.113P1.214P1.315P1.416P1.517P1.618P1.719VC C 20IC1AT89C 2051JTC130P C230PR110KVC CAN 2AN 1R2R3R4R5R6R7R8R9A 1B 2C 3D 4E 5F 6G 7DP8P19P210P311P4128.8.8.8.LEDDPY_7_SEGAVC CR10 4.7K R13 4.7KR11 4.7K R12 4.7K Q18550Q28550Q38550Q4855012JXZ CON2C5104C4470UF VC CC310UFA FB GC DPDE A B C D EFG DP 四位电子钟设计与制作电路原理图:此作品为四位电子钟,主要由单片机编程实现其功能,所以分有两部分一个硬件,一个是软件,硬件方面的电路图如上图,单片机采用ATMEL 公司生产的芯片AT89C2051里面有2K 字节的可反复擦写的Flash 程序存储器和128字节的随机存取数据存储器。

显示部分为0.56共阳极四位数码管,在电路中P1口输出段码数据送入四位数码管,P3口做扫描控制,控制数码管的显示。

Q1、Q2、Q3为8550三极管,信号经过放大送入P1、P2、P3、P4也就是数码管显示部分,AN1调整小时,AN2为调整分钟它们都接10脚然后接地.10脚接地,20脚接正电源,它们由3-6V 电源供电,可以用两节1.5V 的电池供电,也可以接USB 接口5V 供电.软件方面,程序里先定义两个中断定时器T0和T1,一个作为秒记数用,另一个作为调整时闪烁用,编程时先将P1和P3口数据清零,然后P1和P3作为动态扫描显示,由于人的眼睛有延迟性,当扫描频率非常高时人就感觉数码管一直亮着,而同时计数器在遵循时间的变化方式执行着分到了60分钟加1,时间为24小时制,就是到了24小时后自动为00:00. 元件清单:名称 型号 数量 单片机 AT89C2051 1 数码管 0.56四位共阳极 1三极管8550 4电阻4.7K 4 10K 1 220 8电容30PF 2 10uf 1 104 1石英晶体振荡器12M 1 电子钟源程序(汇编):MIAO BIT P2.0 ;秒点位HOU_S BIT P3.0 ;时十位HOU_G BIT P3.1 ;时个位MIN_S BIT P3.2 ;分十位MIN_G BIT P3.3 ;分个位H_KEY BIT P3.4 ;时调整键M_KEY BIT P3.5 ;分调整键SHAN BIT 0 ;秒点闪烁LEDBUS EQU P1 ;显示数据总线SECOND EQU 30H ;秒寄存器MINUTE EQU 31H ;分寄存器HOUR EQU 32H ;时寄存器TIM_1 EQU 33H ;定时器0中断次数TIM_2 EQU 34H ;定时器0中断次数;********************************ORG 0000H ;程序开始LJMP INITORG 000BH ;定时器0中断入口地址LJMP TIMER0ORG 0030H ;程序从30H开始;********************************; 单片机初始化INIT:MOV SECOND, #0 ;秒置0MOV MINUTE, #0 ;分置0MOV HOUR, #0 ;开机后显示0点MOV TIM_1, #10 ;中断10次为0.5秒MOV TIM_2, #2 ;0.5*2=1秒MOV SP, #60H ;堆栈指针指向60HMOV TMOD, #01H ;定时器0为模式1(16位)MOV TH0, #03CHMOV TL0, #0B0H ;50毫秒初值(晶振12M)SETB ET0 ;定时器0中断允许SETB TR0 ;启动定时器0SETB EA ;开总中断;********************************; 主程序MAIN:JNB H_KEY, HT ;时调整键按下转到HTJNB M_KEY, MT ;分调整键按下转到MTACALL DISP ;调用显示子程序AJMP MAIN ;转LOOP继续检测按键状态;********************************; 时间调整;----- 分调整 -----------------MT: ACALL DISP ;调用显示子程序JNB M_KEY, MT ;判断按键是否松开INC MINUTE ;分加一MOV A, MINUTECJNE A,#60, MAIN ;判断分是否加到60MOV MINUTE, #0 ;分到60变为0MOV SECOND, #0 ;秒置0AJMP MAIN;----- 时调整 -----------------HT: ACALL DISP ;调用显示子程序JNB H_KEY, HT ;判断按键是否松开INC HOUR ;时加1MOV A, HOURCJNE A,#24, MAINMOV HOUR, #0 ;判断时是否到24,时到24变0 AJMP MAIN;********************************; 显示子程序DISP:MOV DPTR, #LEDTAB ;数码管段码表首地址送DPTR MOV A, MINUTE ;分放入ACCMOV B, #10 ;B放入10DIV AB ;A/B,商在A余数在BMOVC A, @A+DPTR ;查表取分十位段码MOV LEDBUS, A ;段码送LEDBUS口显示MOV C, SHANMOV MIAO, C ;秒点闪烁CLR MIN_S ;打开分十位显示ACALL D1MS ;延时1毫秒SETB MIN_S ;关闭分十位显示MOV A, BMOVC A, @A+DPTR ;查表取分个位段码MOV LEDBUS, AMOV C, SHANMOV MIAO, C ;秒点闪烁CLR MIN_G ;打开分个位显示ACALL D1MS ;延时1毫秒SETB MIN_G ;关闭分十位显示MOV A, HOURMOV B, #10DIV AB ;拆分小时的十位和个位JZ DISP0 ;十位为0不显示十位MOVC A, @A+DPTRMOV LEDBUS, ACLR HOU_S ;打开时十位显示DISP0:ACALL D1MSSETB HOU_S ;关闭时十位显示MOV A, BMOVC A, @A+DPTRMOV LEDBUS, ACLR HOU_G ;打开时个位显示ACALL D1MSSETB HOU_G ;关闭时个位显示RET;********************************; 定时器0中断服务程序TIMER0:MOV A, #0B1H ;定时器0中断服务子程序ADD A, TL0 ;同步修正(参考本人的<如何是自制的单片机电子钟走时精准>)MOV TL0, AMOV TH0, #03CH ;重装定时器0初值PUSH ACC ;入栈保护ACC和PSWPUSH PSWDJNZ TIM_1, RETI_1MOV TIM_1, #10 ;中断10次为0.5秒CPL SHAN ;取反闪烁位DJNZ TIM_2, RETI_1MOV TIM_2, #2 ;1秒时间到INC SECOND ;秒加1MOV A, SECONDCJNE A,#60, RETI_1MOV SECOND, #0 ;秒到60变0INC MINUTE ;分加1MOV A, MINUTECJNE A,#60, RETI_1MOV MINUTE, #0 ;分到60变0INC HOUR ;时加1MOV A, HOURCJNE A,#24, RETI_1MOV HOUR, #0 ;时到24变0RETI_1: POP PSW ;出栈POP ACCRETI;********************************; 延时子程序D1MS: MOV R7, #2 ;延时1毫秒子程序D_1: MOV R6, #250 ;延时时间估算250*2*2=1000微秒=1毫秒DJNZ R6, $DJNZ R7, D_1RET;********************************; 数码管段码表LEDTAB:DB 14H,0D7H,4CH,45H,87H; 0 1 2 3 4DB 25H,024H,57H,04H,05H; 5 6 7 8 9END。

51单片机中4个数码管的显示实验

51单片机中4个数码管的显示实验

51单片机中4个数码管的显示实验一、实验目的:1、看懂电路原理图,明白4个共阳数码管的编程方式。

2、看懂参考程序,学会使用扫描法来对4个数码管进行扫描显示。

学会使用定时器。

二、实验设备:51通用实验板一个,51仿真器一个,40针仿真头一个,12V电源一个,串口线一条。

三、实验电路原理图:四、实验内容:4个数码管一次显示4个数字,下一次加4进行显示,数字最大为9,到9再从0重新进行显示。

中间有一定的时间延时。

改变数据用定时器进行设置。

五、实验步骤:安实物图的形式把实验设备连接在一起。

六、参考程序:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4个数码管的显示实验;使用70H,71H,72H,73H进行数码管显示数据存储。

75H进行定时器定时时间设置,发光二极管L1进行亮灭显示改变数据标志。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SETTIM EQU 75H;定时时间长短设定ORG 0000HLJMP MAINORG 000BHLJMP TIM0;定时器0中断ORG 0030HMAIN: ;主程序MOV SP,#07HMOV SETTIM ,#00HLCALL INIT;初始化数据MOV TMOD,#01H;设值定时器0MOV TH0,#00H;定时初值MOV TL0,#00HSETB EA;开总中断SETB ET0;开中断SETB TR0;开始定时器STAR:LCALL DISPLJMP STAR;****************************************;显示子程序DISP: MOV R0,#0FEHMOV R1,#70HDISP1:MOV A,R0MOV P2,AMOV A,@R1MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ALCALL DLYSINC R1MOV A,R0RL AMOV R0,AJB ACC.4,DISP1RET;***************************************;定时器0中断程序TIM0:CLR TR0CLR EAMOV A,SETTIMINC ACJNE A,#9,TM1LCALL CHGMOV A,#00HCPL P1.0;定时器运行标志,使L1灯不断闪动TM1: MOV SETTIM,AMOV TH0,#00HMOV TL0,#00HSETB EASETB TR0RETI;****************************改变要显示的值CHG:MOV R0,#70HMOV R3,#04HCH1:MOV A,@R0INC ACJNE A,#0AH,CH2MOV A,#00HCH2:MOV @R0,AINC R0DJNZ R3,CH1RET;********************************************;初始化程序INIT: ;初始化70H---73H中的数据,使用R0,R1,R3MOV R0,#00H;数据初值MOV R3,#04HMOV R1,#70H;4个数码管数据存储地址IN0:MOV A,R0MOV @R1,AINC R0INC R1DJNZ R3,IN0RET;*****************************************;延时程序DLYS: MOV R6,#5DLYS0:MOV R5,#150DJNZ R5,$DJNZ R6,DLYS0RET;*****************************************;数据表TAB:DB 0C0H,0F9H,0A4H,0B0H; 0,1,2,3DB 99H,92H,82H,0F8H;?,5,6,7DB 80H,90H,88H,83H;?,9,A,BDB 0C6H,0A1H,86H,8EH;C,D,E,FDB 8CH,89H,07fh,0bFH;P,H,.,-11001011END七、思考:修改一下程序,使用定时器2进行定时改变数据进显示。

单片机 4位时钟数码管

单片机 4位时钟数码管

单片机控制4位时钟数码管的方法如下:
连接硬件:将4位数码管的共阳(或共阴)引脚连接到单片机的I/O口,连接数码管的段选引脚到单片机的另外4个I/O口。

同时,连接一个晶振和相关的电容电阻到单片机的时钟输入引脚和地。

设置引脚:在代码中定义每个数码管引脚对应的I/O口为输出模式,用于控制数码管的显示。

编写代码:使用单片机的定时器功能,通过编程计算出每个数码管显示的数字对应的段选编码,并在定时器中断服务程序中更新数码管的显示。

调试程序:将程序下载到单片机中,通过观察数码管的显示效果,调整程序中的参数或代码,以达到预期的显示效果。

需要注意的是,具体的实现方式可能因单片机的型号和数码管的类型而有所不同,需要根据实际情况进行相应的调整。

4位数码管时钟笔记

4位数码管时钟笔记

4位数码管做时钟制作人:陈彦彧制作时间:2012年7月28日原件清单:使用知识:定时/计数器、中断I/O口的连接:功能介绍:使用定时器T0扫描数码管显示,使用定时器T1计时;使用键盘扫描来实现时间的调整;焊接电路图:源程序:/***************************************************** 程序设计:陈彦彧*****************************************************/ #include "iom16.h"#include "intrinsics.h"#define uchar unsigned char#define uint unsigned int#define s0 (PIND&0x01)#define s1 (PIND&0x02)#define s2 (PIND&0x04)#define s3 (PIND&0x08)__flash uchar SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uintcnt=0;uinti=0,j=0,a;/**************************/void delay_10nms(uint n){uinta,b,c;for(c=0;c<n;c++){for(b=15;b>0;b--){for(a=1;a>0;a--);}}}/**************************/#pragma vector=TIMER0_OVF_vect__interrupt void time0_ovf_isr(void){SREG=0x80;TCNT0=0X7d;if(++i>4){i=0;}switch(i){case 0:PORTA=SEG7[cnt%10];PORTB=0xfe;//break; case 1:PORTA=SEG7[(cnt/10)%10];PORTB=0xfd;//break; case 2:PORTA=SEG7[(cnt/100)%10];PORTB=0xfb;//break; case 3:PORTA=SEG7[cnt/1000];PORTB=0xf7;//break;case 4:PORTA=SEG7[cnt/1000];PORTB=0xff;break; }}/**************************/#pragma vector=TIMER1_OVF_vect__interrupt void time1_ovf_isr(void){TCNT1H=0X85;TCNT1L=0Xee;j++;PORTA=0X80;PORTB=0xfb;}/**************************/voidinit_devices(void){__disable_interrupt();TCNT0=0x7d;TCCR0=0x03;TCCR1B = 0x04;TCNT1H=0X85;TCNT1L=0Xee;DDRA=0xff;DDRB=0xff;DDRC=0xff;DDRD=0xff;PORTB=0x00;PORTA=0x00;PORTC=0xff;PORTD=0xff;DDRD=0x00;TIMSK=0X05;__enable_interrupt();}/**************************/void scan_s0(void){if(s0==0){delay_10nms(1000);if(s0==0){a=cnt%100;cnt=(cnt/100+1)*100+a;}delay_10nms(1000);}}/**************************/void scan_s1(void){if(s1==0){delay_10nms(1000);if(s1==0){a=cnt%100;cnt=(cnt/100-1)*100+a;}delay_10nms(1000);}}/**************************/void scan_s2(void){if(s2==0){delay_10nms(1000);if(s2==0){++cnt;}delay_10nms(1000);}}/**************************/void scan_s3(void){if(s3==0){delay_10nms(1000);if(s3==0){--cnt;}delay_10nms(1000);}}/**************************/void main(void){init_devices();while(1){scan_s0();scan_s1();scan_s2();scan_s3();if(j==60){++cnt;j=0;}if(cnt%100==99){cnt=cnt/100*100+59;}if(cnt%100==60){cnt=(cnt/100+1)*100;}if(cnt>=2400){ cnt=0; }}}。

单片机课程设计实验报告+基于单片机的数字时钟+含完整实验代码

单片机课程设计实验报告+基于单片机的数字时钟+含完整实验代码

单片机课程设计报告基于单片机的数字时钟姓名:班级:学号:一、前言利用实验板上的4个LED数码管,设计带有闹铃、秒表功能的数字时钟。

功能要求:a)计时并显示(LED)。

由于实验板上只有4位数码管,可设计成显示“时分”和显示“分秒”并可切换。

b)时间调整功能。

利用4个独立按钮,实现时钟调整功能。

这4个按钮的功能为工作模式切换按钮(MODE),数字加(INC),数字减(DEC)和数字移位(SHITF)。

c)定闹功能。

利用4个独立按钮设定闹钟时间,时间到以蜂鸣器响、继电器动作作为闹铃。

d)秒表功能。

最小时间单位0.01秒。

二、硬件原理分析1.电源部分电源部份采用两种输入接口(如上图)。

a)外电源供电,采用2.1电源座,可接入电源DC5V,经单向保护D1接入开关S1。

b)USB供电,USB供电口输入电源也经D1单向保护,送到开关S1。

注:两路电源输入是并连的,因此只选择一路就可以了,以免出问题。

S1为板子工作电源开关,按下后接通电源,提供VCC给板子各功能电路。

电路采用两个滤波电容,给板子一个更加稳定的工作电源。

LED为电源的指示灯,通电后LED灯亮。

2.蜂鸣器蜂鸣器分为有源和无源两种,有源即两引脚有一个直流电源就可以长鸣,无源则需要一个1K左右的脉冲才可以蜂鸣,因此对于按键的提示音及报警蜂鸣使用有源来得方便。

有源也可以当无源使用,而无源则不能当有源使用,当然用有源蜂鸣器作音乐发声会失真厉害。

如上图:单片机P15输出高低电平经R21连接三极管B极,控制三极管的导通与截止,从而控制蜂鸣器的工作。

低电平时三极管导通,蜂鸣器得电蜂鸣,高电平时三极管截止,蜂鸣器失电关闭蜂鸣。

电路使用一个四位共阳型数码管,四个公共阳级由三极管放大电流来驱动,三极管由P10-P13控制开与关。

数码管的阴级由P0口经过电阻限流连接。

例如,要十位的数码管工作,P12输出0,使三极管Q12导通,8脚得电,当P0口相应位有输出0时,点亮相应的LED灯组合各种字符数字。

4位单片机数字钟电子钟制作

4位单片机数字钟电子钟制作

1
PCB
专用 PCB
1
21
4 位数字电子钟调试说明
代码(冒号左边两 位,按 S1 加 1)
功能名称
01秒显示与调整
调位试,内按容S(2 加冒号1)右边两说明
按 S2 秒加 1
可以作为秒表使用
02走时分钟调整
走时分钟调整
03走时小时调整
走时小时调整
走时小时调整
04整点报时设置调整
05时间快慢调整 06第 1 路闹铃分钟调整 07第 1 路闹铃小时调整 08第 2 路闹铃分钟调整 09第 2 路闹铃小时调整
元件清单如下:
元件名称
规格型号
瓷片电容
30P
瓷片电容
104
电解电容
10uF/16-50V
电解电容
220uF/10V
四位绿色阴数码管 ORS-5463BG
20P IC 座
DIP 20
写入程序的芯片 STC11F02
12mm 电磁无源蜂鸣

12RT04CC
9P 排阻
200-
0 为所有整点报时,1
为 7-22 点报时,2 为
不整点报时
有 1-5 档,默认 2 档,
数字越大走时越快
第 1 路闹铃分钟显示
并设定
第 1 路闹铃小时显示
并设定
第 2 路闹铃分钟显示
并设定
第 2 路闹铃小时显示 并设定
此状态后进入正常走时
1/4W 电阻
10K
编号 C1, C2 C5 C3 C4 DS IC1 IC1
数量 2 1 1 1 1 1 1
LS1
1
PR1
1
Q1
1
R1, R2, R3, 4 R4

自制四位数码管显示的数字钟c程序

自制四位数码管显示的数字钟c程序
}
}
void ys()
{for(qw=255;qw>0;qw--)
for(qe=255;qe>0;qe--);
for(qw=255;qw>0;qw--)
for(qe=50;qe>0;qe--);
}
ቤተ መጻሕፍቲ ባይዱ
if(zz==120){zz=0;ss++;}
if(ss==10){ss=0;dd++;}
if(dd==6){dd=0;ff++;}
if(ff==10){ff=0;gg++;}
if(gg==2) {if(ff>=4){ff=0;gg=0;}}
if(gg>=3) {gg=0;}
}
}
void zhongduan() interrupt 1 //中断函
{ TH0=(65535-50000)/256; //定时器复初值
TL0=(65535-50000)%256;
z++;
if(z==80)
{z=0;
e=!e;
zz++;
sbit f=P2^5;//时间指示灯
sbit g=P2^6;//设置指示灯
sbit h=P2^7;//....
sbit i=P1^0;//时间设置按键
sbit j=P1^1;//返回
sbit k=P1^2;//加
sbit l=P1^3;//减
sbit m=P1^4;//定时设置
sbit y=P1^5;//启动定时
P0=shuzi[gg];d=1;d=0;

设计一个4位数码管时钟电路

设计一个4位数码管时钟电路

设计一个4位数码管时钟电路了解什么是4位数码管;四位数码管是一种半导体发光器件,其基本单元是发光二极管。

能显示4个数码管叫四位数码管。

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。

共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。

共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。

当某一字段的阴极为高电平时,相应字段就不亮。

共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。

共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。

当某一字段的阳极为低电平时,相应字段就不亮。

什么是时钟电路;1.就是产生像时钟一样准确的振荡电路;2.任何工作都按时间顺序。

(时钟电路一般由晶体震荡器,晶震控制芯片和电容组成)四位数码管怎么显示;利用单片机调节开关的高低电平的变化,然后显示在数码管上;四位数码管怎样驱动;1、静态驱动也称直流驱动。

静态驱动是指每个数码管的每一个段码都由一个单片机的I/O 端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。

静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O 端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

2、数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。

任务12 设计及制作4位LED数码管显示电路

任务12 设计及制作4位LED数码管显示电路

4位LED 数码管轮 流显示8 的控制程 序
1 12.1.2 跟我想 4位LED数码管有静态显示和动态显示两种结构。为了减少元器件及连线, 可选用动态显示的4位一体的LED数码管。用单片机的某个I/O口送数码管的显示 段码(字符数据),用另一I/O口的其中4位经过三极管驱动后分别作为4个数码 管的显示控制信号,当三极管导通时候对应的数码管显示。 在动手设计电路之前,让我们先学习有关LED数码管的知识。
任务12 设计及制作4位 任务 设计及制作 位LED数码管显示电路 数码管显示电路
2. 软件程序设计 所设计的程序要实现 动态显示的4位数码管同时 显示“8”字符。根据四位 一体数码管的动态显示原 理,首先从P0口送出显示 字符“8”的数据7FH,然 后通过P2口控制的位选信 号让每位数码管轮流显示, 通过延时子程序控制每位 数码管的显示时间。程序 控制流程图如图12-6所示。
通过工作任务实现教学做一体化在动手实践中学习理论知识在学习理论知识中教学做体化在动手实践中学习理论知识在学习理论知识中动手实践使理论教学与动手实践有机结合
学习情境2 LED数码管显示 数码显示在该情景下,首先制作LED数码管显示电路,并通过3个任务的 学习单片机控制LED数码管显示原理及硬件设计和软件编程的方法;学 习单片机定时计数器及中断控制等相关理论知识。通过工作任务实现 教、学、做一体化,在动手实践中学习理论知识,在学习理论知识中 动手实践,使理论教学与动手实践有机结合。 LED数码管显示模块
任务12 设计及制作4位 任务 设计及制作 位LED数码管显示电路 数码管显示电路
12.1.1 明确工作任务 设计单片机控制的4位LED数码管显示电路,并根据电路图在万用板上完成电 路焊接及根据本任务提供的程序调试电路。 4位LED数码管 显示模块

4位共阳数码管遥控时钟

4位共阳数码管遥控时钟
uchar naofs,naofg,naofen; //闹钟分钟 分钟十位和个位
uchar ds,dss,dsg;//继电器小时 小时十位和个位
uchar df,dfs,dfg;//继电器分钟 分钟十位和个位
//设置标志部分
uchar mode=0;//菜单
uchar yiwei=1;
dfs=df/10;//分十位
dfg=df%10;//分个位
dss=ds/10;//时十位
dsg=ds%10;//时个位
P0=table0[dfs];//分十位
P2=table2[3];
delay(10);
naofen=30;
ds=00;
df=30;
while(1)
{ if(!p30) //判断串口是不是有数据
{
iap=0x60; //执行自动下载的命令
}
jishi();//自动走时
TL0=(65535-50000)%256;
int_num++;
}
//定时器初始化函数
void inter_init()
{
EA=1; ///开总中断
ET0=1; //打开定时器T0
TMOD=0x01; //工作方式1
void de(z)//自己用的延迟
{
g n,m;
for(n=z;n>0;n--)
for(m=110;m>0;m--);
}
//初始化T0函数
void time0(void) interrupt 1 // 定时器T0服务子程序
{
TH0=(65535-50000)/256;

四位电子时钟

四位电子时钟

一、实训任务1、通过实训增强自己找材料,自主学习的能力。

2、通过实训学会焊接,测试电路的基本能力,学会熟练的运用Protues的使用。

3、通过实训锻炼自己并成功的制作四位数字时钟。

4、通过实训学会遇到问题解决问题的方法,能够调整心态,认真找到出错原因。

二、实训条件1、需要工具:电烙铁、万用表、剪刀。

2、需要软件:protues、Viso、电脑。

3、需要材料:集电极电容10uF、陶瓷片电容两个30PF、560k电阻8个、4.7K电阻6个、数码管4个、三极管4个、AT89C2051单片机1个、开关2个、石英晶提体1个。

三、实训要求1.学习掌握各种制作软件,熟练焊接。

2.利用Protues软件画出所设计电路的原理图、PCB板图。

3.撰写实训报告,并进行答辩。

四、实训内容(一)设计的总体思路1.资料查找,根据所要设计的题目查找相关资料,了解其设计原理及个元器件功能,掌握电子产品的设计流程。

2.原理图与 PCB,通过Protues软件制作原理图,若出现无封装库的情况则自行进行封装,建立新的元器件库,进而完成电路的仿真与PCB的制作。

3.焊接,焊接过程应注意电烙铁的温度,将元器件按照大小依次焊接于电路板上,焊接时避免烙铁过长时间的接触元器件,以免烫坏元器件,焊接工艺关系到电路能否顺利调试与运行,因此需耐心对待。

4.调试,调试目的是验证电路各部分的正确性,确定产品功能以及产品应用的可行性,调试时应先静态调试,利用万用表测量电路是否接通,检查元器件是否因焊接不当造成损坏,之后再加相应电压,分级测量各部分电压与电流与理论值是否相符,最后整调检验产品功能。

(二)设计方案1.设计要求1)要求每位成员收集资料,整理资料。

2)了解电路原理图,了解每个电路器件的功能。

3)要求焊接精细,注意串线。

2.设计流程图1 四位数字时钟设计流程图图2 四位数字时钟内部功能流程图图3 加一子程序流程图3. 元器件清单3.设计原理本设计为四位数字时钟,其主控芯片为AT89C2051单片机,使用3-6V直流电源供电。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

四位数码管显示的数字钟设计与实现
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。

由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定。

数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。

由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ 时间信号必须做到准确稳定。

通常使用石英晶体振荡器电路构成数字钟。

数字钟的工作原理
晶体振荡器电路晶体振荡器是构成数字式时钟的核心,它保证了时钟的走时准确及稳定。

图3-2所示电路通过cmos非门构成的输出为方波的数字式晶体振荡电路,这个电路中,cmos非门u1与晶体、电容和电阻构成晶体振荡器电路,u2实现整形功能,将振荡器输出的近似于正弦波的波形转换为较理想的方波。

输出反馈电阻R1为非门提供偏置,使电路工作于放大区域,即非门的功能近似于一个高增益的反相放大器。

电容c1、c2与晶体构成一个谐振型网络,完成对振荡频率的控制功能,同时提供了一个180度相移,从而和非门构成一个正反馈网络,实现了振荡器的功能。

由于晶体具有较高的频率稳定性及准确性,从而保证了输出频率的稳定和准确。

晶体XTAL 的频率选为32768HZ。

该元件专为数字钟电路而设计,其频率较低,有利于减少分频器级数。

从有关手册中,可查得C1、C2均为30pF。

当要求频率准确度和稳定度更高时,还可接入校正电容并采取温度补偿措施。

由于CMOS电路的输入阻抗极高,因此反馈电阻R1可选为10M。

较高的反馈电阻有利于提高振荡频率的稳定性。

非门电路可选74HC00。

#include
#define uchar unsigned char
uchar code shuzi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0};//0 1 2 3 4 5 6 7 8 9 0。

相关文档
最新文档