单片机时钟秒表代码

合集下载

单片机制作数字钟(含万年历、秒表功能)

单片机制作数字钟(含万年历、秒表功能)

数字钟、万年历制作(基于单片机)电路原理图:程序://********************20131206****数字钟程序#pragma SMALL#include <reg51.h>#include <absacc.h>#include <intrins.h>//********************************************************* *********编译预处理void display(unsigned char *p); //显示函数,P为显示数据首地址unsigned char keytest(); //按键检测函数unsigned char search(); //按键识别函数void alarm(); //闹钟判断启动函数void ftion0(); //始终修改函数void ftion1(); //闹钟修改函数void ftion3(); //日期修改函数void cum(); //加1修改函数void minus(); //减1修改函数void jinzhi(); //进制修改函数void riqi(); //日期void stopwatch(); //秒表函数//********************************************************* *******函数声明sbit P2_7=P2^7;//********************************************************* *******端口定义unsigned char clockbuf[3]={0,0,0};unsigned char bellbuf[3]={0,0,0};unsigned char date[3]={1,1,1}; //日期存放数组unsigned char stop[3]={0,0,0};unsigned char msec1,msec2;unsigned char timdata,rtimdata,dtimdata;unsigned char count;unsigned char *dis_p;unsigned char or; //12进制控制标志unsigned char ri; //日期显示控制标志位unsigned char mb; //秒表控制标志位bit arm,rtim,rhour,rmin,hour,min,sec,day,mon,year; //定义位变量//********************************************************* *****全局变量定义void main(){unsigned char a;or=0; //12进制修改标志清零ri=0;mb=0;P2_7=0;arm=0;msec1=0;msec2=0;timdata=0;rtimdata=0;count=0;TMOD=0x12;TL0=0x06;TH0=0x06;TH1=(65536-10000)/256;TL1=(65536-10000)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=0;dis_p=clockbuf;while(1){a=keytest();if(a==0x78) //判断是否有键按下{display(dis_p);if(arm==1) alarm();}else{display(dis_p);a=keytest();if(a!=0x78){a=search();switch(a){case 0x00:ftion0();break;case 0x01:ftion1();break;case 0x02:cum();break;case 0x06:jinzhi();break;case 0x03:riqi();break;case 0x04:ftion3();break;case 0x05:minus();break;case 0x07:stopwatch();break;case 0x09:TR1=1;break;case 0x0a:TR1=0;break;case 0x0b:stop[0]=0;stop[1]=0;stop[2]=0;break;default:break;}}}}}//********************************************主函数【完】void display(unsigned char *p){unsigned char buffer[]={0,0,0,0,0,0};unsigned char k,i,j,m,temp;unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};buffer[0]=p[0]/10;buffer[1]=p[0]%10;buffer[2]=p[1]/10;buffer[3]=p[1]%10;buffer[4]=p[2]/10;buffer[5]=p[2]%10;if((sec==0)&&(min==0)&&(hour==0)&&(rmin==0)&&(rhour==0)&&( day==0)&&(mon==0)&&(year==0)) //没有修改标志,正常显示{for(k=0;k<3;k++){temp=0x01;for(i=0;i<6;i++){P0=0x00; //段选端口j=buffer[i];P0=led[j];P1=~temp; //位选端口temp<<=1;for(m=0;m<200;m++);}}}else //若有修改标志,则按以下标志分别显示{if(sec==1||day==1){P1=0x1f;i=buffer[5];P0=led[i];for(m=0;m<200;m++);P1=0x2f;j=buffer[4];P0=led[j];for(m=0;m<200;m++);}if(min==1||rmin==1||mon==1){P1=0x3b;i=buffer[2];P0=led[i];for(m=0;m<200;m++);P1=0x37;j=buffer[3];P0=led[j];for(m=0;m<200;m++);}if(hour==1||rhour==1||year==1) {P1=0x3e;i=buffer[0];P0=led[i];for(m=0;m<200;m++);P1=0x3d;j=buffer[1];P0=led[j];for(m=0;m<200;m++);}}}//**********************************LED显示函数【完】unsigned char keytest(){unsigned char c;P2=0x78; //检测是否有键按下c=P2;c=c&0x78;return(c);}//******************************************键盘检测函数【完】unsigned char search(){unsigned char a,b,c,d,e;c=0x3f;a=0; //行号while(1){P2=c;d=P2;d=d&0x07;if(d==0x03){b=0;break;} //列号else if(d==0x05){b=1;break;}else if(d==0x06){b=2;break;}a++;c>>=1;if(a==5){a=0;c=0x3f;}}e=a*3+b;do{display(dis_p);}while((d=keytest())!=0x78);return(e);}//***********************************************查键值函数【完】void alarm(){if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1])){P2_7=1;rtim=1;if(count==10){count=0;P2_7=0;arm=0;rtim=0;}}}//****************************************闹钟判断启动函数【完】void ftion0(){TR0=0;rhour=0;rmin=0;dis_p=clockbuf;rtimdata=0;timdata++;switch(timdata){case 0x01:sec=1;break;case 0x02:sec=0;min=1;break;case 0x03:min=0;hour=1;break;case 0x04:timdata=0;hour=0;TR0=1;break;default:break;}}//*********************************************时钟设置函数【完】void ftion1(){if(TR0==0) TR0=1;sec=0;min=0;hour=0;dis_p=bellbuf;timdata=0;rtimdata++;switch(rtimdata){case 0x01:rmin=1;break;case 0x02:rmin=0;rhour=1;break;case 0x03:rtimdata=0;rhour=0;arm=1;dis_p=clockbuf;break;default:break;}}//*********************************************闹钟设置函数【完】void ftion3(){if(TR0==0) TR0=1;day=0;mon=0;year=0;dis_p=date;timdata=0;rtimdata=0;dtimdata++;switch(dtimdata){case 0x01:day=1;break;case 0x02:day=0;mon=1;break;case 0x03:mon=0;year=1;break;case 0x04:dtimdata=0;year=0;dis_p=clockbuf;break;default:break;}}//*************************************************日期修改函数【完】void minus(){if(sec==1){if(0==clockbuf[2]) clockbuf[2]=59;else clockbuf[2]--;}else if(min==1){if(0==clockbuf[1]) clockbuf[1]=59;else clockbuf[1]--;}else if(hour==1){if(or==0) //判断进制{if(0==clockbuf[0]) clockbuf[0]=23;else clockbuf[0]--;}if(or==1){if(1==clockbuf[0]) clockbuf[0]=12;else clockbuf[0]--;}}else if(rmin==1){if(bellbuf[1]==0) bellbuf[1]=59;else bellbuf[1]--;}else if(rhour==1){if(or==0){if(bellbuf[0]==0) bellbuf[0]=23;else bellbuf[0]--;}if(or==1){if(bellbuf[0]==1) bellbuf[0]=12;else bellbuf[0]--;}}else if(day==1){if(date[2]==1) date[2]=31;else date[2]--;}else if(mon==1){if(date[1]==1) date[1]=12;else date[1]--;}else if(year==1){if(date[0]==1) date[0]=99;else date[0]--;}}//*************************************减1修改功能函数【完】void cum(){if(sec==1){if(59==clockbuf[2]) clockbuf[2]=0;else clockbuf[2]++;}else if(min==1){if(59==clockbuf[1]) clockbuf[1]=0;else clockbuf[1]++;}else if(hour==1){if(or==0) //判断进制{if(23==clockbuf[0]) clockbuf[0]=0;else clockbuf[0]++;}if(or==1){if(12==clockbuf[0]) clockbuf[0]=1;else clockbuf[0]++;}}else if(rmin==1){if(bellbuf[1]==59) bellbuf[1]=0;else bellbuf[1]++;}else if(rhour==1){if(or==0){if(bellbuf[0]==23) bellbuf[0]=0;else bellbuf[0]++;}if(or==1){if(bellbuf[0]==12) bellbuf[0]=1;else bellbuf[0]++;}}else if(day==1){if(date[2]==31) date[2]=1;else date[2]++;}else if(mon==1){if(date[1]==12) date[1]=1;else date[1]++;}else if(year==1){if(date[0]==99) date[0]=0;else date[0]++;}}//*************************************加1修改功能函数【完】void jinzhi(){if(or==0) or=1;else or=0;}//***********************************进制修改控制函数【完】void riqi(){if(ri==0){dis_p=date;}if(ri==1){dis_p=clockbuf;}ri++;if(ri==2) ri=0;}//********************************日期控显示函数【完】void stopwatch(){if(mb==0){dis_p=stop;mb=1;}else{mb=0;dis_p=clockbuf;}}//************秒表**********秒表**********秒表函数【完】void clock() interrupt 1{EA=0;if(msec1!=0x14) msec1++; //6MHz晶振定时10mselse{msec1=0;if(msec2!=100) msec2++; //定时1selse{if(rtim==1) count++; //闹钟启动标志计时10smsec2=0;if(clockbuf[2]!=59) clockbuf[2]++;else{clockbuf[2]=0;if(clockbuf[1]!=59) clockbuf[1]++;else{clockbuf[1]=0;if(or==0){if(clockbuf[0]!=23) clockbuf[0]++;else{clockbuf[0]=0;if((date[1]==1)||(date[1]==1)||(date[1]==1)||(date[1]==3)||(date[ 1]==5)||(date[1]==7)||(date[1]==8)||(date[1]==10)||(date[1]==12)){if(date[2]!=30) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if((date[1]==4)||(date[1]==6)||(date[1]==9)||(date[1]==11)){if(date[2]!=29) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if(date[1]==2){if((((date[0]%4==0)&&(date[0]%100!=0))||(date[0]%400==0))){if(date[2]!=28) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}else{if(date[2]!=27) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}}}}if(or==1){if(clockbuf[0]!=12) clockbuf[0]++;else{clockbuf[0]=0;if((date[1]==1)||(date[1]==1)||(date[1]==1)||(date[1]==3)||(date[ 1]==5)||(date[1]==7)||(date[1]==8)||(date[1]==10)||(date[1]==12)){if(date[2]!=30) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if((date[1]==4)||(date[1]==6)||(date[1]==9)||(date[1]==11)){if(date[2]!=29) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if(date[1]==2){if((((date[0]%4==0)&&(date[0]%100!=0))||(date[0]%400==0))){if(date[2]!=28) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}else{if(date[2]!=27) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}}}}}}}}EA=1;}//*******************************定时器0中断函数【完】void miaobiao() interrupt 3{TH1=(65536-10000)/256;TL1=(65536-10000)%256;if(stop[2]!=99) stop[2]++;else{stop[2]=0;if(stop[1]!=59) stop[1]++;else{stop[1]=0;if(stop[0]!=59) stop[0]++;else stop[0]=0;}}}//***********************************定时器1中断函数【完】。

