利用单片机DIY制作的数显可调定时器

合集下载

基于单片机设计的多功能定时器

基于单片机设计的多功能定时器

参考文献(3条) 1.李群芳.黄建 单片微型计算机与接口技术 2001 2.张培仁 基于C语言编程MCS-51单片机原理与应用 2002 3.赵秀珍.单永磊 单片微型计算机原理及其应用 2001
相似文献(10条) 1.学位论文 宋公明 基于高速单片机的加工中心数控系统的硬件研制 2007
数控系统是计算机技术在机械制造领域的一种典型应用,它集计算机、机械加工、微电子和自动控制多项技术于一体,是近年来应用领域中发展 十分迅速的一项高新技术。当今世界各国制造业都已广泛采用控制技术,以提高制造能力和水平;并且世界各工业发达国家将数控技术及数控装备列 为国家战略物资,不仅采取重大措施发展自己的数控技术及其产业? 精尖”的数控关键技术及装备进行封锁。因此在数控技术方面,我们要努力创新 ,研究开发具有自己知识产权的技术和产品。加工中心是一种功能齐全和性能强且性能价格比高,应用广泛的数控机床。随着数控技术的日益进步和 加工中心的广泛应用,加工中心已经成为世界数控机床市场中竞争的主流产品,也是我国众多的机械加工行业技术改造的首选产品之一。其应用量大 面广,市场需求日益旺盛。 如今,随着微电子技术和计算机技术的不断发展,数控系统性能也日臻完善;同时,数控系统的应用领域也日益扩 大。数控技术的关键因素是数控装置,即数控系统信息处理部分的功能、速度和可靠性,控制系统的好坏将直接关系到数控机床的整体性能。同时为 了满足社会经济发展和科技发展的需要,各种档次的数控系统都在朝着高精度、高速度和高可靠性等方向发展。为适应这一发展趋势,本文研制的是 一种基于8位高速SoC单片机的加工中心数控系统,该系统采用的是主、从双MCU进行前后台控制的框架结构。采用这一设计方案,主要是为了保证和满 足加工中心数控系统的实时性和高速、高可靠性的要求。 在论文中,以系统的硬件研制为主线,以高速单片机的相关电路、人机交互和双口 RAM实现双机通讯等有关电路设计和底层驱动软件实现为主要内容,全面、系统地介绍了控制系统研制的一般技术知识和要点。 本论文共有7章 ,按照技术内容主要有以下五个部分。各部分的具体内容和技术要点,以及所包含的章节如下: 第一部分简单地介绍了控制系统的总体结构 ,及其系统板的电路设计。这一部分位于论文的第2章,主要概括地说明了控制系统的设计思想,并对高速单片机这一控制核心作了简单的介绍。 第二部分,为论文的第3章。较详细的介绍和分析了控制系统设计中的各单元电路的要点。其中有高速单片机的电路设计、输入输出接口的电路设计 、液晶显示电路设计以及双口RAM的电路设计等(包括人机交互接口、串行通讯接口、在线编程接口以及I/O扩展接口等)。 第三部分,为论文的 第4章。重点介绍系统单元电路的相关底层驱动软件的设计:高速单片机外部存储器接口配置和低端口交叉开关译码器配置的方法及其程序实现、液晶 显示的有关程序设计、双口RAM实现数据共享的程序设计、I/O接口的程序设计及电机驱动程序设计。第四部分介绍的是一般数控系统的抗干扰技术。 分别说明了相关的硬件抗干扰技术和软件设计的抗干扰措施。位于论文的第5章。 最后这一部分介绍了系统电路的部分调试工作。其中有,人机 交互电路的调试,通讯及数据保持芯片的接口电路的调试,以及交流伺服电机的运于单片机设计的多功能定时器

51单片机温度计+计数器(可调时间)+蜂鸣器(生日歌)+花样流水灯6种

51单片机温度计+计数器(可调时间)+蜂鸣器(生日歌)+花样流水灯6种

