河南师范大学本科毕业论文(设计)
附录三 元器件清单 名称 型号 备注 数量 在原理图上的标号 AVR单片机 Atmega16 1 固态继电器 GTJ24-2A 1 温度传感器 DS18B20 1 晶体振荡器 7.3728MHz 1 瓷片电容 30pF 2 电解电容 25V/10uF 4 排插 2x5 2 排插底座 2x5 1 插针底座 1x3 1 排线 1x3 1 插针 1x2 1 音频头 1 接线柱 1x2 2 铜柱 8 排线 1排6根 1 串口头 DB9 公头 1 水泥电阻 8W2K2 3 铜板 万用板 1
30
河南师范大学本科毕业论文(设计)
附录四 单片机程序
下位机程序 主程序
#include
/*包含相关头文件*/
#include
//全局变量声明
unsigned char Temp_H,Temp_L; //主函数 void main(void) {
float temp,a,b,c=0;
int middle,j,k,l; unsigned char f_to_p;
unsigned int i;
unsigned char t[6]; unsigned char *p; unsigned char tmp=0; Temp_H = 0;
Temp_L = 0; port_init(); pwm_init(); OCR=0;
port_1820(); Uart_Init();
//温度高位,低位,复位成功标志 //用于暂存读回的16位温度值 //用于存温度数值及单位 //端口初始化 //pwm初始化 //DS18B20对应单片机端口初始化 //波特率9600 初始化串口
31
河南师范大学本科毕业论文(设计)
while (1) {
for(k=0;k<=9;k++) {
ds1820_reset(); ds1820_start(); longdelay(); longdelay();
//读取温度数值,读得的温度值为16位
//复位D18B20 //启动一次转换
//等待转换结束
i = ds1820_read_temp(); //用于调试的原始温度数据
//i=0x07d0; //当温度为125oC时的i值
//i=0xff5e; //负10.125度 //i=0xfebe; //负20.125度 //i=0x0191; //正25.0625度 //i=0x0550; //正85度
if(i&0x8000) //判断温度正负 {
/温度为负时
//一个字长的温度值转换成两个字节,分別放在Temp_L,Temp_H中
Temp_L=(char)(i&0x00ff); //取i中的低8位 Temp_H=(char)((i&0xff00)>>8); //取i中的高8位
i=Temp_H; //高8位放回i中 i=(i<<8)|Temp_L; //低8位放回i中 temp=(float)(i*0.0625);
32
Temp_H = ~Temp_H; //负温度。取反加1 Temp_L = ~Temp_L;
asm(\ //清零进位位标志 Temp_L++; //温度低字节加1 if((SREG&0x01)!=0x01) //有进位吗? {
Temp_H++; //有进位,则温度高字节加1 }
河南师范大学本科毕业论文(设计)
middle=(int)(temp*100); //取整数带小数点后两位
t[0]=middle/10000+0x30; t[1]=(middle000)/1000+0x30; t[2]=(middle00)/100+0x30;
t[3]=0x2e; //value_1[3]为小数点存放单元 t[4]=(middle0)/10+0x30; t[5]=(middle)+0x30;
Uart_Transmit(0x2d); for(j=0;j<=5;j++) {
Uart_Transmit(t[j]); }
Uart_Transmit(0x0d); }
else {
//溫度為正 temp=(float)(i*0.0625);
middle=(int)(temp*100); t[0]=middle/10000+0x30; t[1]=(middle000)/1000+0x30; t[2]=(middle00)/100+0x30;
t[3]=0x2e; t[4]=(middle0)/10+0x30; t[5]=(middle)+0x30;
Uart_Transmit(0x2b); for(j=0;j<=5;j++) {
Uart_Transmit(t[j]); }
Uart_Transmit(0x0d);
}
//取整数带小数点后两位 //value_1[3]为小数点存放单元 33
河南师范大学本科毕业论文(设计)
} }
DS18B20函数 #include
#define DQ_IN DDRA &= ~(1 << PA7) #define DQ_OUT #define DQ_CLR
DDRA |= (1 << PA7)
/*设置输入*/ /*设置输出*/ /*置高电平*/
Uart_Transmit(0x24); //和上位机握手 for(l=0;l<=4;l++) {
Uart_Receive(); a=UDR-0x30; b=a*pow(10,l-2); c+=b; }
OCR=(20*c); //根据PID输出的控制调节占空比
}
PORTA &= ~(1 << PA7) /*置低电平*/
/*读了电平*/ /*中断标志缓存*/
#define DQ_SET PORTA |= (1 << PA7) #define DQ_R PINA & (1 << PA7)
unsigned char flag;
/*DS18B20复位函数*/
unsigned char ds1820_reset(void) {
unsigned char i; flag = SREG; CLI(); DQ_OUT;
/*中断保护*/ /*关中断*/
34