4位数码管计时器
- 格式:docx
- 大小:13.20 KB
- 文档页数:7
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();}。
共阳四位八段数码管
标题:共阳四位八段数码管
共阳四位八段数码管是一种常见的显示器件,广泛应用于计时器、计数器等电子设备中。
它具有清晰的显示效果和简单的使用方式,为用户提供了便利。
数码管的工作原理是通过控制不同的管脚电平来点亮对应的数字或符号。
共阳四位八段数码管共有12个引脚,其中8个用于控制8段显示,另外4个引脚用于控制四位显示。
使用共阳四位八段数码管的步骤如下:首先,通过电路连接将数码管与主控芯片相连;然后,通过主控芯片发送信号控制数码管的显示内容;最后,数码管根据信号点亮相应的数字或符号。
在使用共阳四位八段数码管时,需要注意以下几点:首先,要保证电路连接正确,引脚对应无误;其次,要根据需要设置合适的亮
度,以便在不同环境下清晰可见;此外,要注意避免过高的电流和过高的温度,以防止数码管损坏。
总结起来,共阳四位八段数码管是一种常用的显示器件,具有清晰的显示效果和简单的使用方式。
在使用时要注意正确的连接和设置适当的亮度,以确保正常运行。
通过合理使用和维护,共阳四位八段数码管能够为用户提供稳定可靠的显示功能。
一、实训目的通过本次实训,使学生了解单片机计时器的基本原理和设计方法,掌握单片机计时器的硬件设计和软件编程,提高学生动手实践能力和创新能力。
二、实训内容本次实训设计一款基于51单片机的计时器,具备计时、暂停、复位功能,计时范围0-59秒,精确到0.1秒。
三、实训原理1. 计时原理:利用51单片机的定时器/计数器功能,通过定时器中断实现计时功能。
2. 暂停功能:在计时过程中,按下暂停按钮,关闭定时器中断,计时停止。
3. 复位功能:按下复位按钮,将计时器清零,数码管显示00.0。
四、实训步骤1. 硬件设计(1)选择51单片机作为核心控制单元。
(2)选择4位共阴数码管作为显示模块,用于显示计时时间。
(3)选择按键作为控制模块,实现计时、暂停、复位功能。
(4)设计电路原理图,包括单片机、数码管、按键等模块的连接。
2. 软件设计(1)编写程序,初始化定时器/计数器,设置中断时间。
(2)编写中断服务程序,实现计时功能。
(3)编写按键扫描程序,实现计时、暂停、复位功能。
(4)编写数码管显示程序,将计时时间显示在数码管上。
3. 系统调试(1)连接电路,将程序烧录到单片机中。
(2)测试计时功能,确保计时准确。
(3)测试暂停和复位功能,确保功能正常。
(4)测试按键功能,确保按键操作正确。
五、实训结果与分析1. 硬件设计结果根据设计要求,成功设计了一款基于51单片机的计时器,包括单片机、数码管、按键等模块的连接,电路原理图如下:```+3.3V||---[单片机]||---[数码管]||---[按键]|GND```2. 软件设计结果编写了完整的程序,实现了计时、暂停、复位功能,数码管显示计时时间,计时范围0-59秒,精确到0.1秒。
3. 系统调试结果经过调试,计时器功能正常,计时准确,按键操作正确,符合设计要求。
六、实训心得1. 通过本次实训,掌握了单片机计时器的基本原理和设计方法,提高了动手实践能力和创新能力。
2. 学会了如何使用51单片机定时器/计数器功能实现计时功能,了解了中断编程的基本方法。
/******************************************************************************************* **/#include<STC12C2052AD.H>//STC头文件/******************************************************************************************* ***///“程序开发调试设置项”#define DY_LI 9 //设置LED显示的亮度(值域:~9)#define DY_DELAY 12 //设置每一个点显示的时间长度(~20)/******************************************************************************************* ***/sbit DY_LED1_H1 =P3 ^ 0; //设置LED点阵屏连接的I/O口sbit DY_LED1_H2 =P3 ^ 1; //设置LED点阵屏连接的I/O口sbit DY_LED1_H3 =P3 ^ 2; //设置LED点阵屏连接的I/O口sbit DY_LED1_H4 =P3 ^ 3; //设置LED点阵屏连接的I/O口sbit DY_LED1_L1 =P1 ^ 0; //设置LED点阵屏连接的I/O口sbit DY_LED1_L2 =P1 ^ 1; //设置LED点阵屏连接的I/O口sbit DY_LED1_L3 =P1 ^ 2; //设置LED点阵屏连接的I/O口sbit DY_LED1_L4 =P1 ^ 3; //设置LED点阵屏连接的I/O口sbit DY_LED1_L5 =P1 ^ 4; //设置LED点阵屏连接的I/O口sbit DY_LED1_L6 =P1 ^ 5; //设置LED点阵屏连接的I/O口sbit DY_LED1_L7 =P1 ^ 6; //设置LED点阵屏连接的I/O口sbit DY_LED1_L8 =P1 ^ 7; //设置LED点阵屏连接的I/O口//sbit DY_BEEP =P2 ^ 2; //扬声器//sbit DY_KEY1 =P0 ^ 2; //按键(M键)(连接在P1.3和P0.2,读P0.2为低时表示有按键动作)//sbit DY_KEY2 =P3 ^ 0; //按键(+键)(连接在P4.6和P3.0,读P3.0为低时表示有按键动作)//sbit DY_KEY3 =P3 ^ 6; //按键(-键)(连接在P2.4和P3.6,读P3.6为低时表示有按键动作)#define DY_P1M0SET 0x00 //设置I/O口工作方式//00000000(左到右,高到低位)#define DY_P1M1SET 0x00 //设置I/O口工作方式//00101000#define DY_P3M0SET 0x00 //设置I/O口工作方式//00000000#define DY_P3M1SET 0xff //设置I/O口工作方式//10010100data unsigned char TIME_DD,TIME_MO,TIME_YY,TIME_WW,TIME_HH,TIME_MM,TIME_SS,ty;//设置日、月、年、周、时、分、秒和温度存放区data unsigned char cou = 0; // 软计数器,对ms时基信号累加到sdata unsigned char bn;//扫描映射全局变量data unsigned char KEY_BIT = 0;//按键值data unsigned char DY_PWM;//显示亮度data unsigned char DY_PWM2;//显示暂存unsigned char code disdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //无小数点数码管段码表(0~9)};/******************************************************************************************* **/void delay (unsigned int a){ // 用于点扫描的延时unsigned int i;while( --a != 0){for(i = 0; i < DY_DELAY; i++);}}/******************************************************************************************* **/void delay1ms (unsigned int a){ // 1ms延时程序(MHz 10倍于单片机速度时)unsigned int i;while( --a != 0){for(i = 0; i < 600; i++);}}/******************************************************************************************* **/void dis_off (void){P1 = ~DY_P1M1SET; //关所有显示P3 = ~DY_P3M1SET;delay(10-DY_PWM);}/******************************************************************************************* **/void displayHH1 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H1 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H1 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H1 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H1 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H1 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H1 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H1 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H1 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH2 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H2 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H2 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H2 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H2 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H2 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H2 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H2 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H2 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH3 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H3 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H3 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H3 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H3 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H3 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H3 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H3 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H3 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH4 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H4 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H4 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H4 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H4 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();if(i == 0x10){DY_LED1_H4 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H4 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H4 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H4 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void diplay_data (unsigned char l,unsigned char d){switch (l){//显示的列位置case 1://displayHH1(d); //将显示数据送入break;//case 2://displayHH2(d); //将显示数据送入break;//case 3://displayHH3(d); //将显示数据送入break;//case 4://displayHH4(d); //将显示数据送入break;//}}/******************************************************************************************* **/void init (void){ //上电初始化P1M0 = DY_P1M0SET;P1M1 = DY_P1M1SET;P3M0 = DY_P3M0SET;P3M1 = DY_P3M1SET;////dis_off();DY_PWM = DY_LI;////TMOD = 0x11; // 定时/计数器,1工作于方式TH0 = 0x3c; // 预置产生ms时基信号EA = 1; // 开总中断ET0 = 1; // 定时/计数器允许中断TR0 = 1; // 开闭定时/计数器//////TIME_DD = 18; //时间在首次使用的值,之后会在EEPROM自动记录上一天的值//TIME_MO = 5; //初始时间:年月日周一,时分秒//TIME_YY = 9;//TIME_WW = 1;//TIME_HH = 22;//TIME_MM = 13;//TIME_SS = 40;}/******************************************************************************************* **/void main (void){ //主程序init();while (1){diplay_data (1,disdata[TIME_MM/10]);diplay_data (2,disdata[TIME_MM%10]);diplay_data (3,disdata[TIME_SS/10]+0x80);diplay_data (4,disdata[TIME_SS%10]+0x80);}}/******************************************************************************************* ***/void tiem0(void) interrupt 1{ // T/C0中断服务程序(产生ms时基信号)cou++; // 软计数器加if(cou > 19){ // 计数值到(1s)cou = 0; // 软计数器清零TIME_SS++; // 秒计数器加(进位ms*100=1s)if(TIME_SS > 59){ // 秒计数值到TIME_SS = 0; // 秒计数器清零TIME_MM++; // 分计数器加(进位s=1m)if(TIME_MM > 59){ // 分计数到TIME_MM = 0; // 分计数器清零TIME_HH++; // 时计数器加(进位m=1h)if(TIME_HH > 23){ // 时计数到TIME_HH = 0; // 时计数器清零}}}}TH0 = 0x3c; // 重置定时常数TL0 = 0xb0;}/******************************************************************************************* ***//*************************************************************/*************************************************************/。
主题:51单片机4位数码管秒表代码内容:1. 介绍51单片机51单片机是一种通用的单片机系列,广泛应用于各种电子设备中。
它具有稳定性好、成本低、易于编程等优点,因此备受电子爱好者和专业工程师的青睐。
2. 4位数码管秒表4位数码管秒表是一种常见的电子计时器,通过LED数码管显示出当前的时间,可以用于各种计时应用,比如比赛计时、实验计时等。
3. 代码编写以下是一段简单的51单片机4位数码管秒表代码:```c#include <reg52.h>#include <intrins.h>// 数码管位选端口sbit wei1 = P2^2;sbit wei2 = P2^3;sbit wei3 = P2^4;sbit wei4 = P2^5;// 数码管显示段选端口sbit se2 = P0^2;sbit se1 = P0^3;sbit se4 = P0^4;sbit se3 = P0^5;unsigned char code smgduan[17] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; // 显示0~9,A,b,C,d,E,F,无的值void delay(unsigned int i) { // 延时while(i--);}void display(unsigned char *tab) { // 数码管显示 unsigned char i;for(i=0; i<7; i++) {P0=0; // 清除段选,以选中所显示的数码管 switch(i) { //确定位选case(0):wei1=0;wei2=wei3=wei4=1;break;case(1):wei2=0;wei1=wei3=wei4=1;break;case(2):wei3=0;wei1=wei2=wei4=1;break;case(3):wei4=0;wei1=wei2=wei3=1;break;default:break;}P0=tab[i]; //段码输出delay(5); // 数码管微秒级延迟}}void m本人n() {unsigned char a=0,b=0,c=0,d=0; //时钟的4位数据 unsigned int i=0;wei1=wei2=wei3=wei4=1; //段选、位选初始化while(1) {a++; // 微秒级的计数if(a==100) { //达到100a=0; b++; //b加1if(b==60) { //当b=60时b=0; c++; //c加1if(c==60) { //当c=60时c=0; d++; //d加1if(d==24) { //当d=24时d=0; //归零}}}}display(smgduan+d10); //显示个秒wei1=1;wei2=wei3=wei4=0; //位选delay(500); //延时display(smgduan+c/10+10); //显示十秒wei2=1;wei1=wei3=wei4=0; //位选delay(500); //延时display(smgduan+b10); //显示个分wei3=1;wei1=wei2=wei4=0; //位选delay(500); //延时display(smgduan+b/10+10); //显示十分wei4=1;wei1=wei2=wei3=0; //位选delay(500); //延时if(i++==200) { //当i=200时i=0;}}}```4. 代码分析该代码通过对51单片机的引脚进行控制,实现了4位数码管秒表的计时功能。
四位数码管工作原理 stm32STM32是一款高性能的微控制器,广泛应用于各种嵌入式系统中。
在嵌入式系统中,常常需要使用数码管来显示数字或字符信息。
本文将介绍数码管的工作原理,并结合STM32微控制器,探讨如何使用STM32驱动数码管。
数码管是一种能够显示数字或字符的电子显示器件。
它由多个发光二极管(LED)组成,每个LED可以独立控制发光与否。
根据LED 的排列方式和控制方式的不同,常见的数码管有共阳数码管和共阴数码管。
共阳数码管是指在数码管的每个LED的阳极都连接在一起,并与正极相连,而每个LED的阴极则分别独立连接到控制芯片的输出引脚。
当控制芯片将某个输出引脚的电平拉低时,对应的LED就会点亮。
通过控制不同的输出引脚,可以实现对数码管上各个LED的控制,从而显示不同的数字或字符。
共阴数码管与共阳数码管的原理基本相同,只是阳极和阴极的连接方式相反。
在共阴数码管中,每个LED的阴极都连接在一起,并与负极相连,而每个LED的阳极则分别独立连接到控制芯片的输出引脚。
当控制芯片将某个输出引脚的电平拉高时,对应的LED就会点亮。
在使用STM32驱动数码管时,需要通过控制STM32的输出引脚来控制数码管的LED。
以共阳数码管为例,假设数码管的每个LED分别连接到STM32的P0、P1、P2等输出引脚上。
当需要显示数字0时,将P0、P1、P2等输出引脚的电平拉低,对应的LED就会点亮;当需要显示数字1时,将P1、P2等输出引脚的电平拉低,P0引脚的电平拉高,对应的LED就会点亮,以此类推。
通过依次控制不同的输出引脚,可以实现对数码管的控制,从而显示不同的数字或字符。
为了方便控制数码管,我们可以编写相应的驱动程序。
首先,需要初始化STM32的输出引脚,并设置为输出模式。
然后,根据需要显示的数字或字符,通过控制相应的输出引脚的电平,点亮对应的LED。
为了实现动态显示,可以使用定时器中断来周期性地更新数码管的显示内容。
可预置数的4位计时器电路图计时器在数字电路中是一个常见的电子元件,它用于计算时间和频率。
本文将介绍一个可预置数的4位计时器电路图设计,可以用于实现许多计时器应用。
本设计使用CMOS技术,具有低功耗和高可靠性等优点。
下面,我们将讨论该电路的各个方面以及如何构建它。
设计要求该电路需要满足以下要求:1.实现可预置数值的计时器功能。
2.4个7段数码管用于显示计数结果。
3.使用 CMOS 技术实现,具有低功耗和高可靠性。
电路原理这个电路是由两个主要部分组成: 一个实现可预置计数的计数器和一个7段显示器。
计数器被控制以完成计数任务,而7段显示器用于显示数码。
可预置计数器可预置计数器使用74LS161集成电路(U1~U4)实现。
这是一个4位计数器,每个计数器有一个时钟输入和Ripple Up/Down控制。
此外,它还有4个可读/可写的并行加载预置输入。
这些输入用于预加载计数器,以便从预定值开始计数。
是可预载入计数器的简单示意图:可预载入计数器每个计数器的载入输入 (Pr) 被连接到 AND 门电路,用于根据 Pr-enable 输入和计数器控制信号的状态来控制数字的预置。
这些控制信号由另外一个74LS161( U5) 生成。
4位计数器的所有输出( Q0~Q3) 都被连接到 BCD数码显示器的输入端。
通过将计数器的二进制值转换成对应的BCD值,就可以控制显示器显示正确的数字。
BCD数码显示器本电路采用常见的共阴极式4位BCD数码管(段选型),其极性为共阴极,因此控制开关使能数字的输出。
每个数字字形由7个LED数码管组成,数字点由一个小LED指示灯表示。
数码管七段输入端是相应位置的数字选择器输入。
使用7447译U4的输出。
码器驱动数码管。
输入信号由计数器的BCD(Q0Q3)输出提供。
选通信号来自计数器U1BCD数码显示器电路图根据上述电路原理和设计要求,下面是可预置数的4位计时器电路的完整电路图:74LS161可预置计数器:Pr5 = /UD0 & /ISEL2 Pr4 = /UD0 & ISEL2Pr3 = /UD1 & /ISEL2 Pr2 = /UD1 & ISEL2Pr1 = /UD2 & /ISEL2 Pr0 = /UD2 & ISEL2U5和U6的接法如下:CP1 = /ISEL0 & /ISEL1CP2 = /ISEL0 & ISEL1CP3 = ISEL0 & /ISEL1CP4 = ISEL0 & ISEL17486异或门的接法如下:/UD0 = CP0 ^ CP1 /UD1 = CP1 ^ CP2/UD2 = CP2 ^ CP3 /UD3 = CP3 ^ CP4数码管(4个)和7447译码器的接法如下:7447 a b c d e f g--------|--|---|---|----|---|---|---NUM0 |0 |0 |0 |0 |0 |0 |1NUM1 |1 |0 |0 |1 |1 |1 |1NUM2 |0 |0 |1 |0 |0 |1 |0NUM3 |0 |0 |0 |1 |1 |1 |0NUM4 |1 |0 |0 |1 |1 |0 |0NUM5 |0 |1 |0 |1 |1 |0 |0NUM6 |0 |1 |0 |0 |0 |0 |0NUM7 |0 |0 |0 |1 |1 |1 |1NUM8 |0 |0 |0 |0 |0 |0 |0NUM9 |0 |0 |0 |1 |1 |0 |0总结本文介绍了一个可预置数的4位计时器电路图,该电路使用CMOS技术,具有低功耗和高可靠性等优点。
一、前言随着科技的不断发展,单片机技术在我国得到了广泛的应用。
为了提高我国单片机技术人才的综合素质,我们学校特开设了单片机实训课程。
本次实训,我们以设计一个单片机计时器为课题,通过实际操作,加深对单片机原理及编程的理解,提高我们的动手能力和团队协作能力。
二、实训目的1. 掌握单片机的基本原理和编程方法;2. 学会使用单片机外围设备,如数码管、按键等;3. 提高动手能力和团队协作能力;4. 熟悉单片机在实际工程中的应用。
三、实训内容1. 计时器硬件设计(1)单片机选择:本次实训选用STC89C52单片机作为核心控制单元。
(2)数码管显示:选用共阴型4位数码管,用于显示计时器的计时值。
(3)按键控制:选用4个轻触开关,分别控制计时器的开始、暂停、复位功能。
(4)时钟电路:选用晶振作为时钟源,产生稳定的时钟信号。
2. 计时器软件设计(1)主程序:负责初始化硬件资源、扫描按键、处理按键事件、更新数码管显示等。
(2)计时功能:通过定时器中断,实现计时器的计时功能。
(3)按键处理:根据按键事件,控制计时器的开始、暂停、复位功能。
(4)数码管显示:根据计时器的计时值,更新数码管显示。
四、实训步骤1. 硬件制作:根据设计图纸,焊接电路板,安装元器件。
2. 硬件调试:检查电路连接是否正确,测试电路功能。
3. 软件编写:使用C语言编写程序,实现计时器功能。
4. 软件调试:在单片机上编译、烧录程序,测试程序功能。
5. 集成调试:将硬件和软件结合,进行整体调试。
五、实训成果1. 成功设计并实现了一个单片机计时器。
2. 掌握了单片机的基本原理和编程方法。
3. 学会了使用单片机外围设备,如数码管、按键等。
4. 提高了动手能力和团队协作能力。
六、心得体会1. 通过本次实训,我对单片机技术有了更深入的了解,认识到理论知识与实际操作相结合的重要性。
2. 在实训过程中,我学会了如何查阅资料、解决问题,提高了自己的自学能力。
3. 在团队协作方面,我学会了如何与他人沟通、分工合作,提高了自己的团队协作能力。
时、分、秒计时器的设计一、实验目的掌握数码管动态显示的基本方法;掌握键盘按键控制的实现方法;根据已知电路和设计要求在实验板上实现时、分、秒计时器。
二、实验内容1、在STC89C52实验平台上实现时、分、秒时钟,4位数码管上显示分、秒或者时、分。
2、应用键盘控制时间的显示。
键盘按键控制“切换时分、分秒显示”、“启动停止”、“加秒显示内容”、“加分显示内容”、“加时显示内容”。
3、根据已知电路和设计要求在PROTEUS平台仿真实现时钟系统。
三、实验原理流程图如下所示:11、主程序流程图2、定时器/计数器T0中断服务程序流程图5 仿真分析在Proteus ISIS的80C51中载入程序生成的HEX文件,按开始符号运行,在数码管上观察程序运行结果,系统仿真结果如图5.1所示。
设计功能如下:(1)、初始状态:未按键之前,上电,数码显示00-00-00。
程序运行后,从秒针开始自动运行。
当秒数到59后,下一秒自动变为00,分针变为01,以此类推。
(2)、调整状态:仿真运行过程中,按p0键,系统暂停,此时,继续按p0无效。
第三次按p0,又开始,如此循环。
(3)、设置状态:按下p0暂停后,按p1,则时针加一,按下p2,则时针减一;按两下p0,在按下p1,则分针加一,按下p2,则分针减一。
时间显示格式为:时分秒;误差分析:实际程序到实验板中的电子钟显示存在一定的误差,误差来源可能为三个方面:第一,在程序运行过程中,时钟周期的不精确导致机器周期与理论值存在一定的差别;第二在中断一秒显示过程中,一些指令需要消耗一定的机器周期,使得一秒延时比实际要长;第三在键抖动的反应程度在运行中比较慢。
25.1实例仿真总结通过这次的课程设计我认识到我对单片机的知识学的太少了,对于书本上很多知识还不能灵活运用,都需要去巩固加强,我会在以后的学习中弥补我的不足。
我也了解了80C51集成环境和PROTEUS仿真软件的使用,用此软件练习电子时钟的设计,不仅使我熟悉了软件的使用方法,而且复习了单片机编程的相关知识。