51单片机课程设计蜂鸣器(生日歌)+温度计+计数器(可调时间)+花样流水灯(6种)#include<reg52.h>#include<intrins.h>#include<stdlib.h>#define uchar unsigned char#define uint unsigned int#define led P1 //将P1口定义位8个leduchar a, count, S1num, xqnum, temp, j, tm, key, coun, L, qdq, mb; //定义变量char yue, ri, shi, fen, miao; //定义月日时分秒int nian; //定义年// ==================定义初始化日历uchar code table0[] = "2020-09-4--FRI--";uchar code table1[] = "08:48:00";uchar code xingqi[][3] = { "MON","TUE","WED","THU","FRI","SAT","SUN" };uint led1[]={0x7e,0xbd,0xdb,0xe7,0xff};// ==================定义初始化日历sbit lcdrs=P2^6; //将lcd1602的RS端口(数据/命令选择端)定义到P2.0 sbit lcdrw=P2^7; //将lcd1602的R/W端口(读/写选择端)定义到P2.1 sbit lcden=P2^5; //将lcd1602的E端口(使能端口)定义到P2.2sbit DQ=P3^7;//ds18b20sbit S1=P3^1; //进入设置退出设置sbit S2=P3^2; //+1 或秒表模式sbit S3=P3^3; //-1 或开始秒表计时sbit S0=P3^0; //进入设置退出设置sbit S4=P3^4; //灯模式切换sbit S5=P3^5;sbit beep = P2^2; //定义蜂鸣器uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159, 212,212,106,126,159,169,190,119,119,126,159,142,159,0};uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};//延时unsigned char code str2[16]={" "};uchar data disdata[5];uint value;//温度值温度值uchar flag;//正负标志正负标志void delay1ms(unsigned int ms)//延时1毫秒{unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void write_com1(unsigned char com1)//写指令//{ delay1ms(1);lcdrs=0;lcdrw=0;lcden=0;P0=com1;delay1ms(1);lcden=1;delay1ms(1);lcden=0;}void write_dat1(unsigned char dat1)//写数据// { delay1ms(1);lcdrs=1;lcdrw=0;lcden=0;P0=dat1;delay1ms(1);lcden=1;delay1ms(1);lcden=0;}void lcd_init()//初始化设置//{write_com1(0x38);delay1ms(5);write_com1(0x08);delay1ms(5);write_com1(0x01);delay1ms(5);write_com1(0x06);delay1ms(5);write_com1(0x0c);delay1ms(5);}void display(unsigned char *p)//显示{while(*p!='\0'){write_dat1(*p);p++;delay1ms(1);}}init_play()//初始化显示{lcd_init();write_com1(0xc0);display(str2);}void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{unsigned char x=0;DQ = 1;//DQ复位delay_18B20(4);//延时DQ=0;//DQ拉低delay_18B20(100);//精确延时大于480usDQ=1;//拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{unsigned char i=0;unsigned char dat1 = 0;for (i=8;i>0;i--){DQ = 0; //给脉冲信号dat1>>=1;DQ=1;//给脉冲信号if(DQ)dat1|=0x80;delay_18B20(10);}return(dat1);}void ds1820wr(uchar wdata)/*写数据*/ {unsigned char i=0;for(i=8;i>0;i--){DQ=0;DQ=wdata&0x01;delay_18B20(10);DQ=1;wdata>>=1;}}read_temp()/*读取温度值并转换*/ {uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/?ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();value=b;value<<=8;value=value|a;if(value<0x0fff)flag=0;else{value=~value+1;flag=1;}value=value*(0.625);//温度值扩大10倍,精确到1位小数return(value);}/*******************************************************************/ void ds1820disp()//温度值显示{uchar flagdat;disdata[0]=value/1000+0x30;//百位数disdata[1]=value%1000/100+0x30;//十位数disdata[2]=value%100/10+0x30;//个位数disdata[3]=value%10+0x30;//小数位if(flag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}write_com1(0xc8);write_dat1(flagdat);//显示符号位write_com1(0xc9);write_dat1(disdata[0]);//显示百位write_com1(0xca);write_dat1(disdata[1]);//显示十位write_com1(0xcb);write_dat1(disdata[2]);//显示个位write_com1(0xcc);write_dat1(0x2e);//显示小数点write_com1(0xcd);write_dat1(disdata[3]);//显示小数位}void delay(uint t) //@12.000MHz延时函数{uint x, y;for (x = t; x > 0; x--)for (y = 110; y > 0; y--);}void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}void PlayMusic(){uint i=0,j,k;while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { //播放各个音符,SONG_LONG 为拍子长度for(j=0;j<SONG_LONG[i]*20;j++){beep=~beep;//SONG_TONE 延时表决定了每个音符的频率for(k=0;k<SONG_TONE[i]/3;k++);}DelayMS(10);i++;}}//======================液晶void write_com(uchar com) //液晶写指令{lcdrw = 0;lcdrs = 0;P0 = com;delay(2);lcden = 1;delay(2);lcden = 0;}void write_data(uchar dat) //液晶写数据{lcdrw = 0;lcdrs = 1;P0 = dat;delay(2);lcden = 1;delay(2);lcden = 0;}void write_sfm(uchar add, uchar dat) //写时分秒函数{uchar shi, ge;shi = dat / 10;ge = dat % 10;write_com(0x80 + 0x40 + add);write_data(0x30 + shi);write_data(0x30 + ge);}void write_yr(uchar add, uchar dat) //写月日函数{uchar shi, ge;shi = dat / 10;ge = dat % 10;write_com(0x80 + add);write_data(0x30 + shi);write_data(0x30 + ge);}void write_nian(uchar add, uint dat) //写年函数{uint qian, bai, shi, ge;qian = dat / 1000;bai = dat % 1000 / 100;shi = dat % 100 / 10;ge = dat % 10;write_com(0x80 + add);write_data(0x30 + qian);write_data(0x30 + bai);write_data(0x30 + shi);write_data(0x30 + ge);}void init_lcd() //液晶初始化{lcden = 0;nian = 2020;yue = 1;ri = 3;shi = 0; //初始shi、fen、miaofen = 0;miao = 0;write_com(0x38); //设置16x2显示,5x7点阵,8位数据口write_com(0x0c); //设置开显示,不显示光标write_com(0x06); //写一个字符后地址指针加1write_com(0x01); //显示清0,数据指针清0}//==================液晶void init() //总初始化函数{init_lcd(); //液晶初始化write_com(0x80); //设置显示初始坐标for (a = 0; a < 14; a++) //显示年月日初始值{write_data(table0[a]);delay(3);}write_com(0x80 + 0x40); //设置显示初始坐标for (a = 0; a < 8; a++) //显示时分秒初始值{write_data(table1[a]);delay(3);}write_nian(0, nian);write_sfm(6, miao); //分别将shi、fen、miao送去液晶显示write_sfm(3, fen);write_sfm(0, shi);qdq=0;mb=0;j=0;L=0;coun=0;count = 0;xqnum = 0;S1num = 0;PT0=1;PT1=0;TH1=(65536-50000)/256;TL1=(65536-50000)%256;TR1=1;ET1=1;led=0xfe;key=0;TMOD = 0x011; //设置定时器0工作模式1TH0 = (65536-50000) / 256; //定时器装初始值TL0 = (65536-50000) % 256;EA = 1; //开总中断ET0 = 1; //开定时器0中断TR0 = 1; //启动定时器0}//=======================流水灯void t0isr() interrupt 3 //定时器2,用于流水灯{TH1=(65536-50000)/256;TL1=(65536-50000)%256;tm++;if(tm>=9){tm=0;switch(key) //六种样式{case 0:led=_crol_(led,1);break;case 1:led=_cror_(led,1);break;case 2:led=_cror_(led,1);break;case 3:led=_crol_(led,1);break;case 4:if(led==0x00)led=0xff;else led=led*2;break;case 5:led=~led;break;}}}//=======================流水灯//=========================== 独立键盘扫描函数void keyscan(){//————————————————————————————————————————————进入日历时钟设置if(S5 == 0){ read_temp();//读取温度ds1820disp();//显示}if (S0 == 0){ beep=0;PlayMusic(); //播放生日快乐beep=1;}if (S1 == 0){delay(2); //确认定义键被按下if (S1 == 0){while(!S1); //确认按键松开S1num++; //定义键S1按下次数记录if (S1num == 1) //S1按下一次时{TR0 = 0; //关闭定时器write_com(0xc0 + 7); //光标定位到秒位置write_com(0x0f); //光标闪烁}if (S1num == 2) //S1按下两次时{write_com(0xc0 + 4); //光标定位到分位置}if (S1num == 3) //S1按下三次时{write_com(0xc0 + 1); //光标定位到时位置}if (S1num == 4) //S1按下四次时{write_com(0x80 + 13); //光标定位到星期位置}if (S1num == 5) //S1按下五次时{write_com(0x80 + 9); //光标定位到日位置}if (S1num == 6) //S1按下六次时{write_com(0x80 + 6); //光标定位到月位置}if (S1num == 7) //S1按下七次时{write_com(0x80 + 3); //光标定位到年位置}if (S1num == 8) //退出设置,开启中断{S1num = 0;delay(3);TR0 = 1;write_com(0x0c);}}}if (S1num != 0) //只有定义键按下后S2、S3、S4才有效{if (S2 == 0){delay(2); //防抖if (S2 == 0) //确认按键被按下{while (!S2); //释放按键确认if (S1num == 1) //S1按下一次时{miao++; //调整秒加1if (miao == 60) //满60清零miao = 0;write_sfm(6, miao); //每调节一次送液晶显示一次write_com(0x80 + 0x40 + 6); //显示位置重新回到调节处}if (S1num == 2) //S1按下两次时{fen++; //调整分加1if (fen == 60)fen = 0;write_sfm(3, fen);write_com(0x80 + 0x40 + 3);}if (S1num == 3) //S1按下三次时{shi++; //调整时加1if (shi == 24)shi = 0;write_com(0x80 + 0x40);write_sfm(0, shi);}if (S1num == 4) //星期加调整{xqnum++;if (xqnum == 7)xqnum = 0;write_com(0x80 + 0x0b);for (a = 0; a < 3; a++){write_data(xingqi[xqnum][a]);delay(5);}}if (S1num == 5) //日加调整{ri++;if (yue == 2){if (nian % 400 == 0){if (ri == 30)ri = 1;}if (nian % 400 != 0){if (ri == 29)ri = 1;}}else if (yue <= 7){if (yue % 2 == 0 & yue != 2){if (ri == 31){ ri = 1; }}else if (yue % 2 != 0 & yue != 2){if (ri == 32){ ri = 1; }}}else if (yue >= 8){if (yue % 2 == 0){if (ri == 32){ ri = 1; }}else if (yue % 2 != 0){if (ri == 31){ ri = 1; }}}write_yr(8, ri);}if (S1num == 6) //月加调整{yue++;if (yue == 13)yue = 1;write_yr(5, yue);}if (S1num == 7) //年加调整{nian++;if (nian == 2030)nian = 2019;write_nian(0, nian);}}}if (S3 == 0){delay(2);if (S3 == 0) //确认按键被按下{while (!S3); //确认按键松开if (S1num == 1){miao--; //调整秒减1if (miao == -1) //减到00后再减重新设置为59miao = 59;write_sfm(6, miao);write_com(0x80 + 0x40 + 6);}if (S1num == 2){fen--; //调整分减1if (fen == -1)fen = 59;write_sfm(3, fen);write_com(0x80 + 0x40 + 3);}if (S1num == 3){shi--; //调整时减1if (shi == -1)shi = 23;write_sfm(0, shi);write_com(0x80 + 0x40);}if (S1num == 4){xqnum--; //调整星期减一if (xqnum == -1)xqnum = 6;write_com(0x80 + 0x0b);for (a = 0; a < 3; a++){write_data(xingqi[xqnum][a]);delay(5);}}if (S1num == 5) //调整日{ri--;if (yue == 2){if (nian % 400 == 0){if (ri == 0){ ri = 29; }}if (nian % 400 != 0){if (ri == 0){ ri = 28; }}}else if (yue <= 7){if (yue % 2 == 0 & yue != 2){if (ri == 0){ ri = 30; }}else if (yue % 2 != 0 & yue != 2){if (ri == 0){ ri = 31; }}}else if (yue >= 8){if (yue % 2 == 0){if (ri == 0){ ri = 31; }}else if (yue % 2 != 0){if (ri == 0){ ri = 30; }}}write_yr(8, ri);}if (S1num == 6) //调整月{yue--;if (yue == 0)yue = 12;write_yr(5, yue);}if (S1num == 7) //调整年{nian--;if (nian == 2030)nian = 2019;write_nian(0, nian);}}}}//————————————————————————————————————-推出日历时钟设置//——————————————————————————————————流水灯设置初值if(S4==0){delay(2);if(S4==0) //确认按键按下{while(!S4);qdq=0; //抢答器重置TR1=1;delay(2);while(S4==0);delay(2);key++;key%=6;if(key==0)led=0xfe;else if(key==1)led=0x7f;else if(key==2)led=0x80;else if(key==3)led=0x01;else if(key==4)led=0xfe;else led=0x55;}}//——————————————————————————————————结束流水灯设置初值}//=========================== 独立键盘扫描函数//=======================定时器0中断服务程序,用于日历时钟、秒表void timer0() interrupt 1{TH0 = (65536-50000) / 256; //重装定时器初始值TL0 = (65536-50000) % 256;count++; //中断次数累加//————————————————————————————————————————————日历时钟if (count == 20) //20次50毫秒即一秒{count = 0;miao++;if (miao == 60) //秒加到60时分进位{miao = 0;fen++;if (fen == 60) //分加到60时时进位{fen = 0;shi++;if (shi == 24) //时加到24时清0{shi = 0;xqnum++;ri++;if (yue == 2) //如果是二月{if (nian % 400 == 0) //闰年判断{if (ri == 30){ri = 1;yue++;write_yr(5, yue);}}if (nian % 400 != 0) //平年判断{if (ri == 29){ri = 1;yue++;write_yr(5, yue);}}}else if (yue <= 7 & yue != 2) //一月到七月{if (yue % 2 == 0) //偶数月(除二月){if (ri == 31){ri = 1;yue++;}}else if (yue % 2 != 0) //奇数月{if (ri == 32){ri = 1;yue++;}}write_yr(5, yue);}else if (yue >= 8) //八月到12月{if (yue % 2 == 0) //偶数月(除二月){if (ri == 32){ri = 1;yue++;if (yue == 13) //如果判断月份为12月,则加一后重新定义月份为1{yue = 1;nian++;write_nian(0, nian);}write_yr(5, yue);}}else if (yue % 2 != 0) //奇数月{if (ri == 31){ri = 1;yue++;write_yr(5, yue);}}}write_yr(8, ri);if (xqnum == 7) //星期写入xqnum = 0;write_com(0x80 + 0x0b);for (a = 0; a < 3; a++){write_data(xingqi[xqnum][a]);delay(5);}}write_sfm(0, shi); //重新写入数据}write_sfm(3, fen); //重新写入数据}write_sfm(6, miao); //重新写入数据}//——————————————————————————————————————————日历时钟结束}//=======================定时器0中断服务程序,用于日历时钟void main() //主函数{init(); //初始化while (1){keyscan(); //检测按键是否被按下}}相关视频在哔哩哔哩:BV1ef4y1q7xY。

