atmega16单片机C语言程序

合集下载

ATmega16时钟(完整版)

ATmega16时钟(完整版)

ATmega16时钟以CV A VR为编译环境的带校时和音乐报时功能时钟的设计与实现////////////////////////////////////////////////源程序/////////////////////////////////////////////// #include <mega16.h>#define key_input PINC // 按键输入口#define key_mask 0b11000000 // 按键输入屏蔽码#define key_no 0#define key_k1 1#define key_k2 2#define key_state_0 0#define key_state_1 1#define key_state_2 2#define Max_note 32flash unsigned char music[Max_note] ={5,2,8,2,5,2,4,2,3,2,2,2,1,4,1,2,1,2,2,2,3,2,3,2,1,2,3,2,4,2,5,8};flash unsigned char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};flash unsigned char position[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};flash unsigned char d[9] = {0,105,116,132,140,157,176,198,209};flash unsigned int t[9] = {0,956,865,759,716,638,568,506,470};unsigned int int_n;unsigned char note_n;unsigned char dis_buff[6]; // 显示缓冲区,存放要显示的6个字符的段码值unsigned char time[3],time_set[3]; // 时、分、秒计数和设置单元unsigned char clock_state = 6,return_time;unsigned char time_counter,key_stime_counter; // 时间计数单元,bit point_on,set_on,time_1s_ok,key_stime_ok;bit play_on;void display(void) // 6位LED数管动态扫描函数{static unsigned char posit=0;PORTC = 0xff;PORTA = led_7[dis_buff[posit]];if (set_on && (posit==clock_state)) PORTA= 0x00; // 校时闪烁if (point_on && (posit==2||posit==4)) PORTA |= 0x80; // 秒闪烁PORTC = position[posit];if (++posit >=6 ) posit = 0; // (3)}// Timer 0 比较匹配中断服务,2ms定时interrupt [TIM0_COMP] void timer0_comp_isr(void){display(); // LED扫描显示if (++key_stime_counter >=5){key_stime_counter = 0;key_stime_ok = 1; // 10ms到if (!(++time_counter % 25)) set_on = !set_on; // 设置校时闪烁标志if (time_counter >= 100){time_counter = 0;time_1s_ok = 1; // 1s到}}}// T/C1 比较匹配A中断服务interrupt [TIM1_COMPA] void timer1_compa_isr(void){if (!play_on){note_n = 0;int_n = 1;play_on = 1;}else{if (--int_n == 0){TCCR1B = 0x08;if (note_n < Max_note){OCR1A = t[music[note_n]];int_n = d[music[note_n]];note_n++;int_n = int_n * music[note_n];note_n++;TCCR1B = 0x09;}elseplay_on = 0;}}}void time_to_disbuffer(unsigned char *time) // 时钟时间送显示缓冲区函数{unsigned char i,j=0;for (i=0;i<=2;i++){dis_buff[j++] = time[i] % 10;dis_buff[j++] = time[i] / 10;}}unsigned char read_key(void){static unsigned char key_state = 0,key_press;unsigned char key_return = key_no;key_press = key_input & key_mask; // 读按键I/O电平switch (key_state){case key_state_0: // 按键初始态if (key_press != key_mask) key_state = key_state_1;break; // 键被按下,状态转换到键确认态case key_state_1: // 按键确认态if (key_press == (key_input & key_mask)){if (key_press == 0b01000000) key_return = key_k1;else if (key_press == 0b10000000) key_return = key_k2;key_state = key_state_2; // 状态转换到键释放态}elsekey_state = key_state_0; // 按键已抬起,转换到按键初始态break;case key_state_2:if (key_press == key_mask) key_state = key_state_0;break; //按键已释放,转换到按键初始态}return key_return;}void main(void){unsigned char key_temp,i;DDRA=0xFF; // LED段码输出PORTC=0xFF;DDRC=0x3F; // LED位控输出DDRD=0x20; // PD5音乐播放输出// T/C0初始化OCR0 = 0xF9; // OCR0 = 0xF9(249),(249+1)/125=2msTCCR0 = 0x0A; // 内部时钟,8分频(1M/8=125KHz),CTC模式// T/C1初始化TCCR1A=0x40;TCCR1B=0x08;TIMSK = 0x12; // 允许T/C1比较匹配A中断,允许T/C0比较匹配中断time[2] = 23; time[1] = 58; time[0] = 55; // 设时间初值23:58:55#asm("sei") // 开放全局中断while (1){if (time_1s_ok) // 1秒到{time_1s_ok = 0;point_on = ~point_on; // 秒闪烁标志if (++time[0] >= 60) // 秒加1,以下为时间调整{time[0] = 0;if (!play_on) TCCR1B = 0x09; // 1分钟到,播放音乐if (++time[1] >= 60){time[1] = 0;if (++time[2] >= 24) time[2] = 0;}}if ((++return_time >= 20) && (clock_state != 6)) clock_state = 6;if (clock_state == 6) time_to_disbuffer(time);}if (key_stime_ok) // 10ms到,键处理{key_stime_ok = 0;key_temp = read_key(); // 调用按键接口程序if (key_temp) // 确认有键按下{return_time = 0;if (key_temp == key_k1) // K1键按下,状态转换{if (++clock_state >= 7) clock_state = 0;if (clock_state == 0){for (i=0;i<=2;i++) time_set[i] = 0;time_to_disbuffer(time_set);}if (clock_state == 6){for (i=0;i<=2;i++) time[i] = time_set[i];time_to_disbuffer(time);}}if ((clock_state != 6) && (key_temp == key_k2)) // K2键按下{if (clock_state%2) time_set[clock_state/2] += 10;else{if ((time_set[clock_state/2] % 10) == 9)time_set[clock_state/2] -= 9;elsetime_set[clock_state/2]+=1;}if (time_set[0] >= 60) time_set[0]-= 60; // 以下设置时间调整if (time_set[1] >= 60) time_set[1]-= 60;if (time_set[2] >= 24) time_set[2]-= 10;time_to_disbuffer(time_set); // 设置时间送显示缓存}}}}}。

atmega16 位操作让灯闪烁

