4301|9

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于定时器的问题 [复制链接]

我在做一个定时器,想要用lcd显示秒、毫秒、微秒。秒和毫秒都是3位显示,精确到0.1ms,在进行各个显示的时候,在微秒进位到秒的时候,显示到256后就自动清零了并且一直没有进位,如果小于256就没有问题,毫秒就会像秒进位。部分程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
#define RS RB4
#define E RE2

uchar table[]="  000:000:000  ";
uchar ys,count;
uint  sec=0,ms=0,us=0;
void init_pic()
{
TRISB=0X00;
TRISD=0X00;
TRISE=0x00;
        GIE=1;
        PEIE=1;
         TMR1IE=1;
         TMR1IF=0;
          
         TMR1H=0Xfe;
         TMR1L=0X70;  //0.1ms
        T1CON=0X01;
}





//**********延时函数*************/
void delay_a(uchar z)
{
        uint i,j;
        for(i=z;i>0;i--)
        for(j=110;j>0;j--);
}


/********************************************************************\
|* 函 数 名: write_command(uchar tempdata)                                                        *|
|* 功能描述: 将数据码写入LCD数据寄存器                                                                     *|
\********************************************************************/
void write_command(uchar tempdata)
{
          
        RS=0;          //RS=0/RW=0 时写指令;
         for(ys=10;ys>0;ys--);//delay_a(5);       
        PORTD=tempdata;
         for(ys=10;ys>0;ys--);//delay_a(5);
        E=1;
        for(ys=10;ys>0;ys--);//delay_a(5);
        E=0;
}


/********************************************************************\
|* 函 数 名: void write_data(uchar tempdata)                                                *|
|* 功能描述: 写LCD1602使能程序                                                                      *|
\********************************************************************/
void write_data(uchar tempdata)
{       
       
        RS=1;           //RS=1/RW=0 时写数据;
         for(ys=10;ys>0;ys--);//delay_a(5);
        PORTD=tempdata;
         for(ys=10;ys>0;ys--);//delay_a(5);
        E=1;
         for(ys=10;ys>0;ys--);//delay_a(5);
        E=0;       
}
void init_LCD(void)
{
        uchar num;
        write_command(0x38); // lcd为两行显示8位数据线有效         
        write_command(0x0c); // 显示字符  关闭光标
        write_command(0x06); // 输入方式设置 光标向右移动一位 ac-1
        write_command(0x01);
        write_command(0x80);//第一行显示

}


void write_sfm(uchar add,uchar date) //*定义变量数字显示位置*/
{
        uchar bai,shi,ge;
        bai=date/100;
        shi=(date%100)/10;
        ge=date%10;
       
        write_command(0x80+add);
        write_data(0x30+bai);
        write_data(0x30+shi);
        write_data(0x30+ge);

}
void zifu_disp()
{
        uchar i;
           write_command(0x80);
        for(i=0;i<15;i++)
        {
                write_data(table);
                delay_a(5);
        }
}

//********中断服务子程序**************
void interrupt time(void)
{
TMR1H=0xfe;
TMR1L=0x70;
TMR1IF=0;
        count++;
}


//*************主函数*******************/
void main()
{       
        init_pic();
       
        init_LCD();
        zifu_disp();

        while(1)
        {         
                if(count==1)
                {        us++;
                        count=0;
                        if(us==9)
                          {
                                  ms++;
                                us=0;
                                  if(ms==999)//一到256就清零了 ?
                                  {
                                sec++;
                                  ms=0;
                                write_sfm(2, sec);
                                  }
                                write_sfm(6, ms);       
                         }
                        write_sfm(10,us);         
                }
               
        }
       
}

最新回复

每天发帖  详情 回复 发表于 2009-11-26 19:48
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
uint  sec=0,ms=0,us=0; ms你定义的是uint类型,单片机内的uint的范围是啥?所以肯定会越界的嘛
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
类型的字节长度和具体的芯片有关系。检查datasheet,看看unsigned int占据多长字节。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
数值类型unsigned int的范围。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
可是我修改了之后还是不行啊 我把他换成一个长整型或者一个浮点型都不行啊 ?都是到了256就清零 难道我的显示有问题?
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

6
 
单步调试,看到这  ms++; ms是啥?排除不是显示问题
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 
主程序中这样写感觉不太好
while(1)
{
if(count==1)
{ us++;
count=0;

该为
while(1)
{
if(count>=1)
{us++;
count=0;

前面有人说仿真看看,直接修改MS到255,然后停在MS++那看MS会变成几
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
编个简单的测试程序就可以知道你单片机上unsigned int是8bit的还是16bit的
比如
……
unsigned int i;
……
i=255;
i++;
if(i==0)
{
printf("sizeof unsigned int is 8bit");
printf("thank you very much");
}
……
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
int是十六位的没有问题...

其它的再看
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 

每天发帖
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表