DIY制作LED数码管定时器

DIY制作LED数码管定时器

从构思到实体出来花了我一个月的课外时间,大家支持一下我的DIY精神吧。

由于只有一个数码管,只能显示0到15,所以这个定时器可以定时0到15分,0到15个小时,0到15天,0到15个星期,本来想在程序中加上定时0到15个月,但想想在实际情况中定时15个月都有一年多了,估计好少用到,就不写了。

这个定时器我加上了继电器,所以可以控制220V交流电,且定时误差在几个毫秒内,还算精确吧。

先来几张初期的原理图:ﻫﻫﻫ下面是单片机的源程序:ﻫ#include<reg52.h>ﻫ#defineuint unsignedintﻫ# defineuchar unsigned charﻫsbit ledg=P1^0;//秒闪烁(一秒钟亮一秒钟灭)ﻫsbit led b=P1^1;//分闪烁(一分钟亮一分钟灭)sbit fmq=P3^3;//蜂鸣器sbit ledx=P3^4;//定时星期指示灯ﻫsbit ledt=P3^6;//定时天指示灯sbit ledf=P3^5;// 定时分钟指示灯sbit leds=P3^7;//定时小时指示灯sbit key1=P1^6;// 启动|暂停ﻫsbitkey2=P1^5;//调整定时分钟sbitkey3=P1^4;// 调整定时小时ﻫsbit key4=P1^3;// 调整定时天sbitkey5=P1^2;// 调整定时星期ﻫsbitjdq=P1^7; //继电器uinti,j,num,num1,num2,num3,num4,num5,num6;uchar shi,temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8,dsf,dss,dst,dsx;ﻫuchar codeshuju[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};ﻫvoiddelayms(uintxms)ﻫ{ﻫfor(i=xms;i>0;i--)ﻫfor(j=110;j>0;j--);}ﻫvoid display(shi)ﻫ{ﻫP2=shuju[shi];}ﻫvoidkeyscan(){uchari;if(key1==0)ﻫ{delayms(10);ﻫif(key1==0)ﻫ{ledb=0; //把分闪烁指示灯调用来指示启动|暂停ﻫwhile(i==0&&P2!=0xC0){ﻫTR0=~TR0;//启动|暂停i++;}ﻫif(TR0==1){ﻫledb=1;//把分闪烁指示灯调用来指示启动|暂停ﻫ}elseﻫ{ﻫTR0=0;}}ﻫ}if(key2==0&&TR0==0){ ﻫdss=0;// 定时小时清零dst=0; //定时天数清零dsx=0; // 定时星期清零ﻫtemp1=1; //进入switch-caseﻫdelayms(10);}ﻫif(key3==0&&TR0==0){ﻫdsf=0;dst=0;ﻫdsx=0;temp2=1;ﻫdelayms(10);ﻫ}ﻫif(key4==0&&TR0==0){ﻫdsf=0;dss=0;dsx=0;ﻫtemp3=1;ﻫdelayms(10);ﻫ}if(key5==0&&TR0==0){ﻫdsf=0;ﻫdss=0;dst=0;ﻫtemp4=1;ﻫdelayms(10);ﻫ}ﻫswitch (temp1) {case1:ﻫif(key2==0){leds=1;//关闭定时小时指示灯ledt=1; //关闭定时天指示灯ﻫledx=1;//关闭定时星期指示灯ledf=0;//打开定时分钟指示灯ﻫledg=1; //关闭秒闪烁ledb=1; //关闭分闪烁jdq=0;//关闭继电器dsf++; // 分钟加加shi=dsf;//把分送去显示if(dsf==16)ﻫ{shi=0;ﻫdsf=0;}while(!key2);ﻫtemp1=2;temp5=1;ﻫnum2=dsf;ﻫtemp6=2;temp7=2;temp8=2;ﻫ}break;ﻫ}switch(temp2){case 1:ﻫif(key3==0){ledf=1;ﻫledt=1;ﻫledx=1;leds=0;jdq=0;ledg=1;ﻫledb=1;dss++;ﻫshi=dss;if(dss==16){shi=0;ﻫdss=0;ﻫ}while(!key3);ﻫtemp2=2;temp6=1;num4=dss;temp5=2;ﻫtemp7=2;temp8=2;ﻫ}ﻫbreak;ﻫ}switch (temp3)ﻫ{ﻫcase 1:ﻫif(key4==0) {ledf=1;leds=1;ﻫledx=1;ﻫledt=0;ﻫjdq=0;ledg=1;ledb=1;ﻫdst++;ﻫshi=dst;ﻫif(dst==16){ﻫshi=0;ﻫdst=0;ﻫ}while(!key4);temp3=2;temp7=1;num5=dst;ﻫtemp5=2;temp6=2;temp8=2;ﻫ}break;}ﻫswitch (temp4){ﻫcase1:ﻫif(key5==0){ledf=1;leds=1;ledt=1;ﻫledx=0;jdq=0;ledg=1;ﻫledb=1;ﻫdsx++;ﻫshi=dsx;if(dsx==16)ﻫ{ﻫshi=0;dsx=0;ﻫ}ﻫwhile(!key5);temp4=2;ﻫtemp8=1;num6=dsx;temp5=2;temp6=2;ﻫtemp7=2;ﻫ}break;}switch(temp5)ﻫ{ﻫcase 1:ﻫif(num==3686){num=0;ledg=~ledg;num1++;}if(num1==60){num1=0;num2--;shi=num2;ﻫif(num2==0)ﻫ{jdq=1;TR0=0;}}ﻫbreak;}ﻫswitch (temp6)ﻫ{ﻫcase1:ﻫif(num==3686) {num=0;ﻫﻫif(num1==60)ledg=~ledg;ﻫnum1++;ﻫ}{num1=0;ﻫledb=~ledb;num3++;if(num3==60)ﻫ{ﻫnum3=0;num4--;ﻫshi=num4; ﻫ}if(num4==0)ﻫ{ﻫjdq=1;TR0=0;}ﻫ}break;}switch(temp7){case 1:if(num==3686)ﻫ{num=0;ﻫledg=~ledg;num1++;}ﻫﻫif(num1==60)ﻫ{ﻫnum1=0;ledb=~ledb;ﻫnum3++;if(num3==1440)ﻫ{ﻫnum3=0;ﻫnum5--;shi=num5; ﻫ}ﻫif(num5==0)ﻫ{jdq=1;ﻫTR0=0;ﻫ}ﻫ}ﻫbreak;}switch(temp8)ﻫ{ﻫcase 1:ﻫif(num==3686)ﻫ{ﻫnum=0;ﻫledg=~ledg;ﻫnum1++; }if(num1==60)ﻫ{ﻫnum1=0;ﻫledb=~ledb;num3++;if(num3==10080)ﻫ{ﻫnum3=0;num6--;shi=num6; ﻫ}ﻫif(num6==0)ﻫ{jdq=1;ﻫTR0=0;ﻫ}ﻫ}break;}}ﻫvoid main(){ﻫTMOD=0x02;ﻫTH0=6;ﻫTL0=6;EA=1;ﻫET0=1;ﻫjdq=0;ﻫwhile(1){ﻫkeyscan();ﻫdisplay(shi);ﻫwhile(jdq==1&&P2==0xC0)ﻫ{fmq=0;ledg=1;ﻫledb=1;ﻫ}ﻫ}ﻫ}ﻫvoidT0_time()interrupt 1{num++;ﻫ}ﻫ全部全代码下载:http://www.51he/f/ledccr.rarﻫ这是洞洞板绘图软件画的电路图:ﻫﻫ。