单片机时钟秒表代码

单片机时钟秒表代码

#include<reg52.h>#define uchar unsigned char#define uint unsigned intbit write=0; //写24C02的标志;sbit sda=P2^3;sbit scl=P2^2;sbit dula=P3^6;sbit wela=P3^7;sbit LED_CS=P2^5;sbit MOTOR_CS=P2^7;sbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^2;sbit key4=P1^3;uint min,sec,tt,ge,shi,bai,qian;uchar a=0;uchar flag=0;uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};void delay(){ ;; }void delayms(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void start() //开始信号:scl为高电平期间, sda发生负跳变{sda=1;delay();scl=1;delay();sda=0;delay();}void stop() //停止信号:scl为高电平, sda发生正跳变{sda=0;delay();scl=1;delay();sda=1;delay();}void respons()//应答信号:scl为高电平期间, sda被承受设备拉为低电平, 最后//scl置0 {uchar i;scl=1;delay();while((sda==1)&&(i<255))i++;scl=0;delay();}void init() //总线初始化:将总线拉高以释放总线{sda=1;delay();scl=1;delay();}/*写字节数据: 将8位数据通过左移到CY(进位),然后赋值给数据线SDA 每发送一位,scl出现正跳变,发送完数据后,需要将scl置0, sda置1 */ void write_byte(uchar date){uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;delay();sda=CY;delay();scl=1;delay();}scl=0;delay();sda=1;delay();}/*读字节数据: 将数据一位一位从sda中获取, 每读取一位scl出现负跳变通过变量k将8位数据整合为1个字节数据,读数据前, 先将scl置0, sda置1*/uchar read_byte(){uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++){scl=1;delay();k=(k<<1)|sda;scl=0;delay();}return k;}//数码管显示程序void display(uchar qian,uchar bai,uchar shi,uchar ge){P0 = table[ge];dula = 1;dula = 0;P0=0x08;wela = 1;wela = 0;delayms(1);P0 = table[shi];dula = 1;dula = 0;P0=0x04;wela = 1;wela = 0;delayms(1);P0 = table[bai];dula = 1;dula = 0;P0 = 0x02;wela= 1;wela= 0;delayms(1);P0 = table[qian];dula = 1;dula = 0;P0 = 0x01;wela= 1;wela= 0;delayms(1);}//判断按键void keyscan(){MOTOR_CS=0;LED_CS=0;if(key1==0){delayms(10); //消抖if(key1==0){sec=0;min=0;while(!key1);}}if(key2==0){delayms(10);if(key2==0){TR0=1;while(!key2);}}if(key3==0){delayms(10);if(key3==0){TR0=0;while(!key3);}}if(key4==0){delayms(10);if(key4==0){TR0=0;sec=sec+1;while(!key4);}}}void led(){LED_CS=1;P0=0x00;delayms(250);P0=0xff;LED_CS=0;}void beep(){MOTOR_CS=1;P0 = 0x3f;delayms(250);P0 = 0x7f;MOTOR_CS=0; }void main(){LED_CS = 0;MOTOR_CS=0;sec=read_add(2); //读出保存的数据赋于secTMOD=0x01; //定时器工作在方式1ET0=1; //打开定时器、计数器0中断允许位EA=1; //打开全局中断// TR0=0;TH0=(65536-50000)/256; //对TH0 TL0赋值while(1){shi=sec/10;ge=sec%10;bai = min%10;qian = min/10;display(qian,bai,shi,ge);keyscan();if(write==1) //判断计时器是否计时一秒{write=0; //置零write_add(2,sec); //在24c02的地址2中写入数据sec }}}void t0() interrupt 1 //定时中断服务函数{TH0=(65536-50000)/256; //对TH0 TL0赋值TL0=(65536-50000)%256; //重装计数初值tt++; //每过50ms tt加一if(tt==20) //计满20次〔1秒〕时{tt=0; //重新再计sec++;write=1; //1秒写一次24C02if(sec==60) //定时60秒,再从零开始计时{sec=0;led();beep();min++;if(min==60)//是否满1h{min=0;}}}。