atmega16 位操作让灯闪烁
# define PIN_PA2 PINA_BIT.BIT2
# define PIN_PA3 PINA_BIT.BIT3
# define PIN_PA4 PINA_BIT.BIT4
# define DDR_PA7 DDRA_BIT.BIT7
#endif
#ifdef DDRB
# define DDR_PB0 DDRB_BIT.BIT0
# define DDR_PB1 DDRB_BIT.BIT1
# define DDR_PB2 DDRB_BIT.BIT2
#include <iom16v.h>
typedef struct BYTE_BIT
{
unsigned BIT0:1;
unsigned BIT1:1;
unsigned BIT2:1;
unsigned BIT3:1;
unsigned BIT4:1;
#ifdef DDRA
# define DDRA_BIT SET_BIT8_FORMAT(DDRA)
#endif
#ifdef DDRB
# define DDRB_BIT SET_BIT8_FORMAT(DDRB)
#endif
#ifdef DDRC
# define DDRC_BIT SET_BIT8_FORMAT(DDRC)
# define _PC4 PORTC_BIT.BIT4
# define _PC5 PORTC_BIT.BIT5
# define _PC6 PORTC_BIT.BIT6
# define _PC7 PORTC_BIT.BIT7
# define DDR_PB3 DDRB_BIT.BIT3

atmega16单片机c语言程序设计经典实例

atmega16单片机c语言程序设计经典实例

atmega16单片机c语言程序设计经典实例中括号在C语言中用于表示数组、结构体、联合体和枚举类型等的定义和使用。

在ATmega16单片机的C语言程序设计中,我们经常会用到数组和结构体,因此本文将以中括号为主题,详细介绍ATmega16单片机上C语言程序设计的经典实例,包括数组的定义和使用、结构体的定义和使用、联合体的定义和使用以及枚举类型的定义和使用。

一、数组的定义和使用数组是一种用于存储一组相同类型的数据项的集合。

在ATmega16单片机上,我们可以使用数组来存储和操作多个引脚的状态、多个传感器的数据等。

1. 数组的定义在C语言中,可以使用方括号来定义一个数组。

下面是一个例子,定义了一个长度为5的整型数组:int array[5];其中,int表示数组的元素类型,array为数组名,[5]表示数组的长度。

2. 数组的初始化数组可以在定义的同时进行初始化。

例如,可以使用大括号将数组的元素初始化为指定的值。

下面是一个例子,将数组的元素初始化为1、2、3、4、5:int array[5] = {1, 2, 3, 4, 5};3. 数组的访问可以使用下标(在中括号内)来访问数组的元素。

数组的下标从0开始,最大值为数组长度减1。

下面是一个例子,访问数组的第一个元素和最后一个元素:int firstElement = array[0];int lastElement = array[4];可以使用循环结构来遍历数组的所有元素:for (int i = 0; i < 5; i++) {访问数组的第i个元素int element = array[i];其他操作}二、结构体的定义和使用结构体是一种可以存储不同类型数据项的数据结构。

在ATmega16单片机上,结构体可以用于存储和操作多个相关的数据项,比如传感器的位置和数值等。

1. 结构体的定义在C语言中,可以使用关键字struct来定义结构体。

下面是一个例子,定义了一个包含姓名和年龄的结构体:struct Person {char name[20];int age;};其中,Person为结构体名,name和age为结构体的成员。

ATMEGA16读写iic(TWI)(24c02)C语言程序

ATMEGA16读写iic(TWI)(24c02)C语言程序

ATMEGA16 读写iic(24c02) C 语言程序测试通过nclude <iom16v.h>#i nclude "I2C.h"#in clude "1602.h"#in clude "delay.h"/*通过AVR往I IC写数据,并通过串口把数据读出显示出来*///===============================================================void UAR_i nit(void) //UART 初始化{ DDRD = 0x02;PORTD = 0x00;UCSRA = 0x02; /* 无倍速*/UCSRB = 0x18; /*允许接收和发送*/U(SRC= 0x06; 1*8位数据,1位停止位,无校验*/UBRRH = 0x00;UBRRL = 12; /*9600*/}//===============================================================void USART_TXD(float data) // 发送采用查询方式{while( !(UCSRA & BIT(UDRE)));UDR=data;while( !(UCSRA & BIT(TXC )));UCSRA|=BIT(TXC);}void mai n(void){un sig ned char i;// LCDinit();uart_i ni t();//TART 初始化SEI(); // 全局中断使能while(1){/*I2C_Write('n',0x00); I2C_Write('c',0x01); I2C_Write('e',0x02);I2C_Write('p',0x03); I2C_Write('u',0x04);*/ i=I2C_Read(0x00); //LCD_write_char(0,0,i); USART_TXD(i); i=I2C_Read(0x01);//LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x02); //LCD_write_data(i); USART_TXD(i);i=I2C_Read(0x03); //LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x04); //LCD_write_data(i); USART_TXD(i);}}/* 上面上主函数部分*/#include <macros.h>#include "delay.h"//I2C 状态定义//MT 主方式传输MR 主方式接受#define START 0x08#define RE_START 0x10#define MT_SLA_ACK 0x18 #define MT_SLA_NOACK 0x20 #define MT_DATA_ACK 0x28 #defineMT_DATA_NOACK 0x30 #define MR_SLA_ACK 0x40 #define MR_SLA_NOACK 0x48 #define MR_DATA_ACK 0x50 #define MR_DATA_NOACK 0x58#define RD_DEVICE_ADDR 0xA1 // 前4位器件固定,后三位看连线,最后1位是读写指令位#define WD_DEVICE_ADDR 0xA0//常用TWI操作(主模式写和读)#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) // 启动I2C #define Stop()(TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) // 停止I2C #define Wait() {while(!(TWCR&(1<<TWINT)));} // 等待中断发生#define TestAck() (TWSR&0xf8) // 观察返回状态#define SetAck (TWCR|=(1<<TWEA)) // 做出ACK应答#define SetNoAck (TWCR&=~(1<<TWEA)) // 做出Not Ack 应答#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) // 启动I2C#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} // 写数据到TWDRunsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress); unsigned charI2C_Read(unsigned RegAddress);/*********************************************I2C 总线写一个字节返回0: 写成功返回1: 写失败**********************************************/unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress){Start(); //I2C 启动Wait();if(TestAck()!=START)return 1; //ACKWrite8Bit(WD_DEVICE_ADDR); // 写I2C 从器件地址和写方式Wait(); if(TestAck()!=MT_SLA_ACK) return 1; //ACKWrite8Bit(RegAddress); // 写器件相应寄存器地址Wait();if(TestAck()!=MT_DATA_ACK)return 1; //ACKWrite8Bit(Wdata); // 写数据到器件相应寄存器Wait();if(TestAck()!=MT_DATA_ACK)return 1; //ACKStop(); //I2C 停止delay_nms(10); // 延时return 0;}/*********************************************I2C 总线读一个字节返回0: 读成功返回1: 读失败**********************************************/unsigned char I2C_Read(unsigned RegAddress){ unsigned char temp;Start();//I2C 启动Wait();if (TestAck()!=START) return 1; //ACKWrite8Bit(WD_DEVICE_ADDR); // 写I2C 从器件地址和写方式Wait(); if (TestAck()!=MT_SLA_ACK) return 1; //ACKWrite8Bit(RegAddress); // 写器件相应寄存器地址Wait();if (TestAck()!=MT_DATA_ACK) return 1;Start(); //I2C 重新启动Wait();if (TestAck()!=RE_START) return 1;Write8Bit(RD_DEVICE_ADDR); // 写I2C 从器件地址和读方式Wait(); if(TestAck()!=MR_SLA_ACK)return 1; //ACKTwi(); // 启动主I2C 读方式Wait(); if(TestAck()!=MR_DATA_NOACK) return 1; //ACKtemp=TWDR;// 读取I2C 接收数据Stop();//l2C 停止return temp;}/*以上是IlC.h头文件部分,需要对照技术文档好好研究*/延时函数编译器:I CC-AVR V6.31A 日期:2005-11-24 20:29:57 目标芯片:M16 时钟:8.0000M Hz作者:arche ng504------------------------------------------------- */#ifndef __delay_h#defi ne __delay_hvoid delay_ nus(un sig ned int n);void delay_ nms(un sig ned int n);void delay_1us(void);void delay_1ms(void);void delay_1us(void) //1us 延时函数{asm( "n op");}void delay_ nus(un sig ned int n) 〃N us 延时函数{un sig ned in t i=0;for (i=0;i <n ;i++)delay_1us();}void delay_1ms(void) //1ms 延时函数{un sig ned in t i;for (i=0;i<1140;i++);}void delay_ nms(un sig ned int n) //N ms 延时函数{un sig ned in t i=0;for (i=0;i <n ;i++)delay_1ms();}#en dif/*以上是delay.h 部分,再加上IIC中自带的iom16v.h和macros.h就可以编译通过*//*注意点:本程序在实验板ATMEGA1上测试通过,在示波器把SCL, SDA信号线有数据,移值到自己电路上可以放心使用,在ATMEGA3上一样使用,本人24C02的A2, A1, A0都是接地,若地址不一样,在程序相应位置改一下就可以,串口上调试单片机的基础,所以它一定要会用*//*本程序调试软件环境是ICC6.31*/。

ATmega16串口程序-值得参考

ATmega16串口程序-值得参考

// USART Transmitter buffer
#define TX_BUFFER_SIZE 16
volatile char tx_buffer[TX_BUFFER_SIZE];
volatile unsigned char tx_wr_index,tx_rd_index,tx_counter;
if (++rx_wr_index == RX_BUFFER_SIZE) //写指针指向下一个单元,并判断是否到了队列的尾部,(不表示接受缓冲区是否满!)
rx_wr_index=0; //到了尾部,则指向头部(构成环状)
if (++rx_counter == RX_BUFFER_SIZE) //队列中收到字符加1,并判断是否队列已满
{
rx_counter=0; // 队列满了,队列中收到字符个数为0,表示队列中所有以前的数据作废,因为最后的数据已经把最前边的数据覆盖了
rx_buffer_overflow=1; //置缓冲区溢出标志。在主程序中必要的地方需要判断该标志,以证明读到数据的完整性
put_s("Hello!");
put_s("这是一个简单的高速的串口驱动程序");
put_s("请你输入任意的字符,单片机将返回你输入的字符");
while (1)
{
put_c(get_c());
}
}
//Makefile,主要的几项,只是针对我这里的程序,要灵活运用哦
//usart.h
//常量定义
#define BAUDRATE 9600 //波特率
//#define F_CPU 4000000 //晶振频率4.0MHz

Atmega16单片机实用程序

Atmega16单片机实用程序
{ for(y_address=y1;y_address
#define uint unsigned int #define SET_1(a,b) a|=bit(b) //將寄存器 a 的第 b 位置 1 #define CLR_0(a,b) a&=~bit(b) //將寄存器 a 的第 b 位清 0 #program date code:
const date[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0 X80,//共陽數據;
Atmega16 单片机实用程序
/************************************************ *********************
MCU: ATmega16 外部晶振: 8MHz 程序功能: 4*4 鍵盤識別,LED 七段數碼管顯示,密 碼功能模塊,直流電機正反轉控制
void delayms(int ms) { int i,j;
for(i=ms;i>0;i--) { for(j=1722;j>0;j 1722; }
/************************************************ ******************* 名稱:us 延時子程序 功能:延時指定的 us ************************************************* *******************/ void delayus(uchar us)
//interrupt process program void process()
{ int adcode=0; ADCSRA&=~BIT(ADIE); adcode=ADCL; adcode=(ADCH>3; y_address=y;

单片机ATMega16-的1602液晶显示两行字母

#include "iom16v.h" //ICC AVR环境下的ATmega16库函数定义了所有的寄存器及其位的标号#include "macros.h"#define LCM_RS_1 PORTB|=(1<<7) //RS为1,定义为PB口的第7位#define LCM_RS_0 PORTB&=(~(1<<7)) //RS为0,定义为PB口的第7位#define LCM_RW_1 PORTB|=(1<<6) //RW为1,定义为PB口的6位#define LCM_RW_0 PORTB&=(~(1<<6)) //RW为0,定义为PB口的6位#define LCM_E_1 PORTB|=(1<<5) //E为1,定义为PB口的第5位#define LCM_E_0 PORTB&=(~(1<<5)) //E为1,定义为PB口的第5位const unsigned char LCM_Dis_String[]="hello hcit";const unsigned char LCM_Dis_WJ[]="welcome to txx";/****************************************************************************** 函数功能:延时1us(4M晶振,0.25微秒的指令执行周期)入口参数:无函数说明:4*0.25=1(微秒)******************************************************************************/ void Delay_1_us(void){NOP();NOP();NOP();NOP();}/****************************************************************************** ********函数功能:延时若干微秒*********************************************************************入口参数:n_us******************/void Delay_n_us(unsigned int n_us){unsigned int cnt_i;for(cnt_i=0;cnt_i<n_us;cnt_i++){Delay_1_us();}}/****************************************************************************** ********函数功能:延时1ms(4M晶振,0.25微秒的指令执行周期)入口参数:无函数说明:(3×cnt_j+2)×cnt_i=(3×33+2)×40*0.25=1010(微秒),可以近似认为是1毫秒******************************************************************************* ********/void Delay_1_ms(void){unsigned char cnt_i,cnt_j;for(cnt_i=0;cnt_i<40;cnt_i++){for(cnt_j=0;cnt_j<33;cnt_j++){}}}/****************************************************************************** ********函数功能:延时若干毫秒入口参数:n_ms******************************************************************************* ********/void Delay_n_ms(unsigned int n_ms){unsigned int cnt_i;for(cnt_i=0;cnt_i<n_ms;cnt_i++){Delay_1_ms();}}/****************************************************************************** ********函数功能:读取忙标志和AC的值入口参数:无******************************************************************************* ********/unsigned char LCM_Re_BAC(){unsigned char status;//LCM_Dat为输入DDRA=0x00;//选择命令通道LCM_RS_0;//选择读操作LCM_RW_1;//使能线置1LCM_E_1;//等待信号线稳定Delay_n_us(1);//读入status=PINA;//使能线置0LCM_E_0;return status;}/****************************************************************************** ********函数功能:写入命令入口参数:命令代码******************************************************************************* ********/void LCM_Wr_CMD(unsigned char cmd_dat){//判忙while(LCM_Re_BAC()>=0x80);//LCM_Dat为输出DDRA=0xFF;//选择命令通道LCM_RS_0;//选择写操作LCM_RW_0;//使能线置1LCM_E_1;//设置命令数据PORTA=cmd_dat;//等待信号线稳定Delay_n_us(1);//送命令数据LCM_E_0;}/****************************************************************************** ********函数功能:写入数据入口参数:数据代码******************************************************************************* ********/void LCM_Wr_DAT(unsigned char dis_dat){//判忙while(LCM_Re_BAC()>=0x80);//LCM_Dat为输出DDRA=0xFF;//选择数据通道LCM_RS_1;//选择写操作LCM_RW_0;//使能线置1LCM_E_1;//设置数据数据PORTA=dis_dat;//等待信号线稳定Delay_n_us(1);//送数据数据LCM_E_0;Delay_n_us(40);}/****************************************************************************** ********函数功能:初始化入口参数:无******************************************************************************* ********/void LCM_1602_Init(void){LCM_Wr_CMD(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口Delay_n_ms(5); //延时5msLCM_Wr_CMD(0x38);Delay_n_ms(5);LCM_Wr_CMD(0x38);Delay_n_ms(5);LCM_Wr_CMD(0x0f); //显示模式设置:显示开,无光标,光标无闪烁Delay_n_ms(5);LCM_Wr_CMD(0x06); //显示模式设置:光标右移,字符不移Delay_n_ms(5);LCM_Wr_CMD(0x01); //清屏幕指令,将以前的显示内容清除Delay_n_ms(5);}unsigned char Get_Key_Val(){unsigned char Key_Val;Key_Val=PINC;switch(Key_Val){case 0xfe:Key_Val=1;break;case 0xfd:Key_Val=2;break;case 0xfb:Key_Val=3;break;default:Key_Val=0;break;}while(PINC==0xFF);return Key_Val;}void main(void){unsigned char cnt_temp,Key_Val;DDRB=0xFF;DDRA=0xFF;DDRC=0x00;PORTC=0xFF;while(1){LCM_1602_Init();Key_Val=Get_Key_Val();switch(Key_Val){case 1:{cnt_temp=0;LCM_Wr_CMD(0x80);while(LCM_Dis_String[cnt_temp]!='\0'){LCM_Wr_DAT(LCM_Dis_String[cnt_temp++]);Delay_n_ms(100);}break;}case 2:{cnt_temp=0;LCM_Wr_CMD(0xC0);while(LCM_Dis_WJ[cnt_temp]!='\0'){LCM_Wr_DAT(LCM_Dis_WJ[cnt_temp++]);Delay_n_ms(100);}break;}case 3:{cnt_temp=0;LCM_Wr_CMD(0x80);while(LCM_Dis_String[cnt_temp]!='\0'){LCM_Wr_DAT(LCM_Dis_String[cnt_temp++]);Delay_n_ms(100);}cnt_temp=0;LCM_Wr_CMD(0xC0);while(LCM_Dis_WJ[cnt_temp]!='\0'){LCM_Wr_DAT(LCM_Dis_WJ[cnt_temp++]);Delay_n_ms(100);}break;}}}}。

个人总结的AVR的ATMEGA16L单片机程序

ATMAGE 16 的C语言程序ATMAGE 16 的C语言程序 (1)一、PB0 口的PB0.1 LED 发光管闪烁的程序: (3)二、PA0、PB0、PC0口的LED 发光管闪烁的程序: (5)三、I/O口的输入与输出 (6)四、跑马灯 (8)五、数码管计数显示设计 (10)六、控制直流电机正反转 (16)七、单片机的定时器(T/C0)应用 (20)AVR原理图 (24)一、PB0 口的PB0.1 LED 发光管闪烁的程序:#include <avr/io.h>int main( void ){unsigned char i, j, k,led=0;DDRB=0xFF; /* all outputs */while (1){if(led)PORTB|=0X01; /* |使最后一位为1 */elsePORTB&=0XFE; /*&最后一位为0 */ led=!led;//延时for (i=0; i<255; i++)for(j=0; j<255;j++)k++;}}/////////////////////////////////////////////////////////////// #include <avr/io.h>int main( void ){unsigned char i, j, k,led=0;DDRB=0xFF; /* all outputs */while (1){if(led)PORTB=0Xfe;elsePORTB=0Xff;led=!led;for (i=0; i<255; i++) //延时for(j=0; j<255;j++)k++;}}二、PA0、PB0、PC0口的LED 发光管闪烁的程序:#include <avr/io.h>int main( void ){unsigned char i, j, k,led=0;DDRA=0xFF;//为输出DDRB=0xFF;DDRC=0XFF;while (1){if(led){PORTA|=0XFF;PORTB|=0XFF;PORTC|=0XFF;}else{PORTA&=0X00;PORTB&=0X00;PORTC&=0X00;}led=!led;//取反////////////延时////////////////for (i=0; i<255; i++)for(j=0; j<255;j++)k++;}}三、I/O口的输入与输出#include <avr/io.h>///////////////////延时us//////////////////void delay_us(int t){dot--;while(t>1);}///////////////////延时ms///////////////// void delay_ms(unsigned int t){while(t!=0){delay_us(1142);t--;}}///////////////////主程序/////////////////////int main(void){DDRA = 0xff; /* all outputs */ DDRB = 0xff; /* all outputs */ DDRC = 0xff; /* all outputs */PORTA=0XFF;PORTB=0XFF;PORTC=0XFF;while(1){//***IO口输出低电平有效,如:0X01为十六进制数,二进制表示为00000001B,再取反////////A口输出//////PORTA=~0X01; // ~表示取反delay_ms(100);//延时N秒PORTA=~0X02;delay_ms(100);PORTA=~0X04;delay_ms(100);PORTA=~0X08;delay_ms(100);PORTA=~0X10;delay_ms(100);PORTA=~0X20;delay_ms(100);PORTA=~0X40;delay_ms(100);PORTA=~0X80;delay_ms(100);PORTA=0X00;//循环结束全亮////////B口输出//////PORTB=~0X01;delay_ms(100);PORTB=~0X02;delay_ms(100);PORTB=~0X04;delay_ms(100);PORTB=~0X08;delay_ms(100);PORTB=~0X10;delay_ms(100);PORTB=~0X20;delay_ms(100);PORTB=~0X40;delay_ms(100);PORTB=~0X80;delay_ms(100);PORTB=0X00;////////C口输出//////PORTC=~0X01;delay_ms(100);PORTC=~0X02;delay_ms(100);PORTC=~0X04;delay_ms(100);PORTC=~0X08;delay_ms(100);PORTC=~0X10;delay_ms(100);PORTC=~0X20;delay_ms(100);PORTC=~0X40;delay_ms(100);PORTC=~0X80;delay_ms(100);PORTC=0X00;}}四、跑马灯#include <avr/io.h>#define uchar unsigned char#define uint unsigned intvoid delayms(uint i){uint j;for(;i!=0;i--){for(j=8000;j!=0;j--);}}void horse(uchar i){switch (i){case 1:PORTB=0X01;break; case 2:PORTB=0X03;break; case 3:PORTB=0X07;break; case 4:PORTB=0X0f;break; case 5:PORTB=0X1f;break;case 6:PORTB=0X3f;break; case 7:PORTB=0X7f;break; case 8:PORTB=0Xff;break; default:break;}}void main(void){uchar i;DDRB=0XFF;PORTB=0XFF;PORTB=0X00;delayms(10);while(1){for(i=1;i<9;i++){horse(i);delayms(10);}for(i=7;i!=0;i--){horse(i);delayms(10);}}五、数码管计数显示设计1、两个按键PB0和PB1分别控制加减。

cc2588驱动程序(Atmega16)

cc2588驱动程序(Atmega16)void cc_spi_read_burst_reg(u8_t addr, u8_t *buffer, u8_t count);调试已经通过///////////////////////////spi.h/////////////////////////////#ifndef SPI_H#define SPI_H#include <stc12le5a60s2.h>#include <spi.h>//sfr P4 = 0xe8;//STC12LE5A60S2单片机自带SPI控制器连接//sbit VCC1 = P2^0;// VCC1 NO USE//sbit SON = P1^6 ;// MISO//sbit SIN = P1^5 ;// MOSI//sbit SCKN = P1^7 ; // SCKsbit CSN = P1^4 ;// 28J60 -- CS//sbit RSTN = P3^5 ; //RST, no use//sbit INTN = P3^3 ; // INT, no usevoid init_spi(void);void WriteByte(u8_t temp);u8_t ReadByte(void);#endif///////////////////////////////////////////////////////////////////////////////////////////spi.c/////////////////////////////#include<spi.h>//STC12LE5A60S2单片机自带SPI控制器连接void init_spi(void){//SSIG = 1; //忽略SS脚//SPEN = 1; //允许SPI工作//DORD = 0; //先传高位MSB//MSTR = 1; //设置单片机为主机SPCTL = 0xD0; //SPI Control Register SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 0000,0100SPSTAT = 0xC0; ////IE2 |= 0x02; //允许SPI中断控制位}void WriteByte(u8_t temp){SPDAT = temp;while(!(SPSTAT & 0x80));SPSTAT = 0xC0;}u8_t ReadByte(void){idata u8_t temp;//SPSTAT = 0xC0;SPDAT = 0x00;while(!(SPSTAT & 0x80));temp = SPDAT;SPSTAT = 0xC0;return temp;}////////////////////////////////////////////////////////////////#include <avr/io.h>#include <avr/interrupt.h>#include <stdlib.h>#include "common.h"#include "ccxxx0_reg.h"#include "cc2588.h"#include "key.h"// 数据包packet_2500_t tx_pkt_2500;packet_2500_t rx_pkt_2500;u8_t rx_state_2500;u8_t rx_flag_2500;void cc_wait(u16_t cycles){while (cycles > 6)cycles -= 6;}// cc2588 外部管脚配置void cc_spi_setup(void){DDRB |= CC2588_CSn;PORTB |= CC2588_CSn;PORTD |= CC2588_GDO0; // 使能上拉// 配置SPI总线//SPSR |= (1<<SPI2X); // 设置SPI时钟倍速SPCR |= (1<<SPE)|(1<<MSTR); // 使能SPI接口,主机模式cli(); // 清所有中断MCUCR |= 0x02; // INT0下降沿触发GICR |= 0x40; // 使能INT0}void cc_spi_write_reg(u8_t addr, u8_t value){// CS enablePORTB &= ~CC2588_CSn;// wait for CCxxxx readywhile (PINB&SPI_MISO);// Clear flagSPSR = 0x00;// Send addressSPDR = addr;// Wait for TX to finishwhile (!(SPSR & (1<<SPIF))) ;cc_wait(75);// Clear flagSPSR = 0x00;// Load data for TX after addrSPDR = value;// Wait for end of addr TXwhile (!(SPSR & (1<<SPIF))) ;cc_wait(75);// CS disablePORTB |= CC2588_CSn;}void cc_spi_write_burst_reg(u8_t addr, u8_t *buffer, u8_t count) {u8_t i;// CS enablePORTB &= ~CC2588_CSn;// Wait for CCxxxx readywhile (PINB&SPI_MISO) ;// Clear flagSPSR = 0x00;// Send addressSPDR = addr|TI_CCxxx0_WRITE_BURST;// Wait for TX to finishwhile (!(SPSR & (1<<SPIF))) ;for (i=0; i<count; i++) {// Clear flagSPSR = 0x00;SPDR = buffer[i];while (!(SPSR & (1<<SPIF))) ;cc_wait(30);cc_wait(30);}// Clear flagSPSR = 0x00;// CS disablePORTB |= CC2588_CSn;}u8_t cc_spi_read_reg(u8_t addr){u8_t x;// CS enablePORTB &= ~CC2588_CSn;// Wait for CCxxxx ready,while (PINB&SPI_MISO) ;// Clear flag set during addr TXSPSR = 0x00;// Send AddressSPDR = addr|TI_CCxxx0_READ_SINGLE;// Wait for TXBUF readywhile (!(SPSR & (1<<SPIF))) ;cc_wait(75);// Clear flag set during addr TXSPSR = 0x00;// Load dummy byte for TX after addrSPDR = 0;// Wait for end of dymmy byte TXwhile (!(SPSR & (1<<SPIF))) ;cc_wait(75);// Read datax = SPDR;cc_wait(45);cc_wait(45);// CS disablePORTB |= CC2588_CSn;return x;}void cc_spi_read_burst_reg(u8_t addr, u8_t *buffer, u8_t count) {u8_t i;// CS enablePORTB &= ~CC2588_CSn;// Wait for CCxxxx readywhile (PINB&SPI_MISO) ;// clear flagSPSR = 0x00;// Send addressSPDR = addr|TI_CCxxx0_READ_BURST;// Wait for txbuf readywhile (!(SPSR & (1<<SPIF))) ;cc_wait(60);for (i=0; i<count; i++) {SPSR = 0x00; // Clear flag// Initiate next data RX, meanwhileSPDR = 0;// wair for end of 1st data byte TXwhile (!(SPSR & (1<<SPIF))) ;cc_wait(30);buffer[i] = SPDR;}// Clear flagSPSR = 0x00;// CS diablePORTB |= CC2588_CSn;}u8_t cc_spi_read_status(u8_t addr){u8_t x;// CS enablePORTB &= ~CC2588_CSn;// Wait for CCxxxx readywhile (PINB&SPI_MISO) ;// Clear flag set during last writeSPSR = 0x00;// Send addressSPDR = addr|TI_CCxxx0_READ_BURST;// Wait for TX to finishwhile (!(SPSR & (1<<SPIF))) ;// Clear flag set during last writeSPSR = 0x00;// Dummy write so we can read dataSPDR = 0;// Wait for RX to finishwhile (!(SPSR & (1<<SPIF))) ;cc_wait(45);cc_wait(45);// Read datax = SPDR;// CS disablePORTB |= CC2588_CSn;return x;}void cc_spi_strobe(u8_t strobe){// CS enablePORTB &= ~CC2588_CSn;// Wait for CCxxxx readywhile (PINB&SPI_MISO) ;// Clear flag set during last writeSPSR = 0x00;// Send strobeSPDR = strobe;// Wait for TX to finishwhile (!(SPSR & (1<<SPIF))) ;// CS disablePORTB |= CC2588_CSn;}void cc_powerup_reset(void){// CS disablePORTB |= CC2588_CSn;cc_wait(30);// CS enablePORTB &= ~CC2588_CSn;cc_wait(30);// CS disablePORTB |= CC2588_CSn;cc_wait(45);// CS enablePORTB &= ~CC2588_CSn;// Wait for CCxxxx readywhile (PINB&SPI_MISO) ;// clear flagSPSR = 0x00;// reset CCxxxx chipSPDR = TI_CCxxx0_SRES;// Wait for end of addr TXwhile (!(SPSR & (1<<SPIF))) ;cc_wait(45);cc_wait(45);cc_wait(45);// CS disablePORTB |= CC2588_CSn;}// CC2588// Product = CC2588// Crystal accuracy = 40 ppm// X-tal frequency = 26 MHz// RF output power = 0 dBm// RX filterbandwidth = 540.000000 kHz // Deviation = 0.000000// Return state: Return to RX state upon leaving either TX or RX// Datarate = 250.000000 kbps// Modulation = (7) MSK// Manchester enable = (0) Manchester disabled// RF Frequency = 2433.000000 MHz// Channel spacing = 199.950000 kHz// Channel number = 0// Optimization = Sensitivity// Sync mode = (3) 30/32 sync word bits detected// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX // CRC operation = (1) CRC calculation in TX and CRC check in RX en abled// Forward Error Correction = (0) FEC disabled// Length configuration = (1) Variable length packets, packet length config ured by the first received byte after sync word.// Packetlength = 255// Preamble count = (2) 4 bytes// Append status = 1// Address check = (0) No address check// FIFO autoflush = 0// Device address = 0// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet// GDO2 signal selection = (11) Serial Clockvoid cc_write_settings(void){#if 0// Write register settingscc_spi_write_reg(TI_CCxxx0_IOCFG2, 0x0B); // GDO2 output pin con fig.//cc_spi_write_reg(TI_CCxxx0_IOCFG2, 0x3A); // GDO2 output pin confi g.cc_spi_write_reg(TI_CCxxx0_IOCFG0, 0x06); // GDO0 output pin con fig.cc_spi_write_reg(TI_CCxxx0_PKTLEN, 0xFF); // Packet length.cc_spi_write_reg(TI_CCxxx0_PKTCTRL1, 0x05); // Packet automation control.cc_spi_write_reg(TI_CCxxx0_PKTCTRL0, 0x05); // Packet automationcc_spi_write_reg(TI_CCxxx0_ADDR, 0x01); // Device address.cc_spi_write_reg(TI_CCxxx0_CHANNR, 0x00); // Channel number.cc_spi_write_reg(TI_CCxxx0_FSCTRL1, 0x07); // Freq synthesizer cont rol.cc_spi_write_reg(TI_CCxxx0_FSCTRL0, 0x00); // Freq synthesizer cont rol.#if 0cc_spi_write_reg(TI_CCxxx0_FREQ2, 0x5D); // Freq control word, hig h bytecc_spi_write_reg(TI_CCxxx0_FREQ1, 0x93); // Freq control word, mid byte.cc_spi_write_reg(TI_CCxxx0_FREQ0, 0xB1); // Freq control word, low byte.#endifcc_spi_write_reg(TI_CCxxx0_FREQ2, 0x5c); // Freq control word, hig h bytecc_spi_write_reg(TI_CCxxx0_FREQ1, 0x80); // Freq control word, mid byte.cc_spi_write_reg(TI_CCxxx0_FREQ0, 0x00); // Freq control word, low byte.cc_spi_write_reg(TI_CCxxx0_MDMCFG4, 0x2D); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG3, 0x3B); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG2, 0x73); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG1, 0x22); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG0, 0xF8); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_DEVIATN, 0x00); // Modem dev (when F SK mod en)cc_spi_write_reg(TI_CCxxx0_MCSM1 , 0x3F); //MainRadio Cntrl State Machinecc_spi_write_reg(TI_CCxxx0_MCSM0 , 0x18); //MainRadio Cntrl State Machinecc_spi_write_reg(TI_CCxxx0_FOCCFG, 0x1D); // Freq Offset Compencc_spi_write_reg(TI_CCxxx0_BSCFG, 0x1C); // Bit synchronization c onfig.cc_spi_write_reg(TI_CCxxx0_AGCCTRL2, 0xC7); // AGC control.cc_spi_write_reg(TI_CCxxx0_AGCCTRL1, 0x00); // AGC control.cc_spi_write_reg(TI_CCxxx0_AGCCTRL0, 0xB2); // AGC control.cc_spi_write_reg(TI_CCxxx0_FREND1, 0xB6); // Front end RX configu ration.cc_spi_write_reg(TI_CCxxx0_FREND0, 0x10); // Front end RX configu ration.cc_spi_write_reg(TI_CCxxx0_FSCAL3, 0xEA); // Frequency synthesize r cal.cc_spi_write_reg(TI_CCxxx0_FSCAL2, 0x0A); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_FSCAL1, 0x00); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_FSCAL0, 0x11); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_FSTEST, 0x59); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_TEST2, 0x88); // Various test settings.cc_spi_write_reg(TI_CCxxx0_TEST1, 0x31); // Various test settings.cc_spi_write_reg(TI_CCxxx0_TEST0, 0x0B); // Various test settings.#endif#if 0// Write register settingscc_spi_write_reg(TI_CCxxx0_IOCFG2, 0x0B); // GDO2 output pin config. cc_spi_write_reg(TI_CCxxx0_IOCFG0, 0x06); // GDO0 output pin config. cc_spi_write_reg(TI_CCxxx0_PKTLEN, 0xFF); // Packet length.cc_spi_write_reg(TI_CCxxx0_PKTCTRL1, 0x05); // Packet automation con trol.cc_spi_write_reg(TI_CCxxx0_PKTCTRL0, 0x22); // Packet automation con trol.cc_spi_write_reg(TI_CCxxx0_ADDR, 0x01); // Device address.cc_spi_write_reg(TI_CCxxx0_CHANNR, 0x00); // Channel number.cc_spi_write_reg(TI_CCxxx0_FSCTRL1, 0x12); // Freq synthesizer control. cc_spi_write_reg(TI_CCxxx0_FSCTRL0, 0x00); // Freq synthesizer control. cc_spi_write_reg(TI_CCxxx0_FREQ2, 0x5c); // Freq control word, highbytecc_spi_write_reg(TI_CCxxx0_FREQ1, 0x80); // Freq control word, mid b yte.cc_spi_write_reg(TI_CCxxx0_FREQ0, 0x00); // Freq control word, low b yte.cc_spi_write_reg(TI_CCxxx0_MDMCFG4, 0x2D); // Modem configuration. cc_spi_write_reg(TI_CCxxx0_MDMCFG3, 0x3B); // Modem configuration. cc_spi_write_reg(TI_CCxxx0_MDMCFG2, 0xF3); // Modem configuration. cc_spi_write_reg(TI_CCxxx0_MDMCFG1, 0x22); // Modem configuration. cc_spi_write_reg(TI_CCxxx0_MDMCFG0, 0xF8); // Modem configuration. cc_spi_write_reg(TI_CCxxx0_DEVIATN, 0x00); // Modem dev (when FSK mod en)cc_spi_write_reg(TI_CCxxx0_MCSM1 , 0x3F); // MainRadio Cntrl State Machinecc_spi_write_reg(TI_CCxxx0_MCSM0 , 0x18); // MainRadio Cntrl State Machinecc_spi_write_reg(TI_CCxxx0_FOCCFG, 0x1D); // Freq Offset Compens. Configcc_spi_write_reg(TI_CCxxx0_BSCFG, 0x1C); // Bit synchronization confi g.cc_spi_write_reg(TI_CCxxx0_AGCCTRL2, 0xC7); // AGC control.cc_spi_write_reg(TI_CCxxx0_AGCCTRL1, 0x00); // AGC control.cc_spi_write_reg(TI_CCxxx0_AGCCTRL0, 0xB0); // AGC control.cc_spi_write_reg(TI_CCxxx0_FREND1, 0xB6); // Front end RX configura tion.cc_spi_write_reg(TI_CCxxx0_FREND0, 0x10); // Front end RX configurat ion.cc_spi_write_reg(TI_CCxxx0_FSCAL3, 0xEA); // Frequency synthesizer c al.cc_spi_write_reg(TI_CCxxx0_FSCAL2, 0x0A); // Frequency synthesizer c al.cc_spi_write_reg(TI_CCxxx0_FSCAL1, 0x00); // Frequency synthesizer c al.cc_spi_write_reg(TI_CCxxx0_FSCAL0, 0x11); // Frequency synthesizer c al.cc_spi_write_reg(TI_CCxxx0_FSTEST, 0x59); // Frequency synthesizer c al.cc_spi_write_reg(TI_CCxxx0_TEST2, 0x88); // Various test settings.cc_spi_write_reg(TI_CCxxx0_TEST1, 0x31); // Various test settings.cc_spi_write_reg(TI_CCxxx0_TEST0, 0x0B); // Various test settings.#endif#if 1// Write register settingscc_spi_write_reg(TI_CCxxx0_IOCFG2, 0x0B); // GDO2 output pin con fig.//cc_spi_write_reg(TI_CCxxx0_IOCFG2, 0x3A); // GDO2 output pin confi g.cc_spi_write_reg(TI_CCxxx0_IOCFG0, 0x06); // GDO0 output pin con fig.cc_spi_write_reg(TI_CCxxx0_PKTLEN, 0xFF); // Packet length.cc_spi_write_reg(TI_CCxxx0_PKTCTRL1, 0x05); // Packet automation control.cc_spi_write_reg(TI_CCxxx0_PKTCTRL0, 0x05); // Packet automation control.cc_spi_write_reg(TI_CCxxx0_ADDR, 0x01); // Device address.cc_spi_write_reg(TI_CCxxx0_CHANNR, 0x00); // Channel number.cc_spi_write_reg(TI_CCxxx0_FSCTRL1, 0x06); // Freq synthesizer cont rol.cc_spi_write_reg(TI_CCxxx0_FSCTRL0, 0x00); // Freq synthesizer cont rol.cc_spi_write_reg(TI_CCxxx0_FREQ2, 0x5c); // Freq control word, hig h bytecc_spi_write_reg(TI_CCxxx0_FREQ1, 0x80); // Freq control word, mid byte.cc_spi_write_reg(TI_CCxxx0_FREQ0, 0x00); // Freq control word, low byte.cc_spi_write_reg(TI_CCxxx0_MDMCFG4, 0x78); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG3, 0x93); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG2, 0x03); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG1, 0x22); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG0, 0xF8); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_DEVIATN, 0x44); // Modem dev (when F SK mod en)cc_spi_write_reg(TI_CCxxx0_MCSM1 , 0x3F); //MainRadio Cntrl State Machinecc_spi_write_reg(TI_CCxxx0_MCSM0 , 0x18); //MainRadio Cntrl State Machinecc_spi_write_reg(TI_CCxxx0_FOCCFG, 0x16); // Freq Offset Compens. Configcc_spi_write_reg(TI_CCxxx0_BSCFG, 0x6C); // Bit synchronization c onfig.cc_spi_write_reg(TI_CCxxx0_AGCCTRL2, 0x43); // AGC control.cc_spi_write_reg(TI_CCxxx0_AGCCTRL1, 0x40); // AGC control.cc_spi_write_reg(TI_CCxxx0_AGCCTRL0, 0x91); // AGC control.cc_spi_write_reg(TI_CCxxx0_FREND1, 0x56); // Front end RX configu ration.cc_spi_write_reg(TI_CCxxx0_FREND0, 0x10); // Front end RX configu ration.cc_spi_write_reg(TI_CCxxx0_FSCAL3, 0xA9); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_FSCAL2, 0x0A); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_FSCAL1, 0x00); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_FSCAL0, 0x11); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_FSTEST, 0x59); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_TEST2, 0x88); // Various test settings.cc_spi_write_reg(TI_CCxxx0_TEST1, 0x31); // Various test settings.cc_spi_write_reg(TI_CCxxx0_TEST0, 0x0B); // Various test settings. #endif}// PATABLE (0 dBm output power)//u8_t paTable[] = {0xFB};u8_t paTable[] = {0xFF};u8_t paTableLen = 1;// 发送数据包void cc_send_packet(u8_t *tx_buf, u8_t size){// 先进空闲,防止锁死cc_spi_strobe(TI_CCxxx0_SIDLE);cc_spi_write_burst_reg(TI_CCxxx0_TXFIFO, tx_buf, size); // Write TX d atacc_wait(30);//cc_spi_write_reg(TI_CCxxx0_FREND0, 0x10); // POWER = 10dbm //cc_wait(30);cli();cc_spi_strobe(TI_CCxxx0_STX); // STX="0x35" enable TX.while ((PIND&CC2588_GDO0) == 0) ; // wait for GDO0 hi, sync TX'ed while ((PIND&CC2588_GDO0) != 0) ; // wait for GDO0 lo, end of pkt sei();}//u8_t cc_receive_packet(u8_t *rx_buf, u8_t *length){u8_t status[2];u8_t pktlen;if ((cc_spi_read_status(TI_CCxxx0_RXBYTES) & TI_CCxxx0_NUM_RXB YTES)) {pktlen = cc_spi_read_reg(TI_CCxxx0_RXFIFO); // read length byteif (pktlen <= *length) { // if pktlen size <= rx_bufcc_spi_read_burst_reg(TI_CCxxx0_RXFIFO, rx_buf, pktlen); // Pull data*length = pktlen; // return the actual sizecc_spi_read_burst_reg(TI_CCxxx0_RXFIFO, status, 2); // read app ended status bytereturn (u8_t)(status[TI_CCxxx0_LQI_RX]&TI_CCxxx0_CRC_OK); // return CRC_OK bit} else {*length = pktlen;cc_spi_strobe(TI_CCxxx0_SFRX); // Flush RXFIFOreturn 0; // error}} else {return 0; // error}}// 接收中断函数SIGNAL(SIG_INTERRUPT0){rx_pkt_2500.len = 32;rx_state_2500 = cc_receive_packet(rx_pkt_2500.buf, &(rx_pkt_2500.len)); if (rx_state_2500 != 0)rx_flag_2500 = 1;cc_spi_strobe(TI_CCxxx0_SRX); // 返回接收}。

AVR单片机(C语言)项目开发实践教程项目4 ATmega16单片机IO接口应用


【知识目标】
1. 了解LED发光二极管的驱动控制方法 2. 了解ATmega16单片机数字I/O口的结构 3. 了解ATmega16单片机数字I/O口的相关寄
存器功能
2021/8/3
【项目知识点与技能点】
1. 掌握单片机控制LED发光二极管驱动电 路的连接方法
2. 掌握ATmega16单片机数字I/O口的相关 寄存器功能的设置
位 PORTA.7 PORTA.6 PORTA.5 PORTA.4 PORTA.3 PORTA.2 PORTA.1 PORTA.0
复位值 0
0
0
0
0
0
0
0
2021/8/3
二、I/O接口的寄存器
• 端口输入寄存器:PINX(PINA)-----只读
位 PINA.7 PINA.6 PINA.5 PINA.4 PINA.3 PINA.2 PINA.1 PINA.0 复位值 N/A N/A N/A N/A N/A N/A N/A N/A
①DDRA为A口数据方向寄存器,用来定义A口的通讯方 向(输入/输出);
②PORTA为A口数据寄存器,用来输出数据(输入时, PORTX为高,打开上拉电阻);当PORTx=1时,I/O引脚高 电平,可提供输出20mA电流;当PORTx=0时,I/O引脚低电 平,可吸纳20mA电流。因此,AVR的I/O在输出方式下提供 了比较大驱动能力,可以直接驱动LED等小功率外围器件。
AVR单片机(C语言)项目开发实践 教程项目4 ATmega16单片机IO接口应

项目四 ATmega6单片机I/O口应用
• 任务一 项目知识点学习 • 任务二 LED闪烁灯控制 • 任务三 LED开关灯控制 • 任务四 汽车转向灯控制 • 任务五 霓虹灯控制 • 任务六 继电器控制照明设备
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档