基于单片机的多用途定时器装置毕业设计论文

基于单片机的多用途定时器装置毕业设计论文

摘要如今的科技已是飞跃的进步,然而定时器的应用永远不会退休。

“定时器”总的来说有两种类型,一种以机械时钟形式的产品,这种定时器功能简单,应用于成本比较低的产品中,如比较古老的滴水计时器、传统的电风扇。

当然滴水计时已被淘汰,而低价的风扇中还是不会淘汰这种机械运转的精度不高的定时器。

另一种是基于电子电路数字技术的新一代产品,这种产品功能强,精度高,控制和使用都比较直观而灵活,是前者的替代之物。

本设计开发了一种基于单片机的专用定时器。

它造价低,功能全,整体性价比高,可适应很多的场合做为保护或定时预警系统中。

此设计是最典型且经典的单片机定时功能应用设计,设计中使用了单片机定时器的设计、单片机中断使用方法、LED显示技术等。

可以实现在100小时内的任意时间定时,另可外控负载和提示报警等。

设计中的硬件电路主要含盖了STC89C51RC单片机、有源蜂鸣器、LED数字显示数码管等。

在硬件的设计基础上,通过软件进行数码管的数值显示、键扫描程序、蜂鸣器的提示音效和报警音效的处理。

关键词:定时器、STC89C51单片机、LED数字显示数码管ABSTRACTToday, technology is a leap of progress, however, the application of the timer never retired. "Timer" In general there are two types, a mechanical clock in the form of products, such a simple timer function, used in low-cost products, such as the old drip timer, traditional fans . Of course, dripping timing has been eliminated, and cheap fan or accuracy of this mechanical operation of the timer will not be eliminated. Another is based on a new generation of electronic circuits digital technology products, this product features high precision, control and use more intuitive and flexible, the former alternative material.The design and development of a microcontroller-based dedicated timer. It is low cost, full-function, and overall cost-effective, and can be adapted to many occasions as a protection or in the timing early warning system.This design is the most typical and classic the microcontroller timing function application design, the design used in the design of a microcontroller timer, microcontroller interrupt usage, LED display technologies. The arbitrary timing can be achieved in 100 hours, another may be outside the control load and prompted alarm.The hardware circuit design covers Microcontroller STC89C51RC active buzzer, LED digital display digital tube. Hardware design based on the value of the digital tube display, key scanner prompt sound and alarm buzzer sound processing through software.Keywords: timer, STC89C51 microcontroller, LED digital display digital tube目录前言 (4)第一章系统任务与总体方案论证 (5)1、设计任务 (5)2、方案论证 (5)3、方案选择 (6)第二章8051单片机的结构 (7)1、8051单片机的特点 (7)2、8051单片机的片内资源 (7)3、8051的引脚信号 (7)4、复位电路 (9)5、时钟电路 (10)第三章LED数码管接口技术 (11)1、LED数码管的结构与原理 (11)2、多位LED显示器的显示方式 (12)3、LED显示器接口技术 (13)第四章多用途定时器装置的硬件设计 (15)1、硬件电路结构 (15)2、电源电路 (15)3、蜂鸣器报警电路 (16)4、系统结构原理整图 (16)5、硬件焊接 (17)第五章多用途定时器装置的软件流程 (19)1、所需要完成的定时器装置功能 (19)2、软件设计思路 (19)3、软件程序流程图 (19)4、多用途定时器装置的源程序如下 (20)5.多用途定时器装置的实际应用 (28)结论 (29)参考文献 (29)致谢 (30)前言含有微处理器、存储器、输入/输出电路及一些诸如中断控制器、定时器/计数器等资源的集成电路芯片,它包含了作为一个计算机所必需的基本部件,在外部只需添加少许的外围器件就可以组成完整的计算机实现控制目的,这样的器件通常称为单片机或微型控制器。

