我想用单片机实现电子表功能,参考于宋彩利编的《单片机原理与C51编程》的程序,目前运行有问题,请多指教
发布网友
发布时间:2022-05-12 06:29
我来回答
共3个回答
热心网友
时间:2024-02-18 19:38
以下就是该题的全部程序,请高手指点~~~~~~
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char //定义0~9共阴显示
code uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit CLK1=P1^0;
sbit SDA1=P1^1;
sbit CLK2=P1^3;
sbit SDA2=P1^4;
sbit KEY=P1^2;
sbit SOUND=P1^7;
int h1,m1,s1;
int h2,m2,s2;
int count1,count2;
uchar dis[6];
void delay() //延时程序
{
unsigned int j;
for(j=0;j<100;j++)
{}
}
void send1(unsigned char a) //74HC164
{
unsigned char i;
for(i=0;i<8;i++)
{ if(_crol_(a,i)&0x80)
SDA1=1;
else
SDA1=0;
CLK1=0;
CLK1=1;
}
}
void send2(unsigned char a)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(_crol_(a,i)&0x80)
SDA2=1;
else
SDA2=0;
CLK2=0;
CLK2=1;
}
}
void display(int h,int m,int s)
{
int i,x,com=0xfe;
dis[0]=h/10;dis[1]=h%10; //时
dis[2]=m/10;dis[3]=m%10; //分
dis[4]=s/10;dis[5]=s%10; //秒
for(i=0;i<6;i++) //显示位数
{ x=send2(0xff);
Table[dis[i]]; //黑屏
send1(x); //发送段码
send2(com); //发送位码
delay(); //延时
com=_crol_(com,1); //改变位码
}
}
void time_add(int h,int m,int s) //加时程序
{
s++;
if(s==60)
{ m++;
s=0;
if(m==60)
{ h++;
m=0;
if(h==24)
{ h=0;
}
}
}
}
void time_dec(int h,int m,int s) //减时程序
{
s--;
if(s<0)
{ m--;
s=59;
if(m<0)
{ h--;
m=59;
if(h<0)
{ h=23;
}
}
}
}
void time0_int(void) interrupt 1 //定时/计数器0
{ TH0=-0x3c;
TL0=0xb0;
count1++;
if(count1==20)
{ time_add(h1,m1,s1);
count1=0;
}
}
void time2(void) interrupt 3 //定时/计数器1
{
TH1=0xFD;
TH1=0x80;
SOUND=~SOUND; //扬荡发声
if(count2==1000)
{
TR1=0;
count2=0;
}
}
void main(void) //主程序
{
int flag;
unsigned char jkey ,i;
TMOD=0x11;
IE=0x8A;
TR0=1;TR1=0; //启动T0,停止T1
while(1)
{
jkey=0xfe;
flag=0;
for(i=0;i<6;i++)
{
send1(jkey);
if(!KEY)
{ flag=1;break;}
else
jkey=_crol_(jkey,1);
}
if(flag==1)
{
switch(i)
{
case 0:{TR0=1;display(h1,m1,s1);break;}
case 1:{TR0=0;display(h1,m1,s1);break;}
case 2:{time_add(h1,m1,s1);display(h1,m1,s1);break;}
case 3:{time_dec(h1,m1,s1);display(h1,m1,s1);break;}
case 4:{time_add(h2,m2,s2);display(h1,m1,s1);break;}
case 5:{time_dec(h2,m2,s2);display(h1,m1,s1);break;}
}
}
else //如果无按键按下,显示当前
display(h1,m1,s1); //闹铃
if(h1==h2&&m1==m2&&s1==s2)
{TR1=1;}
}
}
热心网友
时间:2024-02-18 19:38
首先,不知你的硬件是如何设计的,是用的单片机内部定时器做的还是用的时钟芯片等?然后,针对硬件来进行编程。追问你帮我看看下面回答者的程序吧~~~,那就是全部程序了。。。不胜感激啊~~~~~
追答软件是针对相关的硬件来写的。您是硬件我不清楚。
热心网友
时间:2024-02-18 19:39
time_add(h2,m2,s2);这个函数中断调用了就不能再中断外调用,剩下你出现啥问题了说明白在研究追问oo??貌似没有在中断外调用。这个程序问题在于显示,黑屏处一直存在问题,无法解决呢?我用的均为74HC164控制数码管的段码和位码。嗯,大致是这样~很谢谢你哈!
追答case 2:{time_add(h1,m1,s1);display(h1,m1,s1);break;}
case 3:{time_dec(h1,m1,s1);display(h1,m1,s1);break;}
case 4:{time_add(h2,m2,s2);display(h1,m1,s1);break;}
case 5:{time_dec(h2,m2,s2);display(h1,m1,s1);break;}
这不调用2次吗,黑屏处啥意思,显示是什么现象