用89C51单片机设计一个可以让串口控制两个数码管正常工作,补充电路图。并写出能让两位数码管重0到99显示
(要求有完整的最小系统,晶振12MHz,用定时器0,工作方式1,根据已知条件测出正确的字型码。字型码测试为:当发送数据为11111110B,时数码管a段当发送数据为111...
(要求有完整的最小系统,晶振12MHz,用定时器0,工作方式1,根据已知条件测出正确的字型码。字型码测试为:当发送数据为11111110B,时数码管a段当发送数据为11111101B,时数码管b段当发送数据为11111011B,时数码管c段当发送数据为11110111B,时数码管d段当发送数据为11101111B,时数码管e段当发送数据为11011111B,时数码管f段当发送数据为10111111B,时数码管g段当发送数据为01111111B,时数码管dp段
展开
2012-07-06
展开全部
帮你分析一下:
该题是用单片机的串口,传送数据送给2位数码管显示,串口要选择工作在方式0,即做同步移位寄存器使用,工作在发送状态,用RXD做数据线,TXD做同步时钟使用。
然后可以编程,发送如上数据为11111110B,测试数码管a段是否正常能亮。
程序就不帮你写了,做为学生要自己动手,考试题要自己答才行。有了上面的编程思路,这道题你是可以做出来的,加油吧。
该题是用单片机的串口,传送数据送给2位数码管显示,串口要选择工作在方式0,即做同步移位寄存器使用,工作在发送状态,用RXD做数据线,TXD做同步时钟使用。
然后可以编程,发送如上数据为11111110B,测试数码管a段是否正常能亮。
程序就不帮你写了,做为学生要自己动手,考试题要自己答才行。有了上面的编程思路,这道题你是可以做出来的,加油吧。
追问
这个真的不懂啊,看了好久呢,没有程序分析一下嘛
追答
帮你做出测出正确的字型码程序:
CEDUANMA: MOV A,#00H
MOV SCON,A
MOV A,#11111110B
MOV SBUF, A
LL1: JNB TI, LL1
CLR TI
LCALL YS
RL A
MOV SBUF, A
CJNE A,#11111110B,LL1
LL2: RET
YS: MOV R7,#20
Y11: MOV R6,#200
Y12: MOV R5,#200
Y13: NOP
NOP
NOP
NOP
DJNZ R5,Y13
DJNZ R6,Y12
DJNZ R7, Y11
RET
给加分吧 还有什么问题 都帮你解决
展开全部
这是一个动态数码管扫描的程序,,用串口控制自己写。只要让程序判断RXD是否等于
11111110B也就是十六进制0xfe。如果等于就让数码管段A打开。
#include<stc.h>
#define ur unsigned char
#define ut unsigned int
ur code shz[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00};
sbit d0=P1^0;
sbit d1=P1^1;
sbit d2=P1^2;
sbit d3=P1^3;
sbit d4=P1^4;
sbit d5=P1^5;
sbit d6=P1^6;
sbit d7=P1^7; //数码管的7个段选
ut y; //全局变量
void ys(ut); //延时声明
void smg(ut); //数码动态显示程序声明
void main()
{
TMOD=0x01; //中断工作方式
TH0=(65536-50000)/256; //给寄存器高8位设置初值
TL0=(65536-50000)%256; //给寄存器低8位设置初值
EA=1; //开总中断
ET0=1; //打开T0中断
TR0=1; //启动T0中断
while(1)
{
smg(y);
}
}
void smg(ut i)
{
ut a,t1,t2,t3,t4,t5; //定义了四个变量,这四个变量分别存放个位、十位、百位、千位的数值。
t1=i/10000; //T1存放万位
t2=i%10000/1000; //T2存放千位
t3=i%1000/100; //T3存放百位
t4=i%100/10; //T4存放十位
t5=i%10; //T5存放个位
P1=0; //关闭数码管所有的位选
P0=shz[t5]; //把万位送给P0
d0=1; //打开万的位选
ys(5000); //延时
d0=0; //关闭位选
if(y>=10) //判断只有定时变量Y,大于等于10时在执行十位的动态扫描 这样就可以关闭等待的数码管
{
P0=shz[t4]; //把千位送给P0
d1=1; //打开千的位选
ys(5000); //延时
d1=0; //关闭位选
}
if(y>=100) //判断只有定时变量Y,大于等于100时在执行百位的动态扫描
{
P0=shz[t3]; //如上
d2=1;
ys(5000);
d2=0;
}
if(y>=1000) //判断只有定时变量Y,大于等于1000时在执行千位的动态扫描
{
P0=shz[t2]; //如上
d3=1;
ys(5000);
d3=0;
}
if(y>=10000) //判断只有定时变量Y,大于等于10000时在执行万位的动态扫描
{
P0=shz[t1]; //如上
d4=1;
ys(5000);
d4=0;
}
}
/*-----延时程序-----*/
void ys(ut z)
{
ut x,y;
fou(x=z;x>0;x--)
fou(y=110;y>0;y--);
}
/*------中断程序------*/
void shzd() interrupt 1
{
ut x;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
x++;
if(x==20)
{
y++;
if(y<10000)y=0;
x=0;
}
}
11111110B也就是十六进制0xfe。如果等于就让数码管段A打开。
#include<stc.h>
#define ur unsigned char
#define ut unsigned int
ur code shz[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00};
sbit d0=P1^0;
sbit d1=P1^1;
sbit d2=P1^2;
sbit d3=P1^3;
sbit d4=P1^4;
sbit d5=P1^5;
sbit d6=P1^6;
sbit d7=P1^7; //数码管的7个段选
ut y; //全局变量
void ys(ut); //延时声明
void smg(ut); //数码动态显示程序声明
void main()
{
TMOD=0x01; //中断工作方式
TH0=(65536-50000)/256; //给寄存器高8位设置初值
TL0=(65536-50000)%256; //给寄存器低8位设置初值
EA=1; //开总中断
ET0=1; //打开T0中断
TR0=1; //启动T0中断
while(1)
{
smg(y);
}
}
void smg(ut i)
{
ut a,t1,t2,t3,t4,t5; //定义了四个变量,这四个变量分别存放个位、十位、百位、千位的数值。
t1=i/10000; //T1存放万位
t2=i%10000/1000; //T2存放千位
t3=i%1000/100; //T3存放百位
t4=i%100/10; //T4存放十位
t5=i%10; //T5存放个位
P1=0; //关闭数码管所有的位选
P0=shz[t5]; //把万位送给P0
d0=1; //打开万的位选
ys(5000); //延时
d0=0; //关闭位选
if(y>=10) //判断只有定时变量Y,大于等于10时在执行十位的动态扫描 这样就可以关闭等待的数码管
{
P0=shz[t4]; //把千位送给P0
d1=1; //打开千的位选
ys(5000); //延时
d1=0; //关闭位选
}
if(y>=100) //判断只有定时变量Y,大于等于100时在执行百位的动态扫描
{
P0=shz[t3]; //如上
d2=1;
ys(5000);
d2=0;
}
if(y>=1000) //判断只有定时变量Y,大于等于1000时在执行千位的动态扫描
{
P0=shz[t2]; //如上
d3=1;
ys(5000);
d3=0;
}
if(y>=10000) //判断只有定时变量Y,大于等于10000时在执行万位的动态扫描
{
P0=shz[t1]; //如上
d4=1;
ys(5000);
d4=0;
}
}
/*-----延时程序-----*/
void ys(ut z)
{
ut x,y;
fou(x=z;x>0;x--)
fou(y=110;y>0;y--);
}
/*------中断程序------*/
void shzd() interrupt 1
{
ut x;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
x++;
if(x==20)
{
y++;
if(y<10000)y=0;
x=0;
}
}
追问
谢谢,不是要C语言解决的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询