单片机创新开发定时器使用

单片机创新开发定时器使用

单片机创新开发定时器使用单片机是一种微型电子计算机,是应用在各个领域的重要电子设备。

在单片机的创新开发中,使用定时器是一项非常重要的技术,可以实现各种实用的功能。

本文将从单片机定时器的基本原理、使用方法以及实际应用方面进行详细介绍。

一、单片机定时器的基本原理单片机定时器是通过计数器原理来实现定时功能的,计数器正常情况下会一直累加,当计数器溢出时,会触发一个中断或者改变一些输出状态。

单片机定时器一般有两种工作模式:定时模式和计数模式。

在定时模式下,定时器的计数值可以设置为一个特定的数值,当计数器的值达到设定的数值时,触发中断或者改变输出状态。

这种模式适合实现延时功能,如蜂鸣器的定时控制、舵机的角度控制等。

在计数模式下,定时器的计数值会根据输入脉冲的个数来进行累加,当达到设定的数量时,触发中断或者改变输出状态。

这种模式适合实现计数功能,如测量物体通过传感器的次数、马达转动的圈数等。

二、单片机定时器的使用方法使用单片机定时器前,需对定时器进行初始化设置,包括选择定时器的模式、设定计数值等。

以下是使用单片机定时器的一般步骤:1.选择定时器模式:根据实际应用需求选择定时模式或计数模式。

