|
做了一个气体压力传感器,板子去打样了,就先写写程序,运行在阿莫赠送的评估板上。
昨天为了没有外接电源而烧写错误,小郁闷一把。
用惯了CM3的库,突然想返璞归真一下,寄存器操作吧,清清爽爽的几行程序就搞定了。- #include <avr\io.h> // GCC的标准io.h
- #include <avr\iolgt8f0xa.h> // LGT的头文件
- #include <util\delay.h> // 使用WINAVR自带的演示函数,F_CPU设定正确后延时还是比较准的
- #include <stdio.h>
- #include <string.h>
- #include <avr\wdt.h>
- void _putchar(char c)
- {
- while((UCSR0A & (1 << UDRE0)) == 0);
- UDR0 = c;
- }
- void putstr(unsigned char* buf)
- {
- while (*buf)
- {
- _putchar(*buf);
- buf++;
- }
- }
- //初始化ADC,vref是参考源,LGT好像都是以VCC为参考源,所以这个参数写个0就可以,channl选择ADC0~ADC7
- int init_ADC(unsigned char vref,unsigned char channel)
- {
- ADCSRA = 0; //disable ADC
- DIDR0 = 0xFF; //disable digital port
- ADMUX = ((vref << 6) | channel);
- ADCSRA |= (1 << ADEN); //enable ADC
- return 0;
- }
- //单次读取ADC值
- int DrvADC_Convers(void)
- {
- int retval;
- ADCSRA |= (1 << ADSC); //enable conversion
- while(!(ADCSRA & (1 << ADIF)));
- ADCSRA |= (1 << ADIF); //clear ADC interrupt flag
- retval = ADCL;
- retval |= (ADCH << 8);
- return retval;
- }
- int main()
- {
- int ps = 0;
- unsigned char buf[32];
- // 设置内部RC校正系数
- OSCCAL = 0xa;
- // 设置主时钟分频系数
- CLKPR = 0x80; //先将分频数修改允许位置位
- CLKPR = 0x80; //再写入分频数,这里为16M不分频
- UCSR0A=0x00;
- UBRR0H=0x00;
- UBRR0L=0x67; //9600bps
- UCSR0B = 0x18; //0b00011000 允许:发送、接收
- UCSR0C = 0x0E; //0b00001110 数据帧格式:8,N,1
- DDRA = 0; //PORTA设定为输入高阻
- PORTA = 0;
- wdt_enable(WDTO_8S); //看门狗
- _delay_ms(250);
- init_ADC(0x00,0x00);
- putstr("READY!\r\n");
- wdt_reset();
- while(1)
- {
- _delay_ms(250);
- wdt_reset();
- memset((void *)buf, 0, 32);
- sprintf((void *)buf, "%d\r\n", DrvADC_Convers());
- putstr(buf);
- }
- }
复制代码 下面是AVRSTUDIO4.18的工程文件
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|