搜索
bottom↓
回复: 33

发个超再生接收解码的例程,只要换接收头(315M或433M)就可以解2240或2260的码并可以在

[复制链接]

出0入0汤圆

发表于 2007-6-23 22:13:22 | 显示全部楼层 |阅读模式
//=======================================================================

//ATmega8+315M或433.92M的超再生接收头+1602六线控制的1602显示解到的码

//作者:朱海峰

//邮箱:ntzhf100@163.com    QQ:543376422

//

//========================================================================



#include <iom8v.h>

#include <macros.h>

#include "LCD_1602_4wires.h"



#define Beep_on()                                PORTB |= 0X04

#define Beep_off()                                PORTB &= ~0X04



void System_init(void);

void Receive_ID_Number(void);

void Show_ID_Number(uint32_t n);

void Print_hex(uint32_t n);

void Print_num(uint8_t num);



const uint8_t g_num[] = "0123456789ABCDEF";

/****************************************/

void main(void)

{

        System_init();

    Delay_nms(10);

        LCD_init();

        Beep_off();

        LCD_write_string(1,1,"Receive RF ID");

    SREG = 0x80; // SEI

    while(1)

        {

            Receive_ID_Number();

        }

}

/***************************************/

void System_init(void)

{

/*********************I/O口初始化**************************/         

         DDRC |= LCD_DATA;

     DDRB |= 0XC6;

         PORTB &= ~0X80;//我的RW引脚未接地,通过输出低电平开使它

                      //处在低电平状态

/*********************************************************/

}

/***************************************/

#define get_port_val()          ((PINC & 0x20) >> 5)

static uint32_t g_key_cmd = 0x00;

void Receive_ID_Number(void)

{

        static uint16_t cyc_cnt = 0, low_cnt = 0, high_cnt = 0;

        static uint8_t st = 0;

        static uint32_t last_cmd = 0;

       

    cyc_cnt++;                //查询计数自加1



        if (st == get_port_val())  //如果当前端口读到的电平和上次的一样则退出

            return;

        /* st must euqal 0x00 or 0x01 */

    st = !st;                                       //如果不一样则保存的电平状态取反

        if (st)                                          //如果ST==1则说明当前是由高电平向低电平变化

        {

            low_cnt = cyc_cnt;          //将当前的查询计数值给低电平计数变量

        }

        else                                            //否则说明当前是由低电平向高电平变化

        {

            high_cnt = cyc_cnt;          //将当前的查询计数值给低电平计数变量

        }



        cyc_cnt = 0;                             //查询计数变量赋0



        if (!st)                                    //如果当前是由低电平向高电平的变化则退出

        return;



    if ((low_cnt >> 4) > high_cnt)//如果一直低电平则进入

    {

        g_key_cmd &= 0x00FFFFFF; //取其后24位

                //如果当前的码等于上次的码并且上次的码不为0则显示接收到的码

        if ((g_key_cmd == last_cmd) && (last_cmd != 0))

        {               

            Show_ID_Number(g_key_cmd);//调用显示函数

        }



        last_cmd = g_key_cmd;//保存当前的码,以便下次比较用

    }

   

    g_key_cmd = g_key_cmd << 1;//解到0

   

    if (low_cnt < high_cnt)

    {

        g_key_cmd |= 0x01;          //解到1

    }

}

/***************************************/

void Show_ID_Number(uint32_t n)

{

     //LCD_write_string(1,2,"==>[");

         Beep_on();

         LCD_set_xy(5,2);

     Print_hex(n);

         //LCD_write_string(13,2,"]<==");

     Beep_off();

         Delay_nms(10);

}

/*************************************/

void Print_num(uint8_t num)

{

    LCD_write_byte(0,g_num[num >> 4]);

        LCD_write_byte(0,g_num[num & 0x0F]);

}

/************************************/

void Print_hex(uint32_t n)

{

        Print_num((n & 0xFF000000) >> 24);

        Print_num((n & 0x00FF0000) >> 16);

        Print_num((n & 0x0000FF00) >> 8);

        Print_num((n & 0x000000FF));

}

/************************************/





//=================================第二个液晶6线控制的C头文件========================

