用单片机控制一个8段数码管,其循环显示数字0到9,每位数字显示时间为一秒,定时功能用单片机中断显示
答案:2 悬赏:0 手机版
解决时间 2021-01-13 20:54
- 提问者网友:欲望失宠
- 2021-01-13 02:30
用单片机控制一个8段数码管,其循环显示数字0到9,每位数字显示时间为一秒,定时功能用单片机中断显示
最佳答案
- 五星知识达人网友:煞尾
- 2021-01-13 03:38
有一个一模一样的提问,好吧,俺再发布一次
给你一份我自己写的,利用四位数码管显示模拟时钟的程序吧,供你研究
另外,再给你一个一位数码管的,是你要求的那种
这两个都是利用单片机的定时器中断来产生秒信号的
下面这个是 四位数码管的,最下边的是一位数码管的,端口不一样的话,自己改下
#include
sbit p20=P3^7; sbit p21=P3^6; sbit led=P2^7;//按键及LED端口定义
sbit Axs=P1^3; sbit Bxs=P1^2; sbit Cxs=P1^1; sbit Dxs=P1^0;//数码管位选端口
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
unsigned int h,m,s,t,n;
void YS(char hs)//延时函数
{char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}
void XS(int xh,int xm) //显示子函数
{
char d1,d2,d3,d4;
d1=(xh/1)%10; d2=(xh/10)%10;//分离小时
d3=(xm/1)%10; d4=(xm/10)%10;//分离分钟
P0=table[d1];Cxs=0;YS(10);Cxs=1;//小时个位
P0=table[d2];Dxs=0;YS(10);Dxs=1;//小时十位
P0=table[d3];Axs=0;YS(10);Axs=1;//分钟个位
P0=table[d4];Bxs=0;YS(10);Bxs=1;//分钟十位
P0=0x7f; P1=0xfd; YS(10); P1=0xff;//小数点
}
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定时器初始化
while(1)//主循环
{
if(p20==0){YS(10);if(p20==0){h++;if(h>23){h=0;}}while(!p20){XS(h,m);}}
if(p21==0){YS(10);if(p21==0){m++;if(m>59){m=0;}}while(!p21){XS(h,m);}}
XS(h,m);//调用数码管显示函数
}
}
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;t++;
if(t>500){t=0;led=~led;}//LED闪烁
if(n>1000){n=0;s++;}//如果达到一秒,秒加一
if(s>59){s=0;m++;}//如果达到一分,分加一
if(m>59){m=0;h++;}//如果达到一小时,小时加一
if(h>23){h=0;}//如果达到24小时,小时清零
}
#include
sbit Axs=P1^3;//数码管位选端口
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
unsigned int h,m,s,t,n;
void YS(char hs)//延时函数
{char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定时器初始化
while(1)//主循环
{
P0=table[m];Axs=0;YS(10);Axs=1;//小时个位
}
}
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;
if(n>1000){n=0;m++;}//如果达到一秒,秒加一
if(m>9){m=0;}//如果达到一小时,小时加一
}
追问
你可以再帮我写一下吗还有硬件电路原理图,程序流程图追答记得要采纳哦,上一个也是你提问的吧,还没采纳呢
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1;//定时器初始化
while(1)//主循环
{
if(t==1)//如果已经打开
{P0=table[m];Axs=0;YS(10);Axs=1;}//数码管显示数据
else{Axs=1;}//否则关闭数码管
if(K==0&&t==0)//如果按键被按下且处于关闭状态
{
YS(10);//延时去抖动
if(K==0&&t==0)//如果按键仍被按下
{
TR0=1;//打开定时器
n=0; m=0;//清空数据
t=1;//设置标识符 为开
while(!K);//等待按键松开
}
}
if(K==0&&t==1)//如果按键被按下且处于打开状态
{
YS(10);//延时去抖动
if(K==0&&t==1)//如果按键仍被按下
{
TR0=0;//关闭定时器
n=0; m=0;//清空数据
t=0;//设置标识符为关
while(!K);//等待按键松开
}
}
}
}
追问上次的和这这次的怎么不一样还有硬件电路图,程序流程图追答一样的,字数限制,头文件和定义部分没贴出来
#include
sbit Axs=P1^3; sbit K=P3^7;//数码管位选端口
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
unsigned int m,n,t=0;
void YS(char hs)//延时函数
{char hk;for(;hs>0;hs--){for(hk=100;hk>0;hk--);}}
追问哦哦,那硬件电路图你会吗追答别客气追问你不会吗追答恩,硬件电路,我从不用绘图软件的,不过可以给你讲讲怎么连线
你之前的那个提问,能采纳一下吗,谢谢追问恩可以,那程序流程图那追答程序都有了,流程图就可以参照程序的运行顺序画了啊追问我不会,你可以帮我画下吗追答我这没有绘图软件追问程序流程图不用绘图软件吧追答不用绘图软件你怎么画图?????
用手指在显示器上画画,你能保存在电脑中吗?追问
程序流程图不是这样的吗追答对啊,就是这样的,但这是使用绘图软件绘制的,绘图软件的种类还很多呢追问哦哦,那这样的你会吗,给我画下吧用笔画下就好了怎么不说话了追答用笔画倒是可以,但没办法输入到电脑上,也就没办法传给你呀
我的手机没有照相功能
追问能不能用文字叙述追答先是初始化,然后是状态啊判断,这是后在侧面画个箭头,就是分支
状态0,打开数码管显示,并打开定时器开始计数,另一个分支是检测计数值是否大于9
如果大于9 ,则清零,重新开始
状态1,关闭数码管显示,并关闭定时器,以及清零数据
在判断状态的下面再写上 按键判断,按键判断的同时,也判断状态
然后根据不同的状态设置结果追问谢谢你,那你会系统功能结构图吗追答不会追问哦谢谢你追答别客气
全部回答
- 1楼网友:神鬼未生
- 2021-01-13 04:35
是想好了追问?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