2.设置计数值:根据需要设定计数器的初始值和溢出值。

初始值是定时器开始计数的值,溢出值是定时器计数到多少会触发中断或状态改变。

3.启动定时器:将定时器的控制位设置为1,使定时器开始工作。

4.监听中断或状态改变:根据定时器工作模式选择是否需要在中断中响应操作,或者根据状态改变来执行相应的功能。

5.停止定时器:根据实际需求选择合适的停止定时器的方法,可以是手动停止,也可以是在特定条件下自动停止。

三、单片机定时器的实际应用单片机定时器在实际应用中有广泛的用途1.蜂鸣器控制:通过定时器的定时模式设定合适的计数值,可以实现蜂鸣器的定时控制,如实现不同频率的声音、蜂鸣音乐等。

2.LED灯闪烁:通过定时器的定时模式设置合适的计数值和中断响应,可以实现LED的闪烁效果,如交通信号灯。

自制可调式数字时钟完整版

自制可调式数字时钟完整版

《综合设计实训I》可调式数字时钟姓名:学号:班级:实训地点:指导教师:通信与电子学院编制年月日一、设计要求数字时钟是采用数字电路实现对年,月,日,时,分,秒数字显示的计时装置,广泛用于个人,家庭,车站,码头,办公室等公共场所,成为人们日常生活中的必需品。

