用定时计数器 |
本帖最后由 zl2168 于 2016-11-29 14:42 编辑 虚荣心像恶鬼 发表于 2016-11-28 20:15 程序在书中,自己可去看。 秒表案例不难,网上的程序多如牛毛,有什么区别???区别在于电路与程序真实可靠可信可行;在于程序语句条条有注解;在于便于阅读理解,便于自学;在于可以仿真演示,直观效果;在于不忽悠、不骗人。 |
程序在书中,自己可去看。 |
顶一个 |
zl2168 发表于 2016-11-26 17:35 可以看一下程序吗 |
用定时器最好了 |
三位数码管显示秒,无时、分显示,显示较准确。在普中HC6800V3.0板上做过实验,好用。 #include<reg51.h> #define GPIO_DIG P3 #define GPIO_PLACE P1 unsigned char code DIG_PLACE[3] = {0xfe,0xfd,0xfb};//,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制 unsigned char code DIG_CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char DisplayData[8]; //用来存放要显示的8位数的值 unsigned char Time; //用来存放定时时间 unsigned int Second; /*********************使用数码管显示*******************/ void DigDisplay() { unsigned char i; unsigned int j; for(i=0; i<8; i++) { GPIO_PLACE=DIG_PLACE[i]; //发送位选 GPIO_DIG=DisplayData[i]; //发送段码 j=10; //扫描间隔时间设定 while(j--); GPIO_DIG=0x00; //消隐 } } /*********************配置定时器************************/ void Timer0init(void) { TMOD=0x01; //定时器0选择工作方式1 TH0 =(65536-49550)/256; //设置初始值,定时50MS TL0 =(65536-49550)%256; EA =1; //打开总中断 ET0 =1; //打开定时器0中断 TR0 =1; //启动定时器0 } /**********************主函数***************************/ void main(void) { Timer0init(); while(1) { DisplayData[0]=DIG_CODE[(Second)/100]; DisplayData[1]=DIG_CODE[(Second)%100/10]; DisplayData[2]=DIG_CODE[(Second)%10]; DigDisplay(); } } /*******************定时器0中断函数**********************/ void Timer0() interrupt 1 { TH0=(65536-49550)/256; //设置初始值 TL0=(65536-49550)%256; Time++; if(Time==40) //控制秒时间长短 { Second++; Time=0; } } |
定时器中断延时1s就可以了吧 |
本帖最后由 zl2168 于 2016-11-26 17:36 编辑 实例93 99.9秒秒表 先Proteus仿真一下,确认有效。 ![]() ![]() 以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。 若需99.99秒,硬件电路增加一位595。软件程序增加0.01s(10ms)计数器,并修改相应计数显示程序。 |
刚理解什么叫“跑秒”?,原来是秒表。 |
常长诀 发表于 2016-11-26 13:38 不需要额外振荡器,单片机本身有振荡器。 |
需要振荡器 |
三位数码管显示秒,无时、分显示,显示较准确。在普中HC6800V3.0板上做过实验,好用。 #include<reg51.h> #define GPIO_DIG P3 #define GPIO_PLACE P1 unsigned char code DIG_PLACE[3] = {0xfe,0xfd,0xfb};//,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制 unsigned char code DIG_CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char DisplayData[8]; //用来存放要显示的8位数的值 unsigned char Time; //用来存放定时时间 unsigned int Second; /*********************使用数码管显示*******************/ void DigDisplay() { unsigned char i; unsigned int j; for(i=0; i<8; i++) { GPIO_PLACE=DIG_PLACE[i]; //发送位选 GPIO_DIG=DisplayData[i]; //发送段码 j=10; //扫描间隔时间设定 while(j--); GPIO_DIG=0x00; //消隐 } } /*********************配置定时器************************/ void Timer0init(void) { TMOD=0x01; //定时器0选择工作方式1 TH0 =(65536-49550)/256; //设置初始值,定时50MS TL0 =(65536-49550)%256; EA =1; //打开总中断 ET0 =1; //打开定时器0中断 TR0 =1; //启动定时器0 } /**********************主函数***************************/ void main(void) { Timer0init(); while(1) { DisplayData[0]=DIG_CODE[(Second)/100]; DisplayData[1]=DIG_CODE[(Second)%100/10]; DisplayData[2]=DIG_CODE[(Second)%10]; DigDisplay(); } } /*******************定时器0中断函数**********************/ void Timer0() interrupt 1 { TH0=(65536-49550)/256; //设置初始值 TL0=(65536-49550)%256; Time++; if(Time==40) //控制秒时间长短 { Second++; Time=0; } } |
三位数码管显示秒,无时、分显示,显示较准确。在普中HC6800V3.0板上做过实验,好用。 #include<reg51.h> #define GPIO_DIG P3 #define GPIO_PLACE P1 unsigned char code DIG_PLACE[3] = {0xfe,0xfd,0xfb};//,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制 unsigned char code DIG_CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char DisplayData[8]; //用来存放要显示的8位数的值 unsigned char Time; //用来存放定时时间 unsigned int Second; /*********************使用数码管显示*******************/ void DigDisplay() { unsigned char i; unsigned int j; for(i=0; i<8; i++) { GPIO_PLACE=DIG_PLACE[i]; //发送位选 GPIO_DIG=DisplayData[i]; //发送段码 j=10; //扫描间隔时间设定 while(j--); GPIO_DIG=0x00; //消隐 } } /*********************配置定时器************************/ void Timer0init(void) { TMOD=0x01; //定时器0选择工作方式1 TH0 =(65536-49550)/256; //设置初始值,定时50MS TL0 =(65536-49550)%256; EA =1; //打开总中断 ET0 =1; //打开定时器0中断 TR0 =1; //启动定时器0 } /**********************主函数***************************/ void main(void) { Timer0init(); while(1) { DisplayData[0]=DIG_CODE[(Second)/100]; DisplayData[1]=DIG_CODE[(Second)%100/10]; DisplayData[2]=DIG_CODE[(Second)%10]; DigDisplay(); } } /*******************定时器0中断函数**********************/ void Timer0() interrupt 1 { TH0=(65536-49550)/256; //设置初始值 TL0=(65536-49550)%256; Time++; if(Time==40) //控制秒时间长短 { Second++; Time=0; } } |
这个参考一下 |
16.8 KB, 下载次数: 10
本帖最后由 zl2168 于 2016-11-26 08:56 编辑 什么叫“跑秒”?经常看到一些自定义且莫名其妙的新名词,是老师教的还是你自己想出来的? 建议用规范术语提问! |
定时器中断 要求不高或者用指令延时 |
//自己加上顯示秒數 程式 #include <reg52.h> #define led_bus P0 #define led_com P1 sbit sw1 = P2^0; //-重置秒數 sbit sw2 = P2^1; //停止計時 char count; unsigned int sec; unsigned char T0IntCount; bit stop; void Timer0Init(void) //50ms@11.0592MHz { TMOD &= 0xF0; //Set timer work mode TMOD |= 0x01; //Set timer work mode TL0 = 0x00; //Initial timer value TH0 = 0x4C; //Initial timer value TF0 = 0; //Clear TF0 flag TR0 = 1; //Timer0 start run ET0=1; // } void Timer0Isr(void) interrupt 1 { TL0 = 0x00; //-重裝初值 TH0 = 0x4C; //-重裝初值 T0IntCount++; if( T0IntCount > 19) //50 ms * 20 = 1秒 { T0IntCount=0; sec++; //秒數遞增 } } main() { Timer0Init(); EA=1; //中斷總開關開啟 P2=0xff;//設按鍵可讀取 stop=1; //設定可計時 while(1) { if(sw1==0) //按鍵判斷 { count=!count; //清除或計時 } if(count ==0) //f秒數清除 { TR0=0; sec=0; TL0 = 0x00; //--重裝初值 TH0 = 0x4C; //--重裝初值 } else //開始計時 { TR0=1; } if(sw2 ==0) //暫停計時 { stop=!stop; } ET0=stop ; //驅動顯示秒數 .......(視研發板電路撰寫) } } |