秒表系统设计 设计要求: 以秒位 为单位,小数点后保留三位,最大计时时间99秒。 两个控制按键K1-K2: K1:计时开始。 K2:计时停止,显示当前计时值。再次按下此键,计时值清除。
以上压缩包所有资料下载:
单片机秒表课程设计.rar
(417.01 KB, 下载次数: 51)
程序:
- #include<reg52.h>//52单片机包含的头文件
- #define uint unsigned int //宏定义uint为无符号整形
- #define uchar unsigned char//宏定义uchar为无符号整形
- #define LCD P2//宏定义P2口为LCD1602的并行口
- sbit rs=P3^0; //定义P3^0为LCD1602的数据/命令选择端
- sbit rw=P3^1;//定义P3^1为LCD1602的读/写选择端
- sbit E=P3^2;//定义P3^2为LCD1602的使能信号端
- sbit start=P3^3;//定义P3^3为开始按键
- sbit control=P3^4;//定义P3^4为LCD1602的停止与清零按键
- uchar s1,s2,s3,s4,s5; //定义s1为秒表的十位,s2为秒表的个位,s3为秒表的小数点后第一位,s4为秒表的小数点后第二位s5为秒表的小数点后第三位.
- uchar temp=0;//定义temp为多功能按键功能计数器
- uchar code tab[]="miao biao"; //显示代码
- uchar i,a;//定义随机变量i,a;
- /**************************************************
- 毫秒级延时子程序
- **************************************************/
- void delay(unsigned int k) //形参k为要延时的长度
- {
- unsigned int m,n;
- for(m=k;m>0;m--)
- for(n=50;n>0;n--);//让程序空循环50*k次 延时k毫秒
- }
- /**************************************************
- LCD 1602写指令子程序
- **************************************************/
- write_com(uchar com) //形参com为要写的指令
- {
- rs=0;//拉低LCD1602的数据/命令选择端 1表示选择数据 0表示选择命令
- rw=0;//拉低LCD1602的读/写选择端 1表示选择数据 0表示选择命令
- E=1;//打开使能LCD1602
- LCD=com;//将命令写入LCD1602
- delay(5);//延时5ms
- E=0; //关闭使能LCD1602 使使能端出现高电平
-
- }
- /**************************************************
- LCD 1602写数据子程序
- **************************************************/
- write_data(uchar dat)//写数据
- {
- rs=1;//拉高LCD1602的数据/命令选择端 ,1表示选择数据 0表示选择命令
- rw=0;//拉低LCD1602的读/写选择端 ,1表示选择数据 0表示选择命令
- E=1;//打开使能LCD1602
- LCD=dat;//将数据写入LCD1602
- delay(5); //延时5ms
- E=0; //关闭使能LCD1602 使使能端出现高电平
- }
- /**************************************************
- LCD 1602初始化子程序
- **************************************************/
- init_lcd()
- {
- write_com(0x38);//显示模式设置为0x38,表示设置为16*2显示,5*7点阵,8位数据接口
- write_com(0x01);//显示清屏 数据指针清零和所有数据清零
- write_com(0x06); //显示开/关及光标设置0000 01NS N=1当读或写一个字符后地址指针加一,且光标加一
- // N=0当读或写一个字符后地址指针减一,且光标减一
- // S=1当写一个字符整屏显示左移(N=1)或右移(N=0)以得到光标不移动而屏幕移动的效果
- // S=0当写一个字符整屏显示不移动
- write_com(0x0c);//显示开/关及光标设置0000 1DCB D=1开显示 D=0关显示
- //C=1显示光标 C=0不显示光标
- //B=1光标闪烁 B=0光标不闪烁
- while(tab[i]!='\0')
- {
- write_com(0x80+i+0x04); // 设置显示位置为第一行的第5个字符开始显示出'miaobiao',0x80为第一行第一个字符,0x04为第五个字符
- write_data(tab[i]);
- i++;
- }
- }
- /***************************************************************
- 中断和定时器初始化函数
- /**************************************************************/
- void init_clock(void)
- {
- TMOD=0x01;//设置定时器0为工作方式M1M0=01是16位定时器/计数器
- TH0=(65536-1000)/256;//定时器/计数器0的高八位重新赋初值
- TL0=(65536-1000)%256;//定时器/计数器0的低八位重新赋初值
- //以上两行设置定时时间为50ms,以后只需改动50000的数值即可
- EA=0;//打开总中断
- ET0=1;//定时器/计数器0的中断打开,允许定时器/计数器0申请中断
- TR0=1;//启动定时器/计数器0
- }
- /***************************************************************
- 主函数
- /**************************************************************/
- void main()
- {
- init_lcd();//初始化LCD1602
- init_clock();//初始化中断和定时器
- while(1)//大循环
- {
- write_com(0x80+0x40+5);// 设置显示位置为第一行的第6个字符开始显示,0x80为第一行第一个字符
- write_data(0x30+s1); //显示 秒表的十位
- write_com(0x80+0x40+6);// 设置显示位置为第一行的第7个字符开始显示,0x80为第一行第一个字符
- write_data(s2+0x30);//显示秒表的个位
- write_com(0x80+0x40+7);// 设置显示位置为第一行的第8个字符开始显示,0x80为第一行第一个字符
- write_data(':');//显示一个:号
-
- write_com(0x80+0x40+8);// 设置显示位置为第一行的第9个字符开始显示,0x80为第一行第一个字符
- write_data(0x30+s3);//秒表的小数点后第一位
- write_com(0x80+0x40+9);// 设置显示位置为第一行的第10个字符开始显示,0x80为第一行第一个字符
- write_data(0x30+s4);//秒表的小数点后第二位
- write_com(0x80+0x40+0x0a);// 设置显示位置为第一行的第11个字符开始显示,0x80为第一行第一个字符
- write_data(0x30+s5);//秒表的小数点后第三位
- if(start==0)//如果开始按键按下
- EA=1; //打开中断
- if(control==0)//如果停止与清零按键按下
- {
- delay(100);//延时
- if(control==0)//再次判断停止与清零按键是否按下
- {
- temp=temp+1;//按一次让多功能按键功能计数器加一
- delay(100);//延时
- while(!control);//按键松手检测
- if(temp>=2) temp=2;//使多功能按键功能计数器只有两个功能
-
- }
- }
- if(temp==1)//多功能按键功能计数器为功能1 停止
- EA=0;//关闭中断
- if(temp==2)//多功能按键功能计数器为功能2 清零
- {s1=0;s2=0;s3=0;s4=0;s5=0;temp=0;} //清零
-
-
- }
- }
- void exter1() interrupt 1 //中断服务子程序,1代表定时器/计数器0中断
- {
- TH0=(65536-1000)/256;//定时器/计数器0的高八位重新赋初值
- TL0=(65536-1000)%256;//定时器/计数器0的低八位重新赋初值
- a++;
- //每进入一次中断函数历时1ms,我们让计时器a加1
- if(a==1)//1毫秒到让秒表的小数点后第三位加一
- { a=0;//清零a
- s5++;//让秒表的小数点后第三位加一
- if(s5==10)//10毫秒到让秒表的小数点后第二位加一
- {
- s5=0;//清零s5
- s4++;//让秒表的小数点后第二位加一
- if(s4==10)//100毫秒到让秒表的小数点后第一位加一
- {
- s4=0;//清零
- s3++;//让秒表的小数点后第一位加一
- if(s3==10)//1秒到让秒表的个位加一
- {
- s3=0;//清零
- s2++;//让秒表的个位加一
- if(s2==10)//10秒到让秒表的十位加一
- {
- s2=0;//清零
- s1++;//让秒表的十位加一
- if(s1==10) //100秒到让秒表的小数点后第二位加一
- {s1=9;s2=9;s3=0;s4=0;s5=0;EA=0;}//计数到99秒 停止
- }
- }
- }
- }
- }
- }
复制代码
|