论坛风格切换切换到宽版
  • 4757阅读
  • 12回复

嗨我回来啦了。继续开发89s51的aprs系统 [复制链接]

上一主题 下一主题
离线BG8WJ
 
发帖
166
只看楼主 倒序阅读 0楼 发表于: 2009-03-17
前段时间忙于结婚,89s51的aprs系统项目搁置一段时间,最近继续搞。特开贴征集程序写手,继续完善。gps部分、lcd部分、硬件模块底层、uart通讯部分的底层驱动已经完成并于10分钟前打包。现在上传部分测试谍照。
本项目现在征集的部分是关于网络传输的部分,主要是ax.25的传输层、协议层的c51程序。
老是拷贝鬼子的东西,到处求购picxx fxxxx芯片觉得怄火,中国人发明火药鬼子拿来欺负我们。现在鬼子发明单片机,中国人理应拿来赚他们的钱。

小图 | 大图 图片

  • 哈罗CQ火腿社区 - APRS专题 - 嗨我回来啦了。继续开发89s51的aprs系统
  • 哈罗CQ火腿社区 - APRS专题 - 嗨我回来啦了。继续开发89s51的aprs系统
  • 哈罗CQ火腿社区 - APRS专题 - 嗨我回来啦了。继续开发89s51的aprs系统
  • 哈罗CQ火腿社区 - APRS专题 - 嗨我回来啦了。继续开发89s51的aprs系统
  • 哈罗CQ火腿社区 - APRS专题 - 嗨我回来啦了。继续开发89s51的aprs系统
离线BG8WJ
发帖
166
只看该作者 1楼 发表于: 2009-03-17
硬件层 头文件
#ifndef __hardware_h__
#define __hardware_h__            
#include "at89x52.h"
/************************************************************
              通用定义
************************************************************/      
#define close         1            //定义“关”为1
#define open         0   //定义“开”为0

#define true         1
#define faulse       0

#define high         1
#define low                         0
/************************************************************************************************************
                                                     lcd模块定义
************************************************************************************************************/
/*------------------------------------------------------------------
                          lcd数据、控制口定义
并行8位数据传输模式
字符/图形点阵屏:

  lcd data----------p0
  en----------------p20
  rw----------------p21
  rs----------------p22

图形点阵屏:
  rst---------------p26
  cs1---------------p23
  cs2---------------p24
  cs3---------------p25
 
-------------------------------------------------------------
st7920 (psb------jp1串并选择)
串口模式
scs-------p22  
slk------p20
std------p21  
------------------------------------------------------------*/

#define lcd_data                  p0     //lcd的数据口

sbit lcd_busy=lcd_data^7; //lcd忙信号位

//-----------lcd 控制信号------------------------
sbit lcd_en = p2^0;       //lcd使能信号
sbit lcd_rw = p2^1;       //lcd读写控制
sbit lcd_rs = p2^2;       //lcd寄存器选择h=data; l=command;
sbit lcd_cs1 = p2^3;
sbit lcd_cs2 = p2^4;
sbit lcd_cs3 = p2^5;
sbit lcd_rst = p2^6;             //reset signal 低电平有效
sbit lcd_psb = p2^7;             //psb跳线选择工作方式 h=并口; l=串口;

//----------st7920串口定义----------------------
sbit lcd_slk = p2^0;
sbit lcd_std = p2^1;
sbit lcd_scs = p2^2;

/************************************************************************************************************
                                键盘定义
************************************************************************************************************/
/*--------------------------------------------------
键盘定义:
小键盘的连接方式:(列+行 hex)
1 p1.0(1) -----s1-----s5-----s9-----s13
十六进制:     0x11   0x21   0x41   0x81
          |     |     |     |
2 p1.1(2) -----s2-----s6----s10-----s14
十六进制:     0x12   0x22   0x42   0x82
          |     |     |     |
3 p1.2(4) -----s3-----s7-----s11----s15
十六进制:     0x14   0x24   0x44   0x84
          |     |     |     |
4 p1.3(8) -----s4-----s8-----s12----s16
十六进制:     0x18   0x28   0x48   0x88
          |     |     |     |
          |         |       |         |
5 p1.4(1) ------     |     |     |
              |     |     |
6 p1.5(2) -------------     |     |
                    |     |
7 p1.6(4) --------------------             |
                                                |
8 p1.7(8) --------------------------

-----------------------------------------------------------*/
#define key_port p1
#define key1   p1^6

/************************************************************************************************************
                              红外接收、发射接受定义
************************************************************************************************************/
/*----------------------------------------------------------
发射板
p3.4管脚接发射模块
------------------------------------------------------------*/
sbit ir_model_send = p3^4;
/*----------------------------------------------------------
接受板
p3.2管脚接接收模块
------------------------------------------------------------*/
sbit ir_model_read = p3^2;


#endif
离线BG8WJ
发帖
166
只看该作者 2楼 发表于: 2009-03-17
uart传输层的驱动文件
#include "at89x52.h"
#include "uart.h"
#include "string.h"
/*--------------------------------------------------------------------------------
uart 串行通讯
-----------------------------------------------------------------------------------*/

