搜索
bottom↓
回复: 19

ATmega16读取26位格式韦根码

[复制链接]

出0入0汤圆

发表于 2010-8-18 14:21:18 | 显示全部楼层 |阅读模式
#include <iom16v.h>
#include <macros.h>
unsigned char byte_cnt=0;
unsigned char bit_cnt=0;
  unsigned int wg_data[4]={0xff,0xff,0xff,0xff};
  unsigned int wg_buf[4]={0xff,0xff,0xff,0xff};
  unsigned char wg_mask=0x80;
   void resume_wg26_data(void);
   unsigned char a;
/*********************************************************************************************
延时函数extern

函数说明:软件延时函数,此函数延时单位约为1uS。
晶振频率:CPU内部1M晶振。
带入参数:i无符号整型,变量范围:0-65535。
返回参数:无
*********************************************************************************************/
void delay_us(unsigned int t) {

        unsigned int a;
        unsigned char b;
        for (a = 0; a < t; a++) {
                for (b = 1; b>10; b++) {
                        ;
                        }}}
/*********************************************************************************************
延时函数extern

函数说明:软件延时函数,此函数延时单位约为1mS。
晶振频率:CPU内部1M晶振。
带入参数:i无符号整型,变量范围:0-65535。
返回参数:无
*********************************************************************************************/
void delay_ms(unsigned int i) {

        unsigned int a;
        unsigned char b;
        for (a = 0; a < i; a++) {
                for (b = 1; b; b++) {
                        ;
                        }}}
                        /*********************************************************************************************
串口初始化函数

函数说明:串口初始化函数。
晶振频率:CPU内部1M晶振。
带入参数:无
返回参数:无
*********************************************************************************************/
void uart_init(void) {

        UCSRA = 0x02;                                                /*倍速*/
        UCSRB = 0x18;                                                /*允许接收和发送*/
       
        /*硬件默认为以下值,所以下面语句可以省略*/
        /*具体信息请看MEGA16芯片中文手册150、153、154页说明*/
        /*8位数据、1 位停止、异步、无校验*/
        //UCSRC = (1<<URSEL)|(1 << UCSZ1) | (1 << UCSZ0);

        UBRR = 12;                                                        /*9600波特率*/
}

/*********************************************************************************************
数据发送

函数说明:数据发送,查询方式。
晶振频率:CPU内部1M晶振。
带入参数:i 发送数据,十六进制。
返回参数:无
*********************************************************************************************/
void uart_transmit(unsigned char i) {

        while (!(UCSRA & (1<<UDRE)));                /* 等待发送缓冲器为空*/
        UDR = i;                                                        /* 加载数据,启动发送*/
}

/*********************************************************************************************
数据接收

函数说明:数据接收,查询方式。
晶振频率:CPU内部1M晶振。
带入参数:无
返回参数:接收的数据1字节。
*********************************************************************************************/
unsigned int uart_receive(void) {

        if ((UCSRA & (1<<RXC)) != 0) {                /* 判断接收是否完成*/
                return (UDR | 0x0100);                        /* 返回数据和标志*/
                }
        else {
                return 0;                                                /*返回无效标志*/
                }
}

/*********************************************************************************************
外部中断0初始化函数

函数说明:外部中断0初始化函数
晶振频率:CPU内部1M晶振。
带入参数:无
返回参数:无
*********************************************************************************************/
void int0_init(void) {
           DDRD &= ~(2<<0x01);      //PD2(int0)设定为输入模式
           PORTD|=  (2<<0x01);      //使能内部上拉电阻
       MCUCR|=  (1<<ISC01);     //INT0 的下降沿产生异步中断请求
       GICR |=  (1 << INT0);    //INT0中断允许
}

/*********************************************************************************************/
//
/*********************************************************************************************
外部中断1初始化函数

函数说明:外部中断1初始化函数
晶振频率:CPU内部1M晶振。
带入参数:无
返回参数:无
*********************************************************************************************/
void int1_init(void) {
           DDRD &= ~(3<<0x01);          //PD3(int1)设定为输入模式
           PORTD|=  (3<<0x01);          //使能内部上拉电阻
       MCUCR|=  (1<<ISC11);          //INT1 的下降沿产生异步中断请求
       GICR |= (1 << INT1);                    //INT1中断允许
}

void store_tag_bit(unsigned char tag_data_bit )
{
        //  ( mask = 0x80 ; mask > 0 ; mask >>= 1 )   //1000 0000=0x80
        if( tag_data_bit == 1 )
        {wg_buf[byte_cnt] |= wg_mask;}
        else
        {wg_buf[byte_cnt] &=~wg_mask;}                  //0111 1111=~0x80   =0       
               
       
              wg_mask >>= 1 ;
                 bit_cnt ++;
               
                if (wg_mask == 0)
                    {
                        wg_mask = 0x80;
                    byte_cnt++; }
                        //
                if(bit_cnt==26)//
                        {resume_wg26_data();
                        byte_cnt=0;
                        wg_mask=0x80;
                        bit_cnt=0;
                   for(a=0;a<4;a++)
                    {uart_transmit(wg_data[a]);}       
                }
                   }