1,、设计时可以利用单片机内部定时器,也可以利用外部实时时钟芯片。

(I/O,I2C总线)2、有年,月,日,时,分,秒功能,而且要能够校正前面五项。

3、显示时可以用8位数码管,也可以用LCD液晶屏。

(年只需显示后2位)4、可选功能:闹钟功能。

二、设计方案1、芯片分析AT89C51引脚图管脚说明:VCC:供电电压。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P0口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

基于单片机的定时开关设计

基于单片机的定时开关设计

基于单片机的定时开关设计单片机是一种集成电路,具有许多功能,如计算、控制和通信。

定时开关是一种常见的应用,可用于控制家居设备、灯光和其他电子设备。

在本文中,将介绍基于单片机的定时开关的设计。

设计一个基于单片机的定时开关需要以下步骤:1. 硬件设计:选择合适的单片机,如PIC系列或Arduino。

确定开关的电源和电路连接方式。

为开关添加必要的保护电路,如过压保护和过流保护。

为了实现定时功能,还要设计一个时钟电路。

2.软件设计:编写单片机的程序代码。

首先,初始化单片机和相关外设。

然后,设置定时器和计数器,以实现定时功能。

通过编程,指定开关打开或关闭的时间和持续时间。

最后,通过单片机的IO口控制开关的打开和关闭。

3.测试和调试:将设计好的硬件连接并上电。

通过测试和调试程序,确保开关按照预期工作。

进行适当的调整和优化,以满足需求。

在设计定时开关时,还可以考虑以下几点:1.配置选项:提供用户界面或编程接口,以便用户可以灵活地配置开关的定时参数。

例如,可以通过按钮设置开关时间和持续时间,或者通过串口通信设置。

2.外部输入/输出:除了通过单片机的IO口控制开关,还可以提供额外的外部输入/输出接口。

例如,可以使用红外遥控器或无线通信模块控制开关的打开和关闭。

3.多个定时设置:支持多个定时设置,使得用户可以根据需要设置不同的时间段和持续时间。

例如,用户可以设置在白天和夜晚不同时间段需要打开或关闭的开关。

4.节能功能:通过智能控制和触发器,实现节能功能。

例如,可以通过传感器检测到有人在房间内时才开启灯光,从而减少能源消耗。

综上所述,基于单片机的定时开关设计是一项有挑战性、有创造性和有实际应用价值的任务。

通过合理设计硬件和软件,可以实现一个高效、可靠和灵活的定时开关系统。

我也制一个定时器

我也制一个定时器

基于51单片机的定时器制作一、功能:1)日历时钟功能、液晶显示面板。

2) 设定继电器动作日期时间后,时间到达设定值时,继电器吸合。

继电器触点可自由控制电器。

3) 使用储存芯片使定时器具有掉电保存功能。

二、使用的主要器件:单片机STC89C52、液晶1602、时钟芯片DS1302、储存器芯片24C02、DC5V继电器。

