本帖最后由 一匹狼 于 2013-2-13 11:03 编辑
- /********************************************************************/
- /*用动态扫描方法和定时器1在数码管的前三位显示出秒表, */
- /*精确到1%秒,即最后两位显示1%秒,一直循环下去 */
- /*设时钟频率为12M */
- /********************************************************************/
- #include<reg52.h> //52单片机头文件
- #include <intrins.h> //包含有左右循环移位子函数的库
- #define uint unsigned int //宏定义
- #define uchar unsigned char //宏定义
- sbit dula=P2^2; //数码管段选锁存端
- sbit wela=P2^3; ////数码管位选锁存端
- uchar ge,shi,bai;
- uint tt;
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- void display(uchar,uchar,uchar); //函数声明
- void delay(uint);
- void main()
- {
- TMOD=0x10;//设置定时器1为工作方式1
- TH1=(65536-10000)/256;
- TL1=(65536-10000)%256;
- EA=1;//开总中断
- ET1=1;//开定时器1中断
- TR1=1;//启动定时器1
- while(1)
- {
- display(bai,shi,ge);
- }
- }
- void exter0() interrupt 3 // 定时器1中断
- {
- TH1=(65536-10000)/256;
- TL1=(65536-10000)%256;
- tt++;
- if(tt==1000)
- tt=0;
- bai=tt/100;
- shi=tt%100/10;
- ge=tt%10;
- }
- void display(uchar one,uchar two,uchar three)
- {
- dula=1;
- P0=table[one]; //送段数据
- dula=0;
- P0=0xff; //送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选锁存器
- wela=1;
- P0=0xfe;
- wela=0;
- delay(1);
- dula=1;
- P0=table[two];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0xfd;
- wela=0;
- delay(1);
- dula=1;
- P0=table[three];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0xfb;
- wela=0;
- delay(1);
- }
- void delay(uint z) //延时子函数
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
复制代码设定初值时是不是有错?
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
后面是tt=1000;所以
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
郭天祥十天学会单片机的课后习题,感觉不对劲啊
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
已经想明白了,因为秒表最后两位表示分秒 想成ms了
一周热门 更多>