c51单片机程序-数码管秒表

合集下载

51单片机流水灯、数码管、定时器、秒表、计算器程序

51单片机流水灯、数码管、定时器、秒表、计算器程序

51单片机流水灯、数码管、定时器、秒表、计算器程序流水灯 #include<reg52.h>char data_group[]={0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e};unsigned int a;void delay(unsigned int time) {int i,j;for(i=time;i>0;i--){for(j=100;j>0;j--);}}void move_mid_side(void) {int m;for(m=0;m<7;m++){P1=data_group[m];delay(500);}}void move_right_only(void) {int a,temp;delay(500);temp=0x80;for(a=7;a>=0;a--){temp=~temp;P1=temp;delay(500);temp=~temp;temp>>=1;}temp=0x80;delay(1000);}void move_left_only(void) { int a,temp;delay(500);temp=0x01;for(a=7;a>=0;a--){temp=~temp;P1=temp;delay(500);temp=~temp;temp<<=1;}temp=0x01;delay(1000);}void move_right_hlod(void) { int a,temp;temp=0x7f;for(a=8;a>=0;a--){P1=temp;delay(500);temp=temp>>1;}temp=~temp;delay(1000);}void move_left_hold(void) { int a,temp;temp=0xfe;for(a=8;a>=0;a--){P1=temp;delay(500);temp<<=1;}temp=~temp;delay(1000);}void main(){while(1){move_left_hold();move_mid_side();move_right_hlod();move_mid_side();move_left_only();move_right_only();}}数码管 #include <reg52.h>chardata_duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9 char data_wei[]={0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00}; //0xff全关,之后为第一个数码管到第八个数码管//char data_wei_add[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};void delay(unsigned int time) {int i,j;for(i=time;i>0;i--){for(j=0;j<100;j++);}}void show_number_only(void){int i;P2=data_wei[1]; //P2为位选for(i=0;i<10;i++){P0=data_duan[i]; //P0为段选delay(500);}}/*******************数码管动态显示子程序***************/ void move_show1(void){int i;for(i=1;i<2;i++){P2=data_wei[i];P0=data_duan[i];delay(1);}}void move_show2(void){int i;for(i=1;i<3;i++){P2=data_wei[i];P0=data_duan[i];delay(1);}}void move_show3(void) {int i;for(i=1;i<4;i++){P2=data_wei[i];P0=data_duan[i]; delay(1);}}void move_show4(void) {int i;for(i=0;i<5;i++){P2=data_wei[i];P0=data_duan[i]; delay(1);}}void move_show5(void) {int i;for(i=0;i<6;i++){P2=data_wei[i];P0=data_duan[i]; delay(1);}}void move_show6(void) {int i;for(i=0;i<7;i++){P2=data_wei[i];P0=data_duan[i]; delay(1);}}void move_show7(void) {int i;for(i=0;i<8;i++){P2=data_wei[i];P0=data_duan[i]; delay(1);}}void move_show8(void) {int i;for(i=0;i<9;i++){P2=data_wei[i];P0=data_duan[i];delay(1);}}/********数码管动态显示,实现数码管由1~8在八个数码管上一次显示************/void move_show_hold(void){int temp,i;temp=1000;for(i=temp;i>0;i--)move_show1();temp=600;for(i=temp;i>0;i--)move_show2();temp=400;for(i=temp;i>0;i--)move_show3();temp=200;for(i=temp;i>0;i--)move_show4();temp=200;for(i=temp;i>0;i--)move_show5();temp=200;for(i=temp;i>0;i--)move_show6();temp=100;for(i=temp;i>0;i--)move_show7();temp=100;for(i=temp;i>0;i--)move_show8();}void show_all(void) //将所有的位选端口打开,变化段选,显示整体变化1~9{int i;P2=data_wei[9];for(i=0;i<10;i++){P0=data_duan[i];delay(500);}}int main(void) {while(1){// show_number_only();move_show8();//move_show_hold(); // show_all(); }}独立按键#include <reg52.h>sbit key1=P3^0; sbit d2=P1^0;int temp,number=0;void delay(unsigned int time) {int i,j;for(i=time;i>0;i--){for(j=100;j>0;j--) ;}}int main(void) {temp=0xfe;while(1){d2=1;key1=1;P1=temp;if(key1==0){delay(100);if(key1==0){number++;if(number<=7){temp=~temp;temp=temp<<1;temp=~temp;P1=temp;}else{temp=0xfe;number=0;}}}}}矩阵按键 #include<reg52.h>chardata_duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80 ,0xc6,0xc0,0x86,0x8e,};//0~9 chardata_wei[]={0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00};int number=0;void delay(unsigned int time) {int i,j;for(i=time;i>0;i--){for(j=0;j<100;j++);}}//void move_show1(void)//{// int i;// for(i=1;i<2;i++){ // P2=data_wei[i]; // P0=data_duan[i]; // delay(1);// }//}//void move_show2(void)//{// int i;// for(i=1;i<3;i++){ // P2=data_wei[i];// P0=data_duan[i]; // delay(1);// }//}void scan_key(void){int temp;P1=0xfe;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(1);temp=P1;temp=temp&0xf0;while(temp!=0xf0){switch(temp){case 0xe0:number=12;break; case 0xd0:number=13;break; case 0xb0:number=14;break; case 0x70:number=15;break; }while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(1);temp=P1;temp=temp&0xf0;while(temp!=0xf0){switch(temp){case 0xe0:number=8;break; case 0xd0:number=9;break; case 0xb0:number=10;break; case 0x70:number=11;break; }while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(1);temp=P1;temp=temp&0xf0;while(temp!=0xf0){switch(temp){case 0xe0:number=4;break; case 0xd0:number=5;break; case 0xb0:number=6;break; case 0x70:number=7;break; }while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(1);temp=P1;temp=temp&0xf0;while(temp!=0xf0){switch(temp){case 0xe0:number=0;break; case 0xd0:number=1;break; case 0xb0:number=2;break; case 0x70:number=3;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}// return number;}int main(void){// int num=0;while(1){// num=scan_key(num);scan_key();P2=data_wei[1];P0=data_duan[number];}}定时器中断 #include <reg52.h>chardata_duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9 char data_wei[]={0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00}; //0xff全关,之后为第一个数码管到第八个数码管int number=0,time=0;int main(void){// TMOD=0x01;//设置工作方式定时器0// TH0=(65536-50000)/256; //给计数器装初值 // TL0=(65535-50000)%256;// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 // TR0=1; //启动定时器0TMOD=0x10;//设置工作方式定时器1TH1=(65536-50000)/256; //给计数器装初值TL1=(65535-50000)%256;EA=1; //开总中断ET1=1; //定时器T1中断允许TR1=1; //启动定时器1while(1){if(number==20){P2=data_wei[2];P0=data_duan[4];}if(time==40){P2=data_wei[0];number=0;time=0;}}}void exter3() interrupt 3{TH1=(65536-50000)/256; //给计数器装初值TL1=(65535-50000)%256;time++;number++;}//void exter1() interrupt 1//{// TH0=(65536-50000)/256; //给计数器装初值 // TL0=(65535-50000)%256;// time++;// number++;//}时钟 #include <reg52.h>chardata_duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9 char data_wei[]={0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00};unsigned long int second=0,minute=0,hour=0,point=0,tip=0;unsigned long int time=0,sign=0,number=0,key=0,variable=0; unsigned long int S1=0,S2=0,M1=0,M2=0,H1=0;H2=0;void delay(unsigned int time) {int i,j;for(i=time;i>0;i--){for(j=0;j<100;j++);}}void key_scan(void){int temp; //应用按键检测P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(1);temp=P1;temp=temp&0xf0;while(temp!=0xf0){switch(temp){case 0xe0:number=1;break; case 0xd0:number=2;break; case 0xb0:number=3;break; case 0x70:number=4;break; }while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}// P1=0xfb;// temp=P1;// temp=temp&0xf0; // while(temp!=0xf0){ // delay(1);// temp=P1;// temp=temp&0xf0; // while(temp!=0xf0){ // switch(temp){ // case 0xe0:number=5;break; // case 0xd0:number=6;break; // case0xb0:number=7;break; // case 0x70:number=8;break; // } // while(temp!=0xf0){ // temp=P1;// temp=temp&0xf0; // }// }////// }}void adjust_alarm(void) {if(number==1){ //控制时钟的启动与停止key=!key;if(key==1){EA=0;variable=time;}if(key==0){EA=1;}number=0;}if(number==2){ //调节时间选择标志位tip=tip+1;tip=tip%6;if(tip==0){tip=6;}number=0;}if((number==3)&&(EA==0)){if(tip==1)time=time-1;if(tip==2)time=time-10;if(tip==3)time=time-60;if(tip==4)time=time-600;if(tip==5)time=time-3600;if(tip==6)time=time-36000;number=0;}if((number==4)&(EA==0)){if(tip==1)time=time+1;if(tip==2)time=time+10;if(tip==3)time=time+60;if(tip==4)time=time+600;if(tip==5)time=time+3600;if(tip==6)time=time+36000;number=0;}// if((number==5)&&(EA==0)){ // if(tip==1) // variable=variable-1; // if(tip==2)// variable=variable-10; // if(tip==3)// variable=variable-60; // if(tip==4)// variable=variable-600; // if(tip==5)// variable=variable-3600; // if(tip==6)// variable=variable-3600; // number=0;// }// if((number==6)&(EA==0)){ // if(tip==1)// variable=variable+1; // if(tip==2)// variable=variable+10; // if(tip==3)// variable=variable+60; // if(tip==4)// variable=variable+600; // if(tip==5)// variable=variable+3600; // if(tip==6)// variable=variable+36000; // number=0;// }}void compare_time(void){if(time>variable){;}}void alarm_show_s(void){int sign2;for(sign2=1;sign2<2;sign2++){ //数码管动态显示S1=second%10;P2=data_wei[sign2];P0=data_duan[S1];delay(1);}for(sign2=2;sign2<3;sign2++){ S2=second/10;P2=data_wei[sign2];P0=data_duan[S2];delay(1);}for(sign2=3;sign2<4;sign2++){ P2=data_wei[sign2];P0=0xbf;delay(1);}for(sign2=4;sign2<5;sign2++){ M1=minute%10;P2=data_wei[sign2];P0=data_duan[M1];delay(1);}for(sign2=5;sign2<6;sign2++){ M2=minute/10;P2=data_wei[sign2];P0=data_duan[M2];delay(1);}for(sign2=6;sign2<7;sign2++){P2=data_wei[sign2];P0=0xbf;delay(1);}for(sign2=7;sign2<8;sign2++){H1=hour%10;P2=data_wei[sign2];P0=data_duan[H1];delay(1);}for(sign2=8;sign2<9;sign2++){H2=hour/10;P2=data_wei[sign2];P0=data_duan[H2];delay(1);}}void record_set_alarm(void) //设定闹钟所改变的值 { second=variable%60;minute=variable/60%60;hour=variable/3600%24;if(hour==24){variable=0;}}void record_time(void) {second=time%60;minute=time/60%60; hour=time/3600%24;if(hour==24){time=0;}}int main(void){TMOD=0x01;TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;ET0=1;TR0=1;while(1){record_time();// record_set_alarm(); alarm_show_s();key_scan();adjust_alarm();}}void extern1() interrupt 1 //定时器中断0 { TH0=(65536-50000)/256; //重装值TL0=(65536-50000)%256;sign++;if(sign==20){time++;sign=0;}}。

