协会的几个人画了51学习板,这两天正在焊板子,让我写一些示例程序,感觉一拖再拖,都已经拖了很久了,所以就在这几天学习arm有点困乏的时候回过神来写写51了.一般写例程都不例外从最简单的IO口操作(比如说流水灯)开始,所以写了流水灯.但是问题来了,画板子的童孩可能没考虑到布线的问题,板子上可能存在漏电的情况,在我单独测试某位led时发现其他led都有或多或少的发光.由于硬件平台存在很多问题,所以我就没有心思继续下去了,但是能够下进程序,说明串口部分是没有问题的,所以就先写写串口通信程序吧,很久没弄51了,固然还是存在问题的,开始写了个程序,一切都OK,单片机成功将我发送的字符返回来了,但是后来就纠结了,我打算用上那块带有串口的12864液晶写些东西,可是无论如何都没有办法发送命令,这个让我有些纠结,在此先把自己的源码和截图发上来,供日后思考,如果有了解情况,希望高手与之共勉!
/******************************************
name:UART收发
function:通过串口将PC机从串口调试工具中发送的数据原样返回
date:2012/3/23
version:1.0
edit by:RXJ
*******************************************/
#include
#define uint unsigned int
#define uchar unsigned char
uint tmp_data; //全局变量
void sendback(uint rec_data); //返还函数
/**************串口初始化函数***********/
void ser_cfg()
{
TMOD |=0x20; //用于产生波特率
TH1=0xfd; //定时器初值,9600--->fdH
TL1=0xfd;
TR1=1;
SCON=0x50; //串口工作方式1,8bit数据,波特率可变,定时器1产生溢出
ES=1; //使能串口中断
EA=1; //开总中断
}
/*****************************************/
/*****************主函数*****************/
void main()
{
ser_cfg(); //初始化串口寄存器
while(1);
}
/*****************************************/
/****************串口中断函数**********/
void ser_intr() interrupt 4
{
if(TI)
{
TI=0; //清发送中断标志
}
if(RI)
{
RI=0; //清接收中断标志
tmp_data=SBUF; //读取串口缓冲寄存器中接收到的数据
sendback(tmp_data);
}
}
/*****************************************/
/****************返还函数****************/
void sendback(uint rec_data)
{
while(TI);
SBUF=rec_data;
}
/*****************************************/
以上是PC与串口通信的源码,测试无误
后面的通过串口12864画图就出现问题了,源码如下:
#include
#define uint unsigned int
#define uchar unsigned char
void sendcmd(uchar cmd);
void drawcircle(uchar x,uchar y,uchar banjin);
void delay(uint x)
{
int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/**************串口初始化函数***********/
void ser_cfg()
{
TMOD |=0x20; //用于产生波特率
TH1=0xfd; //定时器初值,9600--->fdH
TL1=0xfd;
TR1=1;
SCON=0x50; //串口工作方式1,8bit数据,波特率可变,定时器1产生溢出
ES=1; //使能串口中断
EA=1; //开总中断
}
/*****************************************/
/*****************主函数*****************/
void main()
{
ser_cfg(); //初始化串口寄存器
while(1)
{
drawcircle(0x40,0x20,0x20);
}
}
/*****************************************/
/****************串口中断函数**********/
void ser_intr() interrupt 4
{
if(TI)
{
TI=0; //清发送中断标志
}
}
void drawcircle(uchar x,uchar y,uchar banjin)
{
sendcmd(0x42); //画圆的指令
sendcmd(x); //圆心横坐标
sendcmd(y); //圆心纵坐标
sendcmd(banjin); //圆心半径
sendcmd(0x01); //01H为画圆
}
void sendcmd(uchar cmd)
{
SBUF=cmd;
}
由于这款12864自带了串口收发器,所以只需通过51的串口向其发送命令和数据就行了,但是无论如何总是不行,所以还得仔细研究研究,自己的51毕竟学的不是很扎实.这段代码虽说编译通过,但是在链接过程当中出现了如下警告,不是很明了.
Build target 'Target 1'
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_DELAY?FLASH_LAMP
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: _SENDCMD
MODULE: flash lamp.obj (FLASH_LAMP)
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: _SENDCMD
MODULE: flash lamp.obj (FLASH_LAMP)
ADDRESS: 0829H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: _SENDCMD
MODULE: flash lamp.obj (FLASH_LAMP)
ADDRESS: 082EH
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: _SENDCMD
MODULE: flash lamp.obj (FLASH_LAMP)
ADDRESS: 0833H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: _SENDCMD
MODULE: flash lamp.obj (FLASH_LAMP)
ADDRESS: 0838H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: _SENDCMD
MODULE: flash lamp.obj (FLASH_LAMP)
ADDRESS: 083DH
Program Size: data=12.0 xdata=0 code=120
creating hex file from "flash lamp"...
"flash lamp" - 0 Error(s), 7 Warning(s).
希望高手能多给予指点!
前天小小改动了一下,发现用串口与12864液晶通信时,不能进入串口中断函数清除中断标志,这个有点奇怪,如果改成下面这样就不会出现问题,可以成功地操作液晶.
void sendcmd(uchar cmd)
{
SBUF=cmd;
while(TI==0);//等待字符发送完
TI=0; //直接清除中断标志,而不是进入中断函数清除
}
阅读(396) | 评论(2) | 转发(0) |