51单片机秒表程序

51单片机秒表程序
TH0=0Xd8;//给定时器赋初值,定时10ms
TL0=0Xf0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
/*******************************************************************************
case(7):
LSA=0;LSB=0;LSC=0; break;//显示第0位
}
P0=DisplayData[i];//发送段码
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void datapros()
{
DisplayData[0]=smgduan[min/10];
DisplayData[1]=smgduan[min%10];
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
void main()
{
Timer0Init(); //定时器0初始化
while(1)
{
datapros();
DigDisplay();
}
}
/*******************************************************************************

单片机秒表程序代码

单片机秒表程序代码

单片机秒表程序代码
以下是一个基本的单片机秒表程序代码,使用Keil C语言编写:#include <reg52.h> 引入头文件
unsigned int s=0; 定义全局变量秒数
void delay() 定义延时函数
{
unsigned int i,j;
for(i=1;i<=1000;i++)
{
for(j=1;j<=100;j++);
}
}
void timer0() interrupt 1 定义定时器0中断服务函数
{
TH0=0xFC; 设置计时器初始值,每50ms中断一次
TL0=0x67;
s++; 秒数+1
}
void main() 主函数
{
TMOD=0x01; 设置计时器0为模式1
TH0=0xFC; 设置计时器初始值,每50ms中断一次
TL0=0x67;
EA=1; 允许中断
ET0=1;
TR0=1; 启动计时器0
while(1)
{
if(s>=60) 如果秒数到达60秒,重置秒数为0
{
s=0;
}
P1=s; 将秒数显示在P1口上
delay(); 延时
}
}
注:此代码仅供参考,实际使用时可能需要根据具体需求进行修改和优化。

单片机秒表程序代码

单片机秒表程序代码
TMOD=0x01;
TR0=1;ET0=1;EA=1;
while(1)
{
KeyHandle();
CountToLeds();
CountsToLed();
}}
if (isLock) c=0x40;
if (isQuery) c=0x00;
v=Counts[Countp2];
Leds[4]=v/1000+c;
Leds[5]=v/100%10+c;
Leds[6]=v/10%10+0x10+c;
Leds[7]=v%10+c;
}
void Lock()
{
Counts[Countp]=Count;
{
if (isStart) Lock();
isStart=1;
isQuery=0;
}
if (key==0x0d) isStart=0;
if (key==0x0b)
{ isStart=0;
isLock=0;
isQuery=0;
Count=0;}
if (key==0x07)
{
Countp2=(MAXC+Countp2-1)%MAXC;
if (v&0x10) c|=0x80;
if (v&0x80) c=0x00;
if ((v&0x40) && (bGlink)) c=0x00;
P2=c;P3=Ledc;
Ledc++;
if (Ledc>=8) Ledc=0;}
void readkey()
{ char c;
c=P1;
c&=0x0f;

51单片机时钟代码(带秒表闹钟功能)

51单片机时钟代码(带秒表闹钟功能)

51单片机时钟代码(带秒表闹钟功能)#include#include#defineucharunignedchar#defineuintunignedintbitbeep=P1^5;//蜂鸣器bitLED1=P1"6;//LED灯bitep=P2"7;//1602使能端bitr=P2八6;//1602bitrw=P2八5;//1602bit0二P3八4;//停止闹铃和小灯bit1二P3八5;//功能键bit2二P3飞;//增大键bit3二P3X;//减小键bit4二P3「;//bit5=P3^2;bit6二P3八3;bit7=P3^0;uchar1num,4num,count,count1,judge=0;charec,min,hour,miao,fen,hi,ec1,min1,diwei;voiddelay(uintz){ uint某,y;for(某二z;某〉0;某--)for(y=100;y〉0;y—);}voiddi(){beep=0;delay(50);beep=1;}bitlcd_bz()//测试LCD忙碌状态{bitreult;r=0;rw=1;ep=1;_nop_();_nop_();_nop_();_nop_();reult=(bit)(P0&0某80);ep=0;returnreult;}_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;}voidwrite_data(uchardat)//写入字符显示数据到LCD{while(lcd_bz());//等待LCD空闲r=1;rw=0;ep=0;P0=dat;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_( );_nop_();_nop_();_nop_();ep=0;}ucharhi,ge;hi=dat/10;ge=dat;write_data(0某30+hi);write_data(0某30+ge);}voidwrite_alarm(ucharadd,uchardat){ucharhi1,ge1;hi1=dat/10;ge1=dat;count=0;//clearwrite_data('A');delay(5);hi=17;voidkeycan()//按键扫描{if(l==0){delay(5);if(1==0){1num++;while(!1);di(); if(1num==1){TR0=0;if(1num==2){if(1num==3){if(1num==4){1num=0;if(1num!=0){if(2==0){delay(5);if(2==0){while(!2);di();if(1num==1){ec++;if(ec==60)ec=0;min++;if(min==60)min=0;if(1num==3){hour++;if(hour==24)hour=0;delay(5);if(3==0){while(!3);di();if(1num==1){ec--;if(ec<0)ec=59;if(1num==2){min--;if(min<0)min=59;hour--;if(hour<0)hour=23;}voidkeycan1(){if(4==0){delay(5);if(4==0){4num++;while(!4);di();if(4num==1){TR0=0;if(4num==3){if(4num==4){if(4num!=0){if(5==0){delay(5);if(5==0){while(!5);di();if(4num==1){miao++;if(miao==60)miao=0; write_alarm(10,miao);if(4num==2){fen++;if(fen==60)fen=0;if(4num==3){hi++;if(hi==24)hi=0;write_alarm(4,hi);if(6==0){delay(5);if(6==0){while(!6);di();if(4num==1){miao--;if(miao<0)miao=59;if(4num==2){fen--;if(fen<0)fen=59;write_alarm(7,fen);if(4num==3){hi--;if(hi<0)hi=23;}}if(7==0){delay(5);if(7==0){while(!7)di();judge++;}}if(judge==2){TL0=0某b0;TH0=0某3c; {ec=0;min++;if(min==60){min=0;hour++;if(hour==24){hour=0;}}}}}if(judge==3){judge=0;ec1=0;min1=0;diwei=0;write_alarm(10,miao);write_alarm(7,fen);write_alarm(4,hi);wr ite_alarm(10,miao);write_alarm(7,fen);write_alarm(4,hi);} if(count==20){count=0;ec++;if(ec==60){ec=0;min++;if(min==60){min=0;hour++;if(hour==24){hour=0;}}}}}。

51单片机,实现秒表功能

51单片机,实现秒表功能
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
char cent=0;
char second=0;
char minite=0;
bit s2=0;
bit s3=0;
bit s4=0;
bit s5=0;
bit s6=0;
/********************************************************/
//函数名:void Delay1ms(uint count)
//功能:延时时间为1ms
//输入参数:count,1ms计数
//说明:总共延时时间为1ms乘以count,crystal=12Mhz
/*共阳数码管字型码*/
/*0,1,2,3,4,5,6,7,8,9,p.,灭*/
char code dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0c,0xff,0xbf};
/*P点显示代码序号*/
char data find_code[]={0,0,12,0,0,12,0,0};
/********************************************************/
/*延迟函数*/
void Delay1ms(uint count)
{
uint j;
while(count--!=0)
{
for(j=0;j<80;j++);
}
}
/************************************************************************/

