Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45081
  • 博文数量: 13
  • 博客积分: 260
  • 博客等级: 二等列兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-29 21:19
文章分类
文章存档

2012年(13)

我的朋友

分类: 嵌入式

2012-03-24 21:28:43

     协会的几个人画了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) |
0

上一篇:关于JTAG的烧写

下一篇:我的Tiny6410开发板

给主人留下些什么吧!~~

我是个贫民2012-12-10 21:00:55

很好 呵呵

xiaojian12272012-04-02 10:17:32

昨天给改了一下,知道前几天为什么不能执行指令了,因为在串口配置时,可能还没等单片机和12864液晶的串口配置完成就开始发送命令了,这样是不能发送的,小小改动了一下串口配置函数

void init()
{
        TMOD=0x20;                //设置定时器1为工作方式2
        TH1=0xfd;            //装入初值
        TL1=0xfd;
        TR1=1;                    &