数码管显示时间及点阵显示字符
- 格式:doc
- 大小:25.50 KB
- 文档页数:8
数码管显示时间及点阵显示字符//数码管显示时间及点阵显示字符#include#include#define uchar unsigned char#define uint unsigned int//定义Max7219端口#define DUAN P0 //P0口控制段#define WEI P2 //P2口控制位sbit k_hour=P1^0; // 更改小时按键sbit k_min=P1^1; // 更改分钟按键sbit k_sec=P1^2; // 更改秒按键//定义数码管端口sbit Max7219_pinCLK = P1^2;sbit Max7219_pinCS = P1^1;sbit Max7219_pinDIN = P1^0;//Max7219位定义unsigned char key; //P3按键扫描(执行模块控制)code uchar seg7code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF }; //显示段码数码管字跟uchar wei[8]={0XFE,0XFD,0XFB,0XF7,0XEf,0XDf,0XBf,0X7f}; //位的控制端uchar numb[8]; //定义字符串uint sec=0,min,hour;//数码管初始定义uchar code disp2[7][8]={{0x00,0x3E,0x2A,0xFF,0xAA,0xBE,0xC0,0x00}, //电{0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00}, //一{0x00,0x00,0x1E,0x20,0x40,0x20,0x1E,0x00}, //V {0x00,0x00,0x4E,0x4A,0x4A,0x7A,0x00,0x00}, //5 {0x00,0x00,0x42,0x7E,0x42,0x00,0x00,0x00}, //I {0x00,0x0C,0x1E,0x3C,0x3C,0x1E,0x0C,0x00}, //love {0x00,0x00,0x3E,0x40,0x40,0x3E,0x00,0x00}, //U };char flag;//定义点阵显示字符void Delay_xms(uint x){uint i,j;for(i=0;i<x;i++)< p="">for(j=0;j<300;j++);}//公用的延时程序//功能:向MAX7219(U3)写入字节//入口参数:DATA//出口参数:无void Write_Max7219_byte(uchar DATA){uchar i;Max7219_pinCS=0;for(i=8;i>=1;i--){Max7219_pinCLK=0;Max7219_pinDIN=DATA&0x80;DATA=DATA<<1;if(flag)Delay_xms(500);Max7219_pinCLK=1;}}//功能:向MAX7219写入数据//入口参数:address、dat//出口参数:无//说明:void Write_Max7219(uchar address,uchar dat){Max7219_pinCS=0;Write_Max7219_byte(address); //写入地址,即数码管编号Write_Max7219_byte(dat); //写入数据,即数码管显示数字Max7219_pinCS=1;}void Init_MAX7219(void){Write_Max7219(0x09, 0x00); //译码方式:BCD码Write_Max7219(0x0a, 0x03); //亮度Write_Max7219(0x0b, 0x07); //扫描界限;8个数码管显示Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0 }void t_to_dis(){numb[0]=hour/10; //显示小时十位numb[1]=hour%10; //显示小时个位numb[2]=10; //显示横杠numb[3]=min/10; //显示分十位numb[4]=min%10; //显示分个位numb[5]=10; //显示横杠numb[6]=sec/10; //显示秒十位numb[7]=sec%10; //显示秒个位</x;i++)<>。
16*32点阵数字钟及汉字显示一.电路原理框架设计制作作品:16×32点阵显示数字钟及汉字显示实现功能:点阵显示的实时时钟以及汉字等字符的左移显示实用特征:采用双电源供电,断电后时钟由电池供电还能继续运行,而且精确性较高实现原理:1.时钟显示是由DS1302精确的时钟芯片产生时钟信号并将其送至单片机,经过单片机处理后再输送到点阵显示模块。
2.汉字显示并左移原理是先写入与本点阵驱动相应的代码进单片机,通过单片机控制程序取表进行处理后送点阵模块显示电路主要模块及原理图:1.单片机最小系统及控制按键电路2.DS1302与单片机接口电路DS1302除了系统上电时由系统供电外,如果主电源断电还有一电池给DS1302供电,防止断电后DS1302数据消失。
4.点阵行驱动模块电路行驱动采用74LS154(4-16线译码器)及PNP三极管,由于是16×32点阵显示功率较大故采用8550NP三极管。
5.点阵列驱动电路列驱动采用74HC595移位寄存器将控制位级连接入单片机,每个74HC595数据输入端单独接单片机。
16×32点阵模块由8块小的8×8点阵模块通过级连而拼成,共16行,32列。
二:主要元器件选择:单片机:AT89S51采用市场上比较常用的STC89C51三极管:点阵的行驱动电路用,这里采用PNP管,具体型号用8550 点阵块:为了电路简单,采用双色8×8点阵晶振:采用的是12MHZ的晶振电源部分:采用5V电压供电,采用的是L7805稳压芯片供电电阻:大部分是限流电阻,阻值为4.7K或10K,1K译码器:4-16线采用市场上较为常用的74LS154,用来作行驱动移位寄存器:采用74HC595移位寄存器作列驱动,驱动列端口分配及连接:P1.0-P1.2:DS1302与单片机接口P1.3-P1.4:K0,K1按键,用来调整时间,按下为0P0:P0口接点阵行驱动电路接译码器P2:P2口点阵列驱动电路接74HC595最后是做好之后的图。
8位数码管显示电子时钟C51单片机程序时间:2012-09-10 13:52:26 来源:作者:/*8位数码管显示时间格式51 用于小时加1操作52 用于小时减1操作53 用于分钟加1操作54 用于分钟减1操作05 —50—00 标示05点50分00秒*/#inClude<>sbit KEY仁P39 // sbit KEY2=P3A1; 定义端口参数sbitKEY3=P3A2;sbit KEY4=P3A3;sbit LED=P1A2; // 定义指示灯参数Code unsigned Char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 共阴极数码管0—9 unsigned Char StrTab[8]; // 定义缓冲区unsigned Char minute=19,hour=23,seCond; // 定义并初始化为12:30:00void delay(unsigned int Cnt){while(--Cnt);}/****************************************************************/* 显示处理函数*//******************************************************************/void Displaypro(void){StrTab[0]=tab[hour/10]; //显示小时StrTab[1]=tab[hour%10];StrTab[2]=0x40; // 显示"-"StrTab[3]=tab[minute/10]; // 显示分钟StrTab[4]=tab[minute%10];StrTab[5]=0x40; // 显示"-"StrTab[6]=tab[seCond/10]; // 显示秒StrTab[7]=tab[seCond%10];}main()TMOD |=0x01; TH0=0xd8; // TL0=0xf0; // 定时器 0 10ms inM crystal 初值用于计时ET0=1; TR0=1; TMOD |=0x10; TH1=0xF8; TL1=0xf0; // //定时器 1用于动态扫描初值ET1=1; TR1=1; EA =1; Displaypro(); while(1){ //调用显示处理函数if(!KEY1){//按键 1去抖以及动作delay(10000); if(!KEY1){hour++;if(hour==24)hour=0;Displaypro();// 正常时间 小时 加 1if(!KEY2) // 按键 2去抖以及动作delay(10000); if(!KEY2){hour--;if(hour==255)hour=23;//正常时间 小时减1Displaypro();}if(!KEY3){delay(10000); if(!KEY3) {//按键去抖以及动作minute++;if(minute==60)minute=0; Displaypro(); // 分加1} }if(!KEY4) //{delay(10000);if(!KEY4){minute--;if(minute==255)minute=59;Displaypro(); 按键去抖以及动作// 分减1/****************************************************************/* 定时器1中断/**************************************************************** void time1_isr(void) interrupt 3 using 0 //{static unsigned char num;TH1=0xF8; // 重入初值TL1=0xf0;switch (num){case 0:P2=0;P0=StrTab[num];break; //case 1:P2=1;P0=StrTab[num];break;case 2:P2=2;P0=StrTab[num];break;case 3:P2=3;P0=StrTab[num];break;case 4:P2=4;P0=StrTab[num];break;case 5:P2=5;P0=StrTab[num];break;case 6:P2=6;P0=StrTab[num];break;case 7:P2=7;P0=StrTab[num];break;default:break;*/定时器1用来动态扫描分别调用缓冲区的值进行扫描} num++; //if(num==8) 扫描8次,使用8个数码管}num=0;**************************************************************定时器0中断*/ /***************************************************************void tim(void) interrupt 1 using 1{static unsigned char count; //TH0=0xd8; // 重新赋值TL0=0xf0;count++;switch (count){case 0:case 20:case 40:case 60:case 80:Displaypro();break; // case50:P1=~P1;break; // default:break;}if (count==100){count=0;second++; // 秒加 1 if(second==60){second=0;minute++; // if(minute==60) {minute=0;hour++; // if(hour==24) hour=0;}定义内部局部变量隔一定时间调用显示处理半秒LED 闪烁分加1时加1基于单片机的LCD1602空制总线模式时间:2012-09-10 13:50:39 来源:作者:第一行显示"Welcome"; 第二行显示="Happy day"; 若要显示其他字符,请直接往数组LCMLineOne[16] 和LCMLineTwo[16] 填充相应的代码。
;///////////////////////////////////////////;本程序源代码由湖南工程职业技术学院提供.;专业单片机培训,让你学习单片机更容易.;程序员:蒋庆桥;QQ:xxxxxxxxx;本程序用汇编实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历,H_ADJ BIT P3.0 ;时/年调整M_ADJ BIT P3.1 ;分/月调整S_ADJ BIT P1.4 ;秒/日调整DT_SET BIT P1.6 ;时间/日期选择STR BIT P1.5;启动走时T_RST BIT P1.0 ;实时时钟复位线引脚T_CLK BIT P1.1 ;实时时钟时钟线引脚T_IO BIT P1.2 ;实时时钟数据线引脚HH_BIT EQU 40H ;时高位HL_BIT EQU 41H ;时低位MH_BIT EQU 42H ;分高位ML_BIT EQU 43H ;分低位SH_BIT EQU 44H ;秒高位SL_BIT EQU 45H ;秒低位TEMPER_L EQU 46HTEMPER_H EQU 47HYH_BIT EQU 48H ;年高位YL_BIT EQU 49H ;年低位MOH_BIT EQU 4aH ;月高位MOL_BIT EQU 4bH ;月低位DH_BIT EQU 4cH ;日高位DL_BIT EQU 4dH ;日低位SEC EQU 30HMIN EQU 31HHOUR EQU 32HDAY EQU 33HMONTH EQU 34HWEEK EQU 35HYEAR EQU 36HTEMPER equ 37hFLAG1 BIT 20h.0 ;DS18B20存在标志位DQ BIT P1.3A_BIT EQU 55HB_BIT EQU 56HDS1302_ADDR EQU 5EHDS1302_DATA EQU 5FHORG 00HLJMP STARTSTART:MOV SP,#60HMOV TMOD,#11HMOV TH0,#3CHMOV TL0,#0B0HMOV R0,#10SETB EASETB ET0SETB TR0MOV R1,37HMOV YEAR,#13H ;上电预置日期、时间MOV WEEK,#03H ;周1 MONMOV MONTH,#07H ;2011 04 25 12:00:00MOV DAY,#05HMOV HOUR,#23HMOV MIN,#00HMOV SEC,#00HMOV 50H,#0/////////////////////////////////////////////////////////////////////// ////MAIN:LCALL KEY//MAIN2:CALL FENLILCALL INIT_18B20LCALL GET_TEMPERcall CHANGEcall dispcall displayAJMP MAINFENLI:MOV A,YEARMOV B,#10HDIV ABMOV YL_BIT,BMOV YH_BIT,AMOV A,MONTHMOV B,#10HDIV ABMOV MOL_BIT,BMOV MOH_BIT,AMOV A,DAYMOV B,#10HDIV ABMOV DL_BIT,BMOV DH_BIT,AMOV A,HOURMOV B,#10HDIV ABMOV HL_BIT,BMOV HH_BIT,AMOV A,MINMOV B,#10HDIV ABMOV ML_BIT,BMOV MH_BIT,AMOV A,SECMOV B,#10HDIV ABMOV SL_BIT,BMOV SH_BIT,ARETKEY: ;按键子程序JB F0,MAIN10 ;F0=1,开始走时。
数字显示工作原理数字显示技术是现代电子产品中广泛采用的一种显示方式。
它通过将数字信号转换为可见的数字或字符形式,使得用户能够直观地获取信息。
数字显示技术应用广泛,涵盖了诸如数码时钟、计算器、手机、电视机等各个领域。
本文将介绍数字显示工作原理,并探讨一些常见的数字显示技术。
一、数字显示工作原理数字显示的工作原理基于电子器件的特性和操作原理。
主要有以下几种方式:1.数码管显示数码管是一种常见的数字显示设备,它由多个发光二极管(LED)组成。
通过控制不同的LED点亮或熄灭,可以显示不同的数字或字符。
数码管按照结构可以分为共阳极和共阴极两种。
共阳极数码管的阳极连接,而共阴极的则连接阴极。
通过在不同数字或字符对应的阳极或阴极上加电,可实现相应的数字或字符显示。
2.液晶显示液晶显示是一种利用液晶材料的光学特性来实现图形或数字显示的技术。
液晶由液晶分子组成,其分子结构可以通过电场来控制,并改变光的传播方式。
液晶显示屏通常由液晶层、驱动电路和背光模块构成。
驱动电路通过控制液晶层中的电场,使得液晶分子的排列发生改变,从而改变光线的透射与反射,实现显示效果。
3.发光二极管显示发光二极管(LED)是一种具有自发光特性的半导体器件。
通过控制LED的电流来控制其亮度,LED可以发射不同颜色的光。
在数字显示中,常用的LED颜色包括红色、绿色、蓝色等。
通过将LED按照不同的布局组成数字或字符的形状,可以实现数字显示的效果。
4.数码管显示数码管显示是一种通过在单元矩阵中控制单元的点亮或熄灭来实现数字显示的技术。
通常使用的单元矩阵包括7段数码管和14段数码管。
通过控制各个单元的点亮状态,可以显示不同的数字或字符。
二、常见的数字显示技术1.七段数码管显示七段数码管是一种常见的数字显示设备,通常用于显示0-9的数字和一些字母。
它由7个发光二极管组成,每个发光二极管对应一个段。
通过控制每个段的点亮状态,可以显示不同的数字或字符。
2.点阵显示点阵显示是一种通过多个小点组成的矩阵来显示数字或字符的技术。
16*32点阵数字钟及汉字显示一.电路原理框架设计制作作品:16×32点阵显示数字钟及汉字显示实现功能:点阵显示的实时时钟以及汉字等字符的左移显示实用特征:采用双电源供电,断电后时钟由电池供电还能继续运行,而且精确性较高实现原理:1.时钟显示是由DS1302精确的时钟芯片产生时钟信号并将其送至单片机,经过单片机处理后再输送到点阵显示模块。
2.汉字显示并左移原理是先写入与本点阵驱动相应的代码进单片机,通过单片机控制程序取表进行处理后送点阵模块显示电路主要模块及原理图:1.单片机最小系统及控制按键电路2.DS1302与单片机接口电路DS1302除了系统上电时由系统供电外,如果主电源断电还有一电池给DS1302供电,防止断电后DS1302数据消失。
4.点阵行驱动模块电路行驱动采用74LS154(4-16线译码器)及PNP三极管,由于是16×32点阵显示功率较大故采用8550NP三极管。
5.点阵列驱动电路列驱动采用74HC595移位寄存器将控制位级连接入单片机,每个74HC595数据输入端单独接单片机。
16×32点阵模块由8块小的8×8点阵模块通过级连而拼成,共16行,32列。
二:主要元器件选择:单片机:AT89S51采用市场上比较常用的STC89C51三极管:点阵的行驱动电路用,这里采用PNP管,具体型号用8550 点阵块:为了电路简单,采用双色8×8点阵晶振:采用的是12MHZ的晶振电源部分:采用5V电压供电,采用的是L7805稳压芯片供电电阻:大部分是限流电阻,阻值为4.7K或10K,1K译码器:4-16线采用市场上较为常用的74LS154,用来作行驱动移位寄存器:采用74HC595移位寄存器作列驱动,驱动列端口分配及连接:P1.0-P1.2:DS1302与单片机接口P1.3-P1.4:K0,K1按键,用来调整时间,按下为0P0:P0口接点阵行驱动电路接译码器P2:P2口点阵列驱动电路接74HC595最后是做好之后的图附:点阵时间显示源程序//=================================================================== ================////*标题:16*32点阵数字钟显示程序//*说明:时钟信号产生采用DS1302,列采用74HC595驱动(共4个),行驱动采用4 -16线译码器74LS154//*功能:通过动态扫描显示时钟,可显示时,分,秒,日期中的月和日//*作者:HEY//*日期:2006-05-29//*邮箱:billy3416@//*备注:此是我刚接触单片机时的一个小制作程序和电路设计上难免有不足之处请谅解//=================================================================== ================//#include <reg51.h>#include <stdlib.h>#define uchar unsigned char//=================================================================== ================////用到的引脚及端口定义//=================================================================== ================//sbit SERIALIN_0=P2^0; //定义P2.0为列向第1个74HC595的DATA输入sbit SERIALIN_1=P2^1; //定义P2.1为列向第2个74HC595的DATA输入sbit SERIALIN_2=P2^2; //定义P2.2为列向第2个74HC595的DATA输入sbit SERIALIN_3=P2^3; //定义P2.3为列向第2个74HC595的DATA输入sbit CLOCK_DATA=P1^0; //定义P1.0为DS1302的D ATA端口sbit CLOCK_RST=P1^1; //定义P1.1为DS1302的复位输出端口sbit CLOCK_SCLK=P1^2; //定义P1.2为DS1302的时钟信号状态控制sbit K0=P1^3; //K0为按键1,用来选择要调整时间的选项(时和分)sbit K1=P1^4; //K1为按键2,执行加1 sbit CLOCK=P2^4; //74HC595的移位时钟控制sbit LATCH=P2^5; //74HC595的锁存输出时钟控制void control(); //调整时间控制函数void time();uchar CLOCK_TIME[3]={0,0,0}; //定义时钟时间数据存储区,分别为(时,分,秒)uchar BUFFER[8]={0,0,0,0,0,0,0,0}; //显示缓冲区uchar YEAR[3]={0,0,0}; //定义时钟年月日数据存储区uchar temp[4]={0,0,0,0}; //定义74HC595的移位缓冲区uchar FLASH_STOP; //显示小时和分钟之间的两点控制位uchar sec_flash; //用单片机定时器模拟的一秒(用来控制小时和分中之间的两点)//=================================================================== ================////定义0-9的点阵显示代码段 8*8//=================================================================== ================//uchar code bmp[10][8]={{0xe3,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xe3}, //0{0xf7,0xc7,0xf7,0xf7,0xf7,0xf7,0xf7,0xc1}, //1{0xe3,0xdd,0xdd,0xfd,0xfb,0xf7,0xef,0xc1}, //2{0xe3,0xdd,0xfd,0xe3,0xfd,0xfd,0xdd,0xe3}, //3{0xfb,0xf3,0xeb,0xdb,0xdb,0xc1,0xfb,0xf1}, //4{0xc1,0xdf,0xdf,0xc3,0xfd,0xfd,0xdd,0xe3}, //5{0xe3,0xdd,0xdf,0xc3,0xdd,0xdd,0xdd,0xe3}, //6{0xc1,0xdd,0xfd,0xfb,0xf7,0xf7,0xf7,0xf7}, //7{0xe3,0xdd,0xdd,0xe3,0xdd,0xdd,0xdd,0xe3}, //8{0xe3,0xdd,0xdd,0xdd,0xe1,0xfd,0xdd,0xe3}, //9};//=================================================================== ================////定义0-9的点阵显示代码段 8*8 与上面不同的是多了小时和分钟之间的两点//=================================================================== ================//uchar code bmp_1[10][8]={{0xe3,0xdd,0x5d,0xdd,0xdd,0x5d,0xdd,0xe3}, //:0{0xf7,0xc7,0x77,0xf7,0xf7,0x77,0xf7,0xc1}, //:1{0xe3,0xdd,0x5d,0xfd,0xfb,0x77,0xef,0xc1}, //:2{0xe3,0xdd,0x7d,0xe3,0xfd,0x7d,0xdd,0xe3}, //:3{0xfb,0xf3,0x6b,0xdb,0xdb,0x41,0xfb,0xf1}, //:4{0xc1,0xdf,0x5f,0xc3,0xfd,0x7d,0xdd,0xe3}, //:4{0xe3,0xdd,0x5f,0xc3,0xdd,0x5d,0xdd,0xe3}, //:5{0xc1,0xdd,0x7d,0xfb,0xf7,0x77,0xf7,0xf7}, //:6{0xe3,0xdd,0x5d,0xe3,0xdd,0x5d,0xdd,0xe3}, //:7{0xe3,0xdd,0x5d,0xdd,0xe1,0x7d,0xdd,0xe3}, //:8};//=================================================================== ================////定义0-9的点阵显示代码段数码似的字模 8*8 显示数据前有一横杠将月和日格开//=================================================================== ================//uchar code bmp_2[10][8]={{0xff,0xff,0xf8,0xfa,0x8a,0xfa,0xf8,0xff}, //-0{0xff,0xff,0xfe,0xfe,0x8e,0xfe,0xfe,0xff}, //-1{0xff,0xff,0xf8,0xfe,0x88,0xfb,0xf8,0xff}, //-2{0xff,0xff,0xf8,0xfe,0x88,0xfe,0xf8,0xff}, //-3{0xff,0xff,0xfa,0xfa,0x88,0xfe,0xfe,0xff}, //-4{0xff,0xff,0xf8,0xfb,0x88,0xfe,0xf8,0xff}, //-5{0xff,0xff,0xf8,0xfb,0x88,0xfa,0xf8,0xff}, //-6{0xff,0xff,0xf8,0xfe,0x8e,0xfe,0xfe,0xff}, //-7{0xff,0xff,0xf8,0xfa,0x88,0xfa,0xf8,0xff}, //-8{0xff,0xff,0xf8,0xfa,0x88,0xfe,0xf8,0xff}, //-9};//=================================================================== ================////定义0-9的点阵显示代码段模拟数码似的字模 8*8//=================================================================== ================//uchar code bmp_3[10][8]={{0xff,0xff,0x8f,0xaf,0xaf,0xaf,0x8f,0xff}, //0{0xff,0xff,0xef,0xef,0xef,0xef,0xef,0xff}, //1{0xff,0xff,0x8f,0xef,0x8f,0xbf,0x8f,0xff}, //2{0xff,0xff,0x8f,0xef,0x8f,0xef,0x8f,0xff}, //3{0xff,0xff,0xaf,0xaf,0x8f,0xef,0xef,0xff}, //4{0xff,0xff,0x8f,0xbf,0x8f,0xef,0x8f,0xff}, //5{0xff,0xff,0x8f,0xbf,0x8f,0xaf,0x8f,0xff}, //6{0xff,0xff,0x8f,0xef,0xef,0xef,0xef,0xff}, //7{0xff,0xff,0x8f,0xaf,0x8f,0xaf,0x8f,0xff}, //8{0xff,0xff,0x8f,0xaf,0x8f,0xef,0x8f,0xff}, //9};//=================================================================== ================////定义0-59模拟七段数码管显示 8*8//=================================================================== ================//uchar code bmp_4[60][8]={{0xff,0xff,0x88,0xaa,0xaa,0xaa,0x88,0xff}, //00{0xff,0xff,0x8e,0xae,0xae,0xae,0x8e,0xff}, //01{0xff,0xff,0x88,0xae,0xa8,0xab,0x88,0xff}, //02{0xff,0xff,0x88,0xae,0xa8,0xae,0x88,0xff}, //03{0xff,0xff,0x8a,0xaa,0xa8,0xae,0x8e,0xff}, //04{0xff,0xff,0x88,0xab,0xa8,0xae,0x88,0xff}, //05{0xff,0xff,0x88,0xab,0xa8,0xaa,0x88,0xff}, //06{0xff,0xff,0x88,0xae,0xae,0xae,0x8e,0xff}, //07{0xff,0xff,0x88,0xaa,0xa8,0xaa,0x88,0xff}, //08{0xff,0xff,0x88,0xaa,0xa8,0xae,0x88,0xff}, //09{0xff,0xff,0xe8,0xea,0xea,0xea,0xe8,0xff}, //10{0xff,0xff,0xee,0xee,0xee,0xee,0xee,0xff}, //11{0xff,0xff,0xe8,0xee,0xe8,0xeb,0xe8,0xff}, //12{0xff,0xff,0xe8,0xee,0xe8,0xee,0xe8,0xff}, //13{0xff,0xff,0xea,0xea,0xe8,0xee,0xee,0xff}, //14{0xff,0xff,0xe8,0xeb,0xe8,0xee,0xe8,0xff}, //15{0xff,0xff,0xe8,0xeb,0xe8,0xea,0xe8,0xff}, //16{0xff,0xff,0xe8,0xee,0xee,0xee,0xee,0xff}, //17{0xff,0xff,0xe8,0xea,0xe8,0xea,0xe8,0xff}, //18{0xff,0xff,0xe8,0xea,0xe8,0xee,0xe8,0xff}, //19{0xff,0xff,0x88,0xea,0x8a,0xba,0x88,0xff}, //20{0xff,0xff,0x8e,0xee,0x8e,0xbe,0x8e,0xff}, //21{0xff,0xff,0x88,0xee,0x88,0xbb,0x88,0xff}, //22{0xff,0xff,0x88,0xee,0x88,0xbe,0x88,0xff}, //23{0xff,0xff,0x8a,0xea,0x88,0xbe,0x8e,0xff}, //24{0xff,0xff,0x88,0xeb,0x88,0xbe,0x88,0xff}, //25{0xff,0xff,0x88,0xeb,0x88,0xba,0x88,0xff}, //26{0xff,0xff,0x88,0xee,0x8e,0xbe,0x8e,0xff}, //27{0xff,0xff,0x88,0xea,0x88,0xba,0x88,0xff}, //28{0xff,0xff,0x88,0xea,0x88,0xbe,0x88,0xff}, //29{0xff,0xff,0x88,0xea,0x8a,0xea,0x88,0xff}, //30{0xff,0xff,0x8e,0xee,0x8e,0xee,0x8e,0xff}, //31{0xff,0xff,0x88,0xee,0x88,0xeb,0x88,0xff}, //32{0xff,0xff,0x88,0xee,0x88,0xee,0x88,0xff}, //33{0xff,0xff,0x8a,0xea,0x88,0xee,0x8e,0xff}, //34{0xff,0xff,0x88,0xeb,0x88,0xee,0x88,0xff}, //35{0xff,0xff,0x88,0xeb,0x88,0xea,0x88,0xff}, //36{0xff,0xff,0x88,0xee,0x8e,0xee,0x8e,0xff}, //37{0xff,0xff,0x88,0xea,0x88,0xea,0x88,0xff}, //38{0xff,0xff,0x88,0xea,0x88,0xee,0x88,0xff}, //39{0xff,0xff,0xa8,0xaa,0x8a,0xea,0xe8,0xff}, //40{0xff,0xff,0xae,0xae,0x8e,0xee,0xee,0xff}, //41{0xff,0xff,0xa8,0xae,0x88,0xeb,0xe8,0xff}, //42{0xff,0xff,0xa8,0xae,0x88,0xee,0xe8,0xff}, //43{0xff,0xff,0xaa,0xaa,0x88,0xee,0xee,0xff}, //44{0xff,0xff,0xa8,0xab,0x88,0xee,0xe8,0xff}, //45{0xff,0xff,0xa8,0xab,0x88,0xea,0xe8,0xff}, //46{0xff,0xff,0xa8,0xae,0x8e,0xee,0xee,0xff}, //47{0xff,0xff,0xa8,0xaa,0x88,0xea,0xe8,0xff}, //48{0xff,0xff,0xa8,0xaa,0x88,0xee,0xe8,0xff}, //49{0xff,0xff,0x88,0xba,0x8a,0xea,0x88,0xff}, //50{0xff,0xff,0x8e,0xbe,0x8e,0xee,0x8e,0xff}, //51{0xff,0xff,0x88,0xbe,0x88,0xeb,0x88,0xff}, //52{0xff,0xff,0x88,0xbe,0x88,0xee,0x88,0xff}, //53{0xff,0xff,0x8a,0xba,0x88,0xee,0x8e,0xff}, //54{0xff,0xff,0x88,0xbb,0x88,0xee,0x88,0xff}, //55{0xff,0xff,0x88,0xbb,0x88,0xea,0x88,0xff}, //56{0xff,0xff,0x88,0xbe,0x8e,0xee,0x8e,0xff}, //57{0xff,0xff,0x88,0xba,0x88,0xea,0x88,0xff}, //58{0xff,0xff,0x88,0xba,0x88,0xee,0x88,0xff}, //59};//=================================================================== ================////名称:delay//说明:延时函数//功能:根据需要取不同的值,实现不同的延时效果//=================================================================== ================//void delay(){uchar n;for(n=0;n<=125;n++);}void delay2(uchar m){uchar n;while(m--){for(n=0;n<=200;n++);}}//=================================================================== ================////名称:shift//说明:74HC595左移程序//功能:实现74HC595的移位输入//=================================================================== ================//void shift(){uchar j;for(j=0;j<8;j++){temp[0]=temp[0]<<1; //将temp[0]左移1位SERIALIN_0=CY; //进位输出到移位寄存器temp[1]=temp[1]<<1; //将temp[1]左移1位后SERIALIN_1=CY; //进位输出到移位寄存器temp[2]=temp[2]<<1; //将temp[2]左移1位后SERIALIN_2=CY; //进位输出到移位寄存器temp[3]=temp[3]<<1; //将temp[0]左移1位后的进位输出到移位寄存器SERIALIN_3=CY; //进位输出到移位寄存器CLOCK=1; //移位时钟控制移位CLOCK=0;}}//=================================================================== ================////名称:display//说明:显示函数//功能:将要显示的数据通过74HC595和74LS154用LED点阵显示出来//实现方法:该16X32点阵为8块小点阵,显示时将上下分开,上面显示时间。
六位数码管显示时分秒,通过四个按键进行时间的控制。
按下"调时"按键,时间显示停止;按下"选择时分秒"按键,数码管上方的发光二极管会点亮,对应着选中的要修改的时间是小时、分钟还是秒;按下"按下增加"按键,选中的时间将会增加;按下"完成"按键,时间继续显示。
已通过proteus仿真,电路图如下所示,希望大家多多指点,积极留言://编程:jumpmysoul#include<reg51.h>#define ulong unsigned longchar tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管数字码char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共阳数码管数字码(带小数点)#define LED P0 //P0为数码管的段选#define LIGHT P1 //P1为时分秒位的指示灯#define WS P2 //P2为数码管的位选sbit time_change=P3^0; //P3^0为“调时”按键sbit time_choose=P3^1; //P3^1为“选择时分秒”按键sbit time_inc=P3^2; //P3^2为“增加”按键sbit time_ok=P3^3; //P3^3为“完成”按键ulong t;ulong sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi; //定义秒,分,时,秒的个位,十位,分的个位,十位,时的个位,十位int choose_n; //按下“选择时分秒”按键的次数0 1160 160 1241141231 116021603124。
//6个数码管上依次显示时、分、秒,//按下S2一次,停止计时,按下S2两次,开始计时;//停止计时后,按下S3一次,小时数加1;//停止计时后,按下S4一次,分钟数加1;//停止计时后,按下S5一次,秒数加1#include<reg52.h>//头文件#define uint unsigned int#define uchar unsigned char //宏定义sbit wela=P2^7;sbit dula=P2^6;//数码管锁存位声明sbit s2=P3^4;sbit s3=P3^5;sbit s4=P3^6;sbit s5=P3^7;//独立按键位声明uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9段码uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位码uint num=0,num1,num2;//全局变量uchar shi,fen,miao;void delay(uint);void display(uchar,uchar);void keyscan();void main(){TMOD=0x01;TH0=(65536-50000)/256;//赋初值TL0=(65536-50000)%256;EA=1;//中断使能ET0=1;TR0=1;while(1){shi=num/3600;fen=num%3600/60;miao=num%60;if(shi==13)num=num%3600;if(fen==60)num=num/3600*3600+num%60;if(miao==60)num=num/60*60;keyscan();//按键if(num2==0){display(shi,0);//显示display(fen,2);display(miao,4);}else{switch(num2){case 1:display(shi,0);display(fen,2);display(miao,4);break;case 2:display(shi,0);break;case 3:display(fen,2);break;case 4:display(miao,4);break;}}}}void delay(uint x){uint i,j;//局部变量for(i=0;i<x;i++)for(j=0;j<110;j++);//延时子函数}void display(uchar disnum,uchar weinum){uchar sh,ge;sh=disnum/10;ge=disnum%10;P0=0xff;wela=1;wela=0;P0=table[sh];dula=1;dula=0;P0=table1[weinum];wela=1;wela=0;delay(2);//十位显示P0=0xff;wela=1;wela=0;P0=table[ge];dula=1;dula=0;P0=table1[weinum+1];wela=1;wela=0;delay(2);//个位显示*/}void keyscan(){if(s2==0){delay(15);//消抖if(s2==0){TR0=0;num2++;while(!s2);//松手检测if(num2==5){num2=0;TR0=1;}}}if(num2!=0){if(s3==0){delay(5);if(s3==0){while(!s3);num=num+3600;}}if(s4==0){delay(5);if(s4==0){num=num+60;while(!s4);}}if(s5==0){delay(5);if(s5==0){num++;while(!s5);}}}}void time0() interrupt 1{TH0=(65536-50000)/256;//赋初值TL0=(65536-50000)%256;num1++;if(num1==20){num1=0;num++;//if(num==43200)//num=0;}}。
/*******************************************************************//* 数码管上的时钟数字显示*//* 2012年5月*//* 作者:雷国强*//* 邮箱:940762196@ *//*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!*//* *//*******************************************************************///开始运行时,数码管个位一秒加一到59时分钟加一,到59:59时归0//有3*4的键盘,按下数字键时调节时钟定时,按*或者#时时钟继续走//用到proteus 6 画图//画图器件at89c52 两个两位数码管两个led灯1个四位与门两个330k电阻/*******************************************************************/#include <reg52.h>#include <INTRINS.H>#define uchar unsigned char //宏定义#define uint unsigned intsbit com1=P3^2;sbit com2=P3^5;sbit com3=P3^6; //定义位sbit com4=P3^7;sbit key1=P3^0;sbit key2=P3^1;uchar value1=0,value2=0,value3=0,value4=0,value=0,time,flag;fl;uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay_ms(uint z);void init(void);void display(void);/****************************************************************************** *************************//****************************************************************************** *************************/main(){init();while(1){ //主函数display(); //显示子函数}}/****************************************************************************** *************************//****************************************************************************** *************************/void init(void) //初始化{//定时器1TMOD=0x01;TH0=(65536-50000)/256; //初值50msTL0=(65536-50000)%256;TR0=1; //打开控制位ET0=1;EX1=1;IT1=1; //中断1EA=1;PT0=1;P2=0xff;P2=0x0f;}void key(void) interrupt 2 //判断按键并定时{uchar i=0,j=1,temp,temp0;delay_ms(5);temp=P2;if(temp!=0x0f){TR0=0;flag=1;temp0=temp&0x01;while(temp0!=0x0){temp>>=1;temp0=temp&0x01;i++;}P2=0xff;P2=0xf0;temp=P2;temp<<=1;temp0=temp&0x80;while(temp0!=0x00){temp<<=1;temp0=temp&0x80;j++;}value=i*3+j; //确定按键if(value==11)value=0;if(value!=10&&value!=12){ value4=value3;value3=value2;value2=value1;value1=value;}elseTR0=1;while(P2!=0xf0) delay_ms(5);}P2=0xff;P2=0x0f;if(flag==1){P1=table[value1];com4=0;com3=1;com2=1;com1=1;delay_ms(2);flag=-1;}else if(flag==-1){P1=table[value2];com4=1;com3=0;com2=1;com1=1;delay_ms(2);flag=0;}else if(flag==0){P1=table[value3];com4=1;com3=1;com2=0;com1=1;delay_ms(2);flag=-3;}else if(flag==(-3)) {P1=table[value4];com4=1;com3=1;com2=1;com1=0;delay_ms(2);flag=1;}}void time0(void) interrupt 1 //定时器0,实现时钟工作{TH0=(65536-50000)/256;TL0=(65536-50000)%256;time++;fl++;if(time==20){time=0;P1=table[value1];value1++;com1=1;com2=1;com3=1;com4=0;delay_ms(5);if(value1==10){value1=0;value2++;P1=table[value2];com1=1;com2=1;com3=0;com4=1;delay_ms(2);if(value2==6){value2=0;value3++;P1=table[value3];com1=1;com2=0;com3=1;com4=1;if(value3==10){value3=0;value4++;P1=table[value4];com1=0;com2=1;com3=1;com4=1;delay_ms(2);if(value4==6)value4=0;}}}}if(fl==10) //控制led等0.5s时灭,1s时亮{key1=1;key2=1;}if(fl==20){ fl=0;key1=0;key2=0;}}void display(void) //显示{P1=table[value1];com4=0;com3=1;com2=1;com1=1;delay_ms(2);P1=table[value2];com4=1;com3=0;com2=1;com1=1;delay_ms(2);P1=table[value3];com4=1;com3=1;com2=0;com1=1;delay_ms(2);P1=table[value4];com4=1;com3=1;com2=1;com1=0;delay_ms(2);}void delay_ms(uint z) //延时函数{uint x;while(z--)for(x=0;x<110;x++) ; //1ms}。
16×32点阵数字钟及汉字显示作者: HEY| 浏览数(6070) | 评论数(0) | 2007-08-09一.电路原理框架设计制作作品:16×32点阵显示数字钟及汉字显示实现功能:点阵显示的实时时钟以及汉字等字符的左移显示实用特征:采用双电源供电,断电后时钟由电池供电还能继续运行,而且精确性较高实现原理:1.时钟显示是由DS1302精确的时钟芯片产生时钟信号并将其送至单片机,经过单片机处理后再输送到点阵显示模块。
2.汉字显示并左移原理是先写入与本点阵驱动相应的代码进单片机,通过单片机控制程序取表进行处理后送点阵模块显示电路主要模块及原理图:1.单片机最小系统及控制按键电路2. DS1302与单片机接口电路DS1302除了系统上电时由系统供电外,如果主电源断电还有一电池给DS1302供电,防止断电后DS1302数据消失。
4.点阵行驱动模块电路行驱动采用74LS154(4-16线译码器)及PNP三极管,由于是16×32点阵显示功率较大故采用8550NP三极管。
5.点阵列驱动电路列驱动采用74HC595移位寄存器将控制位级连接入单片机,每个74HC595数据输入端单独接单片机。
16×32点阵模块由8块小的8×8点阵模块通过级连而拼成,共16行,32列。
二:主要元器件选择:单片机:AT89S51采用市场上比较常用的AT89S51三极管:点阵的行驱动电路用,这里采用PNP管,具体型号用8550点阵块:为了电路简单,采用双色8×8点阵晶振:采用的是12MHZ的晶振电源部分:采用5V电压供电,采用的是L7805稳压芯片供电电阻:大部分是限流电阻,阻值为4.7K或10K,1K译码器:4-16线采用市场上较为常用的74LS154,用来作行驱动移位寄存器:采用74HC595移位寄存器作列驱动,驱动列端口分配及连接:P1.0-P1.2:DS1302与单片机接口P1.3-P1.4:K0,K1按键,用来调整时间,按下为0 P0:P0口接点阵行驱动电路接译码器P2:P2口点阵列驱动电路接74HC595最后是做好之后的图附:点阵时间显示源程序//=================================================================== ================////*标题:16*32点阵数字钟显示程序//*说明:时钟信号产生采用DS1302,列采用74HC595驱动(共4个),行驱动采用4-16线译码器74LS154//*功能:通过动态扫描显示时钟,可显示时,分,秒,日期中的月和日//*作者:HEY//*日期:2006-05-29//*邮箱:billy3416@//*备注:此是我刚接触单片机时的一个小制作程序和电路设计上难免有不足之处请谅解//=================================================================== ================//#include <reg51.h>#include <stdlib.h>#define uchar unsigned char//=================================================================== ================////用到的引脚及端口定义//=================================================================== ================//sbit SERIALIN_0=P2^0; //定义P2.0为列向第1个74HC595的DATA输入sbit SERIALIN_1=P2^1; //定义P2.1为列向第2个74HC595的DATA输入sbit SERIALIN_2=P2^2; //定义P2.2为列向第2个74HC595的DATA输入sbit SERIALIN_3=P2^3; //定义P2.3为列向第2个74HC595的DATA输入sbit CLOCK_DATA=P1^0; //定义P1.0为DS1302的DATA端口sbit CLOCK_RST=P1^1; //定义P1.1为DS1302的复位输出端口sbit CLOCK_SCLK=P1^2; //定义P1.2为DS1302的时钟信号状态控制sbit K0=P1^3; //K0为按键1,用来选择要调整时间的选项(时和分)sbit K1=P1^4; //K1为按键2,执行加1sbit CLOCK=P2^4; //74HC595的移位时钟控制sbit LATCH=P2^5; //74HC595的锁存输出时钟控制void control(); //调整时间控制函数void time();uchar CLOCK_TIME[3]={0,0,0}; //定义时钟时间数据存储区,分别为(时,分,秒)uchar BUFFER[8]={0,0,0,0,0,0,0,0}; //显示缓冲区uchar YEAR[3]={0,0,0}; //定义时钟年月日数据存储区uchar temp[4]={0,0,0,0}; //定义74HC595的移位缓冲区uchar FLASH_STOP; //显示小时和分钟之间的两点控制位uchar sec_flash; //用单片机定时器模拟的一秒(用来控制小时和分中之间的两点)//=================================================================== ================////定义0-9的点阵显示代码段 8*8//=================================================================== ================//uchar code bmp[10][8]={{0xe3,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xe3}, //0{0xf7,0xc7,0xf7,0xf7,0xf7,0xf7,0xf7,0xc1}, //1{0xe3,0xdd,0xdd,0xfd,0xfb,0xf7,0xef,0xc1}, //2{0xe3,0xdd,0xfd,0xe3,0xfd,0xfd,0xdd,0xe3}, //3{0xfb,0xf3,0xeb,0xdb,0xdb,0xc1,0xfb,0xf1}, //4{0xc1,0xdf,0xdf,0xc3,0xfd,0xfd,0xdd,0xe3}, //5{0xe3,0xdd,0xdf,0xc3,0xdd,0xdd,0xdd,0xe3}, //6{0xc1,0xdd,0xfd,0xfb,0xf7,0xf7,0xf7,0xf7}, //7{0xe3,0xdd,0xdd,0xe3,0xdd,0xdd,0xdd,0xe3}, //8{0xe3,0xdd,0xdd,0xdd,0xe1,0xfd,0xdd,0xe3}, //9};//============================================================= ======================////定义0-9的点阵显示代码段8*8 与上面不同的是多了小时和分钟之间的两点//============================================================= ======================//uchar code bmp_1[10][8]={{0xe3,0xdd,0x5d,0xdd,0xdd,0x5d,0xdd,0xe3}, //:0{0xf7,0xc7,0x77,0xf7,0xf7,0x77,0xf7,0xc1}, //:1{0xe3,0xdd,0x5d,0xfd,0xfb,0x77,0xef,0xc1}, //:2{0xe3,0xdd,0x7d,0xe3,0xfd,0x7d,0xdd,0xe3}, //:3{0xfb,0xf3,0x6b,0xdb,0xdb,0x41,0xfb,0xf1}, //:4{0xc1,0xdf,0x5f,0xc3,0xfd,0x7d,0xdd,0xe3}, //:4{0xe3,0xdd,0x5f,0xc3,0xdd,0x5d,0xdd,0xe3}, //:5{0xc1,0xdd,0x7d,0xfb,0xf7,0x77,0xf7,0xf7}, //:6{0xe3,0xdd,0x5d,0xe3,0xdd,0x5d,0xdd,0xe3}, //:7{0xe3,0xdd,0x5d,0xdd,0xe1,0x7d,0xdd,0xe3}, //:8};//============================================================= ======================////定义0-9的点阵显示代码段数码似的字模8*8 显示数据前有一横杠将月和日格开//============================================================= ======================//uchar code bmp_2[10][8]={{0xff,0xff,0xf8,0xfa,0x8a,0xfa,0xf8,0xff}, //-0{0xff,0xff,0xfe,0xfe,0x8e,0xfe,0xfe,0xff}, //-1{0xff,0xff,0xf8,0xfe,0x88,0xfb,0xf8,0xff}, //-2{0xff,0xff,0xf8,0xfe,0x88,0xfe,0xf8,0xff}, //-3{0xff,0xff,0xfa,0xfa,0x88,0xfe,0xfe,0xff}, //-4{0xff,0xff,0xf8,0xfb,0x88,0xfe,0xf8,0xff}, //-5{0xff,0xff,0xf8,0xfb,0x88,0xfa,0xf8,0xff}, //-6{0xff,0xff,0xf8,0xfe,0x8e,0xfe,0xfe,0xff}, //-7{0xff,0xff,0xf8,0xfa,0x88,0xfa,0xf8,0xff}, //-8{0xff,0xff,0xf8,0xfa,0x88,0xfe,0xf8,0xff}, //-9};//============================================================= ======================////定义0-9的点阵显示代码段模拟数码似的字模8*8//============================================================= ======================//uchar code bmp_3[10][8]={{0xff,0xff,0x8f,0xaf,0xaf,0xaf,0x8f,0xff}, //0{0xff,0xff,0xef,0xef,0xef,0xef,0xef,0xff}, //1{0xff,0xff,0x8f,0xef,0x8f,0xbf,0x8f,0xff}, //2{0xff,0xff,0x8f,0xef,0x8f,0xef,0x8f,0xff}, //3{0xff,0xff,0xaf,0xaf,0x8f,0xef,0xef,0xff}, //4{0xff,0xff,0x8f,0xbf,0x8f,0xef,0x8f,0xff}, //5{0xff,0xff,0x8f,0xbf,0x8f,0xaf,0x8f,0xff}, //6{0xff,0xff,0x8f,0xef,0xef,0xef,0xef,0xff}, //7{0xff,0xff,0x8f,0xaf,0x8f,0xaf,0x8f,0xff}, //8{0xff,0xff,0x8f,0xaf,0x8f,0xef,0x8f,0xff}, //9};//============================================================= ======================////定义0-59模拟七段数码管显示8*8//============================================================= ======================//uchar code bmp_4[60][8]={{0xff,0xff,0x88,0xaa,0xaa,0xaa,0x88,0xff}, //00{0xff,0xff,0x8e,0xae,0xae,0xae,0x8e,0xff}, //01{0xff,0xff,0x88,0xae,0xa8,0xab,0x88,0xff}, //02{0xff,0xff,0x88,0xae,0xa8,0xae,0x88,0xff}, //03{0xff,0xff,0x8a,0xaa,0xa8,0xae,0x8e,0xff}, //04{0xff,0xff,0x88,0xab,0xa8,0xae,0x88,0xff}, //05{0xff,0xff,0x88,0xab,0xa8,0xaa,0x88,0xff}, //06{0xff,0xff,0x88,0xae,0xae,0xae,0x8e,0xff}, //07{0xff,0xff,0x88,0xaa,0xa8,0xaa,0x88,0xff}, //08{0xff,0xff,0x88,0xaa,0xa8,0xae,0x88,0xff}, //09{0xff,0xff,0xe8,0xea,0xea,0xea,0xe8,0xff}, //10{0xff,0xff,0xee,0xee,0xee,0xee,0xee,0xff}, //11{0xff,0xff,0xe8,0xee,0xe8,0xeb,0xe8,0xff}, //12{0xff,0xff,0xe8,0xee,0xe8,0xee,0xe8,0xff}, //13{0xff,0xff,0xea,0xea,0xe8,0xee,0xee,0xff}, //14{0xff,0xff,0xe8,0xeb,0xe8,0xee,0xe8,0xff}, //15{0xff,0xff,0xe8,0xeb,0xe8,0xea,0xe8,0xff}, //16{0xff,0xff,0xe8,0xee,0xee,0xee,0xee,0xff}, //17{0xff,0xff,0xe8,0xea,0xe8,0xea,0xe8,0xff}, //18{0xff,0xff,0xe8,0xea,0xe8,0xee,0xe8,0xff}, //19{0xff,0xff,0x88,0xea,0x8a,0xba,0x88,0xff}, //20{0xff,0xff,0x8e,0xee,0x8e,0xbe,0x8e,0xff}, //21{0xff,0xff,0x88,0xee,0x88,0xbb,0x88,0xff}, //22{0xff,0xff,0x88,0xee,0x88,0xbe,0x88,0xff}, //23{0xff,0xff,0x8a,0xea,0x88,0xbe,0x8e,0xff}, //24{0xff,0xff,0x88,0xeb,0x88,0xbe,0x88,0xff}, //25{0xff,0xff,0x88,0xeb,0x88,0xba,0x88,0xff}, //26{0xff,0xff,0x88,0xee,0x8e,0xbe,0x8e,0xff}, //27{0xff,0xff,0x88,0xea,0x88,0xba,0x88,0xff}, //28{0xff,0xff,0x88,0xea,0x88,0xbe,0x88,0xff}, //29{0xff,0xff,0x88,0xea,0x8a,0xea,0x88,0xff}, //30{0xff,0xff,0x8e,0xee,0x8e,0xee,0x8e,0xff}, //31{0xff,0xff,0x88,0xee,0x88,0xeb,0x88,0xff}, //32{0xff,0xff,0x88,0xee,0x88,0xee,0x88,0xff}, //33{0xff,0xff,0x8a,0xea,0x88,0xee,0x8e,0xff}, //34{0xff,0xff,0x88,0xeb,0x88,0xee,0x88,0xff}, //35{0xff,0xff,0x88,0xeb,0x88,0xea,0x88,0xff}, //36{0xff,0xff,0x88,0xee,0x8e,0xee,0x8e,0xff}, //37{0xff,0xff,0x88,0xea,0x88,0xea,0x88,0xff}, //38{0xff,0xff,0x88,0xea,0x88,0xee,0x88,0xff}, //39{0xff,0xff,0xa8,0xaa,0x8a,0xea,0xe8,0xff}, //40{0xff,0xff,0xae,0xae,0x8e,0xee,0xee,0xff}, //41{0xff,0xff,0xa8,0xae,0x88,0xeb,0xe8,0xff}, //42{0xff,0xff,0xa8,0xae,0x88,0xee,0xe8,0xff}, //43{0xff,0xff,0xaa,0xaa,0x88,0xee,0xee,0xff}, //44{0xff,0xff,0xa8,0xab,0x88,0xee,0xe8,0xff}, //45{0xff,0xff,0xa8,0xab,0x88,0xea,0xe8,0xff}, //46{0xff,0xff,0xa8,0xae,0x8e,0xee,0xee,0xff}, //47{0xff,0xff,0xa8,0xaa,0x88,0xea,0xe8,0xff}, //48{0xff,0xff,0xa8,0xaa,0x88,0xee,0xe8,0xff}, //49{0xff,0xff,0x88,0xba,0x8a,0xea,0x88,0xff}, //50{0xff,0xff,0x8e,0xbe,0x8e,0xee,0x8e,0xff}, //51{0xff,0xff,0x88,0xbe,0x88,0xeb,0x88,0xff}, //52{0xff,0xff,0x88,0xbe,0x88,0xee,0x88,0xff}, //53{0xff,0xff,0x8a,0xba,0x88,0xee,0x8e,0xff}, //54{0xff,0xff,0x88,0xbb,0x88,0xee,0x88,0xff}, //55{0xff,0xff,0x88,0xbb,0x88,0xea,0x88,0xff}, //56{0xff,0xff,0x88,0xbe,0x8e,0xee,0x8e,0xff}, //57{0xff,0xff,0x88,0xba,0x88,0xea,0x88,0xff}, //58{0xff,0xff,0x88,0xba,0x88,0xee,0x88,0xff}, //59};//============================================================= ======================////名称:delay//说明:延时函数//功能:根据需要取不同的值,实现不同的延时效果//============================================================= ======================//void delay(){uchar n;for(n=0;n<=125;n++);}void delay2(uchar m){uchar n;while(m--){for(n=0;n<=200;n++);}}//============================================================= ======================////名称:shift//说明:74HC595左移程序//功能:实现74HC595的移位输入//============================================================= ======================//void shift(){uchar j;for(j=0;j<8;j++){temp[0]=temp[0]<<1; //将temp[0]左移1位SERIALIN_0=CY; //进位输出到移位寄存器temp[1]=temp[1]<<1; //将temp[1]左移1位后SERIALIN_1=CY; //进位输出到移位寄存器temp[2]=temp[2]<<1; //将temp[2]左移1位后SERIALIN_2=CY; //进位输出到移位寄存器temp[3]=temp[3]<<1; //将temp[0]左移1位后的进位输出到移位寄存器SERIALIN_3=CY; //进位输出到移位寄存器CLOCK=1; //移位时钟控制移位CLOCK=0;}}//============================================================= ======================////名称:display//说明:显示函数//功能:将要显示的数据通过74HC595和74LS154用LED点阵显示出来//实现方法:该16X32点阵为8块小点阵,显示时将上下分开,上面显示时间。
数码管时分秒动态显示1、目的:数码管显示时、分、秒,实现计时功能。
2、原理:定时器产生中断,一秒钟计数一次,计数值转换成时、分、秒后,数码管动态显示。
3、原理图4、函数思路。
单片机工作频率是12MHZ,定时器12分频后累加计数,也就是1us计数一次。
定时一秒,定时器装入初值50000,则需进入中断20次,才能实现(50000*20=100000=1s)!数码管动态显示,要求控制显示延时时间和消隐。
累计计数转换成时、分、秒,转换思路是计数分割。
一分等于60,秒,一小时等于60分。
计数累加,计数一次,秒加1,;计数60次,分加1,;计数3600次,时加1.计数86400次,24小时满,而后计数清零。
5、程序#include<reg52.H>#include<intrins.H> // 加载头文件#define uchar unsigned char // 宏定义无符号字符型#define uint unsigned long int // 宏定义无符号长整型uint num ; // 定义num和cunt为全局变量,全局更改有效uchar cunt ;uchar tab1[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; // 数码管段选编码高电平有效uchar code tab2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //数码管位选编码,低电平有效void display(uint num ); // 显示函数函数声明void delay (); // 延时函数声明void init () // 中断初始化{TMOD=0x01; // 设置定时器T0为16位定时模式TH0=(65535-50000)/256; // T0装入初值50000TL0=(65535-50000)%256; // / 取整,%取余。
/******************************************************** 计时器*** 用到138译码器P2^2 P2^3 P2^4*** 数码管接到P0端口*** 通过按K4可以切换闹铃与时间显示*** 按K1可以调秒数(调设置时间的秒数,后同),按K2可以调分数,K3可以调小时数*****************************************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit Beep = P1^5 ;sbit K1=P3^1;sbit K2=P3^0;sbit K3=P3^2;sbit K4=P3^3;#define First LSA=0;LSB=0;LSC=0 //138译码器位数设置#define Second LSA=1;LSB=0;LSC=0#define Third LSA=0;LSB=1;LSC=0#define Fourth LSA=1;LSB=1;LSC=0#define Fifth LSA=0;LSB=0;LSC=1#define Sixth LSA=1;LSB=0;LSC=1#define Seventh LSA=0;LSB=1;LSC=1#define Eighth LSA=1;LSB=1;LSC=1uchar code DIG_CODE[16]={0x03f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码uchar Time=0;uchar miao1=0,miao2=0,fen1=0,fen2=0,shi1=0,shi2=0;char Setmiao1=-1,Setmiao2=0,Setfen1=0,Setfen2=0,Setshi1=0,Setshi2=0;void TimerConfiguration();void delayms(uchar x);void Timer(); //时间显示void SetingTime(); //时间设置void Clock(); //闹铃void SetingClock(); //闹铃时间设置void SetingClockDisplay(); //闹钟设置显示void Delay(unsigned int i) ; //蜂鸣器所用延时main(){uchar Num=1;Beep=0;TimerConfiguration();while(1){if(K4==0) //通过K4来选择是计时还是设置闹铃{delayms(1);if(K4==0){Num++;while(!K4);}}if(Num==2){Num=0;}if(Num){SetingClock();}else{SetingTime();Timer();Clock();}}}void SetingTime() //时间设置{if(K1==0){delayms(1);if(K1==0){miao1++;while(!K1);}else{}}if(K2==0){delayms(1);if(K2==0){fen1++;while(!K2);}else{}}if(K3==0){delayms(1);if(K3==0){shi1++;while(!K3);}else{}}void Timer() //时间显示{if(Time==20||Time>20) //每秒miao1++{Time=0;miao1++;}else //显示:在第一位显示秒的个位{P0=0x00;First;P0=0x00;P0=DIG_CODE[miao1];}if(miao1==10){miao1=0;miao2++;}else //显示秒的十位{P0=0x00;Second;P0=0x00;P0=DIG_CODE[miao2];}if(miao2==6){miao2=0;fen1++;}P0=0x00; //显示第三位的“-”Third;P0=0x00;P0=0x40;if(fen1==10){fen1=0;fen2++;}else //显示分的个位{P0=0x00;Fourth;P0=0x00;P0=DIG_CODE[fen1];}if(fen2==6){fen2=0;shi1++;}else //分的十位{P0=0x00;Fifth;P0=0x00;P0=DIG_CODE[fen2];}P0=0x00; //显示第六位的“-”Sixth;P0=0x00;P0=0x40;if(shi1==10){shi1=0;shi2++;}else //显示时的个位{P0=0x00;Seventh;P0=0x00;P0=DIG_CODE[shi1];// P0=0x00;}if(shi2==2){shi2=0;}else //显示时的十位{P0=0x00;Eighth;P0=0x00;P0=DIG_CODE[shi2];// P0=0x00;}}void SetingClock() //闹铃时间设置{SetingClockDisplay(); //闹钟设置显示/*************通过按键来设置闹铃时间**********/if(K1==0){delayms(1);if(K1==0){Setmiao1++;while(!K1);}else{}}if(K2==0){delayms(1);if(K2==0){Setfen1++;while(!K2);}else{}}if(K3==0){delayms(1);if(K3==0){Setshi1++;while(!K3);}else{}}/***********时间的进位设置******************/if(Setmiao1==10){Setmiao1=0;Setmiao2++;}if(Setmiao2==6){Setmiao2=0;Setfen1++;}if(Setfen1==10){Setfen1=0;Setfen2++;}if(Setfen2==6){Setfen2=0;Setshi1++;}if(Setshi1==10){Setshi1=0;Setshi2++;}if( (Setshi2==2)&&(Setshi1==3) ) //即23时{Setshi1=0;Setshi2=0;}}void Clock() //闹铃{if( (Setmiao1==miao1)&&(Setmiao2==miao2)&&(Setfen1==fen1)&&(Setfen2==fen2) &&(Setshi1==shi1)&&(Setshi2==shi2) ){while(1){Beep=1;Delay(5);Beep=0;Delay(5);}}}void SetingClockDisplay() //闹钟设置显示{P0=0x00;First;P0=0x00;P0=DIG_CODE[Setmiao1];P0=0x00;Second;P0=0x00;P0=DIG_CODE[Setmiao2];P0=0x00;Fourth;P0=0x00;P0=DIG_CODE[Setfen1];P0=0x00;Fifth;P0=0x00;P0=DIG_CODE[Setfen2];P0=0x00;Seventh;P0=0x00;P0=DIG_CODE[Setshi1];P0=0x00;Eighth;P0=0x00;P0=DIG_CODE[Setshi2];}void TimerConfiguration() //中断的设置{TMOD = 0x01; //选择工作方式1TH0 = 0x3C; //设置初始值,定时50MSTL0 = 0xB0;EA = 1; //打开总中断ET0 = 1; //打开定时器0中断TR0 = 1; //启动定时器0}/****************************************************************************** ** 函数名 : Timer0()* 函数功能 : 定时器0中断函数* 输入 : 无* 输出 : 无******************************************************************************* /void Timer0() interrupt 1{TH0 = 0x3C; //设置初始值TL0 = 0xB0;Time++;}void delayms(uchar x) //x*10毫秒{uchar a,b,c;for(c=x;c>0;c--)for(b=38;b>0;b--)for(a=130;a>0;a--);}void Delay(unsigned int i) //蜂鸣器用延时函数{char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}。
8位共阴极数码管动态显示时间,可调节,调节的数闪烁显示//本例程为共阴极数码管;//在普中单片机上通过实验;//8位数码管动态显示时间,可调节,//调节时间时,调节的数闪烁显示;//比较两种闪烁的方法;#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit tiaojie=P3^0;sbit jia=P3^1;sbit jian=P3^2;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};uchar a,b,num1,num2,flag100ms,flag1s,flagtj;uchar miao,fen,shi,flagjia,flagjian;bit flag_1s;uchar code wela[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchar dula[8]={0,0,1,1,2,2,3,3};void delay(uint z);void intc();void keyscan();void disp();void main(){intc();while(1){keyscan();disp();}}//================void intc(){TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;ET0=1;EA=1;TR0=1;}void timer0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;a++;if(a==10){flag100ms=1;}if(a==100){a=0,flag1s=1,miao++;flag_1s=~flag_1s;}if(miao==60){miao=0,fen++;}if(fen==60){fen=0,shi++;if(shi>12)shi=1;}}//====================void disp(){uchar i;dula[7]=miao%10;dula[6]=miao/10;dula[5]=10;dula[4]=fen%10;dula[3]=fen/10;dula[2]=10;dula[1]=shi%10;dula[0]=shi/10;/*switch(flagtj)//第一种方法实现闪烁显示{case 1: if(flag_1s==1){dula[7]=11;dula[6]=11;}else{dula[7]=miao%10;dula[6]=miao/10;}break;case 2: if(flag_1s==1){dula[4]=11;dula[3]=11;}else{dula[4]=fen%10;dula[3]=fen/10;}break;case 3: if(flag_1s==1){dula[1]=11;dula[0]=11;}else{dula[1]=shi%10;dula[0]=shi/10;}break;case 0:break;}for(i=0;i<8;i++){ P0=table[dula[i]];P2=wela[i];delay(10);P0=0;}*/for(i=0;i<8;i++)//第二种闪烁显示方法{switch(flagtj){case 1:if(i>5&&i<8){if(flag_1s==1)P0=0;elseP0=table[dula[i]];}elseP0=table[dula[i]];break;case 2:if(i>2&&i<5){if(flag_1s==1)P0=0;elseP0=table[dula[i]];}elseP0=table[dula[i]];break;case 3:if(i>=0&&i<2){if(flag_1s==1)P0=0;elseP0=table[dula[i]];}elseP0=table[dula[i]];break;case 0:P0=table[dula[i]];break;}P2=wela[i];delay(10);P0=0;}}//=====================void delay(uint z){uint x;uchar y;for(x=0;x<z;x++)for(y=0;y<112;y++);}//===========================void keyscan(){if(tiaojie==0)delay(100);if(tiaojie==0){while(!tiaojie);flagtj++;if(flagtj>3)flagtj=0;}if(jia==0)delay(100);if(jia==0){while(!jia);flagjia=1;}if(jian==0)delay(100);if(jian==0){while(!jian);flagjian=1;}if(flagtj!=0)switch(flagtj){ case 1: if(flagjia==1){flagjia=0;miao++;if(miao>60)miao=0;}if(flagjian==1) {flagjian=0;if(miao<1)miao=1;miao--;}break;case 2: if(flagjia==1) {flagjia=0;fen++;if(fen>60)fen=0;}if(flagjian==1) {flagjian=0;if(fen<1)fen=1;fen--;}break;case 3: if(flagjia==1) {flagjia=0;shi++;if(shi>12)shi=1;}if(flagjian==1) {flagjian=0;if(shi<1)shi=1;shi--;}break;}}//===============。
//数码管显示时间及点阵显示字符#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int//定义Max7219端口#define DUAN P0 //P0口控制段#define WEI P2 //P2口控制位sbit k_hour=P1^0; // 更改小时按键sbit k_min=P1^1; // 更改分钟按键sbit k_sec=P1^2; // 更改秒按键//定义数码管端口sbit Max7219_pinCLK = P1^2;sbit Max7219_pinCS = P1^1;sbit Max7219_pinDIN = P1^0;//Max7219位定义unsigned char key; //P3按键扫描(执行模块控制)code uchar seg7code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF }; //显示段码数码管字跟uchar wei[8]={0XFE,0XFD,0XFB,0XF7,0XEf,0XDf,0XBf,0X7f}; //位的控制端uchar numb[8]; //定义字符串uint sec=0,min,hour;//数码管初始定义uchar code disp2[7][8]={{0x00,0x3E,0x2A,0xFF,0xAA,0xBE,0xC0,0x00}, //电{0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00}, //一{0x00,0x00,0x1E,0x20,0x40,0x20,0x1E,0x00}, //V{0x00,0x00,0x4E,0x4A,0x4A,0x7A,0x00,0x00}, //5{0x00,0x00,0x42,0x7E,0x42,0x00,0x00,0x00}, //I{0x00,0x0C,0x1E,0x3C,0x3C,0x1E,0x0C,0x00}, //love{0x00,0x00,0x3E,0x40,0x40,0x3E,0x00,0x00}, //U};char flag;//定义点阵显示字符void Delay_xms(uint x){uint i,j;for(i=0;i<x;i++)for(j=0;j<300;j++);}//公用的延时程序//功能:向MAX7219(U3)写入字节//入口参数:DATA//出口参数:无void Write_Max7219_byte(uchar DATA){uchar i;Max7219_pinCS=0;for(i=8;i>=1;i--){Max7219_pinCLK=0;Max7219_pinDIN=DATA&0x80;DATA=DATA<<1;if(flag)Delay_xms(500);Max7219_pinCLK=1;}}//功能:向MAX7219写入数据//入口参数:address、dat//出口参数:无//说明:void Write_Max7219(uchar address,uchar dat){Max7219_pinCS=0;Write_Max7219_byte(address); //写入地址,即数码管编号Write_Max7219_byte(dat); //写入数据,即数码管显示数字Max7219_pinCS=1;}void Init_MAX7219(void){Write_Max7219(0x09, 0x00); //译码方式:BCD码Write_Max7219(0x0a, 0x03); //亮度Write_Max7219(0x0b, 0x07); //扫描界限;8个数码管显示Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0 }void t_to_dis(){numb[0]=hour/10; //显示小时十位numb[1]=hour%10; //显示小时个位numb[2]=10; //显示横杠numb[3]=min/10; //显示分十位numb[4]=min%10; //显示分个位numb[5]=10; //显示横杠numb[6]=sec/10; //显示秒十位numb[7]=sec%10; //显示秒个位}//数码管求值函数void display()//显示函数{//数码管数据转换P2=0XFF;P0=seg7code[numb[0]];P2=wei[0];Delay_xms(80);P2=0XFF;P0=seg7code[numb[1]];P2=wei[1];Delay_xms(80);P2=0XFF;P0=seg7code[numb[2]];P2=wei[2];Delay_xms(80);P2=0XFF;P0=seg7code[numb[3]];P2=wei[3];Delay_xms(80);P2=0XFF;P0=seg7code[numb[4]];P2=wei[4];Delay_xms(80);P2=0XFF;P0=seg7code[numb[5]];P2=wei[5];Delay_xms(80);P2=0XFF;P0=seg7code[numb[6]];P2=wei[6];Delay_xms(80);P2=0XFF;P0=seg7code[numb[7]];P2=wei[7];Delay_xms(80);P2=0XFF;}void Display1(){//0P2=0X00;P0=0xc0;Delay_xms(200);//1P2=0X00;P0=0xf9;Delay_xms(200);//2P2=0X00;P0=0xa4;Delay_xms(200);//3P2=0X00;P0=0xb0;Delay_xms(200);//4P2=0X00;P0=0x99;Delay_xms(200);//5P2=0X00;P0=0x92;Delay_xms(200);//6P2=0X00;P0=0x82;Delay_xms(200);//7P2=0X00;P0=0xf8;Delay_xms(200);//8P2=0X00;P0=0x80;Delay_xms(200);//9P2=0X00;P0=0x90;Delay_xms(200); }//4位显示0~9void Display2(){P2=0XFE;P0=0x00;Delay_xms(200);P2=0XFD;P0=0x00;Delay_xms(200);P2=0XFB;P0=0x00;Delay_xms(200);P2=0XF7;P0=0x00;Delay_xms(200);P2=0XEF;P0=0x00;Delay_xms(200);P2=0XDF;P0=0x00;Delay_xms(200);P2=0XBF;P0=0x00;Delay_xms(200);P2=0X7F;P0=0x00;Delay_xms(200);}//数码管移位显示8void SetTime(){if(k_hour==0){hour++;while(!k_hour);if(hour>=24) hour=0;}if(k_min==0){min++;while(!k_min);if(min>=60) min=0;}if(k_sec==0){sec++;while(!k_sec);if(sec>=60) sec=0;}}//数码管按键函数void timer1(void)interrupt 3 //每一秒增加一{uchar i;TH1=0X3c;//定时初值TL1=0Xaf;//定时初值i++;if(i>=20){i=0;sec++;//秒加1if(sec>=60){sec=0; //秒清零min++; //60秒后分加1if(min>=60){min=0; //分清零hour++; //60分后时加1if(hour>=24)hour=0; //时清零}}}}//数码管中断函数void InitInterrupt(){TMOD=0X10;//定义定时器工作方式TH1=0X3c;TL1=0Xaf;ET1=1;TR1=1;//开定时器EA=1;//开中断}//数码管中断初始化void main1(){uchar m,n;Delay_xms(500);P2=0xaa;Delay_xms(500);P2=0x55;Delay_xms(500);flag=0;Init_MAX7219();flag=0;while(1){for(m=0;m<7;m++){for(n=0;n<9;n++)Write_Max7219(n,disp2[m][n-1]);Delay_xms(500);}}}//点阵Main函数void main2(){InitInterrupt(); //中断初始化Display1();Display2();while(1){SetTime();//按键函数t_to_dis();//确定秒分时值display(); //显示秒分时值}}//数码管Main函数void ext_int0(void) interrupt 0 using 1{if(P3!=0xff){Delay_xms(10);key=P3;}while(P3!=0xff);switch(key){case 0xfe:main1(); break;case 0xfd:main2(); break;default:break;}}//判断有按键按下,所控制的程序void main(){IT0=1; //设定为边沿触发方式IP=0x01; //置外部中断0为高优先级中断P3=0xff; //置P3口为输入态EA=1; //开CPU中断EX0=1; //开外部中断0while(1); //等待外部中断}。