电子体温计的研制 33
开始启用/转换调用转换 结束数据转换数据存储返回图5-2 A/D转换子程序流程图
(3)将单片机输出值经过处理后在驱动液晶程序后显示温度值。
温度数据移入显示寄存器十位数 为0?百位数 为0?十位显示 符号百位显示 数据结束
图5-3 显示子程序流程图
电子体温计的研制 34
图5-4 仿真实验图
5.2 源程序
1、八线制:PC0-PC7为数据线,PD4/PD5/PD6控制JXD1602A的RS,RW,EN。 2、模块化编程。
*******************************************************************************/ (1)主程序
#include
uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void Display(uchar *p) //间隔5ms显示 {uchar i,sel=0x01; for(i=0;i<4;i++) {PORTD=sel;
PORTB=0xff-Table[p[i]]; delay_ms(2); sel=sel<<1; }
电子体温计的研制 35
}
uint adc_init() {
uint adc_data;
DDRA&=~BIT(PA0); //设置PA0口输入 PORTA&=~BIT(PA0); //设置PA0口输入
ADMUX=0X00;// 设置ADC选择寄存器 AVCC参考电压,ADC0输入 ADCSRA=0xE6;// 设置ADC控制寄存器ADC使能,ADC使能有效,125分频因子
ADCSRA|=BIT(ADSC); //开始ADC转换 while(!(ADCSR&(BIT(ADIF)))); //查询转换是否结束 adc_data=ADCL;//数据地位
adc_data=adc_data+ADCH*256; //数据 return(adc_data); }
void main(void) {
uint i,x,y,a[5];
Port_init();// 端口初始化
LCD_init(); // LCD初始化 LCD_clear();//清屏 delay_ms(30); LCD_clear();//清屏
DDRA=0x00; //设置A口为不带上拉输入;
PORTA=0x00;
DDRB=0xFF; //设置B口为推挽1输出; PORTB=0xFF;
ADMUX=0x00; //选择第一通道ADC1;
ADCSR=0xE6; //125K转换速率,自由转换模式;启动AD转换器;
delay_ms(200); //延时待系统稳定;
while (1) {
x=adc_init();
x=((long)x*5000)/1024; //转化为电压
电子体温计的研制 36
LCD_write_str(0,0,\
for(i=0;i<5;i++) //将电压值转换为字符数组 { y=(int)x;
a[0]=(y/1000)+0x30;
a[1]='.';
a[2]=(y00/100)+0x30; a[3]=(y0/10)+0x30; a[4]=(y)+0x30; } }
(2)NTC热敏电阻程序
#include #include #include #define uint unsigned int #define uchar unsigned char #define BIT(x) (1< void delay(uint n) { uint i,j; } LCD_write_char(5,1,a[0]); LCD_write_char(6,1,a[1]); LCD_write_char(7,1,a[2]); LCD_write_char(8,1,a[3]); LCD_write_char(9,1,a[4]); LCD_write_char(10,1,'V'); delay_ms(1); delay_ms(1); delay_ms(1); delay_ms(1); delay_ms(1); delay_ms(1); 电子体温计的研制 37 for(i=0;i //1602写程序 void write_com(uchar com) { PORTA&=~BIT(4) ; //PORTA&=~BIT(4); PORTA&=~BIT(5) ; //PORTA&=~BIT(5); PORTA&=~BIT(6); PORTB=com; PORTA|=BIT(6); //E上升沿读数据 delay(1); PORTA&=~BIT(6); } //ADC转换 void write_date(uchar date) { PORTA|=BIT(4); PORTA&=~BIT(5); PORTA&=~BIT(6); PORTB=date; PORTA|=BIT(6); delay(1); PORTA&=~BIT(6); uint ADC_date() { uint ad_date ; uchar dateH,dateL; DDRA&=~BIT(0); //置输入 PORTA&=~BIT(0); //不使能内部上拉电阻 ADMUX=0; // 取外部VCC为参考电压 ADCSRA|=BIT(7)|BIT(6)|BIT(2)|BIT(1)|BIT(0); //使能ADC,128分频 //ADCSRA=0xc7; ADCSRA|=BIT(6) ; //启动转换