四、C语言程序:#include <reg51.h>#include <intrins.h>//=============键的定义=============================sbit KeyAdd=P3^2; //加1sbit KeyShift=P3^3; //移位sbit KeyMenu=P3^4; //确定sbit KeyHandle=P3^5; //手动操作unsigned char SetDateFlag; //正在进行时间设置标志//================================================== sbit RelayKA1=P2^3; //继电器信号脚//光标变量unsigned char CursorX;unsigned char CursorY;//延时函数void Delay(unsigned char n);void Delay(unsigned char n){unsigned char i;for(i=0;i<n;i ){;}}//==========================时钟芯片DS1302定义=========================sbit SCLK=P2^0; //时钟线sbit IO=P2^1; //数据线sbit RST=P2^2; //复位线void DS1302Init(); //初始化void WriteByte(unsigned char TimeR); //写一个字节unsigned char ReadByte(); //读一个字节void WriteRAM(unsigned char Add,unsigned char Data); //向地址写数unsigned char ReadRAM(unsigned char Add); //由地址读数unsigned char Second[3]; //秒时间变量unsigned char Minute[3]; //分时间变量unsigned char Hour[3]; //时时间变量unsigned char Day[3]; //日时间变量unsigned char Month[3]; //月时间变量unsigned char Week[3]; //星期时间变量unsigned char Year[3]; //年时间变量unsigned char SetSecond[3]; //设定的秒时间变量unsigned char SetMinute[3]; //设定的分时间变量unsigned char SetHour[3]; //设定的时时间变量unsigned char SetDay[3]; //设定的日时间变量unsigned char SetMonth[3]; //设定的月时间变量unsigned char SetWeek[3]; //设定的星期时间变量unsigned char SetYear[3]; //设定的年时间变量unsigned char SetActionSecond[3]; //设定动作的秒时间变量unsigned char SetActionMinute[3]; //设定动作的分时间变量unsigned char SetActionHour[3]; //设定动作的时时间变量unsigned char SetActionDay[3]; //设定动作的日时间变量unsigned char SetActionMonth[3]; //设定动作的月时间变量unsigned char SetActionWeek[3]; //设定动作的星期时间变量unsigned char SetActionYear[3]; //设定动作的年时间变量void DS1302Delay(unsigned char n); //延时函数void ReadDate(); //读取日期各变量void WriteDate(); //写日期各变量//=============================================================== =======void DS1302Init(){SCLK=0;RST=0;RST=1;WriteByte(0x8E); //控制命令WriteByte(0x0); //充许写RST=0;}void WriteByte(unsigned char TimeR){unsigned char i;for(i=0;i<8;i ){IO=0;SCLK=0;if(TimeR&0x01){IO=1;}TimeR=TimeR>>1;SCLK=1;}SCLK=0;}unsigned char ReadByte(){unsigned char i;unsigned char TimeR;for(i=0;i<8;i ){_nop_();SCLK=0;TimeR>>=1;if(IO==1){TimeR=TimeR 0x80;}_nop_();SCLK=1;}SCLK=0;return(TimeR);}void WriteRAM(unsigned char Add,unsigned char Data) {RST=1;WriteByte(Add);WriteByte(Data);DS1302Delay(10);RST=0;}unsigned char ReadRAM(unsigned char Add){unsigned char Temp;RST=1;WriteByte(Add);Temp=ReadByte();DS1302Delay(10);RST=0;return(Temp);}void DS1302Delay(unsigned char n) {unsigned char i;for(i=0;i<n;i );}void ReadDate(){Second[0]=ReadRAM(0x81); //秒Minute[0]=ReadRAM(0x83); //分Hour[0]=ReadRAM(0x85); //时Day[0]=ReadRAM(0x87); //日Month[0]=ReadRAM(0x89); //月Week[0]=ReadRAM(0x8B); //周Year[0]=ReadRAM(0x8D); //年Second[1]=Second[0]&0x0F;Second[2]=Second[0]&0xF0;Second[2]=Second[2]>>4;Minute[1]=Minute[0]&0x0F;Minute[2]=Minute[0]&0xF0;Minute[2]=Minute[2]>>4;Hour[1]=Hour[0]&0x0F;Hour[2]=Hour[0]&0xF0;Hour[2]=Hour[2]>>4;Day[1]=Day[0]&0x0F;Day[2]=Day[0]&0xF0;Day[2]=Day[2]>>4;Month[1]=Month[0]&0x0F;Month[2]=Month[0]&0xF0;Month[2]=Month[2]>>4;Week[1]=Week[0]&0x0F;Week[2]=Week[0]&0xF0;Week[2]=Week[2]>>4;Year[1]=Year[0]&0x0F;Year[2]=Year[0]&0xF0;Year[2]=Year[2]>>4;}void WriteDate(){unsigned char Temp;Temp=SetSecond[2]*16 SetSecond[1];WriteRAM(0x80,Temp);//秒Temp=SetMinute[2]*16 SetMinute[1];WriteRAM(0x82,Temp);//分Temp=SetHour[2]*16 SetHour[1];WriteRAM(0x84,Temp);//时Temp=SetDay[2]*16 SetDay[1];WriteRAM(0x86,Temp);//日Temp=SetMonth[2]*16 SetMonth[1];WriteRAM(0x88,Temp);//月Temp=SetWeek[2]*16 SetWeek[1];WriteRAM(0x8A,Temp);//周Temp=SetYear[2]*16 SetYear[1];WriteRAM(0x8C,Temp);//年}//=============================================================== =============//===========================================液晶1602==========================================#define DBPort P1 //液晶数据口sbit RW=P0^1; //寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器sbit RS=P0^0; //读写信号线,高电平时进行读操作,低电平时进行写操作。

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

利用单片机DIY制作的数显可调定时器(附制作的全部资料)详细说明
摘要:
随着电子技术的不断发展,人们生活水平的不断提高,充电型电子设备的种类和数量也跟着迅猛发展,尤其是电动车和手机。

这些电子设备在给我们生活和工作带来便捷的同时,充电的问题也使得人们不厌其烦,电动车大约需要充电8小时左右,手机大约需要充电3小时左右,然而当充电结束后,人们经常忘记拔掉电源,更有甚者给电池充电达数天,这对电池的功能和使用寿命无疑是一种破坏。

介于此,笔者萌生了自己动手设计制作一个数显可调定时器的想法,来解决一些生活中的问题。

数显可调定时器原理介绍
通过小时和分钟的“加”“、减”按键对需要的定时时间进行预设,确定无误后,按下启动按键,定时开始,这时,数码管便会从预设时间开始倒计时,同时充电发光二极管每秒闪烁一次,当计时到零后,充电发光二极管由闪烁状态变成常亮,继电器动作,切断充电电源。

假如电路在运行时出现故障或者运行错误,需要按单片机的
复位键,然后对定时时间重新调整后,按启动按键,重新开始定时。

电路框图如图1所示。

电路原理图如图2所示。

图1 电路方框图
图2 电路原理图。

相关文档
最新文档