把atmega8的AD转换程序,proteus仿真图都改成ATmega16的,需要怎么改? 5C

图片说明#include
#include
#define uchar unsigned char
#define uint unsigned int
/**********************************************************************
定义数组

**********************************************************************/
uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar Data[4]={0,0,0,0};
/**********************************************************************
延时函数

**********************************************************************/
void DelayMs(uint i) //0.25ms
{uchar j;
for(;i!=0;i--)
{for(j=250;j!=0;j--) {;}}
}
/**********************************************************************
显示函数

注意:使用开发板时sel=0xef;
**********************************************************************/
void Display(uchar p) //动态显示函数,参数p为待显示的数组名
{uchar i,sel=0x01;

for(i=0;i<4;i++)
{PORTD=sel; //选通最右边的数码管
PORTB=~Table[p[i]]; //送字型码
if(i==0){PORTB=PORTB&0X7f;} //增加小数点
DelayMs(1); //显示延时

sel=sel<<1; //移位以显示前一位
}
}
/
*********************************************************************
电压值处理函数

**********************************************************************/
uint ADC_Convert(void)
{uint temp1,temp2;
temp1=(uint)ADCL;//先读ADCL
temp2=(uint)ADCH;//再读ADCH
temp2=(temp2<<8)+temp1;//求值
temp2=temp2*49/10;//求显示的电压值(0~5.12)V
return(temp2);
}
/**********************************************************************
显示处理函数

**********************************************************************/
void Process(uint i,uchar p)
{p[0]=i/1000;
i=i%1000;
p[1]=i/100;
i=i%100;
p[2]=i/10;
i=i%10;
p[3]=i;
}
/
*********************************************************************
初始化I/O口
**********************************************************************/
void Init_IO(void) //初始化I/O口
{
DDRA=0x00; //设置A口为不带上拉输入;
PORTA=0x00;
DDRB=0xff; //设置B口为推挽1输出;
PORTB=0xff;
DDRD=0xff; //设置C口为推挽1输出;
PORTD=0xff;
}
/**********************************************************************
主函数

**********************************************************************/
void main(void)
{uint i;
Init_IO();
ADMUX=0x00; //选择第一通道;
/**********************转换速率应在50~200K****************************/
ADCSR=0xe6; //125K转换速率,自由转换模式;启动AD转换器;
DelayMs(300); //延时待系统稳定;
while(1)
{
i=ADC_Convert(); //显示电压值(0~1024)
Process(i,Data);
Display(Data);
}
}

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
(ICCAVR中编译的)ATmega16程序与对应的proteus仿真图
有没有人做(ICCAVR中编译的)ATmega16的AD转换、T/C1捕获、通用串行接口DUART、TWI、矩阵这样的程序和对应的proteus仿真图??
ATmega16 eeprom读写问题
我用的是ATmega16 单片机,用progisp写程序。在开始的程序里,把数据写到EEPROM中,接着读出数据,结果能正确读出来。然后,将写EEPROM的那部分去掉,重新编译成 .hex文件烧录到单片机中,结果就不能从EEPROM中读出正确的数据了。这是怎么回事啊? 选项为:芯片擦除,编程Flash,校验Flash以及熔丝位
Atmega88Pa 读写AD7793失败
用ATMEGA88pa读写 AD7793谁做过呢,我试了1个月都不成功,模拟spi,8m内部rc振荡
利用ATMEGA16单片机输出PWM波形控制温度的程序哪位大神有 啊
利用ATMEGA16单片机输出PWM波形控制温度的程序哪位大神有 啊![图片说明](https://img-ask.csdn.net/upload/201605/07/1462614869_61784.png)
ATmega16A 定时器0 不明原因程序不运行
想用定时器实现按毫秒定时(输入多少毫秒就定多少) 配置了MCUCR GICR TIMSK SREG TCCR0 TCNT0 中断函数 以及输出电平 熔丝位设置:CKOPT:0 CKSEL:1111 SUT:10 外部12M晶振 功能就是让数码管亮 锁存控制具体哪个数码管 for循环延时正常 通电瞬间会全亮一下然后循环 现在用定时器 不知道什么原因 通电之后全亮了 应该是卡在程序开头 然而开头只是个io口电平设置啊 环境 CodeBlocks13.12 编译器 WinAVR 刚才测了输出的电平 用1个单片机测的是3.66V 另1个是3.11V 都不是高电平 ``` #include <avr/io.h> //#include <avr/iom16a.h> //#include <avr/iom16.h> unsigned int digits[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0-10和无数字 unsigned int count0 = 0; unsigned int ms = 0; void portInit(void) { //A输出到数码管,B输出到锁存LE //先规定电平后规定方向防止默认电平 PORTA = 0x00; DDRA = 0xff; PORTB = 0x00; DDRB = 0xff; PORTC = 0x00; DDRC = 0xff; PORTD = 0x00; DDRD = 0xff; } //#define _TC0_ #ifndef _TC0_ void timer0Init(void) { SREG = 0x80; //全局中断 Page7 TIMSK = 0x01; //T/C0 Page 80 TCNT0 = 209; TCCR0 = 0x04; //256分频 Page79 } void timer0Off(void) { SREG = 0x00; //全局中断 Page7 TIMSK = 0x00; //T/C0 Page 80 TCCR0 = 0x00; } /* //针对晶振12M void delayMs(unsigned int ms) { unsigned int count0 = 0; TCNT0 = 209; while(1) { TCCR0 = 0x04; //256分频 Page79 if(++count0 >= ms) { TCCR0 = 0x00; //count0 = 0; break; } else { } } } */ void delayMs(unsigned int mss) { timer0Init(); ms = mss; } #pragma interrupt_handler timer0Ovf: 10 //中断向量 Page43 void timer0Ovf(void) { TCNT0 = 209; //重装计数初值 if(++count0 >= ms) { timer0Off(); count0 = 0; ms = 0; } } void main(void) { unsigned int i; portInit(); timer0Off(); GICR = 0x00; MCUCR = 0x00; //Page30 PORTB = 0x3f; PORTA = digits[10]; while(1) { for(i=0;i<11;i++) { delayMs(300); PORTA = digits[i]; } } } #else //for循环延时 void main(void) { unsigned int i,j; portInit(); PORTB = 0x3f; PORTA = digits[10]; while(1) { for(j=0;j<11;j++) { for(i=0;i<20000;i++) { } PORTA = digits[j]; } } } #endif ```
用ATMEGA8开发GY-273,IIC无应答信号
用ATMEGA8开发GY-273,IIC无应答信号。 经过逐步调试,程序卡在了 # if(TestAck()!=MT_SLA_ACK) # return 1; //ACK # Send_Char(0x33);//测试用 也就是说,第一次写操作就进行不了 附上全部代码**___ ``` //ICC-AVR application builder : 2009-3-12 17:05:04 // Target : M8 // Crystal: 8.0000Mhz #include <avr/io.h> #include <avr/interrupt.h> #include <macros.h> #include "usart.h" void port_init(void) { DDRB|=0X04;//B2,LED_DOWN,PIN16 DDRC|=0X02;//C1,LED_LEFT,PIN24 DDRC|=0X08;//C3,LED_RIGHT,PIN26 DDRC|=0X20;//C5,LED_UP,PIN28 DDRB|=0X01;//B0,LED_OK,PIN14 DDRD|=0X40;//D6,TEST,PIN12 DDRC&=~0X01;//C0,KEY_LEFT,PIN23 DDRC&=~0X04;//C2,KEY_RIGHT,PIN25 DDRC&=~0X10;//C4,KEY_UP,PIN27 DDRB&=~0X02;//B1,KEY_DOWN,PIN15 DDRD&=~0X80;//D7,KEY_OK,PIN13 PORTC |= 0xFF; PORTB |= 0xFF; PORTD |= 0xFF; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up cli(); //disable all interrupts port_init(); MCUCR = 0x00; //MCU Control Register GICR = 0x00; //General Interrupt Control Register TIMSK = 0x00; //timer interrupt sources sei(); //re-enable interrupts //all peripherals are now initialized } /************************************************************************* 用 途:iic发送接收 Taget :mega8 crystal :8M 介 绍:PC4-SDA PC5-SCK/SCL //*********************************************************************** 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 #define MT_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 0x3c //前4位器件固定,后三位看连线,最后1位是读写指令位 #define WD_DEVICE_ADDR 0x3d #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);} //写数据到TWDR /*延时子程序*/ void delay_ms(int time) { int i; for(;time>0;time--) for(i=0;i<1000;i++); } //初始化 void iic_init() { TWBR= 0x20; //设置波特率 TWSR= 0x00; //设置预分频比 TWCR= 0x44; //使能应答,使能TWI DDRC|=(1<<PC4)|(1<<PC5); PORTC|=(1<<PC4)|(1<<PC5); } /********************************************* I2C总线写一个字节 返回0:写成功 返回1:写失败 **********************************************/ unsigned char iic_write(unsigned char Wdata,unsigned char RegAddress) { Start(); //I2C启动 Wait(); if(TestAck()!=START) return 1; //ACK Send_Char(0x11);//测试用 Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式 Wait(); Send_Char(0x22);//测试用 ## ** if(TestAck()!=MT_SLA_ACK) ## return 1; //ACK ## Send_Char(0x33);//测试用** Write8Bit(RegAddress); //写器件相应寄存器地址 Wait(); if(TestAck()!=MT_DATA_ACK) return 1; //ACK Write8Bit(Wdata); //写数据到器件相应寄存器 Wait(); if(TestAck()!=MT_DATA_ACK) return 1; //ACK Stop(); //I2C停止 delay_ms(100); //延时 return 0; } /********************************************* I2C总线读一个字节 返回非0:读成功 返回0:读失败 **********************************************/ unsigned char iic_read(unsigned RegAddress) { unsigned char temp; Start();//I2C启动 Wait(); if (TestAck()!=START) return 1; //ACK Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式 Wait(); if (TestAck()!=MT_SLA_ACK) return 1; //ACK Write8Bit(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; //ACK Twi(); //启动主I2C读方式 Wait(); if(TestAck()!=MR_DATA_NOACK) return 1; //ACK temp=TWDR; //读取I2C接收数据 Stop(); //I2C停止 return temp; } //**************************************************************************** void main() { unsigned char i,j; port_init(); init_devices(); usart_Init(); iic_init(); i=iic_write(0xaa,0X10);//在0X10地址写入数据0XAA if (i==1) PORTB=0x1;//若写入失败(i=1),B口0x01;若写入成功,B口输出0X02 else PORTB=0x2; j=iic_read(0X10);//读出0x10地址的数据 if(j==1) PORTD=0xff; //若读出失败(j=1),D口全灭;若读出成功,D口输出0XAA else PORTD=j; while(1) { ; } } ``` 检测过SCL 和 SDA 的IO口输出电压为3.3V,猜测不是上拉电阻的问题
用ATmega8驱动OLED时候显示屏不亮。
用ATmega8驱动OLED代码如下,用ICCAVR编程,显示屏不亮,不知道代码是否有问题,还是需要检查平台的配置? ``` #include<iom8v.h> #include<macros.h> //#include "asiic.h" #define uchar unsigned char #define uint unsigned int const xtal = 8; const unsigned char f6x8[][6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// ! 0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// " 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// # 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// % 0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// & 0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// ' 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// ( 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// ) 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// * 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// + 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// , 0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// . 0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// / 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1 0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4 0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6 0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7 0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9 0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// : 0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ; 0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// < 0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// = 0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// > 0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ? 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @ 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R 0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W 0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X 0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y 0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [ 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ] 0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _ 0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// ' 0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b 0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d 0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n 0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r 0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w 0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines }; //延时函数 void delay_ms(uchar n) { uint i; for(i=n;i<(uint)(xtal*143-2);i++);//xtal为晶振大小,单位为MHz } void delay_us(uint a) { uint i; for(i = 0;i < a;i++) { asm("nop"); } } /*------------------------------------------------------- 注意: 该模块不和5.0V接口兼容,所以请大家在使用的时候一定 要小心,别直接接到5V的系统上去,接5V 系统时,应串接 3.3K电阻,电源依然是3.3V。 所用模块为4线SPI:每个数据长度均为8位,在SCLK的上升沿,数 据从SDIN移入到SSD1306,并且是高位在前的 D0 -> PB5 串行时钟线SCLK D1 -> PB3 串行数据线SDIN RES -> PC6 硬复位OLED D/C -> PB1 命令/数据标志(0,读写命令;1,读写数据) CS -> PB2 OLED片选信号(高电平有效) -------------------------------------------------------*/ //---------------宏定义--------------------------------- //SCLK #define SCLK_high (PORTB |= (1<<PB5)) #define SCLK_low (PORTB &=~(1<<PB5)) // SDIN #define DSDIN_high (PORTB |= (1<<PB3)) #define DSDIN_low (PORTB &=~(1<<PB3)) #define RES_high (PORTC |= (1<<PC6)) #define RES_low (PORTC &=~(1<<PC6)) //写数据 #define DC_high (PORTB |= (1<<PB1)) //写命令 #define DC_low (PORTB &=~(1<<PB1)) //------------------------------------------------------ //端口初始化 void port_init(void) { DDRC = 0xff; PORTC = 0x00; PORTC |= 0x40; DDRB = 0xff; PORTB = 0x2f; //PORTB |=(1<<PB1); /* SCLK_high; DSDIN_high; DC_low; RES_high; */ } //向Oled写入数据 void Oled_WR_Data(uchar data) { uchar i; uchar temp = 0; DC_high; //写数据 SCLK_low; for(i=0;i<8;i++) { temp =data & 0x80; // SCLK_high;//高位在前 if(temp==0) { DSDIN_low; } else { DSDIN_high; } SCLK_high; delay_us(10); SCLK_low; data <<= 1; } // DSDIN_high; } //向Oled写入命令 void Oled_WR_Cmd(uchar cmd) { uchar i; uchar temp = cmd & 0x80; DC_low; //写命令 SCLK_low; for(i=0;i<8;i++) { // SCLK_high; //高位在前 if(temp==0) { DSDIN_low; } else { DSDIN_high; } SCLK_high; delay_us(10); SCLK_low; cmd <<= 1; } // DSDIN_high; } //满屏 void Oled_Fill(uchar dat) { uchar x,y; for(y=0;y<8;y++) { Oled_WR_Cmd(0xb0 + y); Oled_WR_Cmd(0x01); Oled_WR_Cmd(0x10); for(x=0;x<128;x++) Oled_WR_Data(dat); } } //清屏 void Oled_Cls(void) { uchar x,y; for(y=0;y<8;y++) { Oled_WR_Cmd(0xb0 + y); Oled_WR_Cmd(0x01); Oled_WR_Cmd(0x10); for(x=0;x<128;x++) Oled_WR_Data(0); } } //初始光标位置 void Oled_Set_Pos(uchar x,uchar y) { Oled_WR_Cmd(0xb0 + y); Oled_WR_Cmd(((x & 0xf0)>>4)|0x10); Oled_WR_Cmd((x & 0x0f)|0x01); } // OLED的初始化 void Oled_init(void) { SCLK_high; RES_low; delay_ms(100); RES_high; //从上电到下面开始初始化要有足够的时间,即等待RC复位完毕 Oled_WR_Cmd(0xae);//关闭显示 Oled_WR_Cmd(0x00);//---set low column address Oled_WR_Cmd(0x10);//---set high column address Oled_WR_Cmd(0x40);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F) Oled_WR_Cmd(0x81);//--对比度设置 Oled_WR_Cmd(0xcf); // Set SEG Output Current Brightness Oled_WR_Cmd(0xa1);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 Oled_WR_Cmd(0xc8);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 Oled_WR_Cmd(0xa6);//--set normal display Oled_WR_Cmd(0xa8);//设置驱动路数(1 to 64) Oled_WR_Cmd(0x3f);//--1/64 默认0X3F Oled_WR_Cmd(0xd3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F) Oled_WR_Cmd(0x00);//-not offset Oled_WR_Cmd(0xd5);//--set display clock divide ratio/oscillator frequency Oled_WR_Cmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec Oled_WR_Cmd(0xd9);//设置预充电周期 Oled_WR_Cmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock Oled_WR_Cmd(0xda);//--set com pins hardware configuration Oled_WR_Cmd(0x12); Oled_WR_Cmd(0xdb);//--set vcomh Oled_WR_Cmd(0x40);//Set VCOM Deselect Level Oled_WR_Cmd(0x20);//设置内存地址模式 (0x00/0x01/0x02) Oled_WR_Cmd(0x02);// Oled_WR_Cmd(0x8d);//电荷泵设置 Oled_WR_Cmd(0x14);//--set(0x10) disable Oled_WR_Cmd(0xa4);// Disable Entire Display On (0xa4/0xa5) Oled_WR_Cmd(0xa6);// Disable Inverse Display On (0xa6/a7) Oled_WR_Cmd(0xaf);//--开启显示 Oled_Fill(0xff); //Oled_Cls(); //初始清屏 Oled_Set_Pos(0,0);//初始位置 } void Oled_6x8_Str(uchar x,uchar y,uchar ch) { uchar c=0,i=0,j=0; while (ch) { ch -= 32; if(x > 126) { x = 0; y++; } Oled_Set_Pos(x,y); for(i=0;i<6;i++) Oled_WR_Data(f6x8[ch][i]); x += 6; j ++; } } void main(void) { port_init(); Oled_init(); Oled_Fill(0xff); // while(1) // { // if((PINB&(1<<PB0))==0) // { // while(!(PINB&(1<<PB0))); // if(count>=10) // count = 0; // else // count += 1; // } // delay_ms(5000); // Oled_Cls(); // Oled_6x8_Str(2,2,count); // delay_ms(5000); // Oled_Fill(0x00); // } } ```
怎样禁止atmega16a通电自动复位
想存储数据在EEPROM,又不想用外部存储,每次通电好像都是自动复位了数据丢了。 还有要吐槽的是,读EEPROM的使能EERE好像不好使。 熔丝 SUT 11 时钟源设置外部晶振12M。
ATMEGA64A-AU的使用问题
![图片说明](https://img-ask.csdn.net/upload/201612/14/1481709369_699343.png) ![图片说明](https://img-ask.csdn.net/upload/201612/14/1481709383_159921.png) 更换成3.3V供电后,又正常了。
AVR单片机 驱动SS1306 SPI模式点不亮屏幕
网上到处都是51 和stm32的例程,AVR的完全找不到,移植了51的例程, 但是就是点不亮oled。主芯片是atmega128 走的是spi模式。程序代码如下,不用库单独画点都完全没反应,实在找不出是啥子原因。跪求解答 ``` #include <iom128.h> #include <delay.h> #include <oledfont.h> //8位LED灯控制端口定义,连接在PE口,灌电流模式 #define LED PORTE //PE口接8个LED灯 #define LEDDDR DDRE //PE口方向寄存器 #define LED4_0 PORTE &= ~(1<<PE3) //D4亮 #define LED4_1 PORTE |= (1<<PE3) //D4灭 #define u8 unsigned char #define u32 unsigned int #define OLED_CMD 0 //写命令 #define OLED_DATA 1 //写数据 #define OLED_RST_Clr() PORTE &= ~(1 << PE6) #define OLED_RST_Set() PORTE |= (1 << PE6) #define OLED_DC_Clr() PORTE &= ~(1 << PE5) #define OLED_DC_Set() PORTE |= (1 << PE5) #define OLED_SCLK_Clr() PORTB &= ~(1 << PB1) #define OLED_SCLK_Set() PORTB |= (1 << PB1) #define OLED_SDIN_Clr() PORTB &= ~(1 << PB2) #define OLED_SDIN_Set() PORTB |= (1 << PB2) #define SIZE 16 #define XLevelL 0x02 #define XLevelH 0x10 #define Max_Column 128 #define Max_Row 64 #define Brightness 0xFF #define X_WIDTH 128 #define Y_WIDTH 64 u8 OLED_GRAM[8][128]; //8页 128列 void OLED_WR_Byte(u8 dat,u8 cmd); void OLED_Set_Pos(unsigned char x, unsigned char y) ; void OLED_Set_Pos(unsigned char x, unsigned char y) ; void OLED_Display_On(void); void OLED_Display_Off(void); void OLED_Clear(void); void OLED_DrawPoint(u8 x,u8 y,u8 t); void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot); void OLED_ShowChar(u8 x,u8 y,u8 chr); void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2); void OLED_ShowString(u8 x,u8 y, u8 *p); void OLED_Set_Pos(unsigned char x, unsigned char y); void OLED_ShowCHinese(u8 x,u8 y,u8 no); void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]); void OLED_Init(void); void system_init(); void Print_Point(u8 x, u8 y,u8 checkedState); void system_init() { LEDDDR=0xff; //设置PE口为输出 LED=0xff; //初始状态为高,关闭8个LED灯 } //向SSD1306写入一个字节单位 //dat:要写入的数据/命令 //cmd:数据/命令标志 0命令 1数据 void OLED_WR_Byte(u8 dat,u8 cmd) { u8 i; if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); //OLED_CS_Clr(); for(i=0;i<8;i++) { OLED_SCLK_Clr(); if(dat&0x80) { OLED_SDIN_Set(); } else OLED_SDIN_Clr(); OLED_SCLK_Set(); dat<<=1; } //OLED_CS_Set(); OLED_DC_Set(); } void OLED_Set_Pos(unsigned char x, unsigned char y) //坐标位置 { OLED_WR_Byte(0xb0+y,OLED_CMD);//页 OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//高四位 OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD); //低四位 } //开启OLED显示 void OLED_Display_On(void) { OLED_WR_Byte(0X8D,OLED_CMD); //电荷泵设置 OLED_WR_Byte(0X14,OLED_CMD); //打开电荷泵 OLED_WR_Byte(0XAF,OLED_CMD); //开启显示 } //关闭OLED显示 void OLED_Display_Off(void) { OLED_WR_Byte(0X8D,OLED_CMD); OLED_WR_Byte(0X10,OLED_CMD);//关 A2 OLED_WR_Byte(0XAE,OLED_CMD); } //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! void OLED_Clear(void) { u8 i,n; for(i=0;i<8;i++) { OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7) OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址 OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); } //更新显示 } //在指定位置显示一个字符,包括部分字符 //x:0~127 //y:0~63 //mode:0,反白显示;1,正常显示 //size:选择字体 16/12 void OLED_ShowChar(u8 x,u8 y,u8 chr) { unsigned char c=0,i=0; c=chr-' ';//得到偏移后的值 if(x>Max_Column-1){x=0;y=y+2;} if(SIZE ==16) { OLED_Set_Pos(x,y); for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); OLED_Set_Pos(x,y+1); for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); } else { OLED_Set_Pos(x,y+1); for(i=0;i<6;i++) OLED_WR_Byte(F6x8[c][i],OLED_DATA); } } //m^n函数 u32 oled_pow(u8 m,u8 n) { u32 result=1; while(n--)result*=m; return result; } //显示2个数字 //x,y :起点坐标 //len :数字的位数 //size:字体大小 //mode:模式 0,填充模式;1,叠加模式 //num:数值(0~4294967295); void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2) { u8 t,temp; u8 enshow=0; for(t=0;t<len;t++) { temp=(num/oled_pow(10,len-t-1))%10; if(enshow==0&&t<(len-1)) { if(temp==0) { OLED_ShowChar(x+(size2/2)*t,y,' '); //OLED_ShowChar(x+(size2/2)*t,y,' ',size2);//IIC程序中的 continue; }else enshow=1; } OLED_ShowChar(x+(size2/2)*t,y,temp+'0'); } } //显示一个字符号串 void OLED_ShowString(u8 x,u8 y,u8 *chr) { unsigned char j=0; while (chr[j]!='\0') { OLED_ShowChar(x,y,chr[j]); x+=8; if(x>120){x=0;y+=2;} j++; } } //显示汉字 void OLED_ShowCHinese(u8 x,u8 y,u8 no) { u8 t,adder=0; OLED_Set_Pos(x,y); for(t=0;t<16;t++) { OLED_WR_Byte(Hzk[2*no][t],OLED_DATA); adder+=1; } OLED_Set_Pos(x,y+1); for(t=0;t<16;t++) { OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA); adder+=1; } } /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/ void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]) { unsigned int j=0; unsigned char x,y; if(y1%8==0) y=y1/8; else y=y1/8+1; for(y=y0;y<y1;y++) { OLED_Set_Pos(x0,y); for(x=x0;x<x1;x++) { OLED_WR_Byte(BMP[j++],OLED_DATA); } } } void Print_Point(u8 x, u8 y,u8 checkedState) { OLED_Set_Pos(x,y); if(checkedState == 1) { OLED_WR_Byte(0xC0,OLED_DATA); OLED_WR_Byte(0xC0,OLED_DATA); } else { OLED_WR_Byte(0x00,OLED_DATA); OLED_WR_Byte(0x00,OLED_DATA); } } //初始化SSD1306 void OLED_Init(void) { //OLED_CS_Set(); OLED_RST_Set(); delay_ms(100); OLED_RST_Clr(); delay_ms(100); OLED_RST_Set(); OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel OLED_WR_Byte(0x00,OLED_CMD);//---set low column address低列地址 OLED_WR_Byte(0x10,OLED_CMD);//---set high column address高列地址 OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)起始行地址 OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register对比度 OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness对比度/亮度值 OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display A6:正常/A7:反相 OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)驱动路数 OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty驱动路数值 OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)设置显示偏移 OLED_WR_Byte(0x00,OLED_CMD);//-not offset设置显示偏移值 OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency 设置时钟分频因子,震荡频率 OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period设置预充电周期 OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration设置COM硬件引脚配置 OLED_WR_Byte(0x12,OLED_CMD); OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh设置VCOMH倍率 //OLED_WR_Byte(0x30,OLED_CMD);//Set VCOM Deselect Level OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)设置内存地址模式 OLED_WR_Byte(0x02,OLED_CMD);//[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10; OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable电荷泵设置///////////手册上没找到 OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disablebit2,开启/关闭 OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏) OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) 设置显示方式;bit0:1,反相显示;0,正常显示 OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel开启显示 OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ OLED_Clear(); //OLED_Set_Pos(0,0); } int main(void) { // u8 t; system_init(); OLED_Init(); // OLED_Clear(); // OLED_ShowString(30,0,"OLED TEST"); // OLED_ShowString(8,2,"ZHONGJINGYUAN"); // OLED_ShowString(20,4,"2014/05/01"); // OLED_ShowString(0,6,"ASCII:"); // OLED_ShowString(63,6,"CODE:"); // t=' '; OLED_Display_On(); delay_ms(10000); while(1) { Print_Point(3,5,1); LED = 0xFF; PORTE &= ~(1<<PE3); OLED_Clear(); OLED_ShowCHinese(0,0,0);//中 OLED_ShowCHinese(18,0,1);//景 OLED_ShowCHinese(36,0,2);//园 OLED_ShowCHinese(54,0,3);//电 OLED_ShowCHinese(72,0,4);//子 OLED_ShowCHinese(90,0,5);//科 OLED_ShowCHinese(108,0,6);//技 } } ```
atmega128 相位修正pwm OC1C和OC3C不能输出
初始化代码如下 void pwm1_init() { TCCR1B=0X00;//STOP TCNT1H=0X00; TCNT1L=0X00; ICR1H=0X24;//SET TOP ICR1L=0; OCR1AH=0X02; OCR1AL=0XEE; OCR1BH=0X02; OCR1BL=0XEE; OCR1CH=0X02; OCR1CL=0XEE;//initial TCCR1A|=(1<<WGM31);//WGM3:0=1010 to set top=9216 TCCR1A|=BIT(COM3A1)|BIT(COM3B1);//OC1A AND OC1B: NORMAL OUTPUT TCCR1B|=(1<<CS31)|(1<<WGM33);//PRESCALE 8 PORTB|= 0X80;//WHEN PB7=1 OC2||OC1C DDRB|=0B11100000; } …… void pwm3_init() { TCCR3B=0X00;//STOP TCNT3H=0X00; TCNT3L=0X00; OCR3AH=0X24; OCR3AL=0X00;//set top OCR3BH=0X02; OCR3BL=0XEE; OCR3CH=0X02; OCR3CL=0XEE;//initial TCCR3A|=(3<<WGM30);//WGM3:0=1010 to set top=9216 TCCR3A|=BIT(COM3A1)|BIT(COM3B1);//OC1A AND OC1B: NORMAL OUTPUT TCCR3B|=(1<<CS31)|(1<<WGM33);//PRESCALE 8 PORTE|=0B00110000; DDRE|=0B00110000; } 写入单片机实验以后,发现OC1C和OC3C都不能输出。我已经尝试不同板子,都不行。现在最怀疑是端口复用了,此外还可能是ICCAVR编译环境的问题,求大神解答!!
AVR单片机用ISP下载程序时提示无法进入编程模式,读不到设备地址
用的新的ATMEGA32A芯片,给AVR单片机下载程序时能读到电压值但是读不到设备地址,无法进入编程模式,在连接到单片机前,要先设置熔丝位这些吗?
AVR单片机定时器中断1s不准是怎么回事?
我的开发板是ATMEGA16的,用定时器1进行1s的定时,外部晶振是11.059M,256分频,计算得出初值为0x5740,然后计数60次进行1分钟的定时,控制小灯亮1分钟暗分钟,但是结果总是在55秒时小灯就变换一次,熔丝位配置为1111,会是啥问题呢,想不明白。
如何实现单片机与PC之间的通信
想用opencv编写识别程序,与atmega128通讯,来控制机械臂抓取物体 用一根USB串口转接线连接单片机和笔记本电脑 怎么实现通讯(单独编程?还是可以安装什么软件?) 求大神们帮帮忙~万分感谢
Atmel studio 6.0 编译之后PWM无输出,求大神指点
使用的是atmega48芯片,程序如下: #include <avr/io.h> #include <avr/iomx8.h> #include <avr/interrupt.h> #define F_CPU 8000000UL #include <avr/wdt.h> #include <util/delay.h> #define uchar unsigned char #define uint unsigned int //控制单个io口 省略 uint a; //各端口初始化 void PORT_INIT(void) { DDRD=(1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD6)|(1<<PD7); //PD2,PD3,PD4,PD7,PD6为输出端口 PORTD=0x00; DDRC=(1<<PC3)|(1<<PC4)|(1<<PC5); // 将AD转换口设置成输入 PORTC=0x00; // 不带上拉电阻 DDRB=(1<<PB1)|(1<<PB2) |(1<<PB3)|(1<<PB4)|(1<<PB5); //PORTB口的PB0,PB1,PB2设为输出口,其它为输入口 PORTB=0x00;//不带上拉电阻 } void USART0_INIT(void) { cli(); //关总中断; UCSR0B=0x00; //关闭USART0,包括使能和中断 UCSR0A=0x00; //不使用倍速发送 UCSR0C=(1<<UCSZ01)|(1<<UCSZ00); //字符长度为8位,1位停止位,无校验位 UBRR0L=103; //波特率的计算,此为8M的数值,4M时为51; UBRR0H=0; UCSR0B=(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); //接收使能和发送使能,开接收中断使能 sei(); //开总中断 } void time0_init() { TCCR0A=(1<<COM0A1)|(1<<WGM01)|(WGM00);//快速PWM模式 TCCR0B=(1<<CS00);//无分频,启动时钟 OCR0A=0x60; LEDG0; } void time1_init() { TCCR1A=(1<<COM1B1)|(WGM10); TCCR1B=(1<<WGM12)|(1<<CS10);//wu分频、8位快速PWM OCR1B=0xd9; LEDR0; } void time2_init() { TCCR2A=(1<<COM2B1)|(1<<WGM21)|(WGM20); TCCR2B=(1<<CS20); OCR2B=0x0b; LEDY0; } int main(void) { uint ADD_AVE,MUX; //AD转换后得到的数据 uint i=0; a=0; PORT_INIT(); //USART0_INIT(); wdt_enable(WDTO_2S); wdt_reset(); PWM0;LEDG1;LEDR1;LEDY1;wdt_reset(); _delay_ms(1000);wdt_reset(); _delay_ms(1000);wdt_reset(); _delay_ms(1000);wdt_reset(); while(1) { if (a==0) { a=1; time0_init(); time1_init(); time2_init(); } OCR2B=20; wdt_reset(); } } 之前也做了许多程序没有问题,不知道怎么了之后重新编译之后都不能输出pwm 各种尝试没有结果,泪目...
关于atmga8a的问题~这里有一个RHF格式的固件但是不知道怎么将它烧到单片机中去
文件的开头部分,接下来就是一段代码 [Header] Product Name = School Kits 2014 USB 5port Release Date = 2014-05-15 Release Version = 1.0 Line Count = 513 Object Count = 8193 Control Data L1 = 05d3 Control Data L2 = 05c7 Control Data L3 = 06ed Device = ATmega8 EEPROM = False Description = [EEPROM] [Body]
用C++面向对象的方法访问硬件资源
最近在开发一个基于ATMega2560的单片机系统,因为外围模块比较多, 同时也想以后开发其它板子时,能够稍微修改上一次的代码就可以适用到新板子, 查阅很多资料后,发现APM飞控就是用这样的一种思想:硬件抽象层;还有就是Android系统也使用了硬件抽象层的概念,这样的设计可以极大地提高兼容性。然而当我仔细研究APM的源码之后,我发现我找不到任何访问硬件的信息,难道C++不能直接访问硬件吗?在这里提问,希望各位师兄师姐,给位大神,牛人能够不吝赐教,小生感激不尽!在此先谢过大家了~~~
关于arduino怎么连接两个RFID模块的问题
毕业设计我要做一个基于rfid的巡更系统,为此我要连接至少两个的RFID读写模块。 但网上的示例都是只用一个的,引脚的插得位置也是一样的,我不太清楚引脚都是怎么定义的。 我用的是mfrc522的模块。 以下面代码为例,我只知道#define RST_PIN 9 和#define SS_PIN 10 是定义RST和SS引脚的,但剩下的SCK MOSI MISO 是怎么定义的。本来我以为剩下的是可以公用的,就用一个面包板连接起来,但发现不行。 现在可能是要定义这些的引脚,但我不知道哪部分代码是定义这些引脚的。 求大神指点一下。 ``` #include <SPI.h> #include <MFRC522.h> #define RST_PIN 9 // 可配置,见典型引脚布局以上 #define SS_PIN 10 // Configurable, see typical pin layout above MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance /* Set your new UID here! */ #define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF} MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); // Initialize serial communications with the PC 初始化与PC串行通信 while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4) 如果没有串口打开,什么也不做(添加基于atmega32u4 Arduinos) SPI.begin(); // Init SPI bus 初始化SPI总线 mfrc522.PCD_Init(); // Init MFRC522 card Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!")); //警告:这个例子改写你的UID变卡UID,小心使用! // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory. 准备关键所有按键都设置在芯片ffffffffffff H从工厂交货。 for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } } // Setting the UID can be as simple as this: 设置UID可以这么简单: //void loop() { // byte newUid[] = NEW_UID; // if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) { // Serial.println("Wrote new UID to card."); // } // delay(1000); //} // But of course this is a more proper approach 当然,这是一个更恰当的方法 void loop() { // Look for new cards, and select one if present 寻找新卡,并选择一个如果存在 if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { delay(50); return; } // Now a card is selected. The UID and SAK is in mfrc522.uid.现在选择卡片。UID和SAK是mfrc522.uid。 // Dump UID转储的UID Serial.print(F("Card UID:")); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); // Dump PICC type 转为PICC类型 // MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); // Serial.print(F("PICC type: ")); // Serial.print(mfrc522.PICC_GetTypeName(piccType)); // Serial.print(F(" (SAK ")); // Serial.print(mfrc522.uid.sak); // Serial.print(")\r\n"); // if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI // && piccType != MFRC522::PICC_TYPE_MIFARE_1K // && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { // Serial.println(F("This sample only works with MIFARE Classic cards.")); // return; // } // Set new UID 设置新的UID byte newUid[] = NEW_UID; if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) { Serial.println(F("Wrote new UID to card.")); } // Halt PICC and re-select it so DumpToSerial doesn't get confused / /停止PICC和重新选择那么DumpToSerial不混乱 mfrc522.PICC_HaltA(); if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { return; } // Dump the new memory contents 转为新的内容储存 Serial.println(F("New UID and contents:")); mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); delay(2000); } ```
arduino mega 2560+ SD shield +vc0706 TTL摄像头模组 “camera not found”找不到摄像头是什么问题?
mega 2560的板子参考Adafruit vc0706类库的snapshot例程 想实现摄像头拍照并储存在sd卡这一功能 camera接serial1,sd卡接线cs-53,sck-52, mosi-51, miso-50 运行程序,报错“camera not found” 代码部分: ``` // This is a basic snapshot sketch using the VC0706 library. // On start, the Arduino will find the camera and SD card and // then snap a photo, saving it to the SD card. // Public domain. // If using an Arduino Mega (1280, 2560 or ADK) in conjunction // with an SD card shield designed for conventional Arduinos // (Uno, etc.), it's necessary to edit the library file: // libraries/SD/utility/Sd2Card.h // Look for this line: // #define MEGA_SOFT_SPI 0 // change to: // #define MEGA_SOFT_SPI 1 // This is NOT required if using an SD card breakout interfaced // directly to the SPI bus of the Mega (pins 50-53), or if using // a non-Mega, Uno-style board. #include <Adafruit_VC0706.h> #include <SPI.h> #include <SD.h> // comment out this line if using Arduino V23 or earlier #include <SoftwareSerial.h> // uncomment this line if using Arduino V23 or earlier // #include <NewSoftSerial.h> // SD card chip select line varies among boards/shields: // Adafruit SD shields and modules: pin 10 // Arduino Ethernet shield: pin 4 // Sparkfun SD shield: pin 8 // Arduino Mega w/hardware SPI: pin 53 // Teensy 2.0: pin 0 // Teensy++ 2.0: pin 20 #define chipSelect 53 // Pins for camera connection are configurable. // With the Arduino Uno, etc., most pins can be used, except for // those already in use for the SD card (10 through 13 plus // chipSelect, if other than pin 10). // With the Arduino Mega, the choices are a bit more involved: // 1) You can still use SoftwareSerial and connect the camera to // a variety of pins...BUT the selection is limited. The TX // pin from the camera (RX on the Arduino, and the first // argument to SoftwareSerial()) MUST be one of: 62, 63, 64, // 65, 66, 67, 68, or 69. If MEGA_SOFT_SPI is set (and using // a conventional Arduino SD shield), pins 50, 51, 52 and 53 // are also available. The RX pin from the camera (TX on // Arduino, second argument to SoftwareSerial()) can be any // pin, again excepting those used by the SD card. // 2) You can use any of the additional three hardware UARTs on // the Mega board (labeled as RX1/TX1, RX2/TX2, RX3,TX3), // but must specifically use the two pins defined by that // UART; they are not configurable. In this case, pass the // desired Serial object (rather than a SoftwareSerial // object) to the VC0706 constructor. // Using SoftwareSerial (Arduino 1.0+) or NewSoftSerial (Arduino 0023 & prior): #if ARDUINO >= 100 // On Uno: camera TX connected to pin 2, camera RX to pin 3: //SoftwareSerial cameraconnection = SoftwareSerial(2, 3); // On Mega: camera TX connected to pin 69 (A15), camera RX to pin 3: //SoftwareSerial cameraconnection = SoftwareSerial(69, 3); #else NewSoftSerial cameraconnection = NewSoftSerial(2, 3); #endif //Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection); // Using hardware serial on Mega: camera TX conn. to RX1, // camera RX to TX1, no SoftwareSerial object is required: Adafruit_VC0706 cam = Adafruit_VC0706(&Serial1); void setup() { // When using hardware SPI, the SS pin MUST be set to an // output (even if not connected or used). If left as a // floating input w/SPI on, this can cause lockuppage. #if !defined(SOFTWARE_SPI) #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) if(chipSelect != 53) pinMode(53, OUTPUT); // SS on Mega #else if(chipSelect != 10) pinMode(10, OUTPUT); // SS on Uno, etc. #endif #endif Serial1.begin(38400); //vc0706默认波特率38400我没改 Serial.begin(9600); Serial.println("VC0706 Camera snapshot test"); // see if the card is present and can be initialized: if (!SD.begin(chipSelect)) { Serial.println("Card failed, or not present"); // don't do anything more: return; } // Try to locate the camera if (cam.begin()) { Serial.println("Camera Found:"); } else { Serial.println("No camera found?"); return; } // Print out the camera version information (optional) char *reply = cam.getVersion(); if (reply == 0) { Serial.print("Failed to get version"); } else { Serial.println("-----------------"); Serial.print(reply); Serial.println("-----------------"); } // Set the picture size - you can choose one of 640x480, 320x240 or 160x120 // Remember that bigger pictures take longer to transmit! cam.setImageSize(VC0706_640x480); // biggest //cam.setImageSize(VC0706_320x240); // medium //cam.setImageSize(VC0706_160x120); // small // You can read the size back from the camera (optional, but maybe useful?) uint8_t imgsize = cam.getImageSize(); Serial.print("Image size: "); if (imgsize == VC0706_640x480) Serial.println("640x480"); if (imgsize == VC0706_320x240) Serial.println("320x240"); if (imgsize == VC0706_160x120) Serial.println("160x120"); Serial.println("Snap in 3 secs..."); delay(3000); if (! cam.takePicture()) Serial.println("Failed to snap!"); else Serial.println("Picture taken!"); // Create an image with the name IMAGExx.JPG char filename[13]; strcpy(filename, "IMAGE00.JPG"); for (int i = 0; i < 100; i++) { filename[5] = '0' + i/10; filename[6] = '0' + i%10; // create if does not exist, do not open existing, write, sync after write if (! SD.exists(filename)) { break; } } // Open the file for writing File imgFile = SD.open(filename, FILE_WRITE); // Get the size of the image (frame) taken uint16_t jpglen = cam.frameLength(); Serial.print("Storing "); Serial.print(jpglen, DEC); Serial.print(" byte image."); int32_t time = millis(); pinMode(8, OUTPUT); // Read all the data up to # bytes! byte wCount = 0; // For counting # of writes while (jpglen > 0) { // read 32 bytes at a time; uint8_t *buffer; uint8_t bytesToRead = min(32, jpglen); // change 32 to 64 for a speedup but may not work with all setups! buffer = cam.readPicture(bytesToRead); imgFile.write(buffer, bytesToRead); if(++wCount >= 64) { // Every 2K, give a little feedback so it doesn't appear locked up Serial.print('.'); wCount = 0; } //Serial.print("Read "); Serial.print(bytesToRead, DEC); Serial.println(" bytes"); jpglen -= bytesToRead; } imgFile.close(); time = millis() - time; Serial.println("done!"); Serial.print(time); Serial.println(" ms elapsed"); } void loop() { } ``` 求各位大佬看下什么问题
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方...
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
如何防止抄袭PCB电路板
目录 1、抄板是什么 2、抄板是否属于侵权 3、如何防止抄板 1、抄板是什么 抄板也叫克隆或仿制,是对设计出来的PCB板进行反向技术研究;目前全新的定义:从狭义上来说,抄板仅指对电子产品电路板PCB文件的提取还原和利用文件进行电路板克隆的过程;从广义上来说,抄板不仅包括对电路板文件提取、电路板克隆、电路板仿制等技术过程,而且包括对电路板文件进行修改(即改板)、对电子产品外形模具进行三维...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
相关热词 c# 引用mysql c#动态加载非托管dll c# 两个表数据同步 c# 返回浮点json c# imap 链接状态 c# 漂亮字 c# 上取整 除法 c#substring c#中延时关闭 c#线段拖拉
立即提问