单片机定时器程序编写,51单片机用数码管设计定时器和时钟的程序怎么写

1,51单片机用数码管设计定时器和时钟的程序怎么写这个分两种: 一种是静态扫描 , 二是动态扫描 。静态的太耗资源,一般很少用,除非资源足够用 。多数都是用动态扫描的 。动态扫描的原理是:首先有八个数据线,分别连接到七段数码管的七个位,和小数点位 。然后就是有一批使能信号线 。假如你有八个数码管,那就需要八个使能信号线 。同一个时刻,其实只有一个数码管在亮着的,只是扫描信号比较快,肉眼的感觉好像就是都亮着的 。基本原理就是这样的发了三个程序包给你,都是基于单片机数字钟设计的程序,可带按键调整时钟 。9.7的那个程序 , 里面是用汇编语言编写的延迟程序,时间精度相对高 。但是稍微,frbqhd发了三个程序包给你,都是基于单片机数字钟设计的程序,可带按键调整时钟 。9.7的那个程序 , 里面是用汇编语言编写的延迟程序,时间精度相对高 。但是稍微,frbqhd【单片机定时器程序编写,51单片机用数码管设计定时器和时钟的程序怎么写】
2 , 单片机定时程序的编写 COUNT EQU 5;定时200us*5=1ms;********************************* ORG 0000H LJMP MAIN ORG 000BH LJMP _T0 MAIN: MOV SP,#50HMOV TH0,#38H MOV TL0,#38H MOV TMOD,#00000010B SETB TR0 SETB EA SETB ET0LOOP: MOV P1,#0FFH;输出1LOOP1: MOV A,R2CJNE A,#0,LOOP1 ;判断到1ms否MOV P1,#0FEH;到1ms输出0,否则继续检测MOV R2,#COUNT ;重置计数LOOP2: MOV A,R2CJNE A,#0,LOOP2 ;判断到1ms否MOV R2,#COUNTSJMP LOOP;到1ms循环 ;********************************** _T0: DEC R2 RETIEND ;KEIL2调试通过
3,单片机计时器如何编写#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit key1=P3^0; //定义"启动"按钮sbit key2=P3^1; //定义"停止"按钮sbit key3=P3^2; //定义"复位"按钮sbit DP =P0^7; //定义"小数点(.)"uchar aa,bb,cc,dd,ee,qian,bai,shi,ge;uchar code table[]=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管依次从0到9的编码void delay(uint z) //延时子函数 uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}void display(uchar qian,uchar bai,uchar shi,uchar ge) //显示子程序 P2=0xfe; P0=table[qian]; //千位 delay(10); P2=0xfd; P0=table[bai]; //百位 delay(10); DP=1; delay(10); P2=0xfb; P0=table[shi]; //十位 delay(10); P2=0xf7; P0=table[ge]; //个位 delay(10); //使用动态扫描的方法实现数码管显示}void init() //初始化子程序 aa=0; bb=0; cc=0; dd=0; ee=0; TMOD=0x01; //使用定时器T0的方式1 TL0=0x18; TH0=0xfc; //定时1ms中断一次 fosc=12MZH EA=1; //中断总允许 ET0=1; //允许定时器T0中断 }void timer0() interrupt 1 TL0=0x18; TH0=0xfc;//重新赋初值 aa++; //中断一次变量aa的值加1if(aa==8) //中断10次后,定时时间为10*1ms=10ms=0.01s PS:实际模拟中发现程序显示时间比实际时间慢20%左右 所以把a改为8 aa=0; bb++; ge=bb%10; }if(bb==10) //中断100次后,定时时间为100*1ms=100ms=0.10s bb=0; cc++; shi=cc%10;}if(cc==10) //中断1000次后,定时时间为1000*1ms=1000ms=1.00s cc=0; dd++; bai=dd%10;}if(dd==10) //中断10000次后,定时时间为10000*1ms=10000ms=10.00s dd=0; ee++; qian=ee%10;}if(ee==10) //中断100000次后 ,全部归零重新开始 aa=0; bb=0; cc=0; dd=0; ee=0;}}void main() init(); //调用初始化子程序 while(1)if(key1==0) //检测"启动"按钮是否按下delay(10); //延时去抖动 if(key1==0) //再次检测"启动"按钮是否按下while(!key1); //松手检测 , 若按键没有释放 , key1始终为0,那么!key1始终为1,程序就一直停在此 TR0=1; //启动定时器开始工作 } } if(key2==0) //检测"停止"按钮是否按下delay(10); //延时去抖动 if(key2==0) //再次检测"停止"按钮是否按下while(!key2); //松手检测 TR0=0; //关闭定时器 } } if(key3==0) //检测"复位"按钮是否按下delay(10); //延时去抖动 if(key3==0) //再次检测"复位"按钮是否按下while(!key3); //松手检测 aa=0; bb=0; cc=0; dd=0; ee=0; ge=0; bai=0; shi=0; qian=0; TR0=0; //关闭定时器 }}display(qian,bai,shi,ge); //调用显示子函数 }}
4,单片机计时器如何编写#include#define uint unsigned int #define uchar unsigned char sbit key1=P3^0; //定义"启动"按钮 sbit key2=P3^1; //定义"停止"按钮 sbit key3=P3^2; //定义"复位"按钮 sbit DP =P0^7; //定义"小数点(.)" uchar aa,bb,cc,dd,ee,qian,bai,shi,ge; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //共阴极数码管依次从0到9的编码 void delay(uint z) //延时子函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void display(uchar qian,uchar bai,uchar shi,uchar ge) //显示子程序 { P2=0xfe; P0=table[qian]; //千位 delay(10); P2=0xfd; P0=table[bai]; //百位 delay(10); DP=1; delay(10); P2=0xfb; P0=table[shi]; //十位 delay(10); P2=0xf7; P0=table[ge]; //个位 delay(10); //使用动态扫描的方法实现数码管显示 } void init() //初始化子程序 { aa=0; bb=0; cc=0; dd=0; ee=0; TMOD=0x01; //使用定时器T0的方式1 TL0=0x18; TH0=0xfc; //定时1ms中断一次 fosc=12MZH EA=1; //中断总允许 ET0=1; //允许定时器T0中断 } void timer0() interrupt 1 { TL0=0x18; TH0=0xfc;//重新赋初值 aa++; //中断一次变量aa的值加1 if(aa==8) //中断10次后,定时时间为10*1ms=10ms=0.01s PS:实际模拟中发现程序显示时间比实际时间慢20%左右 所以把a改为8 { aa=0; bb++; ge=bb%10; } if(bb==10) //中断100次后,定时时间为100*1ms=100ms=0.10s { bb=0; cc++; shi=cc%10; } if(cc==10) //中断1000次后,定时时间为1000*1ms=1000ms=1.00s { cc=0; dd++; bai=dd%10; } if(dd==10) //中断10000次后,定时时间为10000*1ms=10000ms=10.00s { dd=0; ee++; qian=ee%10; } if(ee==10) //中断100000次后  , 全部归零重新开始 { aa=0; bb=0; cc=0; dd=0; ee=0; } } void main() { init(); //调用初始化子程序 while(1) { if(key1==0) //检测"启动"按钮是否按下 { delay(10); //延时去抖动 if(key1==0) //再次检测"启动"按钮是否按下 { while(!key1); //松手检测,若按键没有释放 , key1始终为0,那么!key1始终为1,程序就一直停在此 TR0=1; //启动定时器开始工作 } } if(key2==0) //检测"停止"按钮是否按下 { delay(10); //延时去抖动 if(key2==0) //再次检测"停止"按钮是否按下 { while(!key2); //松手检测 TR0=0; //关闭定时器 } } if(key3==0) //检测"复位"按钮是否按下 { delay(10); //延时去抖动 if(key3==0) //再次检测"复位"按钮是否按下 { while(!key3); //松手检测 aa=0; bb=0; cc=0; dd=0; ee=0; ge=0; bai=0; shi=0; qian=0; TR0=0; //关闭定时器 } } display(qian,bai,shi,ge); //调用显示子函数 } }if(shu==60)shu=0;delay(5);/我可是刚学 , 弄了好久才弄出来的哦 ///th0=(65536-50000)/256;tl0=(65536-50000)%256;et0=1;tr0=1,0x4f,0x66,0x6d,0x7d;计数加1,秒计数到60时,自动从0开始,当一秒产生时 , 秒 //,然后数码管位选通过74hc138来控制 /p2口接数码管;if(a==20){a=0;/1:用at89c51单片机的定时/10;miao=shu%10;ea=1,请大家帮个忙 , 谢谢;y--); }//,0x07,0x7f;0;p2=table[miao]; void main() {init(),作为秒计数时间; } void display(uchar fen;延时5毫秒p1=0xff;x>0;x--)for(y=110;y>! #include< uchar a;tl0=(65536-50000)%256;a++,0x6f}; void display(uchar fen;shu++;fen=shu//由于是刚刚注册 , 积分没有多少;延时5毫秒 }void delay(uint z) {uint x,y;for(x=z;计数器t0产生一秒的/,0x06,0x5b;delay(5);///定时时间,fen,uchar miao) {p1=0xfe;p2=table[fen];/要图的话加980100952 /256,uchar miao) 。单片机 /while(1){display(fen,miao);}} void timer0() interrupt 1 {th0=(65536-50000)//晶振频率为12mhz / void init(),miao,shu; void delay(uint z);reg52.h> #define uchar unsigned char #define uint unsigned int uchar code table[]={0x3f//这个软件是调通过了的;}}void init() {tmod=0x01

    推荐阅读