完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 baidu202 于 2011-5-12 23:13 编辑
#include #include typedef unsigned char uchar; typedef unsigned int uint; ***it key=P1^7; bit flag=0; uint t; uchar sec=0,min=0,hour=0,x=0,u=0xfe,tt=0;//t计时一秒 tt计时2毫秒 uchar code Num[]= { 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0xff; }; uchar Num_Buf[]= {0,0,10,0,0,10,0,0}; void display() { if(tt==1) { tt=0; P2=u; u=_crol_(u,1); P0=Num[Num_Buf[x]]; x++; if(x==8)x=0; } } void timer0()interrupt 1 { ET0=0; TH0=-(2010/256); TL0=-(2010%256); t++; tt++; if(t==500) { t=0; sec++; } ET0=1; } void main() { EA=1; ET0=1; TR0=1; TMOD=0x01; TH0=-(2000/256); TL0=-(2000%256); P2=0xff; P0=0xff; while(1) { display(); if(sec==60) { sec=0; min++; if(min==60) { min=0; hour++; if(hour==24) { hour=0; } } } Num_Buf[6]=sec/10; Num_Buf[7]=sec%10; Num_Buf[3]=min/10; Num_Buf[4]=min%10; Num_Buf[0]=hour/10; Num_Buf[1]=hour%10; } } 我是一个新手,才学51单片机。 这是我编的一个单纯的计时器,没有其他功能, 只有从00-00-00开始。后来发现,定时时间不准,定时器初值越小的时候越不准,误差很大。定时器初值补偿也试过,无法修正。请各位高手帮我看看哪里有问题。晶振是12兆的。 无论怎样,先说声谢谢大家。。。 |
|
相关推荐
5个回答
|
|
定时器做的时钟不准很正常,要想精确用时钟芯片,如:DS1302
|
|
|
|
用单片机的晶体振荡器,程序定时会有误差。
|
|
|
|
试试这样修改下:
/***************************************************************************************** 修改版 *****************************************************************************************/ #include #include typedef unsigned char uchar; typedef unsigned int uint; ***it key=P1^7; bit flag=0; uint t; uchar sec=0,min=0,hour=0,x=0,u=0xfe,tt=0;//t计时一秒 tt计时2毫秒 uchar code Num[]= { 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0xff; }; uchar Num_Buf[]= {0,0,10,0,0,10,0,0}; void display() { if(tt==1) { tt=0; P2=u; u=_crol_(u,1); P0=Num[Num_Buf[x]]; x++; if(x==8)x=0; } } void timer0()interrupt 1 { ET0=0; //TH0=-(2010/256); //TL0=-(2010%256); //定时周期尽量设置长一些,因为进入中断以及重装初值都需要消耗时间。这个时间和你定时周期越接近,定时越不精确。 TH0=(65536-50000)/256; TL0=(65536-50000)%256; t++; tt++; //if(t==500) if(t==20) { t=0; sec++; if(sec==60) { sec=0; min++; if(min==60) { min=0; hour++; if(hour==24) { hour=0; } } } } ET0=1; } void main() { EA=1; ET0=1; TR0=1; TMOD=0x01; //TH0=-(2000/256); //TL0=-(2000%256); TH0=(65536-50000)/256; TL0=(65536-50000)%256; P2=0xff; P0=0xff; while(1) { display(); //这里潜在的问题,假如此时sec=60,主函数将要执行 if(sec==60)的时候,突然发生定时器中断, //在中断里面进行了src++,中断退出后,返回主函数继续执行 if(sec==60),而此时sec已经变成了61, //这里的判断是不是就失效呢? //在程序中要避免在中断和主函数同时使用一个资源,(资源:变量,函数,硬件等待) //否则就会因为资源争夺而发生冲突。 /* if(sec==60) { sec=0; min++; if(min==60) { min=0; hour++; if(hour==24) { hour=0; } } }*/ Num_Buf[6]=sec/10; Num_Buf[7]=sec%10; Num_Buf[3]=min/10; Num_Buf[4]=min%10; Num_Buf[0]=hour/10; Num_Buf[1]=hour%10; } } |
|
|
|
楼上分析得很到位
|
|
|
|
晶体震荡器会有误差 这是不可避免的 如果要即时准的用ds12c887吧1302也行
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
988 浏览 0 评论
645 浏览 0 评论
嵌入式学习-搭建自己的ubuntu系统之ubuntu网络设置
778 浏览 0 评论
龙芯中科胡伟武:3B6600 八核桌面 CPU 性能将达到英特尔中高端酷睿 12~13 代水平
842 浏览 0 评论
树莓派Pico 2发布,搭载RP2350双核RISC-V和Arm Cortex-M33微控制器!
795 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
10783 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-20 05:01 , Processed in 0.598250 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号