/*============================================================

工程:字符型液晶通用六线驱动

作者:朱海峰               

日期:2007.02.28

E_mail:ntzhf100@163.com

说明:谢谢www.ouravr.com论坛上的朋友们的提供的宝贵经验



液晶指令说明:

0x08==============>关闭显示

0x0c==============>开显示

0x01==============>清除LCD的显示内容

0x06==============>移动光标

0x0c==============>显示开,光标关

0x28==============>16*2显示,5*7点阵,4位数据

0x1c==============>字符右移一格

0x18==============>字符左移一格

0x10==============>光标右移一格

0x14==============>光标左移一格

显示地址:

===============================================================

=0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 ................ 0x27=

=0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47 ................ 0x67=

===============================================================

每行可以显示40个字符,可以看到的只有16个字符,可以通过指令使字符

整体移动来显示所有字符。

LCD_write_byte函数功能:当cmd=0时,向LCD写入数据,否则向LCD写

                   入命令

四线控制的方式:先送字节的高四位,在送低四位。

值得注意的是当使用的I/O口为高四位时数据先给另一个变量,变量再将

数据高四位送到I/O口,接着是将变量左移四位,再送到I/O口上去。

当使用的I/O口为低四位时数据先给另一个变量,变量右移四位后送到I/O

口上去,接着将数据给变量直接送入I/O口。

使用时注意一下。

============================================================*/

#include <iom8v.h>

#include <macros.h>

//定义MCU与LCD的接口

#define LCD_DATA_PORT          PORTC

#define LCD_CONTROL_PORT  PORTB

#define LCD_DATA          0x0F

#define SET_RS()                  LCD_CONTROL_PORT|=0x40

#define CLR_RS()                  LCD_CONTROL_PORT&=~0x40

#define SET_EN()                  LCD_CONTROL_PORT|=0x02

#define CLR_EN()                  LCD_CONTROL_PORT&=~0x02

#define xtal 8                          //晶振调整 MHz



typedef        unsigned char                   uint8_t;

typedef        unsigned int                  uint16_t;

typedef unsigned long       uint32_t;

/*-----------------------------------------------------

Public function prototypes

-------------------------------------------------------*/

void LCD_init                         (void);

void LCD_write_byte         (uint8_t cmd,uint8_t data);

void LCD_Write_half_byte    (void);

void LCD_set_xy             (uint8_t x, uint8_t y);

void LCD_write_string       (uint8_t X,uint8_t Y,uint8_t *s);

void Move                                        (uint8_t step,uint8_t dirction,uint16_t time);

void Flash_lcd                                (uint16_t delay_t,uint8_t times);

void Delay_nms                                (uint16_t ms);



uint8_t data_temp;

//==================================================

void LCD_init(void)

  {

        Delay_nms(50);                 

    Delay_nms(1);

    LCD_write_byte(1,0x28);           //4bit test    显示模式设置(不检测忙信号)

    Delay_nms(1);  

    LCD_write_byte(1,0x08);         // 显示关闭

    Delay_nms(1);

    LCD_write_byte(1,0x01);         // 显示清屏

    Delay_nms(1);

    LCD_write_byte(1,0x06);         // 显示光标移动设置

    Delay_nms(1);

    LCD_write_byte(1,0x0C);         // 显示开及光标设置

    Delay_nms(10);

  }

/*--------------------------------------------------

LCD_write_byte    : 英文字符显示函数

输入参数:*s      :英文字符串指针;

          X、Y    : 显示字符串的位置,X:1-16,Y:1-2                

---------------------------------------------------*/

void LCD_write_byte(uint8_t cmd,uint8_t data)

  {      

    if (cmd == 1)

        {

           CLR_RS();

        }

        if (cmd == 0)

        {

           SET_RS();

        }

        data_temp = data;

        data_temp = data_temp >> 4;

    LCD_Write_half_byte();

        data_temp = data;

    LCD_Write_half_byte();

        Delay_nms(1);         

  }

/*----------------写4bit到LCD------------------------*/

void LCD_Write_half_byte(void)

  {  

           LCD_DATA_PORT &= 0xf0;          //

            LCD_DATA_PORT = data_temp;//send 4bit

         SET_EN();

         NOP();

         CLR_EN();

         NOP();

   }



/*----------------------------------------------------

LCD_set_xy        : 设置LCD显示的起始位置

输入参数:x、y    : 显示字符串的位置,X:1-16,Y:1-2               

-----------------------------------------------------*/

void LCD_set_xy( uint8_t x, uint8_t y )

  {

    unsigned char address;

    if (y == 1)

        {

           address = 0x80 - 1 + x;

        }

    else

    {

           address = 0xc0 - 1 + x;

        }

    LCD_write_byte(1,address);

  }

/*---------------------------------------------------

LCD_write_string  : 英文字符串显示函数

输入参数:*s      :英文字符串指针;

          X、Y    : 显示字符串的位置               

---------------------------------------------------*/