51单片机秒表程序设计

51单片机秒表程序设计

51单片机秒表程序设计1. 简介秒表是一种用于测量时间间隔的计时器,常见于体育比赛、实验室实验等场合。

本文将介绍如何使用51单片机设计一个简单的秒表程序。

2. 硬件准备•51单片机开发板•LCD液晶显示屏•按键开关•连接线3. 程序流程3.1 初始化设置1.设置LCD液晶显示屏为8位数据总线模式。

2.初始化LCD液晶显示屏。

3.设置按键开关为输入模式。

3.2 主程序循环1.显示初始界面,包括“00:00:00”表示计时器初始值。

2.等待用户按下开始/暂停按钮。

3.如果用户按下开始按钮,则开始计时,进入计时状态。

4.如果用户按下暂停按钮,则暂停计时,进入暂停状态。

5.在计时状态下,每隔1毫秒更新计时器的数值,并在LCD液晶显示屏上显示出来。

6.在暂停状态下,不更新计时器的数值,并保持显示当前数值。

3.3 计时器控制1.定义一个变量time用于存储当前的计时器数值,单位为毫秒。

2.定义一个变量running用于标记计时器的状态,0表示暂停,1表示运行。

3.定义一个变量start_time用于存储计时器开始的时间点。

4.定义一个变量pause_time用于存储计时器暂停的时间点。

5.在计时状态下,每隔1毫秒更新time的值为当前时间与start_time的差值,并将其转换为小时、分钟、秒的表示形式。

6.在暂停状态下,保持time的值不变。

3.4 按键检测1.检测按键开关是否被按下。

2.如果按键被按下,判断是开始/暂停按钮还是复位按钮。

3.如果是开始/暂停按钮,并且当前处于计时状态,则将计时状态设置为暂停状态,并记录暂停时间点为pause_time;如果当前处于暂停状态,则将计时状态设置为运行状态,并记录开始时间点为当前时间减去暂停时间的差值。

4.如果是复位按钮,则将计时器数值重置为0,并将计时状态设置为暂停。

4. 程序代码示例#include <reg51.h>// 定义LCD控制端口和数据端口sbit LCD_RS = P1^0;sbit LCD_RW = P1^1;sbit LCD_EN = P1^2;sbit LCD_D4 = P1^3;sbit LCD_D5 = P1^4;sbit LCD_D6 = P1^5;sbit LCD_D7 = P1^6;// 定义按键开关端口sbit START_PAUSE_BTN = P2^0;sbit RESET_BTN = P2^1;// 定义全局变量unsigned int time = 0; // 计时器数值,单位为毫秒bit running = 0; // 计时器状态,0表示暂停,1表示运行unsigned long start_time = 0; // 开始时间点unsigned long pause_time = 0; // 暂停时间点// 函数声明void delay(unsigned int ms);void lcd_init();void lcd_command(unsigned char cmd);void lcd_data(unsigned char dat);void lcd_string(unsigned char *str);void lcd_clear();void lcd_gotoxy(unsigned char x, unsigned char y);// 主函数void main() {// 初始化设置lcd_init();while (1) {// 显示初始界面lcd_clear();lcd_gotoxy(0, 0);lcd_string("00:00:00");// 等待用户按下开始/暂停按钮while (!START_PAUSE_BTN && !RESET_BTN);// 判断按钮类型并处理计时器状态if (START_PAUSE_BTN) {if (running) { // 当前处于计时状态,按下按钮将进入暂停状态 running = 0;pause_time = time;} else { // 当前处于暂停状态,按下按钮将进入计时状态running = 1;start_time = get_current_time() - pause_time;}} else if (RESET_BTN) { // 复位按钮按下,重置计时器time = 0;running = 0;}}}// 毫秒级延时函数void delay(unsigned int ms) {unsigned int i, j;for (i = ms; i > 0; i--) {for (j = 110; j > 0; j--);}}// LCD初始化函数void lcd_init() {lcd_command(0x38); // 设置8位数据总线模式lcd_command(0x0C); // 显示开,光标关闭lcd_command(0x06); // 光标右移,不移动显示器lcd_command(0x01); // 清屏}// 向LCD发送指令函数void lcd_command(unsigned char cmd) {LCD_RS = 0;LCD_RW = 0;LCD_EN = 1;LCD_D4 = cmd >> 4 & 1;LCD_D5 = cmd >> 5 & 1;LCD_D6 = cmd >> 6 & 1;LCD_D7 = cmd >> 7 & 1;delay(1);LCD_EN = 0;LCD_D4 = cmd >> 0 & 1;LCD_D5 = cmd >> 1 & 1;LCD_D6 = cmd >> 2 & 1;LCD_D7 = cmd >> 3 & 1;delay(1);LCD_EN = 0;}// 向LCD发送数据函数void lcd_data(unsigned char dat) { LCD_RS = 1;LCD_RW = 0;LCD_EN = 1;LCD_D4 = dat >> 4 & 1;LCD_D5 = dat >> 5 & 1;LCD_D6 = dat >> 6 & 1;LCD_D7 = dat >> 7 & 1;delay(1);LCD_EN = 0;LCD_D4 = dat >> 0 & 1;LCD_D5 = dat >> 1 & 1;LCD_D6 = dat >> 2 & 1;LCD_D7 = dat >> 3 & 1;delay(1);LCD_EN = 0;}// 向LCD发送字符串函数void lcd_string(unsigned char *str) {while (*str) {lcd_data(*str++);delay(5);}}// 清屏函数void lcd_clear() {lcd_command(0x01);}// 设置光标位置函数void lcd_gotoxy(unsigned char x, unsigned char y) {unsigned char addr;if (y == 0)addr = x | (0x80 + y);else if (y == 1)addr = x | (0xC0 + y);lcd_command(addr);}5. 总结本文介绍了使用51单片机设计一个简单的秒表程序。

单片机电子秒表程序