//向串口发送一个字符
void send_char_com(unsigned char ch)
{
  sbuf=ch;
  while(ti==0);
  ti=0;
}

//向串口发送一个字符串,strlen为该字符串长度
void send_string_com(unsigned char *str)
{
  unsigned int k=0;
     
     do
  {
    send_char_com(*(str + k));
    k++;
  } while(k < strlen(str));
}

void send_end_line(void)
{
  send_char_com(0x0d);
  send_char_com(0x0a);
}
离线BG8WJ
发帖
166
只看该作者 3楼 发表于: 2009-03-17
键盘扫描驱动程序4x4
#include "hardware.h"
#include "public.h"

/******************************************************************************************
* 函数名称   :单一按键选择函数
* 功能描述   :
* 参数     :无
* 返回值     :
******************************************************************************************

bit chk_key(void)
{
if(!key1)
{
  delayms(20);
     
  if(!key1)                  //key=p1.7
  {
    while(!key1);
    delayms(20);
   
    return(1);
  }
  }
return(0);
}
/******************************************************************************************
* 函数名称   :键扫描函数
* 功能描述   :
* 参数     :无
* 返回值     :
******************************************************************************************/
unsigned char keyscan(void)
{
     unsigned char scancode,tmpcode;
     key_port = 0xf0;                                                // 发全0行扫描码
     if ((key_port&0xf0)!=0xf0)                              // 若有键按下
     {
           delayms(60);                                             // 延时去抖动 时间太短按键特灵 太长按键迟钝
           if ((key_port&0xf0)!=0xf0)                        // 延时后再判断一次,去除抖动影响
           {
                 scancode = 0xfe;
                 while((scancode&0x10)!=0)            // 逐行扫描
                 {
                       key_port = scancode;                        // 输出行扫描码
                       if ((key_port&0xf0)!=0xf0)            // 本行有键按下
                       {
                             tmpcode = (key_port&0xf0)|0x0f;      // 返回特征字节码,为1的位即对应于行和列

                             
                             return((~scancode)+(~tmpcode));
                       }
                       else scancode = (scancode<<1)|0x01;            // 行扫描码左移一位
                 }
           }
     }
     return(0);                                                // 无键按下,返回值为0      
}
离线BG8WJ
发帖
166
只看该作者 4楼 发表于: 2009-03-17
液晶点阵12864模块的驱动程序
另外,ast 显示的是当地天空中可用的卫星数目。tst是目前所有的卫星数量。
附件: lcd12864.rar (0 K) 下载次数:45
离线BG4EBC
发帖
17902
只看该作者 5楼 发表于: 2009-03-17
好。先赚一点我们的钱吧,看怎么用比较舒服,比如,给车辆装一个跟踪系统什么的?
离线BD9DM
发帖
3249
只看该作者 6楼 发表于: 2009-03-17
记号,~~~~~
离线BG8WJ
发帖
166
只看该作者 7楼 发表于: 2009-03-17
最后说说成本,硬件:
89s52     rmb: 8元(昆明本地价格)
max232     rmb: 5元(昆明本地价格)
lcm12864   rmb: 50元(淘宝)
电源模块
山寨版lm2576   rmb:7.5(淘宝)
功率电感       rmb:4.0元(淘宝)
其他贴片元件基本可以不及入成本。
最贵的电路板   平均每片价格30元 最心疼的是打样费啊。
如果使用afsk的调制解调芯片 昨天深圳日本鬼子办事处给出的sample订货价格:rmb:22元
所以51单片机还是比较具有优势的。
离线汤圆
发帖
1157
只看该作者 8楼 发表于: 2009-03-17
我很关心你的是什么调制方式 ?那个运放干嘛的
离线BG8WJ
发帖
166
只看该作者 9楼 发表于: 2009-03-17
使用afsk ,运放是怕afsk调制解调芯片输出和对讲机mic之间如果需要匹配的话做个缓冲用的 因为模拟电路功底不是很好,这款音频板实际是抄袭别人的耳放、话放弄得。另外,因为还要实现ax.25的数据传输功能,所以对讲机出来的audio信号通过运放来匹配解调芯片输入。再有一片运放是实现dc单电源转换成运放所需要的双电源。
离线汤圆
发帖
1157
只看该作者 10楼 发表于: 2009-03-17
你做afsk用什么产生波形呢 定时器做调制使用吗? 解码呢, 我感觉51的速度差劲 前面的工作我都做过,和你一样也是12864做显示的 驱动层我也都写过 但是对于x25不了解 对于aprs报文不是很清楚,你也可以自己写个通信协议 遵循位同步 帧同步 数据流 校验 错误直接丢弃就行。我当时就是这么协调 如果你点比较多 可以采用类似时分多地方法 用秒信号做同步信号
离线BG8WJ
发帖
166
只看该作者 11楼 发表于: 2009-03-17
我准备使用cmx的86x做fsk调制解调芯片。基本工作原理是同fx614 。这样就避免c51小马拉大车,基本上单片机只需要对应用层处理。c51速度上来说只要不处理双精度浮点数,完全够用。本来8位机器还是做8位机器擅长的工作。
离线汤圆
发帖
1157
只看该作者 12楼 发表于: 2009-03-17
我说呢 哈哈