|
串口助手发送数据通过单片机控制l ed屏显示?
[复制链接]
目的是 用vb通过单片机控制led屏。现在先用串口助手试下。我想用串口助手先发一个数过去,点亮led屏的一个小灯,在依次累加。led屏是用74hc595串起来的。其间也想把单片机接收的数据回显到串口助手来证明接受无误。以前直接烧程序控制屏时点亮第一个小灯是发送0x01,但是现在用串口助手发送一个1,毫无反应阿,为什么呢?
//-----------------------函数声明,变量定义--------------------------------
#include
#define COUNT 30 // 定义接收缓冲区大小
#define uchar unsigned char
#define uint unsigned int
#define TIMER0_HIGH 0xF3
#define TIMER0_LOW 0x67 //每3.5ms中断一次,计数n=9677
//注:TIMER0_HIGH=0xDA
// TIMER0_LOW =0x33
#define T1_HIGH 0xF5
#define T1_LOW 0x33 //每1ms中断一次,计数n=2765
#define T2_HIGH 0xEA
#define T2_LOW 0x66 //每2ms中断一次,计数n=5530
#define T5_HIGH 0xCA
#define T5_LOW 0x00 //..5ms....... 计数n=13824
#define T10_HIGH 0x94
#define T10_LOW 0x00 //..10ms...... 计数n=27648
#define T20_HIGH 0x28
#define T20_LOW 0x01 //..20ms...... 计数n=55295
//-----------站点相关参数定义-------------------------
#define StbDot (*((uchar volatile xdata*)0x4400)) //输出点的车位泊位位图的锁存命令
//----------定义SFR寄存器变量-------------------------
sfr SPCR =0xD5;
sfr SPDAT =0x86;
sfr SPSR =0xaa;
sbit SPIF =ACC^7;
//----------工作信号控制灯定义--------------------------
sbit Led =P3^4;
//----------被调用函数声明----------------------------
void UART_Init(); //串口初始化函数
void COM_Send(void); //串口接收函数
void Delay(uint time);
uchar xdata Buffer[COUNT]; //定义接收缓冲区
uchar xdata DispBuffer[COUNT]; //定义给spi口发送数据的数组
uchar xdata SaveBuffer[COUNT]; //定义储存接受的数据的数组
uint xdata point=0; //定义接收数据个数指示变量
uint T0_Count =0; //用来计算等待时间
uchar code *pcData; //指向程序存储器的指针,用于调取显示数据
void In_Order_Send(unsigned char *pcData) ;
//-------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为33.177时,设定串口波特率为9600bit/s
// 串口接收中断允许,发送中断禁止
//初始化串行口和波特率发生器
//-------------------------------------------------------------------------
void UART_init()
{
SCON =0x50; //选择串口工作方式,打开接收允许
TMOD =0x21; //定时器1工作在方式2串口通信,定时器0工作在方式1用来计时
TH1 =0xf7; //实现波特率9600(系统时钟33.1776MHZ)
TR1 =1; //启动定时器T1
TL0=T10_LOW;
TH0=T10_HIGH;
TR0=1;
ET1 =1;
ET0 =1;
ES=1; //允许串行口中断
//PS=1; //设计串行口中断优先级
EA =1; //单片机中断允许
pcData=&SaveBuffer;
SPCR =0x5C; //由于是由SPI串口烧入,所以必须有这个选项
}
//-------------------------------------------------------------------------
// 函数名称: T0_int中断函数
// 函数功能: 检验单片机是否工作
//-------------------------------------------------------------------------
void T0_int(void) interrupt 1 using 2
{
TL0=T10_LOW;
TH0=T10_HIGH; //定时器初值重置,实现循环工作
T0_Count++; //定时器计数
if((T0_Count%100)==0)
{
Led=!Led;
}
if((T0_Count%10)==0)
{
pcData=&DispBuffer[0];
In_Order_Send(pcData);
}
if(T0_Count>=500)T0_Count=0;
}
//-------------------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收数据到数据缓冲区
//-------------------------------------------------------------------------
Com_Interrupt(void) interrupt 4 using 3
{ uchar p=0;
if(!RI)return;
Buffer[point]=SBUF;
RI=0;
SaveBuffer[p]=Buffer[point];
//p++;
// if(p==30)p=0;
SBUF=Buffer[point];
while(!TI);
TI=0;
// point++;
// if(point==COUNT)point=0;
}
//-------------------------------------------------------------------------
// 函数名称: In_Order_Send()
// 函数功能: 发送数据到屏
//-------------------------------------------------------------------------
void In_Order_Send(uchar *pcData)
{
uchar i;
for(i=0;i<28;i++) //Put the output data in order
{
DispBuffer[27-i]=*(pcData+i);
}
for(i=0;i<28;i++) //Send the data
{
SPDAT=0xff-DispBuffer;
do{
ACC=SPSR;
}while(SPIF==0);
}
StbDot=0;
Delay(150);
}
//-------------------------------------------------------------------------
// 函数名称: COM_send()串口发送函数
// 函数功能: 把数据缓冲区的数据发送出去
//-------------------------------------------------------------------------
/*void COM_Send(void)
{
SBUF=Buffer[point-1];
while(!TI);
TI=0;
}
*/
//-------------------------------------------------------------------------
// 函数名称: 主函数
// 函数功能: 调度各子函数,完成通信过程
//-------------------------------------------------------------------------
void main(void)
{
UART_init(); //初始化串口
do
{
}while(1);
}
//-------------------------------------------------------------------------
void Delay(uint time)
{uint i,j;
for(i=0;i
for(j=0;j
}
|
|