打印

大家看看这个程序有什么错误没?

[复制链接]
2690|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jhzh951753|  楼主 | 2011-9-15 13:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, ge, ck, ni, ST
#include <C8051F120.h>
#include <stdio.h>
#include <string.h>

unsigned char code string_change[]={0X43,0X44,0X20,0X77,0X6A,0X79,0X0D,0XFF};   
#define uint unsigned int
#define BAUDRATE 115200
#define SYSTEMCLOCK 24500000
uchar rbyte;
unsigned char flag_rece=0 ;
unsigned char flag_send=0 ;
void Device_Init();
void Delay_ms(uint time);
void PORT_Init();
void SCK_Init();
void UART_SendS(uchar code *p);
void UART_SendB(uchar rbyte);
void UART0_Init();

void main()
{
Device_Init();
Delay_ms(200);
UART_SendS(string_change);
// UART_ReceB();
Delay_ms(200);
UART_SendB(rbyte);

while(1);
}
void  Device_Init()
{
WDTCN = 0xDE;
WDTCN = 0xAD;
SCK_Init();
PORT_Init();
UART0_Init();

EA = 1;
SFRPAGE = UART0_PAGE ;
}
void SCK_Init()
{   
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
OSCICN = 0x83;
SFRPAGE = SFRPAGE_SAVE;
}
void PORT_Init()
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
XBR0 = 0x04;
XBR2 = 0x44;
P0MDOUT = 0x03;
SFRPAGE=SFRPAGE_SAVE;
}
void UART0_Init()
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
     SCON0   = 0x50;                     // SCON1: mode 0, 8-bit UART, enable RX
   SSTA0=0X10;       //禁止波特率二分频
SFRPAGE = TIMER01_PAGE;
    TMOD   &= ~0xF0;
   TMOD   |=  0x20;                    // TMOD: timer 1, mode 2, 8-bit reload
    if (SYSTEMCLOCK/BAUDRATE/16/256 < 1) {
      TH1 = -(SYSTEMCLOCK/BAUDRATE/16);
      CKCON |= 0x10;                   // T1M = 1; SCA1:0 = xx
    } else if (SYSTEMCLOCK/BAUDRATE/16/256 < 4) {
      TH1 = -(SYSTEMCLOCK/BAUDRATE/16/4);
      CKCON &= ~0x13;                  // Clear all T1 related bits
      CKCON |=  0x01;                  // T1M = 0; SCA1:0 = 01
    } else if (SYSTEMCLOCK/BAUDRATE/16/256 < 12) {
      TH1 = -(SYSTEMCLOCK/BAUDRATE/16/12);
      CKCON &= ~0x13;                  // T1M = 0; SCA1:0 = 00
    } else {
      TH1 = -(SYSTEMCLOCK/BAUDRATE/16/48);
      CKCON &= ~0x13;                  // Clear all T1 related bits
      CKCON |=  0x02;                  // T1M = 0; SCA1:0 = 10
    }
    TL1 = TH1;                          // init Timer1
    TR1 = 1;                            // START Timer1
ES0=1;
}

void UART0_Interrupt(void)
{
  if (RI0 == 1)
    {
  RI0 = 0;                           //清接收标志位
     rbyte = SBUF0;                      // Read a character from UART
  flag_rece=1;
    }
    if (TI0 == 1)                         // Check if transmit flag is set
    {
  TI0=0;
  flag_send=1;
    }
}
void Delay_ms(uint time)
{
uint i, j;
for(i=1;i<=time;i++)
  for(j=1;j<=300;j++);
}
void UART_SendS(uchar code *p)
{
while(*p != 0xFF)
{
  UART_SendB(*p);
  p++;
}
}
void UART_SendB(uchar rbyte)
{
   TI0 = 0;
   SBUF0 = 0x12;
   while(!TI0);
   TI0 = 0  ;
}

在debug的时候运行到UART_SendB()的时候就运行不下去了。

相关帖子

沙发
ayb_ice| | 2011-9-15 14:21 | 只看该作者
发送又用中断方式,又用查询方式,能行的话一定是"奇迹 "

使用特权

评论回复
板凳
jhzh951753|  楼主 | 2011-9-15 14:33 | 只看该作者
2# ayb_ice 您好!能不能说的具体点啊!!我是新手 很多的不明白,,,什么是查询方式啊。。

使用特权

评论回复
地板
ayb_ice| | 2011-9-15 14:58 | 只看该作者
本帖最后由 ayb_ice 于 2011-9-15 15:01 编辑
2# ayb_ice  您好!能不能说的具体点啊!!我是新手 很多的不明白,,,什么是查询方式啊。。
jhzh951753 发表于 2011-9-15 14:33


void UART_SendB(uchar rbyte)
{
   TI0 = 0;
   SBUF0 = 0x12;
   while(!TI0);
   TI0 = 0  ;
}
以上就是查询方式
你已经在中断中将TI0清零了,这里"while(!TI0);"当然死机了

使用特权

评论回复
5
jhzh951753|  楼主 | 2011-9-15 15:12 | 只看该作者
4# ayb_ice 那我中断部分怎么处理呢??直接注释掉么?void UART0_Interrupt(void)
{
  if (RI0 == 1)
    {
  RI0 = 0;                           //清接收标志位
     rbyte = SBUF0;                      // Read a character from UART
  flag_rece=1;
    }
    if (TI0 == 1)                         // Check if transmit flag is set
    {
  TI0=0;
  flag_send=1;
    }
}

使用特权

评论回复
6
jhzh951753|  楼主 | 2011-9-15 15:14 | 只看该作者
是不是可以改成这样呢
void UART0_Interrupt(void)
{
        if (RI0)
           {
                RI0 = 0;                           //清接收标志位
            rbyte = SBUF0;                      // Read a character from UART
                flag_rece=1;       
           }

           if (TI0 )                         // Check if transmit flag is set
           {
                TI0=0;
                flag_send=1;
           }
}

使用特权

评论回复
7
joyme| | 2011-9-15 16:21 | 只看该作者
if (TI0 )                         // Check if transmit flag is set
           {
                TI0=0;
                flag_send=1;
           }

要么去掉中断里的这段代码,用查询模式,要保留这里的代码就再SendB里TI0改为你自己的标志flag_send,否则这个while就是个死循环,因为你在中断里已经清除了TI0

使用特权

评论回复
8
ayb_ice| | 2011-9-15 16:44 | 只看该作者
本帖最后由 ayb_ice 于 2011-9-15 16:49 编辑

要么发送之前关闭串口中断,
要么通过中断传递信息,如下
void UART_SendB(uchar rbyte)
{
   TI0 = 0;
   SBUF0 = 0x12;
   while(!flag_send);
   flag_send = 0;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:<table><tr><td>我在这里呢!!~ </td></tr></table>

1

主题

127

帖子

1

粉丝