第一范文网 - 专业文章范例文档资料分享平台

毕业设计-基于CAN总线和AVR单片机的网络型温度传感 - 图文

来源:用户分享 时间:2025/6/1 13:32:24 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

接入。使用内部电压参考源时,可以通过在 AREF 引脚外部并接一个电容来提高 ADC 的抗噪性能。

程序中采用 T/C0 比较匹配中断,每 2ms 中断一次。该定时中断作为 ADC自动触发转换的触发源信号。在 ADC 的初始化代码中,设置 ADC 时钟的分频系数为 32。系统4M 时钟经过64 分频产生7.3725/64MHz的 ADC 时钟,满足了逐次比较转换电路达到最大精度时,需要的 50kHz~200kHz 之间的采样时钟的要求。ADC 单端输入转换时间为 13 个 ADC 时钟周期,则一次 ADC 转换的时间为 13×64/7372.5KHz = 0.11ms。因此,2ms 的固定转换间隔时间远超出完成一次 ADC 的转换时间 0.11ms,不会影响 ADC 的转换过程,同时每秒内完成的 ADC 转换达 500 次。

在 ADC 转换完成中断服务中,把 ADC 转换结果换算成电压值,换算采用了整型数计算。为了保证计算产生不溢出,先将 adc_data 强行转换成长型,然后再乘 5000(这里假定AVcc参考电压为 5v) ,最后再除 1024,得出的结果就是对应的输入电压值.保证了换算的正确型。

ADC和T/C0的初始化函数的C语言实现如下所示,源代码有相应的注释:

- 29 -

/******************************************************************** *函数原型: port_init(void) *参数说明: 无 *返回值: 无 *说明: AVR单片机端口初始化 ********************************************************************/ void port_init(void) { DDRA = 0x00; PORTA = 0x00; } /******************************************************************** *函数原型: adc_init(void) *参数说明: 无 *返回值: 无 *说明: AVR单片机对内部ADC的初始化 ********************************************************************/ void adc_init(void)//dac初始化 { ADCSRA = 0x00; //disable adc ADMUX = 0x60; //select adc avcc 外部电源参考,数据左对齐,ADC0为输入; ACSR = 0x80; SFIOR&=0x1F; SFIOR|=0x60; //选择T/C0比较匹配中断为AD0 触发源 ADCSRA = 0xAD; } /******************************************************************** *函数原型: adc_isr(void) *参数说明: TXD_data1:存放转换结果的参数 *返回值: 无 *说明: ADC中断处理函数,用于提取中断完成后的数据 ********************************************************************/ #pragma interrupt_handler adc_isr:iv_ADC //ADC转换完成中断处理函数 void adc_isr(void)//ADC转换 { TXD_data1=ADCH; //转换结果值 } //初始化PA口为AD输入端口 - 30 -

/******************************************************************** *函数原型: timer0_comp_isr(void) *参数说明: time_2ms_ok:数据更新标志 *返回值: 无 *说明: 定时器处理函数,用于设置数据更新标志 ********************************************************************/ #pragma interrupt_handler timer0_comp_isr:20 void timer0_comp_isr(void) { time_2ms_ok=1; //数据更新标志 nop(); } /******************************************************************** *函数原型: init_devices(void) *参数说明: time_2ms_ok:数据更新标志 *返回值: 无 *说明: 设备初始化函数,用于初始化ADC、定时器T/C0和外部中断 ********************************************************************/ void init_devices(void) //系统的初始化 { //stop errant interrupts until set up CLI(); //关中断 port_init(); adc_init(); MCUCR = 0x00; //GICR = 0x40; GICR = 0x00; TCCR0=0x0B; //内部时钟,64分频(7.3725Mhz/64),CTC模式 TCNT0=0x00; OCR0=0xE6; TIMSK = 0x02; //使能T/C0比较中断 SEI(); //开中断 //all peripherals are now initialized }

- 31 -

4.4 LCM模块软件的设计

LCM模块的软件设计主要包括三大部分:LCD12864的初始化函数、LCD12864写数据和写命令函数、LCD12864显示字符函数。

各部分函数的代码和注释如下图所示:

/******************************************************************** *函数原型: void Write_Cmd(uchar cmd) *参数说明: cmd: 写入的命令参数; Lcdtemp:判忙标志 *返回值: 无 *说明: 该函数用于向LCM写命令 ********************************************************************/ void Write_Cmd(uchar cmd) { uchar lcdtemp = 0; LCD_RS_Status; LCD_RW_Read; LCD_DataIn; do //判忙 { LCD_ENABLE; NOP(); lcdtemp = LCD2MCU_Data; LCD_DISABLE; } while(lcdtemp & 0x80); LCD_DataOut; LCD_RW_Write; MCU2LCD_Data = cmd; LCD_ENABLE; NOP(); LCD_DISABLE; }

- 32 -

毕业设计-基于CAN总线和AVR单片机的网络型温度传感 - 图文.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c5xnpd7xp9l3x5if1kmzb_9.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top