单片机电子秒表程序

单片机电子秒表程序MB EQU 40H ;跑表数值PB EQU 50H ;秒表数值单元;-------------------------;定义中断和主程序存储单元;-------------------------ORG 0000HAJMP MAINORG 000BH ;T0中断地址AJMP TIME0ORG 001BH ;T1中断地址AJMP TIME1ORG 0030H;-------------------------;主程序;-------------------------MAIN: MOV TMOD,#11H ;置定时器T0为工作方式1 QJ: LCALL JP ;采键JZ QJJB ACC.0,STA1 ;K1键按下,则跳到STA1执行跑表功能JB ACC.3,STA2 ;K4键按下,则跳到STA2执行分钟显示功能SJMP QJ;-------------------------;跑表程序;-------------------------STA1:MOV R0,#MB ;计时器清零MOV A, #00HCLR1: MOV @R0, AINC R0CJNE R0,#49H,CLR1SETB EA ;CPU开中断GO: SETB ET0 ;定时器T0开中断SETB TR0 ;启动定时器T0DISP1:MOV R0,#MB ;R0指向40H单元CALL JP ;采集键盘的状态JB ACC.1,STOP ;K2键按下,则暂停跑表功能JB ACC.0,STA1 ;K1键按下,则跳到STA1执行跑表功能JB ACC.3,GO ;K3键按下,则继续执行跑表功能JB ACC.2,DISP2 ;K4键按下,则跳到STA2执行分钟显示功能CALL SEL5CALL AACALL SEL4INC R0 ;R0指向41H单元CALL AACALL SEL3INC R0 ;R0指向42H单元CALL BBCALL SEL2INC R0 ;R0指向43H单元CALL AASJMP DISP1STOP: CLR ET0 ;关闭定时器TO的中断SJMP DISP1;-------------------------;秒表程序;-------------------------STA2:MOV R1,#PB ;计时器清零MOV A, #00HCLR2: MOV @R1, AINC R1CJNE R1,#59H,CLR2SETB EA ;CPU开中断SETB TR1 ;启动定时器T1SETB ET1 ;定时器T1开中断DISP2:MOV R1,#PB+2 ;R1指向52H单元CALL JP ;采集键盘的状态JB ACC.0,STA1 ;K1键按下,则跳到STA1执行跑表功能AJMP XIANSHI ;否则显示秒表A0: CALL JPJZ A0JB ACC.0,A00JB ACC.1,A01AJMP LED0A00: INC 52HAJMP LED0A01: DEC 52HLED0:LCALL SEL5MOV @R1,52HLCALL AA1AJMP A0XIANSHI: CALL SEL5CALL AA1CALL SEL4INC R1 ;R1指向53H单元CALL AA1CALL SEL3INC R1 ;R1指向54H单元CALL BB1CALL SEL2INC R1 ;R1指向55H单元CALL AA1AJMP DISP2AA: MOV P0,#00H ;关显示CALL DELAY1 ;延时5MSMOV A,@R0 ;把RO指向的地址单元的内容送给A MOV DPTR,#TAB1 ;DPTR指向表TAB1的首地址MOVC A,@A+DPTR ;取出表中对应的字型送给A寄存器MOV P0,A ;将字型送P0口显示CALL DELAY ;延时1MSRET;-------------------------;显示子程序;-------------------------AA1: MOV P0,#00H ;关显示CALL DELAY1 ;延时5MSMOV A,@R1 ;把R1指向的地址单元的内容送给A寄存器MOV DPTR,#TAB1 ;DPTR指向表TAB1的首地址MOVC A,@A+DPTR ;取出表中对应的字型送给A寄存器MOV P0,A ;将字型送P0口显示CALL DELAY ;延时1MSRETBB: MOV P0,#00H ;关显示CALL DELAY1 ;延时5MSMOV A,@R0 ;把RO指向的地址单元的内容送给A MOV DPTR,#TAB2 ;DPTR指向表TAB2的首地址MOVC A,@A+DPTR ;取出表中对应的字型送给A寄存器MOV P0,A ;将字型送P0口显示CALL DELAY ;延时1MSRETBB1: MOV P0,#00H ;关显示CALL DELAY1 ;延时5MSMOV A,@R1 ;把R1指向的地址单元的内容送给A寄存器MOV DPTR,#TAB2 ;DPTR指向表TAB2的首地址MOVC A,@A+DPTR ;取出表中对应的字型送给A寄存器MOV P0,A ;将字型送P0口显示CALL DELAY ;延时1MSRET;-------------------------;键采集程序;-------------------------JP: MOV P0,#00H ;关显示CALL SEL8 ;打开三态门MOV P1,#0FFH ;置P1口为输入口MOV A,P1 ;采集键盘的状态CALL SEL7 ;关闭三态门CPL AANL A,#0FHRET;-------------------------;定时中断0控制跑表程序;-------------------------TIME0:PUSH ACC ;保护A寄存器MOV TH0,#3CH ;重置定时器TO的初值10MSMOV TL0,#0AFHINC MB ;10MS计数器加1,存放到40H单元中MOV A,MBCJNE A,#6,TEND ;10MS计数器的值不等于10,; 即不到100MS,则跳到TEND中断返回MOV MB,#00H ;10MS计数器清零INC MB+1 ;100MS计数器加1,存放到41H单元中MOV A,MB+1CJNE A,#6,TEND ;100MS计数器的值不等于10,; 即不到1S,则跳到TEND中断返回MOV MB+1,#00H ;100MS计数器清零INC MB+2 ;1S计数器加1,存放到42H单元中MOV A,MB+2CJNE A,#6,TEND ;1S计数器的值不等于10,; 即不到10S,则跳到TEND中断返回MOV MB+2,#00H ;1S计数器清零INC MB+3 ;10S计数器加1,存放到43H单元中MOV A,MB+3CJNE A,#6,TEND ;10S计数器的值不等于10,; 即不到100S,则跳到TEND中断返回MOV MB+3,#00H ;10S计数器清零TEND: POP ACC ;恢复A寄存器RETI ;中断服务子程序结束返回;-------------------------;定时中断1控制跑表程序;-------------------------TIME1:PUSH ACC ;保护A寄存器MOV TH1,#3CH ;重置T1初值50MSMOV TL1,#0AFHINC PB ;(50H)+1MOV A,PBCJNE A,#2,TEND1 ;(50H)不等于2,则跳到中断返回MOV PB,#00H ;50MS计数器清零INC PB+1 ;(51H)+1MOV A,PB+1CJNE A,#10,TEND1 ;100MS计数器的值不等于10,; 即不到1S,则跳到TEND1中断返回MOV PB+1,#00H ;100MS计数器清零INC PB+2 ;100MS计数器加1,存放到52H单元中MOV A,PB+2CJNE A,#10,TEND1 ;1S计数器的值不等于10,; 即不到10S,则跳到TEND1中断返回MOV PB+2,#00H ;1S计数器清零INC PB+3 ;10S计数器加1,存放到53H单元中MOV A,PB+3CJNE A,#6,TEND1 ;10S计数器的值不等于6,;即不到1分(60S),则跳到TEND1中断返回MOV PB+3,#00H ;10S计数器清零INC PB+4 ;1分计数器加1,存放到54H单元中MOV A,PB+4CJNE A,#10,TEND1 ;1分计数器的值不等于10,; 即不到10分,则跳到TEND1中断返回MOV PB+4,#00H ;1分计数器清零INC PB+5 ;10分计数器加1,存放到55H单元中MOV A,PB+5CJNE A,#10,TEND1 ;10分计数器的值不等于6,; 即不到60分,则跳到TEND1中断返回MOV PB+5,#00H ;10分计数器清零TEND1:POP ACC ;恢复A寄存器RETI ;中断服务子程序结束返回;-------------------------;延时子程序;-------------------------DELAY:MOV R2,#2 ;延时1MS子程序DL Y4: MOV R3,#250DL Y5: DJNZ R3,DL Y5DJNZ R2,DL Y4RETDELAY1:MOV R4,#10 ;延时5MS子程序DL Y6: MOV R5,#250DL Y7: DJNZ R5,DL Y7DJNZ R4,DL Y6RET;-------------------------;译码器子程序;-------------------------SEL2: CLR P2.5CLR P2.6SETB P2.7RETSEL3: CLR P2.5SETB P2.6CLR P2.7RETSEL4: CLR P2.5SETB P2.6SETB P2.7RETSEL5: SETB P2.5CLR P2.6CLR P2.7RETSEL7: SETB P2.5SETB P2.6CLR P2.7RETSEL8: SETB P2.5SETB P2.6SETB P2.7RETTAB1: DB 7EH, 0CH, 0B6H, 9EH, 0CCH, 0DAH, 0FAH, 0EH, 0FEH, 0DEH TAB2: DB 7FH, 0DH, 0B7H, 9FH, 0CDH, 0DBH, 0FBH, 0FH, 0FFH, 0DFH。

