在STC单片机里写了个串口发送程序,运行正确,可把这程序烧到89C2051里面就不好使!下面试我的程序

2025-03-01 00:22:05
推荐回答(5个)
回答1:

用C语言实现的,就是方法笨点
#include
#include
unsigned char code ch[2][80]={{0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09,0x01,0x03,0x05,0x07,0x09},
{0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08,0x02,0x04,0x06,0x08}};
void init_serialcom( void ) //串口通信初始设置
{
SCON = 0x98 ; //UART为模式2,8位数据,允许接收
TMOD = 0x10 ; //定时器1为模式1
PCON = 0x80; //SMOD=1;波特率为320.4K
TH1 = 0xE8 ; //装载高位
TL1 = 0x00 ; //装载地位
IE = 0x98 ; //开总中断,串口中断,定时器中断
TR1 = 1 ; // 启动定时器1
}

//向串口发送一个字符
void send_char_com( unsigned char ch)

{
ACC=ch; //将数赋值给寄存器A,计算偶校位P的值
TB8=P; //将P的值赋值给TB8,进行偶校验
SBUF=ch; //校验完后将数赋值到串口寄存器SBUF中
while(TI==0); //等待赋值完毕,发送数据到串口
TI=0; //赋值完毕后将发数标志位清零

}

