标题:
求教STC12C2052AD单片机芯片程序的问题
[打印本页]
作者:
Host
时间:
2019-7-23 12:40
标题:
求教STC12C2052AD单片机芯片程序的问题
描述一下想要实现的功能:按下K1键,串口发送字符串,通过另一片芯片接收并显示在1602上。
问题:按K1键不会发送,反而按复位键才会发送。1602也不会实时显示,只有在接收时按复位键才会显示,我觉得是串口设置的问题,但是我看了看51的配置,我觉得没有毛病呀,是这块芯片不一样吗?所以来问问,程序如下:
#include "F:\C51\C51\INC\STC\STC12C2052AD.h"
#define uint unsigned int
#define uchar unsigned char
//#define jz 11059200 /*使用11.0592M晶体*/
//#define bt 9600 /*波特率定义为9600*/
sbit K1=P3^7;
sbit rs=P3^3;
sbit rw=P3^4;
sbit en=P3^5;
uchar Redata[64];
uchar i=0;
uchar Temp;
/***************延时***************/
void delay(uint n)
{
uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
/***************写命令***************/
void lcd_wcom(uchar com)
{
rs=0;
rw=0;
P1=com;
delay(5);
en=1;
en=0;
}
/***************写数据***************/
void lcd_wdat(uchar dat)
{
rs=1;
rw=0;
P1=dat;
delay(5);
en=1;
en=0;
}
/***************LCD初始化***************/
void lcd_init()
{
lcd_wcom(0x38);
lcd_wcom(0x0c);
lcd_wcom(0x06);
lcd_wcom(0x01);
}
/***************设置显示位置**************************/
void lcd_wz( uchar x, uchar y )
{
uchar address;
if (y == 1)
address = 0x80 + x;
else
address =0xc0+ x;
lcd_wcom(address);
}
/***************显示字符串函数***************/
void lcd_distr(uchar x,uchar y,uchar *pData)
{
lcd_wz( x, y );
while (*pData != '\0')
{
lcd_wdat(*pData);
pData++;
}
}
/***************串口初始化***************/
void uart_init(void)
{
TMOD = 0x20; /*step 2: 根据串口通信方式 确定是否设置波特率*/
SCON = 0x40;
PCON = 0x00;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1; /*step 3 :启动*/
EA = 1; /*step 4: 是否启用中断函数*/
ES = 1;
}
/***************发送字节***************/
void send(uchar Sedate) //发送一个字节的数据,即为待发送数据。
{
SBUF=Sedate; //将数据写入到串口缓冲
while(!TI);
TI = 0; //等待发送完毕
}
/***************发送字符串***************/
void sendzfc(uchar *pdate)
{
while((*pdate)!='\0') //发送字符串,直到遇到0才结束
{
send(*pdate); //发送一个字符
pdate++; //移动到下一个字符
}
}
/***************接收字节***************/
uchar receive(void)
{
uchar redate;
while(!RI);
RI = 0;
redate=SBUF;
return redate;
}
/***************接收字符串***************/
uchar recezfc(void)
{
uchar *qdate;
while((*qdate)!='\0') //发送字符串,直到遇到0才结束
{
receive(); //发送一个字符
qdate++; //移动到下一个字符
}
return *qdate;
}
/***************主函数***************/
void main()
{
uart_init();
while(1)
{
lcd_init();
if(K1==0){
delay(200);
if(K1==0)
{
sendzfc("OK") ;
}
}
//Redata[i]=recezfc() ;
if(Redata[0]==0x4F && Redata[1]==0x4B)
{
lcd_distr(0,1," ESD Test ");
lcd_distr(6,2,"OK");
delay(200);
}
}
}
/***************中断函数***************/
void uart_rx() interrupt 4
{
if(RI) //判断是接收中断产生
{
Temp = SBUF;
Redata[i] = Temp;
i++;
RI=0;
}
if(TI)
TI = 0;
}
复制代码
希望大家提供宝贵的意见,十分感谢!
作者:
Host
时间:
2019-7-23 13:09
把SCON 改为 0x50 也于事无补,头大,按键无论放在哪都无法识别
作者:
Host
时间:
2019-7-23 13:11
复位时SCON会全部置为0,这和问题有联系吗?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1