void LCD_write_string(uint8_t X,uint8_t Y,uint8_t *s)

  {

    LCD_set_xy( X, Y );   

    while (*s)

      {

        LCD_write_byte(0,*s);

                s++;

      }

  }

//=======================================================

void Move(uint8_t step,uint8_t dirction,uint16_t time)

{

         uint8_t i;

         for(i=0; i<step-1; i++)

         {

                   LCD_write_byte(1,dirction);      //字符移动方向                                    

         Delay_nms(time);                //控制移动时间

         }

}

//=========================================================

void Flash_lcd(uint16_t delay_t,uint8_t times)

{

         uint8_t j;

         for(j=0; j<times; j++)

         {

                  LCD_write_byte(1,0x08);

                Delay_nms(delay_t);

                LCD_write_byte(1,0x0c);

                Delay_nms(delay_t);

         }

}

//========================================================

void Delay_nms(uint16_t ms)

{

    uint16_t i;

    while(ms--)   

   {

     for(i=1; i<(uint16_t)(xtal*143-2); i++)

         ;

   }   

}

//========================================================

出0入0汤圆

 楼主| 发表于 2007-6-24 01:04:40 | 显示全部楼层
自己顶一下吧!

注:我把两个文件放在一起发了,即“===第二个液晶6线控制的C头文件=”所标的上面是一个C文件,下面一个是液晶的6线驱动文件

出0入0汤圆

发表于 2007-11-8 08:36:11 | 显示全部楼层
厉害!!顶一 下
头像被屏蔽

出0入0汤圆

发表于 2007-11-8 08:37:48 | 显示全部楼层
能上连线方法(电路图)也一并上传吗? 谢谢。 COOL !

出0入96汤圆

发表于 2010-5-12 10:47:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-12 21:40:16 | 显示全部楼层
ffffffffffffffff

出0入0汤圆

发表于 2010-9-28 23:45:30 | 显示全部楼层
TKS

出0入0汤圆

发表于 2010-9-29 08:40:34 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2010-10-25 15:43:20 | 显示全部楼层
站个位置

出0入42汤圆

发表于 2010-11-19 10:40:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-9 11:08:41 | 显示全部楼层
厉害!!顶一 下

出0入0汤圆

发表于 2010-12-14 21:14:55 | 显示全部楼层
明天试试看

出0入0汤圆

发表于 2011-1-26 19:29:42 | 显示全部楼层
make

出0入0汤圆

发表于 2011-1-27 11:28:29 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2011-5-26 19:09:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-10 20:15:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-15 22:14:18 | 显示全部楼层
无得弹吖……

出0入0汤圆

发表于 2011-8-16 10:54:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-22 19:43:09 | 显示全部楼层
好收下!

出0入0汤圆

发表于 2011-8-24 12:05:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-11 16:27:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-8 21:23:59 | 显示全部楼层
好资料收下

出0入0汤圆

发表于 2012-4-1 18:59:32 | 显示全部楼层
收藏下吧  

出0入0汤圆

发表于 2012-10-12 15:30:07 | 显示全部楼层
本帖最后由 tomy 于 2012-10-12 16:13 编辑

这个帖有些沉底了。

没理解楼主那个同步头是要怎么找呢?

" if ((low_cnt >> 4) > high_cnt)//如果一直低电平则进入"

这句应该就是吧?

同步低电平时间是128a.宽脉冲时间是4a,窄脉冲时间是a.

出0入0汤圆

发表于 2012-10-12 15:43:28 | 显示全部楼层
mark markmark

出0入0汤圆

发表于 2013-7-25 16:26:41 | 显示全部楼层
发压缩包感觉好点。。。

出0入0汤圆

发表于 2013-7-25 17:20:38 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2014-6-20 09:01:38 | 显示全部楼层
赞一个,楼主强悍,我看不懂,纯顶!

出0入53汤圆

发表于 2014-6-24 08:26:44 | 显示全部楼层
请问LZ void Receive_ID_Number(void)这个函数在主函数里一直在调用  请问最低调用频率多少合适?不可能让mcu只调用这个函数  不做其他的哦

出0入0汤圆

发表于 2014-11-30 22:12:47 | 显示全部楼层
楼主,是武昌工学院?

出0入0汤圆

发表于 2014-12-23 08:42:23 | 显示全部楼层
学习了,多谢楼主分享

出0入0汤圆

发表于 2015-1-29 11:52:55 | 显示全部楼层
学习了、、、、、

出0入0汤圆

发表于 2015-4-23 18:32:56 | 显示全部楼层
记号,学习一下。

出0入0汤圆

发表于 2015-4-23 21:43:46 | 显示全部楼层
不错,做个标记
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 11:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表