c51数字秒表课程设计

c51数字秒表课程设计

c51数字秒表课程设计一、课程目标知识目标:1. 学生能理解C51单片机的基本原理,掌握数字秒表的硬件设计及编程方法。

2. 学生能够运用C语言编写程序,实现秒表的启动、停止、计时的功能。

3. 学生了解数字秒表在实际应用中的重要性,如时间测量、实验数据记录等。

技能目标:1. 学生能够运用所学的C51知识,设计并实现一个具有基本功能的数字秒表。

2. 学生通过实际操作,提高动手实践能力,培养解决实际问题的能力。

3. 学生能够运用所学知识,对数字秒表进行调试和优化,提高程序运行效率。

情感态度价值观目标:1. 学生培养对单片机编程的兴趣,提高学习主动性和积极性。

2. 学生通过合作完成任务,培养团队协作能力和沟通能力。

3. 学生在解决问题的过程中,培养坚持不懈、勇于探索的精神。

本课程针对高年级学生,结合C51单片机课程内容,注重理论与实践相结合。

课程设计旨在帮助学生巩固所学知识,提高动手实践能力,培养解决实际问题的能力。

通过数字秒表的设计与实现,让学生充分体会单片机编程的乐趣,激发学生的学习兴趣,为后续课程学习打下坚实基础。

