|
#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周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|