写了个秒表的程序,有些困惑
00 :00 . 00分 秒分秒
代码:/***************************************************************
文件名:秒表.c
晶振频率:12MHz
****************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define dataport P0
uchar code weima[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
uchar code duanma[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar tempdata;
uchar tt0,tt1,tt2;
sbit wela=P2^2;
sbit dula=P2^3;
void display(uchar,uchar);
void Init_Timer0(void);
void delayms(uint);
void main(void)
{
Init_Timer0();
while(1)
display(0,6);
}
void Init_Timer0(void)
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
IE=0x82;
//EA=1;
//ET0=1;
TR0=1;
}
void T0_isr(void)interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
tt0++;
if(tt0==100) //1秒
{
tt0=0;
tt1++;
if(tt1==60)
{
tt1=0;
tt2++;
if(tt2==60)
tt2=0;
}
}
tempdata=duanma; //分前一位
tempdata=duanma; //分后一位
tempdata=duanma; //秒前一位
tempdata=duanma; //秒后一位
tempdata=duanma; //分秒前一位
tempdata=duanma; //分秒后一位
}
void display(uchar firstbit,uchar num)
{
uchar i;
for(i=0;i<num;i++)
{
dataport=0;
dula=1;
dula=0;
dataport=weima;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(2);
}
}
void delayms(uint ms)
{
uint i;
while(ms--)
for(i=110;i>0;i--);
}
不知道问题出现在哪,数码管显示不对,高手指点下 没电路图,没怎么不对的情况,你当大家都是算命的吗? 怎么个不对 单片机开发板的电路原理图 单片机表面丝印图 本帖最后由 一匹狼 于 2013-2-14 15:37 编辑
william_rain 发表于 2013-2-14 15:23 static/image/common/back.gif
怎么个不对
数码管显示很乱,根本就没法读数,
我设计本意是显示6位,而数码管显示了8位
说明下:P0口接8位共阴数码管
i55x 发表于 2013-2-14 15:20 static/image/common/back.gif
没电路图,没怎么不对的情况,你当大家都是算命的吗?
开发板的电路原理图 你那个tt0不用初始化一个值吗? faduo2012 发表于 2013-2-14 15:41 static/image/common/back.gif
你那个tt0不用初始化一个值吗?
默认赋值0 你还是一位位的点亮吧。不用急 没仔细看,但一般都是延时的问题。 alwen 发表于 2013-2-14 15:49 static/image/common/back.gif
你还是一位位的点亮吧。不用急
/***************************************************************
文件名:秒表.c
晶振频率:12MHz
****************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define dataport P0
uchar code weima[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
uchar code duanma[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar tempdata;
uchar tt0,tt1,tt2;
sbit wela=P2^2;
sbit dula=P2^3;
void display(void);
void Init_Timer0(void);
void delayms(uint);
void main(void)
{
Init_Timer0();
while(1)
display();
}
void Init_Timer0(void)
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
IE=0x82;
//EA=1;
//ET0=1;
TR0=1;
}
void T0_isr(void)interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
tt0++;
if(tt0==100) //1秒
{
tt0=0;
tt1++;
if(tt1==60)
{
tt1=0;
tt2++;
if(tt2==60)
tt2=0;
}
}
tempdata=duanma; //分前一位
tempdata=duanma; //分后一位
tempdata=duanma; //秒前一位
tempdata=duanma; //秒后一位
tempdata=duanma; //分秒前一位
tempdata=duanma; //分秒后一位
}
void display(void)
{
dataport=0xfe;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(1);
dataport=0xfd;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(1);
dataport=0xfb;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(1);
dataport=0xf7;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(1);
dataport=0xef;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(1);
dataport=0xdf;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(1);
dataport=0xbf;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(1);
}
void delayms(uint ms)
{
uint i;
while(ms--)
for(i=110;i>0;i--);
}
还是不行、、、 bg6ixm 发表于 2013-2-14 15:59 static/image/common/back.gif
没仔细看,但一般都是延时的问题。
显示函数display延时范围在1~8ms都有试过,貌似不是这方面原因 一匹狼 发表于 2013-2-14 16:31 static/image/common/back.gif
还是不行、、、
首先你先确认,你已经成功点亮数码管子,可以静态76543210 的数字 /***************************************************************
文件名:秒表.c
晶振频率:12MHz
****************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define dataport P0
uchar code weima[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
uchar code duanma[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar tempdata;
uchar tt0,tt1,tt2;
sbit wela=P2^2;
sbit dula=P2^3;
void display(void);
void Init_Timer0(void);
void delayms(uint);
void main(void)
{
Init_Timer0();
while(1)
display();
}
void Init_Timer0(void)
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
IE=0x82;
//EA=1;
//ET0=1;
TR0=1;
}
void T0_isr(void)interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
tt0++;
if(tt0==100) //1秒
{
tt0=0;
tt1++;
if(tt1==60)
{
tt1=0;
tt2++;
if(tt2==60)
tt2=0;
}
}
tempdata=duanma; //分前一位
tempdata=duanma; //分后一位
tempdata=duanma; //秒前一位
tempdata=duanma; //秒后一位
tempdata=duanma; //分秒前一位
tempdata=duanma; //分秒后一位
}
void display(void)
{
dataport=0xfe;
wela=1;
wela=0;
dataport=tempdata; dula=1;
dula=0;
delayms(1);
dataport=0xfd;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(1);
dataport=0xfb;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(1);
dataport=0xf7;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(1);
dataport=0xef;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(1);
dataport=0xdf;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(1);
dataport=0xbf;
wela=1;
wela=0;
dataport=tempdata;
dula=1;
dula=0;
delayms(1);
}
void delayms(uint ms)
{
uint i;
while(ms--)
for(i=110;i>0;i--);
}
这段代码中的dataport=tempdata; 更改成dataport=duanma;
看看能否静态显示个个数字 定时器16位模式没有自动重装载功能吧。 i55x 发表于 2013-2-14 17:12 static/image/common/back.gif
定时器16位模式没有自动重装载功能吧。
第47、48行重新装载初值 alwen 发表于 2013-2-14 16:55 static/image/common/back.gif
/***************************************************************
文件名:秒表.c
晶振频率:12MHz
显示不了
不知道为什么,
但我的单片机开发板还是好的,因为我烧写了以前写的8位共阴数码管的程序,数码管显示是正常。
谢谢你的耐心回答~节日快乐 是不是把两个573搞错了? Tliang 发表于 2013-2-14 19:14 static/image/common/back.gif
是不是把两个573搞错了?
l两个573? 一匹狼 发表于 2013-2-14 18:27 static/image/common/back.gif
显示不了
不知道为什么,
但我的单片机开发板还是好的,因为我烧写了以前写的8位共阴数码管的程序,数码 ...
你可以找一个成功运行的文件,再修改,功能实现后,在自己从头写一次,这样不就OK咯 一匹狼 发表于 2013-2-14 19:19 static/image/common/back.gif
l两个573?
我也想知道,PA0~PA7 是接到哪里的 alwen 发表于 2013-2-14 22:05 static/image/common/back.gif
我也想知道,PA0~PA7 是接到哪里的
P0接8位数码管,我的板子标明J3, 楼主可以先试试单独点数码管显示固定数字,比如动态扫描显示1234,这个测试没问题了再试秒表的计数值 月光疾風 发表于 2013-2-14 23:35 static/image/common/back.gif
楼主可以先试试单独点数码管显示固定数字,比如动态扫描显示1234,这个测试没问题了再试秒表的计数值 ...
动态扫描xxxx xxxx没问题啊,
我三位的秒表测试也没问题
就是写的六位的秒表没有成功 不知道程序在哪出现差错了。。。。 好用的代码贴出来看看 一匹狼 发表于 2013-2-14 15:33 static/image/common/back.gif
数码管显示很乱,根本就没法读数,
我设计本意是显示6位,而数码管显示了8位
楼主,我写了个。在我的实验板上调试通了。
你把位选、段选定义改一下就好了。/*
*板极调试成功
*6位数码管显示
*
*/
#include <reg52.h>
sbit DuCs = P2^6;
sbit WeCs = P2^7;
#define DATA P0
unsigned char Second = 0;
unsigned char Minute =0;
unsigned char Hour = 0;
unsigned char Count = 0;
unsigned char Scan = 0;
unsigned char SMG_Buffer = {0};
unsigned char code TAB[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
unsigned char code WEI[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
void Timer0_Init(void){
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
ET0 = 1;
TR0 = 1;
}
void Timer1_Init(void) {
TMOD = 0x21;
TH1 = (256 - 250);
TL1 = (256 - 250);
ET1 = 1; //打开定时器中断
TR1 = 1; //开启定时器
}
void main(){
Timer0_Init();
Timer1_Init();
EA = 1;
while (1){
SMG_Buffer = Second /10;
SMG_Buffer = Second % 10;
SMG_Buffer = Minute / 10;
SMG_Buffer = Minute % 10;
SMG_Buffer = Hour / 10;
SMG_Buffer = Hour % 10;
}
}
void Timer0_SRV(void) interrupt 1{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
Second ++;
if (100 == Second) {
Second = 0;
Minute ++;
if (Minute == 60) {
Minute = 0;
Hour ++;
if (Hour == 60){
Hour =0;
}
}
}
}
void Timer1_Service(void) interrupt 3{
TH1 = (256 - 250);
TL1 = (256 - 250);
P0 = ~ (1 << Scan);
WeCs = 1;
WeCs = 0;
P0 = TAB];
DuCs = 1;
DuCs = 0;
Scan ++;
if (Scan > 7){
Scan = 0;
}
} 要写一行,调一行,对码编程.这样写完就调完了
页:
[1]