同时,课程强调团队协作和情感态度的培养,使学生在学习过程中形成积极向上的人生态度。

本章节教学内容主要包括以下几部分:1. C51单片机原理回顾:复习C51单片机的硬件结构、工作原理及编程基础,重点掌握I/O口编程、定时器/计数器等知识点。

2. 数字秒表的硬件设计:介绍数字秒表的硬件组成,包括单片机、时钟电路、显示电路等,分析各部分功能及相互关系。

3. 数字秒表的编程实现:学习如何使用C语言编写程序,实现数字秒表的功能。

内容包括:- 定时器/计数器的配置与使用;- 按键扫描程序编写;- 数码管显示程序编写;- 秒表功能模块设计(启动、停止、计时)。

4. 教学案例分析与实践:结合教材案例,分析数字秒表的设计过程,引导学生动手实践,完成一个具有基本功能的数字秒表设计。

5. 调试与优化:介绍程序调试方法,指导学生运用调试工具,对数字秒表程序进行调试和优化,提高程序运行效率。

51单片机 秒表程序

51单片机 秒表程序
Dis_Gewei=tab[msecond%10]; //个位显示处理
}
void ISR_INT0(void) interrupt 0 using 1
{
TR0=!TR0; //利用外部中断打开和关闭定时器0 用于开始和停止计时
}
void ISR_INT1(void) interrupt 2 using 1
{
if(TR0==0)//停止时才可以清零
CLR();
}
void CLR(void)
{
second=0; //利用外部中断清零
msecond=0;
Dis_Shiwei=tab[msecond/10];//十位显示值处理
Dis_Gewei=tab[msecond%10]; //个位显示处理
//共阴数码管 0-9
unsigned char Dis_Shiwei;//定义十位
unsigned char Dis_Gewei; //定义个位
unsigned char S_Dis_Shiwei;//定义秒十位
unsigned char S_Dis_Gewei; //定义秒个位
unsigned char second,msecond;
void CLR(void);
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
EX0=1;//外部中断0设置(打开外部中断0)
IT0=1;
EX1=1;//外部中断1设置
/*
1、清零
2、硬件要求:数码管、晶振12M
*/

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();
}
}
/*******************************************************************************

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单片机4位数码管秒表代码

51单片机4位数码管秒表代码

主题:51单片机4位数码管秒表代码内容:1. 介绍51单片机51单片机是一种通用的单片机系列,广泛应用于各种电子设备中。

它具有稳定性好、成本低、易于编程等优点,因此备受电子爱好者和专业工程师的青睐。

2. 4位数码管秒表4位数码管秒表是一种常见的电子计时器,通过LED数码管显示出当前的时间,可以用于各种计时应用,比如比赛计时、实验计时等。

3. 代码编写以下是一段简单的51单片机4位数码管秒表代码:```c#include <reg52.h>#include <intrins.h>// 数码管位选端口sbit wei1 = P2^2;sbit wei2 = P2^3;sbit wei3 = P2^4;sbit wei4 = P2^5;// 数码管显示段选端口sbit se2 = P0^2;sbit se1 = P0^3;sbit se4 = P0^4;sbit se3 = P0^5;unsigned char code smgduan[17] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; // 显示0~9,A,b,C,d,E,F,无的值void delay(unsigned int i) { // 延时while(i--);}void display(unsigned char *tab) { // 数码管显示 unsigned char i;for(i=0; i<7; i++) {P0=0; // 清除段选,以选中所显示的数码管 switch(i) { //确定位选case(0):wei1=0;wei2=wei3=wei4=1;break;case(1):wei2=0;wei1=wei3=wei4=1;break;case(2):wei3=0;wei1=wei2=wei4=1;break;case(3):wei4=0;wei1=wei2=wei3=1;break;default:break;}P0=tab[i]; //段码输出delay(5); // 数码管微秒级延迟}}void m本人n() {unsigned char a=0,b=0,c=0,d=0; //时钟的4位数据 unsigned int i=0;wei1=wei2=wei3=wei4=1; //段选、位选初始化while(1) {a++; // 微秒级的计数if(a==100) { //达到100a=0; b++; //b加1if(b==60) { //当b=60时b=0; c++; //c加1if(c==60) { //当c=60时c=0; d++; //d加1if(d==24) { //当d=24时d=0; //归零}}}}display(smgduan+d10); //显示个秒wei1=1;wei2=wei3=wei4=0; //位选delay(500); //延时display(smgduan+c/10+10); //显示十秒wei2=1;wei1=wei3=wei4=0; //位选delay(500); //延时display(smgduan+b10); //显示个分wei3=1;wei1=wei2=wei4=0; //位选delay(500); //延时display(smgduan+b/10+10); //显示十分wei4=1;wei1=wei2=wei3=0; //位选delay(500); //延时if(i++==200) { //当i=200时i=0;}}}```4. 代码分析该代码通过对51单片机的引脚进行控制,实现了4位数码管秒表的计时功能。

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单片机设计一个简单的秒表程序。

C51简易秒表

C51简易秒表

C51单片机简易秒表和按键控制秒表的程序(一)简易秒表#include<reg51.h>#include<intrins.h>code unsigned char LED_TBL[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned char LED_BUF[2] = {0,0}; //字位码有两个,分别对应两个接口的选择unsigned char second = 0,counter=0;void refresh();void delay();void ledBufModify();void main(){TMOD = 0x10;TH1 = 0x3C; //计数初值为15536 ,即3CB0HTL1 = 0xB0;IT0=1;EA=1;//总中断控制打开EX0=1;ET1=1;//定时器/计时器中断打开TR1=1;//T1中断允许打开while(1){ledBufModify();refresh();}}void timer1() interrupt 3 //n 1/3 ,Timer0/Timer1 {counter++;TH1=0x3c;TL1=0xb0;}void refresh() //数码管动态刷新子程序{unsigned char select,i;select=0xFE;for(i = 0 ; i< 2 ; i ++){P1=select;//字位口输出选择码;P2=LED_TBL[LED_BUF[i]];//字型口输出字型码;delay();select=_crol_(select,1);//选择码循环左移;}}void delay() //延时子程序{unsigned char i,j;for(i=0;i<0x10;i++)for(j=0;j<0x10;j++);}void ledBufModify() //修改显示缓冲区,秒变化时调用{if(counter==20) //产生1秒的时间标志{second++;if(second==60){second=0;} //ledBufModify();counter=0;}LED_BUF[0]=second/10; //second 的个位数字拆出来,ledBuf[0];LED_BUF[1]=second%10; //second 的十位数字拆出来,ledBuf[1];//flag=0;//1秒钟标志清除;}硬件电路:(二)按键控制秒表:#include<reg51.h>#include<intrins.h>code unsigned char LED_TBL[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};unsigned char LED_BUF[2] = {0,0}; //字位码有两个,分别对应两个接口的选择unsigned char second = 0,counter=0;void refresh();void delay();void ledBufModify();void main(){TMOD = 0x10;TH1 = 0x3C; //计数初值为15536 ,即3CB0HTL1 = 0xB0;IT0=1;EA=1;//总中断控制打开EX0=1;ET1=1;//定时器/计时器中断打开TR1=1;//T1中断允许打开while(1){ledBufModify();refresh();}}void timer1() interrupt 3 //n 1/3 ,Timer0/Timer1{counter++;TH1=0x3c;TL1=0xb0;}void refresh() //数码管动态刷新子程序{unsigned char select,i;select=0xFE;for(i = 0 ; i< 2 ; i ++){P1=select;//字位口输出选择码;P2=LED_TBL[LED_BUF[i]];//字型口输出字型码;delay();select=_crol_(select,1);//选择码循环左移;}}void delay() //延时子程序{unsigned char i,j;for(i=0;i<0x10;i++)for(j=0;j<0x10;j++);}void ledBufModify() //修改显示缓冲区,秒变化时调用{ //counter++;if(counter==20) //产生1秒的时间标志{second++;if(second==60){second=0;}counter=0;}LED_BUF[0]=second/10; //second 的个位数字拆出来,ledBuf[0];LED_BUF[1]=second%10; //second 的十位数字拆出来,ledBuf[1];//flag=0;//1秒钟标志清除;}void intr0 () interrupt 0 //0/2,INT0/INT1{//本质秒表取决于定时器工作状态,控制定时器是否工作//TRxTR1 = !TR1;}硬件电路图:。

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