// 主函数
main(){
    unsigned char i;
        DDRA = 0x00;                                                /*方向输入*/
        PORTA = 0xFF;                                                /*打开上拉*/
        DDRB = 0xFF;                                                /*方向输出*/
        PORTB = 0xFF;                                                /*高电平*/
        DDRC = 0x00;
        PORTC = 0xFF;
        DDRD = 0x00;
        PORTD = 0xFF;
        int0_init();
        int1_init();
        uart_init();
        delay_ms(250);
    SEI();
        while(1)
        {;}
        }

/*********************************************************************************************
外部中断0

函数说明:外部低电平中断
晶振频率:CPU内部1M晶振。
带入参数:中断无参数
返回参数:中断无参数
*********************************************************************************************/
#pragma interrupt_handler Int0: iv_INT0
void Int0(void) {
GICR = (( 0 << INT0 ) | ( 0 << INT1 ));//关闭外部中断0与1
store_tag_bit(0);                     
delay_us( 1 );    //延时200US屏蔽,一次信号多次中断
GICR = ( ( 1 << INT0 ) | ( 1 << INT1 )); //开启外部中断0与1
       
}
/*********************************************************************************************
外部中断1

函数说明:外部低电平中断
晶振频率:CPU内部1M晶振。
带入参数:中断无参数
返回参数:中断无参数
*********************************************************************************************/
#pragma interrupt_handler Int1: iv_INT1
void Int1(void) {
GICR = (( 0 << INT0 ) | ( 0 << INT1 ));//关闭外部中断0与1
store_tag_bit(1);                     
delay_us( 1 );    //延时200US,屏蔽一次信号多次中断
GICR = ( ( 1 << INT0 ) | ( 1 << INT1 )); //开启外部中断0与1
       
}

/*********************************************************************************************
储存外部中断引脚信号函数

函数说明:根据对应的中断保持数据
晶振频率:CPU内部1M晶振。
带入参数:中断无参数
返回参数:中断无参数
****************************************************************************/                  
void resume_wg26_data(void)
{
unsigned int i;
        wg_data[0] = wg_buf[0] << 1;
                wg_data[0] &=0xfe;
                i = wg_buf[1] >>7 & 0x01;
                wg_data[0] |= i;
               
                wg_data[1] = wg_buf[1] << 1;
                wg_data[1] &=0xfe;
                i = wg_buf[2] >>7 & 0x01;
                wg_data[1] |= i;
               
            wg_data[2] = wg_buf[2] << 1;
                wg_data[2] &=0xfe;
                i = wg_buf[3] >>7& 0x01;
                wg_data[2] |= i;}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2010-8-18 14:22:50 | 显示全部楼层
程序经过多次测试,读取数据可靠稳定,当然也有需要改进的地方,希望大家指点,谢谢!数据能通过串口软件显示出来!

出0入0汤圆

发表于 2010-8-18 17:09:45 | 显示全部楼层
好东西,支持!
楼主好伟大!

出0入0汤圆

 楼主| 发表于 2010-8-18 21:54:11 | 显示全部楼层
回复【2楼】linghu2 令狐二中
-----------------------------------------------------------------------

谢谢!相互学习!

出0入0汤圆

发表于 2010-8-18 23:16:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-16 17:04:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-18 11:12:36 | 显示全部楼层
3Q!

出0入0汤圆

发表于 2010-11-18 12:39:10 | 显示全部楼层

出0入0汤圆

发表于 2010-11-18 12:41:15 | 显示全部楼层
格式韦根码

出0入0汤圆

 楼主| 发表于 2011-4-29 08:57:37 | 显示全部楼层
已经写好WG26与WG34自动适应的代码!

出0入0汤圆

发表于 2011-9-29 20:30:58 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-9-30 09:20:27 | 显示全部楼层
回复【10楼】zlj2008
-----------------------------------------------------------------------

能将WG26与WG34自动适应的代码贴出来参考下吗?
谢谢!

出0入0汤圆

发表于 2011-10-7 18:34:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-8 14:03:24 | 显示全部楼层
能将WG26与WG34自动适应的代码贴出来参考下吗?
谢谢!

出0入0汤圆

发表于 2011-10-26 15:06:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-20 14:23:39 | 显示全部楼层
其实我想知道这个的原理图 O(∩_∩)O~

出0入0汤圆

发表于 2011-11-20 16:09:56 | 显示全部楼层
门禁的大伙有有福啦

出0入0汤圆

发表于 2011-11-20 23:51:55 | 显示全部楼层
刚开始学,有点看不懂...呵呵...

出0入0汤圆

发表于 2013-5-30 10:34:02 | 显示全部楼层
WG26与WG34自动适应的代码贴出来参考下吗?

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-16 19:53

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

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