找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3600|回复: 1
打印 上一主题 下一主题
收起左侧

单片机秒表系统课程设计 PPT文档 程序 仿真下载

[复制链接]
跳转到指定楼层
楼主

秒表系统设计
设计要求:
以秒位
为单位,小数点后保留三位,最大计时时间99秒。
两个控制按键K1-K2:
K1:计时开始。
K2:计时停止,显示当前计时值。再次按下此键,计时值清除。







以上压缩包所有资料下载: 单片机秒表课程设计.rar (417.01 KB, 下载次数: 51)

程序:
  1. #include<reg52.h>//52单片机包含的头文件
  2. #define uint unsigned int //宏定义uint为无符号整形
  3. #define uchar unsigned char//宏定义uchar为无符号整形
  4. #define LCD P2//宏定义P2口为LCD1602的并行口
  5. sbit rs=P3^0; //定义P3^0为LCD1602的数据/命令选择端
  6. sbit rw=P3^1;//定义P3^1为LCD1602的读/写选择端
  7. sbit E=P3^2;//定义P3^2为LCD1602的使能信号端
  8. sbit start=P3^3;//定义P3^3为开始按键
  9. sbit control=P3^4;//定义P3^4为LCD1602的停止与清零按键
  10. uchar s1,s2,s3,s4,s5; //定义s1为秒表的十位,s2为秒表的个位,s3为秒表的小数点后第一位,s4为秒表的小数点后第二位s5为秒表的小数点后第三位.
  11. uchar temp=0;//定义temp为多功能按键功能计数器
  12. uchar code tab[]="miao biao"; //显示代码
  13. uchar i,a;//定义随机变量i,a;

  14. /**************************************************
  15.                  毫秒级延时子程序
  16. **************************************************/
  17. void delay(unsigned int k) //形参k为要延时的长度
  18. {
  19.   unsigned int m,n;
  20.   for(m=k;m>0;m--)
  21.   for(n=50;n>0;n--);//让程序空循环50*k次 延时k毫秒

  22. }
  23. /**************************************************
  24.                 LCD 1602写指令子程序
  25. **************************************************/

  26. write_com(uchar com) //形参com为要写的指令
  27. {
  28.   rs=0;//拉低LCD1602的数据/命令选择端 1表示选择数据 0表示选择命令
  29.   rw=0;//拉低LCD1602的读/写选择端 1表示选择数据 0表示选择命令
  30.   E=1;//打开使能LCD1602
  31.   LCD=com;//将命令写入LCD1602
  32.   delay(5);//延时5ms
  33.   E=0;  //关闭使能LCD1602 使使能端出现高电平

  34. }
  35. /**************************************************
  36.                 LCD 1602写数据子程序
  37. **************************************************/
  38. write_data(uchar dat)//写数据
  39. {
  40.   rs=1;//拉高LCD1602的数据/命令选择端  ,1表示选择数据 0表示选择命令
  41.   rw=0;//拉低LCD1602的读/写选择端 ,1表示选择数据 0表示选择命令
  42.   E=1;//打开使能LCD1602
  43.   LCD=dat;//将数据写入LCD1602
  44.   delay(5); //延时5ms
  45.   E=0; //关闭使能LCD1602 使使能端出现高电平

  46. }

  47. /**************************************************
  48.                 LCD 1602初始化子程序
  49. **************************************************/
  50. init_lcd()
  51. {

  52.   write_com(0x38);//显示模式设置为0x38,表示设置为16*2显示,5*7点阵,8位数据接口
  53.   write_com(0x01);//显示清屏 数据指针清零和所有数据清零
  54.   write_com(0x06); //显示开/关及光标设置0000 01NS  N=1当读或写一个字符后地址指针加一,且光标加一
  55.                                                                                                           // N=0当读或写一个字符后地址指针减一,且光标减一
  56.                                                                                                           // S=1当写一个字符整屏显示左移(N=1)或右移(N=0)以得到光标不移动而屏幕移动的效果
  57.                                                                                                           // S=0当写一个字符整屏显示不移动
  58.   write_com(0x0c);//显示开/关及光标设置0000 1DCB  D=1开显示    D=0关显示
  59.                                                                                                            //C=1显示光标  C=0不显示光标
  60.                                                                                                            //B=1光标闪烁  B=0光标不闪烁
  61.           while(tab[i]!='\0')
  62.                 {
  63.                         write_com(0x80+i+0x04); // 设置显示位置为第一行的第5个字符开始显示出'miaobiao',0x80为第一行第一个字符,0x04为第五个字符
  64.                         write_data(tab[i]);
  65.                         i++;
  66.                 }
  67. }
  68. /***************************************************************
  69.                    中断和定时器初始化函数
  70. /**************************************************************/
  71. void init_clock(void)
  72. {
  73.         TMOD=0x01;//设置定时器0为工作方式M1M0=01是16位定时器/计数器
  74.         TH0=(65536-1000)/256;//定时器/计数器0的高八位重新赋初值
  75.         TL0=(65536-1000)%256;//定时器/计数器0的低八位重新赋初值
  76.         //以上两行设置定时时间为50ms,以后只需改动50000的数值即可
  77.     EA=0;//打开总中断
  78.         ET0=1;//定时器/计数器0的中断打开,允许定时器/计数器0申请中断
  79.         TR0=1;//启动定时器/计数器0
  80. }
  81. /***************************************************************
  82.                           主函数
  83. /**************************************************************/
  84. void main()
  85. {  
  86.         init_lcd();//初始化LCD1602
  87.     init_clock();//初始化中断和定时器
  88.         while(1)//大循环
  89.         {
  90.                    write_com(0x80+0x40+5);// 设置显示位置为第一行的第6个字符开始显示,0x80为第一行第一个字符
  91.                         write_data(0x30+s1); //显示 秒表的十位

  92.                         write_com(0x80+0x40+6);// 设置显示位置为第一行的第7个字符开始显示,0x80为第一行第一个字符
  93.                         write_data(s2+0x30);//显示秒表的个位

  94.                write_com(0x80+0x40+7);// 设置显示位置为第一行的第8个字符开始显示,0x80为第一行第一个字符

  95.                         write_data(':');//显示一个:号
  96.                        
  97.                         write_com(0x80+0x40+8);// 设置显示位置为第一行的第9个字符开始显示,0x80为第一行第一个字符
  98.                         write_data(0x30+s3);//秒表的小数点后第一位
  99.                         write_com(0x80+0x40+9);// 设置显示位置为第一行的第10个字符开始显示,0x80为第一行第一个字符
  100.                         write_data(0x30+s4);//秒表的小数点后第二位
  101.                         write_com(0x80+0x40+0x0a);// 设置显示位置为第一行的第11个字符开始显示,0x80为第一行第一个字符
  102.                         write_data(0x30+s5);//秒表的小数点后第三位
  103.              if(start==0)//如果开始按键按下
  104.                EA=1;  //打开中断
  105.              if(control==0)//如果停止与清零按键按下
  106.               {
  107.                  delay(100);//延时
  108.                  if(control==0)//再次判断停止与清零按键是否按下
  109.                                  {  
  110.                     temp=temp+1;//按一次让多功能按键功能计数器加一
  111.                     delay(100);//延时
  112.                                         while(!control);//按键松手检测
  113.                                         if(temp>=2) temp=2;//使多功能按键功能计数器只有两个功能
  114.                                   
  115.                  }
  116.               }
  117.             if(temp==1)//多功能按键功能计数器为功能1 停止
  118.               EA=0;//关闭中断
  119.              if(temp==2)//多功能按键功能计数器为功能2 清零
  120.               {s1=0;s2=0;s3=0;s4=0;s5=0;temp=0;} //清零
  121.             
  122.                        
  123.         }
  124. }
  125. void exter1() interrupt 1 //中断服务子程序,1代表定时器/计数器0中断
  126. {
  127.         TH0=(65536-1000)/256;//定时器/计数器0的高八位重新赋初值
  128.         TL0=(65536-1000)%256;//定时器/计数器0的低八位重新赋初值
  129.     a++;  
  130.     //每进入一次中断函数历时1ms,我们让计时器a加1       

  131.                 if(a==1)//1毫秒到让秒表的小数点后第三位加一
  132.                  {   a=0;//清零a
  133.                     s5++;//让秒表的小数点后第三位加一
  134.                         if(s5==10)//10毫秒到让秒表的小数点后第二位加一
  135.                          {
  136.                                  s5=0;//清零s5
  137.                                 s4++;//让秒表的小数点后第二位加一
  138.                                 if(s4==10)//100毫秒到让秒表的小数点后第一位加一
  139.                                 {
  140.                                         s4=0;//清零
  141.                                         s3++;//让秒表的小数点后第一位加一
  142.                                         if(s3==10)//1秒到让秒表的个位加一
  143.                                         {
  144.                                                 s3=0;//清零
  145.                                                 s2++;//让秒表的个位加一
  146.                                                 if(s2==10)//10秒到让秒表的十位加一
  147.                                                 {
  148.                                                         s2=0;//清零
  149.                                                         s1++;//让秒表的十位加一
  150.                                                         if(s1==10) //100秒到让秒表的小数点后第二位加一
  151.                                                         {s1=9;s2=9;s3=0;s4=0;s5=0;EA=0;}//计数到99秒 停止
  152.                                                 }
  153.                                         }
  154.                                 }
  155.                          }
  156.                  }
  157. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:154795 发表于 2016-12-14 22:40 | 只看该作者
buduoffff
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表