找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2299|回复: 7
打印 上一主题 下一主题
收起左侧

这个程序到底哪里出错了QAQ

[复制链接]
跳转到指定楼层
楼主
ID:191466 发表于 2017-4-22 00:42 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
32黑币
目的是按左边单片机上的按钮来控制右边的灯泡亮,左边的单片机的程序是这样的:
#include<reg51.h>
#include<intrins.h>
unsigned char a;
void main()
{
a=0xfe;
EA=1;
ES=1;
EX0=1;
IT0=1;
TMOD=0x02;
TH0=0xfd;
TL0=0xfd;
TR0=1;
SCON=0x50;
while(1);
}

void int0() interrupt 0
{
SBUF=a;
a=_crol_(a,1);
}
右边的单片机的程序是这样的:
#include<reg51.h>
void main()
{
EA=1;
ES=1;
SCON=0x50;
TMOD=0x02;
TH0=0xfd;
TL0=0xfd;
TR0=1;
while(1);


}void rec() interrupt 4
{
RI=0;
P1=SBUF;
}
TXD接的RXD,但是运行后按按钮灯还是不亮,我是萌新QAQ求大神指点~

IMG_2320.JPG (90.21 KB, 下载次数: 119)

IMG_2320.JPG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:151348 发表于 2017-4-22 08:57 | 只看该作者
昨天看到了类似的问题,你仿真图里的单片机晶振频率设置的是多少,12MHz?
回复

使用道具 举报

板凳
ID:162136 发表于 2017-4-22 09:43 | 只看该作者
TR0=1;改为TR1=1;试试,c51用TR1的溢出率,不是TR0
回复

使用道具 举报

地板
ID:162136 发表于 2017-4-22 09:44 | 只看该作者
把程序的TR0=1;改为TR1=1;试试
回复

使用道具 举报

5#
ID:47286 发表于 2017-4-22 13:44 | 只看该作者
左边的单片机的程序是这样的:

#include<reg51.h>

#define uchar unsigned char

sbit key=P1^0;                //定义按键所在端口

uchar a;                        //定义变量a 存放要发送的数据

void Init_UART()        //串口初始化 12T/定时器1作波特率发生器
{
        PCON |= 0x80;                        //使能波特率倍速位SMOD
        SCON = 0x50;                        //8位数据,可变波特率
        AUXR &= 0xBF;                        //定时器1时钟为Fosc/12,即12T
        AUXR &= 0xFE;                        //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                        //清除定时器1模式位
        TMOD |= 0x20;                        //设定定时器1为8位自动重装方式
        TL1=TH1=xxxx;                        //设定定时初值 (你自己定义波特率)
        ET1 = 0;                                //禁止定时器1中断
        TR1 = 1;                                //启动定时器1
        ES=1;                                        //开串口中断
}

void delay()                                        //延时程序 自己写 20ms够了
{
        //...............
}

void main()
{
        Init_UART();        //初始化UART

        a=0xfe;                        //赋值 要发送的数据
       
        while(1)                        //主循环
        {
                if(key==0)                        //如果 按键按下
                {
                        delay();                        //防抖
                        if(key==0)                        //如果按键依旧按下
                        {
                                while(!TI);                        //等到按键释放才动作
                                SBUF=a;                                //给串口缓冲区传送数据
                                while(!TI);                        //等待发送标记
                        }
                }
        }
}

右边的单片机的程序是这样的:

#include<reg51.h>
#include<intrins.h>

#define uchar unsigned char

uchar b=0;                        //定义变量b 存放收到的数据
bit flag_uart=0;        //定义标记 是否接收到数据

void Init_UART()        //串口初始化 12T/定时器1作波特率发生器
{
        PCON |= 0x80;                        //使能波特率倍速位SMOD
        SCON = 0x50;                        //8位数据,可变波特率
        AUXR &= 0xBF;                        //定时器1时钟为Fosc/12,即12T
        AUXR &= 0xFE;                        //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                        //清除定时器1模式位
        TMOD |= 0x20;                        //设定定时器1为8位自动重装方式
        TL1=TH1=xxxx;                        //设定定时初值 (你自己定义波特率 和发送的一样)
        ET1 = 0;                                //禁止定时器1中断
        TR1 = 1;                                //启动定时器1
        ES=1;                                        //开串口中断
}

void Server_UART() interrupt 4        //中断4 服务
{
        TI=0;                                                                //发送标志位 TI置0       
       
        if(RI==1)                                                        //如果接收位1 有数据接收
        {
                RI=0;                                                                //清除接收标志 硬件可以接收数据
                b=SBUF;                                                                //从接收缓冲区SBUF读取数据到数据缓冲区RX
                flag_uart=1;                                                //接收标记置1 收到数据
        }
}

void main()
{
        P1=0x00;                        //显示端口清零
       
        Init_UART();                //串口初始化
       
        while(1)                        //主循环
        {
                if(flag_uart==1)        //如果 接收标记为1 收到数据
                {
                        flag_uart=0;                //接收标记清零 可以再次接收
                        P1=b;                                //赋值 P1端口值为收到的数据
                }
        }
}
回复

使用道具 举报

6#
ID:191466 发表于 2017-4-22 16:46 来自手机 | 只看该作者
bayga456 发表于 2017-4-22 09:43
TR0=1;改为TR1=1;试试,c51用TR1的溢出率,不是TR0

谢谢,就是TR0的问题!
回复

使用道具 举报

7#
ID:122949 发表于 2017-4-22 18:04 | 只看该作者
内部定时器的设置问题
回复

使用道具 举报

8#
ID:192443 发表于 2017-4-22 19:14 | 只看该作者
同求帮助
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表