单片机数字秒表计时器编写

单片机数字秒表计时器编写

单⽚机数字秒表计时器编写这次做了51单⽚机的实验数字秒表显⽰,⽤到了定时器,中断服务函数,还有就是数码管的动态显⽰,还有就是程序的逻辑考虑初次在这⾥写,经验不⾜,排版不够美观代码如下:#include<reg52.h>#define uchar unsigned charsbit s0=P1^0;sbit s1=P1^1;sbit s2=P1^2;sbit s3=P1^3; //数码管的位选uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9的数码管段码uchar count=0;uchar second=0;uchar minite=0;uchar number=200;void delay(void){uchar a,b;for(b=1;b>0;b--)for(a=90;a>0;a--);}void delay_LED(){ uchar a,b;for(b=38;b>0;b--)for(a=80;a>0;a--);}void ini_display() //初始化数码管显⽰“ help” 字样{ uchar x=1000;while(x--){s0=0;s1=1;s2=1;s3=1;P0=0x89;delay();P0=0xff;s0=1; s1=0; s2=1; s3=1; P0=0x86; delay(); P0=0xff;s0=1; s1=1; s2=0; s3=1; P0=0xc7; delay(); P0=0xff;s0=1; s1=1; s2=1; s3=0; P0=0x8c; delay(); P0=0xff;}}void display() // 显⽰ XX(分):XX(秒) 四个数码管共阳极{if(second<=9){s0=1; s1=1; s2=1; s3=0; P0=table[second]; delay_LED(); P0=0xff;s0=1; s1=1; s2=0; s3=1; P0=table[0]; delay_LED(); P0=0xff;s0=1; s1=0; s2=1; s3=1; P0=table[minite%10]; delay_LED(); P0=0xff;s0=0; s1=1; s2=1; s3=1; P0=table[minite/10]; delay_LED(); P0=0xff;}if(second>=10&&second<60){s0=1; s1=1; s2=0; s3=1; P0=table[second/10]; delay_LED(); delay_LED(); P0=0xff; s0=1; s1=1; s2=1; s3=0; P0=table[second%10]; delay_LED(); P0=0xff;s0=1; s1=0; s2=1; s3=1; P0=table[minite%10]; delay_LED(); P0=0xff;s0=0; s1=1; s2=1; s3=1; P0=table[minite/10]; delay_LED(); P0=0xff;}if(second==60){minite++;second=0;}if(minite==60){minite=0;}}void main(){ uchar flag=0;EA=1;ET1=0;ET0=1;TMOD = 0x21; //定时器0作定时50msTH0 = 0x3c;TL0 = 0xb0;TR0 = 1;TH1 = 0xfd;TL1 = 0xfd; // 定时器1做波特率发⽣器TR1 = 1;EX1 = 1;IT1 = 1;ES = 1;SM0 = 0;SM1 = 1;REN = 1; //设置串⼝⽅式SBUF=temp; //触发串⼝处的中断while(1){if(flag==0){ini_display();flag = 1;}else{display();}}}void timezhongduan( ) interrupt 1 //定时50ms后,计数20次,就是⼀秒----->秒表计时器{TH0 = 0x3c;TL0 = 0xb0;count++;if(count==20){count=0;SBUF=table[minite/10];SBUF=table[minite%10];SBUF=table[second/10];SBUF=table[second%10];second++;}}void waibuint()interrupt 2 //外部中断1,会清零从头开始计数{EX1=0;second=0;minite=0;EX1=1;}void series()interrupt 4 //置零TI{if(TI){TI=0;}}。

MSP430单片机秒表程序(完整)

MSP430单片机秒表程序(完整)

MSP430单片机"秒表" 程序(完整)/*******************************************************基于MSP430F449单片机的秒表*功能:秒计时,8位数码管显示,包括小时、分钟、秒和毫秒*此程序同样适用于其他系列单片机*by:duyunfu1987******************************************************/#include "msp430x44x.h"#define DPYOUT P3OUT //数码管的段选输出口#define DPYCOM P2OUT //38译码器的ABC输入#define OPENOUT P2OUT |= BIT3 //74HC573使能锁存段选#define CLOSEOUT P2OUT &= ~BIT3//74HC573无效int hour,min,sec,ms; //缓冲区定义,小时、分钟、秒、毫秒int count = 0; //2ms计数,计到5时ms增1//共“阴”极数码管的码表unsigned char LED7CC[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//延时n(us)void delay_us(int n){ while(n-- >0)_NOP();}//延时n(ms)void delay_ms(int dms){ int i;while(dms-- >0){ for(i=0;i<250;i++);}}//初始化缓冲区与IO口void Init(){hour = 0;min = 0;sec = 0;ms = 0;P2SEL = 0;P3SEL = 0;P2DIR |= BIT0+BIT1+BIT2+ BIT3;//A B C 使能位P2DIR &= ~(BIT4+BIT5+BIT6); //按键P3DIR = 0xff;P3OUT = 0x00;}//8位数码管动态显示函数void display(){DPYOUT = 0;_NOP();DPYOUT = LED7CC[ms%10]; DPYCOM = 7;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[ms/10]; DPYCOM = 6;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[sec%10]|0x80; DPYCOM = 5;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[sec/10]; DPYCOM = 4;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[min%10]|0x80; DPYCOM = 3;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[min/10]; DPYCOM = 2;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[hour%10]|0x80; DPYCOM = 1;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[hour/10]; DPYCOM = 0;OPENOUT;CLOSEOUT;}//按键处理函数void key_deal(int key){switch(key){case 0x60: //START--开始计时{ BTCTL = BT_ADL Y_2;IE2 |= BTIE;_EINT();}break;case 0x50: //STOP -- 停止BTCTL |= BTHOLD; break;case 0x30: //CLEAR--缓冲区清零{ hour = 0;min = 0;sec = 0;ms = 0;}break;default : break;}display();}//主函数void main( void ){int key;// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;FLL_CTL0 |= XCAP18PF;Init();while(1){if((key = P2IN & 0x70)!=0x70){delay_ms(10);if((key = P2IN & 0x70)!=0x70){ key_deal(key);}}display();}}//BT中断服务程序,2ms计时#pragma vector = BASICTIMER_VECTOR__interrupt void BT_ISR(){count ++;if(count == 5){ count = 0;ms ++;}if(ms == 100){ms = 0;sec ++;if(sec == 60){sec = 0;min ++;if(min == 60){min = 0;hour ++;if(hour == 24)hour = 0;}}}}。

