3878|4

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

单片机串行通信用共阴极LED怎么就不行? [复制链接]

现做两单片机之间的串行通信仿真实验,当我用共阴极LED时,其显示发生错误,但是当我换成共阳极LED时,其显示正确。用共阴极或共阳极时,其显示段码也换成相应的显示段码。段码应该没有错,因为我用它做LED静态或动态显示时是正确的。
代码如下:
发送程序:
#include
#include
#define uchar unsigned char;
//uchar code collect[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};  //共阴极显示段码
uchar code collect[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};   //共阳极显示段码
uchar pf;
void delay();
void initial();
void sendd();
void main()
{
        initial();
        while(1)
        {
        sendd();
        }
}

//延时子程序
void delay()
{
        long k;
        for(k=0;k<10000;k++)
        {
        }
}

//串行口初始化
void initial()
{
        TMOD=0x20;          //定时器工作于方式2
        TH1=0xE8;
        TL1=0xE8;
        TR1=1;                  //启动T1
        PCON=0x00;
        SCON=0x50;                //串行口工作在方式1,允许串行接收       
}  

//发送数据
void sendd()
{
        int i;
        do                                 //建立串行通信之间连接
        {
                SBUF=0xaa;          //发送联络信号
                while(TI==0);  //等待发送数据
                TI=0;
                while(RI==0);  //等待对方应答
                RI=0;
        }while((SBUF^0xbb)!=0);

        do
        {
                pf=0;                          //校验和初始化
                for(i=0;i<16;i++)  //连续发送一数组
                {
                        SBUF=collect;
                        P0=collect;        //显示需要发送的数据
                        pf=pf+collect; //求校验和
                        while(TI==0);
                        TI=0;
                        delay();
                }
                SBUF=pf;
                while(TI==0);  //发送校验信息
                TI=0;
                while(RI==0);  //接收反馈信息
                RI=0;         
        }while(SBUF!=0x00);
}

接收程序:
#include
#include
#define uchar unsigned char;
uchar pf;
void initial()
{
        TMOD=0x20;          //定时器工作于方式2
        TH1=0xE8;
        TL1=0xE8;
        TR1=1;                  //启动T1
        PCON=0x00;
        SCON=0x50;                //串行口工作在方式1,允许串行接收       
}  

void main()
{
        int i;
        initial();
        do
        {
                while(RI==0);        //接收字符
                RI=0;
        }while((SBUF^0xaa)!=0);          
        SBUF=0xbb;
        while(TI==0);   //发送确认字符
        TI=0;
        while(1)           //循环接收
        {
                pf=0;
                for(i=0;i<16;i++) //连续接收10个字符
                {
                        while(RI==0);
                        RI=0;
                        P0=SBUF;   //显示接收到的字符
                        pf=pf+SBUF;  //求校验和
                }
                while(RI==0);   //接收校验和
                RI=0;
                if((SBUF^pf)==0)
                {
                        SBUF=0x00;                //校验正确发送“0x00”
                        while(TI==0);
                        TI=0;
                }
                else
                {
                        SBUF=0xff;
                        while(TI==0);
                        TI=0;
                }
        }
}

原理图如下:

最新回复

这就看你共阴极和共阳极的电路了,是不是共阴的电路接错了,理论上,假如你直接用IO来驱动共阴的数码管,是驱动不了的,但是应该也能看见微微的亮线,当然你要是外加三极管来驱动的话,当然是完全足够的。假如一点亮都没有,那么,应该是电路接错了,或者代码搞错了。  详情 回复 发表于 2010-4-27 08:40
点赞 关注

回复
举报

57

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
共阳极是灌电流
共阴极是拉电流
51的IO驱动能力不足
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
学习,UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
你这是c还是c++  怎么不干净
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
这就看你共阴极和共阳极的电路了,是不是共阴的电路接错了,理论上,假如你直接用IO来驱动共阴的数码管,是驱动不了的,但是应该也能看见微微的亮线,当然你要是外加三极管来驱动的话,当然是完全足够的。假如一点亮都没有,那么,应该是电路接错了,或者代码搞错了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表