找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2543|回复: 5
收起左侧

单片机秒表有点慢,这是什么情况?求解

[复制链接]
ID:443291 发表于 2018-12-19 20:56 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit LCD_RS=P2^6;  
  5. sbit LCD_RW=P2^5;
  6. sbit LCD_E=P2^7;
  7. sbit k2=P3^0;

  8. long int count,count1;
  9. char mil,sec,min,mil1,sec1,min1;

  10. unsigned char code table[ ]="          miaobiao  ";
  11. unsigned char code table1[ ]="    00:00:0   ";

  12. void delay(uint z)
  13. {
  14.         uchar j,k;
  15.         for(j=z;j>0;j--)
  16.         for(k=256;k>0;k--);
  17. }
  18. void write_com(uchar com)
  19. {
  20.         LCD_RS=0;
  21.         LCD_E=0;
  22.         LCD_RW=0;
  23.         LCD_DATAPINS=com;
  24.         delay(5);
  25.         LCD_E=1;
  26.         delay(5);
  27.         LCD_E=0;
  28. }

  29. void write_date(uchar date)
  30. {
  31.         LCD_RS=1;
  32.         LCD_E=0;
  33.         LCD_RW=0;
  34.         LCD_DATAPINS=date;
  35.         delay(5);
  36.         LCD_E=1;
  37.         delay(5);
  38.         LCD_E=0;
  39. }

  40. void init()
  41. {
  42.         uchar num;
  43.         LCD_E=0;
  44.         write_com(0x38);
  45.         write_com(0x0c);
  46.         write_com(0x06);
  47.         write_com(0x01);
  48.         write_com(0x80);
  49.         for(num=0;num<20;num++)
  50.         {
  51.                 write_date(table[num]);
  52.                 delay(5);
  53.         }
  54.         write_com(0x80+0x40);
  55.         for(num=0;num<12;num++)
  56.         {
  57.                 write_date(table1[num]);
  58.                 delay(5);
  59.         }
  60.         TMOD=0x01;
  61.         TH0=(65536-50000)/256;
  62.         TL0=(65536-50000)%256;
  63.         EA=1;
  64.         ET0=1;
  65.         EX0=1;
  66.         TR0=0;
  67. }

  68. void write_min(uchar add,uchar date)
  69. {
  70.         uchar one,two;
  71.         one=date/10;
  72.         two=date%10;
  73.         write_com(0x80+0x40+add);
  74.         write_date(0x30+one);
  75.         write_date(0x30+two);
  76. }

  77. void write_sec(uchar add,uchar date)
  78. {
  79.         uchar three,four;
  80.         three=date/10;
  81.         four=date%10;
  82.         write_com(0x80+0x40+add);
  83.         write_date(0x30+three);
  84.         write_date(0x30+four);
  85. }

  86. void write_mil(uchar add,uchar date)
  87. {
  88.         uchar five;
  89.         five=date%10;
  90.         write_com(0x80+0x40+add);
  91.         write_date(0x30+five);
  92. }

  93. void zjs()
  94. {
  95.         if(count==2)
  96.         {
  97.         delay(5);
  98.                 count=0;
  99.                 mil++;
  100.                 if(mil==10)
  101.                 {
  102.                         delay(5);
  103.                         mil=0;
  104.                         sec++;
  105.                         if(sec==60)
  106.                         {
  107.                                 delay(5);
  108.                                 sec=0;
  109.                                 min++;
  110.                                 if(min==60)
  111.                                 {
  112.                                         delay(5);
  113.                                         min=0;
  114.                                         mil=0;         
  115.                                 }
  116.                         }
  117.                 }
  118.         write_min(4,min);
  119.         write_sec(7,sec);
  120.         write_mil(10,mil);                        
  121.         }
  122. }

  123. void main()
  124. {
  125.         init();
  126.         while(1)
  127.         {
  128.                 zjs();
  129.         }
  130. }

  131. void int0() interrupt 0  
  132. {
  133.         delay(10);
  134.         TR0=~TR0;
  135. }

  136. void timer0() interrupt 1
  137. {
  138.         count++;
  139. }
复制代码


回复

使用道具 举报

ID:213173 发表于 2018-12-19 21:59 | 显示全部楼层
T0中断程序中没有重装TH0、TL0初值,当然时间慢30%。
回复

使用道具 举报

ID:393699 发表于 2018-12-19 22:02 | 显示全部楼层
中断里面不要放延时……,你既然开了定时器为何不用硬件计数来计时呢?为什么还要故意用循环延时呢?估计问题就是在这里,重新想想这个计时逻辑吧
回复

使用道具 举报

ID:275479 发表于 2018-12-19 22:20 | 显示全部楼层
定时器方式是   16位定时器/计数器
void int0() interrupt 0  
{
        delay(10);
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TR0=~TR0;
}
回复

使用道具 举报

ID:424598 发表于 2018-12-20 09:35 来自手机 | 显示全部楼层
可参考我发的定时器代码,点我的主题
回复

使用道具 举报

ID:443291 发表于 2018-12-25 13:41 | 显示全部楼层
谢谢大佬
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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