单片机实验——秒表(详细步骤)

单片机实验——秒表(详细步骤)
{
delay(10);//延时去抖动
if(key3==0) //再次检测"复位"按钮是否按下
{
while(!key3); //松手检测
temp=0; //将变量temp的值清零
shi=0; //将十位清零
ge=0; //将个位清零
TR0=0; //关闭定时器
}
}
display(shi,ge); //调用显示子函数
简易秒表制作
1子情境容:制作简易秒表,利用按键构成键盘实现秒表的启动、停止与复位,利用LED数码管显示时间。
2子情境目标:
(1)通过简易秒表的制作,进一步熟悉LED数码管与单片机的接口电路
(2)学习定时/计数器、中断技术的综合运用并会使用简易键盘
3知识点
独立式按键的使用:图5-49为按键与单片机的连接图。
{
init();//调用初始化子程序
while(1)
{
if(key1==0)//检测"启动"按钮是否按下
{
delay(10); //延时去抖动
if(key1==0) //再次检测"启动"按钮是否按下
{
while(!key1); //松手检测,若按键没有释放,key1始终为0,那么!key1始终为1,程序就一直停在此while语句处
机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图5-50所示,抖动时间的长短与开关的机械特性有关,一般为5~10ms。
在触点抖动期间检测按键的通与断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。本子情境中采用软件去抖。

51单片机秒表程序-00-99秒

51单片机秒表程序-00-99秒

#include <reg52.h>#define uchar unsigned char //宏定义用uchar代替unsigned char#define uint unsigned intsbit START=P1^0; //开始、停止键低电平有效sbit RST=P1^1; //复位键sbit SMGGW=P1^2; //用三极管或驱动芯片驱动数码管高电平有效还是低电平有效由电路决定sbit SMGSW=P1^3;uchar tt;uint time; //此变量为时间uchar code table[]={ //此为数码管字模,对应0--90x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};void Delay(uint ms) //延时子函数{uint i,j;for(i=ms;i>0;i--)for(j=500;j>0;j--);}void Display() //显示子函数{uchar ge,shi;shi=time/10;ge=time%10;P0=table[ge];SMGGW=0;//用三极管或驱动芯片驱动数码管高电平有效还是低电平有效由电路决定本程序为低电平数码管亮SMGSW=1;Delay(2);P0=table[shi];SMGGW=1;SMGSW=0;Delay(2);}void main(){P1=0xff;EA=1;ET0=1;TMOD=0x01;TH0=0x4c; //晶振11.0592Mhz 若用12Mhz晶振则改为TH0=0x3c;Tl0=0xb0;TL0=0x00;while(1){if(START==0) //开始、停止{Delay(8);if(START==0){TR0=!TR0;while(!START) Display();}}if(RST==0) //复位{Delay(8);if(RST==0){time=0;while(!RST)Display();}}if(tt==20)tt=0;time++;if(time==99){time=0;}}Display();}}void timer0() interrupt 1{TH0=0x4c; //晶振11.0592Mhz 若用12Mhz晶振则改为TH0=0x3c;Tl0=0xb0;TL0=0x00;tt++;}Welcome To Download !!!欢迎您的下载,资料仅供参考!。

51单片机电子计时秒表C程序

51单片机电子计时秒表C程序
#include <reg51.h> #include <intrins.h> sbit key1=P1^6; sbit key2=P1^7; unsigned char sec1=0,sec2=0,min=0; //定义秒小数、秒整数和分变量 unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; delay() { unsigned char j; for (j=0;j<200;j++); } display() { unsigned char i,wk=0xfe; //wk变量作位控,初始选通右边第1位 unsigned char buf[8]; //声明数码管显示字形缓冲数组 buf[0]=tab[sec1%10]; //秒小数部分的个位 buf[1]=tab[sec1/10%10]; //秒小数部分的十位 buf[2]=0xbf; buf[3]=tab[sec2%10]; //秒的个位 buf[4]=tab[sec2/10%10]; //秒的十位 buf[5]=0xbf; buf[6]=tab[min%10]; //分的个位 buf[7]=tab[min/10%10]; //分的十位 for (i=0;i<=7;i++)
//如果sec1值为99,向秒进位 //变量sec1的值重新被初始化 //秒加1 { sec2=0; min++; if (min==60) { min=0; }
}
} }
//显示"-"
//显示"-"
{ P2=buf[i]; P3=wk; delay(); wk=_crol_(wk,1); P3=0xff; } } button() 数 { if (key1==0) {

单片机计时秒表程序设计

单片机计时秒表程序设计

pic单片机计时秒表程序设计(时钟显示X围00.00~99.99秒,分辨度为0.01秒)来源:本站原创点击数:1676 更新时间:2008年07月12日//此程序实现计时秒表功能,时钟显示X围00.00~99.99秒,分辨度:0.01秒#include "p18f458.h"unsigned char s[4]; //定义0.01 秒、0.1 秒、1秒、10秒计时器unsigned char k,data,sreg;unsigned int i;const table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};//不带小数点的显示段码表const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};//带小数点的显示段码表void clkint(void);//TMR0初始化子程序void tmint(){T0CON=0XCF; //设定TMR0L工作于8位定时器方式//内部时钟,TMR0不用分频INTCON=0X20; //总中断制止,TMR0中断允许,去除TMR0的中断标志INTCON2bits.TMR0IP=1; //TMR0中断高优先级RCONbits.IPEN=1; //使能中断优先级}//系统其它局部初始化子程序void initial(){TRISA=0x00; //A口设置为输出TRISB=0XF0; //RB1输出,RB4输入TRISC=0x00; //SDO引脚为输出,SCK引脚为输出TRISE=0x00; //E口设置为输出SSPCON1=0x30; //SSPEN=1;CKP=1,FOSC/4 SSPSTAT=0xC0; //时钟下降沿发送数据PIR1=0; //去除SSPIF标志data=0X00; //待显示的存放器赋初值PORTBbits.RB1=0;PORTAbits.RA3=0;PORTE=0; //将K1,K2,K3,K4四条列线置0 }//SPI传输数据子程序void SPILED(char data){SSPBUF=data; //启动发送do{;}while(PIR1bits.SSPIF==0);PIR1bits.SSPIF=0;}//显示子程序,显示4位数void dispaly(){PORTAbits.RA5=0; //准备锁存for(k=0;k<4;k++){data=s[k];if(k==2) data=table0[data]; //个位需要显示小数点else data=table[data];SPILED(data); //发送显示段码}for(k=0;k<4;k++){data=0xFF;SPILED(data); //连续发送4个DARK,使显示好看一些}PORTAbits.RA5=1; //最后给锁存信号,代表显示任务完成}//软件延时子程序void DELAY(){for(i = 3553; --i ;)continue;}//键扫描子程序void KEYSCAN(){while(1){dispaly(); //调用一次显示子程序while(PORTBbits.RB4==0){DELAY(); //假设有键按下,那么软件延时break;}if (PORTBbits.RB4==0) break; //假设还有键按下,那么终止循环扫描,返回}}//等键松开子程序void keyrelax(){while(1){dispaly(); //调用一次显示子程序if (PORTBbits.RB4==1) break; //为防止按键过于灵敏,每次等键松开才返回}}/*高优先级中断向量*/#pragma code InterruptVectorHigh=0x08void InterruptVectorHigh (void){_asmgoto clkint //跳到中断程序_endasm}//中断效劳程序#pragma code#pragma interrupt clkintvoid clkint(){TMR0=0X13; //对TMR0写入一个调整值。

C51单片机秒表计时(C语言)

C51单片机秒表计时(C语言)
南开大学滨海学院
C51嵌入式软件设计(C语言)
题目:计时秒表
功能描述:本设计实现在99秒内的秒表计时,一个按键实现开始、暂停、复位。
原理概述:P1接四位七段数码管,P3.2接一按键产生外部中断0,P3.4-P3.7控制扫描显示。计时使用定时器0产生10ms中断累计。按键不同次序决定了对应的控制功能,因为第一次按键必定为开始计时,所以第二次按键判断为暂停,依次第三次为置零。主程序调用显示程序,显示程序实时显示计时时间。
P35=1;
p=mm/10; //ms的高位
P36=0;
P1=Tab[p];delay();
P36=1;
P37=0;//显示单位:S
P1=Tab[5]; delay();
P37=1;
}
/*********主程序********************/
void main()
{
IT0=1;
EX0=1;
mm=0;
a++; }
else if(a==1) //暂停计时
{ TR0=0;
a++;}
else//置零
{ a=0;
mm=0;
cout=0;}
}
/*********定时器子程序****************/
void time0() interrupt 1
{
TH0=0xD8;
TL0=0xF0;
mm++;
效果显示
图一(电路总图)
图二(效果显示)注:第四位显示为单位:S
程序清单
#include<reg51.h>
#include<stdio.h>
unsigned char Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
P0 = table[ge];
dula = 1;
dula = 0;
P0=0x08;
wela = 1;
wela = 0;
delayms(l);
P0 = table[shi]; dula = 1;
dula = 0;
P0=0x04;
wela = 1;
wela = 0;
delayms(1);
P0 = table[bai];
TMOD=0x01;//定时器工作在方式1
ET0=1;//打开定时器、计数器0中断允许位
EA=1;//打开全局中断
//TR0=0;
TH0=(65536-50000)/256;//对TH0 TL0赋值
TL0=(65536-50000)%256;//使定时器0.05秒中断一次
while(1)
{
shi=sec/10;
{
delayms(10);
if(key3==0)
{
TR0=0;
while(!key3);
}
if(key4==0)
{
delayms(10);
if(key4==0)
{
TR0=0;
sec=sec+1;
while(!key4);
}
}
}
void led()
{
LED_CS=1;
P0=0x00;
delayms(250);
0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83, 0xC6,0xA1,0x86,0x8E};
void delay()
{ ;; }
void delayms( uint z)
{
uint x,y;
for(x=z;x>0;x__)
for(y=110;y>0;y--);
delay();
}
void resp on s()
//应答信号:scl为高电平期间,sda被接受设备拉为低电平,最后//scl置0
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i <255))
i++;
scl=0;
delay();
sda=1;
delay();
scl=1;
#in clude<reg52.h>
#defi ne uchar un sig ned char
#defi ne uint un sig ned int
bit write=O; //
sbit sda=P2A3;
sbit scl=P2A2;
sbit dula=P3A6;
sbit wela=P3A7;
sbit LED_CS=P2A5;
sbit MOTOR_CS=P2A7;
sbit key仁PMO;
sbit key2=P1Al;
sbit key3=P1A2;
sbit key4=P1A3;
uint min, sec,tc nt,ge,shi,bai,qia n;
uchar a=0;
uchar flag=O;
uchar code table[]={
ge=sec%10;
bai = mi n%10;
qia n = min/10;
display(qia n,bai,shi,ge);
P0=0xff;
LED_CS=0;
}
void beep()
{
MOTOR_CS=1;
P0 = 0x3f;
delayms(250);
P0 = 0x7f;
MOTOR_CS=0;
}
void mai n()
{
LED_CS = 0;
MOTOR_CS=0;
sec=read_add(2);//读出保存的数据赋于sec
}
void start() //开始信号:scl为高电平期间,sda发生负跳变
{
sห้องสมุดไป่ตู้a=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop() //停止信号:scl为高电平,sda发生正跳变
{
sda=0;
delay();
scl=1;
delay();
sda=1;
{
MOTOR_CS=0;
LED_CS=O;
if(key 1==0)
{
delayms(IO); // if(key1==O)
{
sec=0;
mi n=0;
while(!key1);
}
}
if(key2==0)
{
delayms(10);
if(key2==0)
{
TR0=1;
while(!key2);
}
}
if(key3==0)
1*/ uchar read_byte()
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}
//数码管显示程序
void display(uchar qia n, uchar bai,uchar shi,uchar ge)
dula = 1;
dula = 0;
P0 = 0x02;
wela= 1;
wela= 0;
delayms(1);
P0 = table[qia n];
dula = 1;
dula = 0;
P0 = 0x01;
wela= 1;
wela= 0; delayms(1);
}
//判断按键
void keysca n()
delay();
}
/*写字节数据:将8位数据通过左移到CY(进位),然后赋值给数据线SDA每发送一位,scl出现正跳变,发送完数据后,需要将scl置0,sda置1*/
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
/*读字节数据:将数据一位一位从sda中获取,每读取一位scl出现负跳变 通过变量k将8位数据整合为1个字节数据,读数据前,先将scl置0,sda置
相关文档
最新文档