//定时器中断函数
void time1() interrupt 3
{
int b;
TH1 = 0xE8 ; //装载高位
TL1 = 0x00 ; //装载地位
send_char_com(ch[0][0]);
send_char_com(ch[0][1]);
send_char_com(ch[0][2]);
send_char_com(ch[0][3]);
send_char_com(ch[0][4]);
send_char_com(ch[0][5]);
send_char_com(ch[0][6]);
send_char_com(ch[0][7]);
send_char_com(ch[0][8]);
send_char_com(ch[0][9]);
send_char_com(ch[0][10]);
send_char_com(ch[0][11]);
send_char_com(ch[0][12]);
send_char_com(ch[0][13]);
send_char_com(ch[0][14]);
send_char_com(ch[0][15]);
send_char_com(ch[0][16]);
send_char_com(ch[0][17]);
send_char_com(ch[0][18]);
send_char_com(ch[0][19]);
send_char_com(ch[0][20]);
send_char_com(ch[0][21]);
send_char_com(ch[0][22]);
send_char_com(ch[0][23]);
send_char_com(ch[0][24]);
send_char_com(ch[0][25]);
send_char_com(ch[0][26]);
send_char_com(ch[0][27]);
send_char_com(ch[0][28]);
send_char_com(ch[0][29]);
send_char_com(ch[0][30]);
send_char_com(ch[0][31]);
send_char_com(ch[0][32]);
send_char_com(ch[0][33]);
send_char_com(ch[0][34]);
send_char_com(ch[0][35]);
send_char_com(ch[0][36]);
send_char_com(ch[0][37]);
send_char_com(ch[0][38]);
send_char_com(ch[0][39]);
send_char_com(ch[0][40]);
send_char_com(ch[0][41]);
send_char_com(ch[0][42]);
send_char_com(ch[0][43]);
send_char_com(ch[0][44]);
send_char_com(ch[0][45]);
send_char_com(ch[0][46]);
send_char_com(ch[0][47]);
send_char_com(ch[0][48]);
send_char_com(ch[0][49]);
send_char_com(ch[0][50]);
send_char_com(ch[0][51]);
send_char_com(ch[0][52]);
send_char_com(ch[0][53]);
send_char_com(ch[0][54]);
send_char_com(ch[0][55]);
send_char_com(ch[0][56]);
send_char_com(ch[0][57]);
send_char_com(ch[0][58]);
send_char_com(ch[0][59]);
send_char_com(ch[0][60]);
send_char_com(ch[0][61]);
send_char_com(ch[0][62]);
send_char_com(ch[0][63]);
send_char_com(ch[0][64]);
send_char_com(ch[0][65]);
send_char_com(ch[0][66]);
send_char_com(ch[0][67]);
send_char_com(ch[0][68]);
send_char_com(ch[0][69]);
send_char_com(ch[0][70]);
send_char_com(ch[0][71]);
send_char_com(ch[0][72]);
send_char_com(ch[0][73]);
send_char_com(ch[0][74]);
send_char_com(ch[0][75]);
send_char_com(ch[0][76]);
send_char_com(ch[0][77]);
send_char_com(ch[0][78]);
send_char_com(ch[0][79]);
for(b=0;b<310;b++);
send_char_com(ch[1][0]);
send_char_com(ch[1][1]);
send_char_com(ch[1][2]);
send_char_com(ch[1][3]);
send_char_com(ch[1][4]);
send_char_com(ch[1][5]);
send_char_com(ch[1][6]);
send_char_com(ch[1][7]);
send_char_com(ch[1][8]);
send_char_com(ch[1][9]);
send_char_com(ch[1][10]);
send_char_com(ch[1][11]);
send_char_com(ch[1][12]);
send_char_com(ch[1][13]);
send_char_com(ch[1][14]);
send_char_com(ch[1][15]);
send_char_com(ch[1][16]);
send_char_com(ch[1][17]);
send_char_com(ch[1][18]);
send_char_com(ch[1][19]);
send_char_com(ch[1][20]);
send_char_com(ch[1][21]);
send_char_com(ch[1][22]);
send_char_com(ch[1][23]);
send_char_com(ch[1][24]);
send_char_com(ch[1][25]);
send_char_com(ch[1][26]);
send_char_com(ch[1][27]);
send_char_com(ch[1][28]);
send_char_com(ch[1][29]);
send_char_com(ch[1][30]);
send_char_com(ch[1][31]);
send_char_com(ch[1][32]);
send_char_com(ch[1][33]);
send_char_com(ch[1][34]);
send_char_com(ch[1][35]);
send_char_com(ch[1][36]);
send_char_com(ch[1][37]);
send_char_com(ch[1][38]);
send_char_com(ch[1][39]);
send_char_com(ch[1][40]);
send_char_com(ch[1][41]);
send_char_com(ch[1][42]);
send_char_com(ch[1][43]);
send_char_com(ch[1][44]);
send_char_com(ch[1][45]);
send_char_com(ch[1][46]);
send_char_com(ch[1][47]);
send_char_com(ch[1][48]);
send_char_com(ch[1][49]);
send_char_com(ch[1][50]);
send_char_com(ch[1][51]);
send_char_com(ch[1][52]);
send_char_com(ch[1][53]);
send_char_com(ch[1][54]);
send_char_com(ch[1][55]);
send_char_com(ch[1][56]);
send_char_com(ch[1][57]);
send_char_com(ch[1][58]);
send_char_com(ch[1][59]);
send_char_com(ch[1][60]);
send_char_com(ch[1][61]);
send_char_com(ch[1][62]);
send_char_com(ch[1][63]);
send_char_com(ch[1][64]);
send_char_com(ch[1][65]);
send_char_com(ch[1][66]);
send_char_com(ch[1][67]);
send_char_com(ch[1][68]);
send_char_com(ch[1][69]);
send_char_com(ch[1][70]);
send_char_com(ch[1][71]);
send_char_com(ch[1][72]);
send_char_com(ch[1][73]);
send_char_com(ch[1][74]);
send_char_com(ch[1][75]);
send_char_com(ch[1][76]);
send_char_com(ch[1][77]);
send_char_com(ch[1][78]);
send_char_com(ch[1][79]);
}

main()

{

init_serialcom(); //初始化串口

while (1) ;

}

回答2:

1 在晶振频率为 7.3728M
2 89C2051 定时器 只有12T 时钟频率波特率 不可能达到 115.2K,只能达到 57.6k
3 STC单片机 定时器 有12T 和 1T 时钟频率 用 1T 时钟频率 波特率就可以达到115.2K,
甚至可以更高 。
如果 以 1T 变成 12T 那么 波特率 115.2K 可能变成 9600

回答3:

楼上几位说得基本正确,肯定是波特率不对
1. 查一下DataSheet,STC时钟比普通时钟快12倍,重点查一下时钟源分频的内容。
2.检查串口初始化程序,看是否STC和89C2051串口寄存器资源有何不同。

学习单片机,电子知识,请到“电子设计网dzsj”

回答4:

2051片内RAM空间,仅仅有128字节,但是楼主的数组就用了160字节。
定义为CODE类型才行。

回答5:

晶振一样的情况下,stc的定时周期和普通51的定时周期不一定是一样的,而串口需要波特率匹配,而波特率又和定时器相关,所以。你看下串口给出的信号实测波特率对不对