数字温度计课程设计
❶ 课程设计数字温度计 热敏晶体管传感AD转换电路
问题出在电源部分,你没搞清楚7107的特性,它是正负5V供电,在原来正电接1脚的基础上,负电接21脚(GND),另加一组5V,正电接21脚,负电接26脚;如果没有额外电源,也有折冲办法,但要加两个二极管、一个4069反相器芯片和一个电容,方法如图示:
❷ 单片机课程设计,数字温度计。
1.实验任务
用可调电阻调节电压值作为模拟温度的输入量,当温度低于30℃时,发出长嘀报警声和光报警,当温度高于60℃时,发出短嘀报警声和光报警。测量的温度范围在0-99℃。
2.电路原理图
(图)见插图
3.系统板上硬件连线
a)把“单片机系统”区域中的P1.0-P1.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。
b)把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。
c)把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。
d)把“单片机系统”区域中的P3.1与“模数转换模块”区域中的OE端子用导线相连接。
e)把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接。
f)把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。
g)把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上。
h)把“模数转换模块”区域中的IN0端子用导线连接到“三路可调电压模块”区域中的VR1端子上。
i)把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子上。
j)把“单片机系统”区域中的P3.6、P3.7用导线分别连接到“八路发光二极管指示模块”区域中的L1、L2上。
k)把“单片机系统”区域中的P3.5用导线连接到“音频放大模块”区域中的SPKIN端口上。
l)把“音频放大模块“区域中的SPKOUT插入音频喇叭。
四.C语言源程序
#include<AT89X52.H>
unsignedcharcodedispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsignedchardispbuf[8]={10,10,10,10,10,10,0,0};
unsignedchardispcount;
unsignedchargetdata;
unsignedinttemp;
unsignedchari;
sbitST=P3^0;
sbitOE=P3^1;
sbitEOC=P3^2;
sbitCLK=P3^3;
sbitLED1=P3^6;
sbitLED2=P3^7;
sbitSPK=P3^5;
bitlowflag;
bithighflag;
unsignedintcnta;
unsignedintcntb;
bitalarmflag;
voidmain(void)
{
ST=0;
OE=0;
TMOD=0x12;
TH0=0x216;
TL0=0x216;
TH1=(65536-500)/256;
TL1=(65536-500)%256;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;
ST=1;
ST=0;
while(1)
{
if((lowflag==1)&&(highflag==0))
{
LED1=0;
LED2=1;
}
elseif((highflag==1)&&(lowflag==0))
{
LED1=1;
LED2=0;
}
else
{
LED1=1;
LED2=1;
}
}
}
voidt0(void)interrupt1using0
{
CLK=~CLK;
}
voidt1(void)interrupt3using0
{
TH1=(65536-500)/256;
TL1=(65536-500)%256;
if(EOC==1)
{
OE=1;
getdata=P0;
OE=0;
temp=getdata*25;
temp=temp/64;
i=6;
dispbuf[0]=10;
dispbuf[1]=10;
dispbuf[2]=10;
dispbuf[3]=10;
dispbuf[4]=10;
dispbuf[5]=10;
dispbuf[6]=0;
dispbuf[7]=0;
while(temp/10)
{
dispbuf[i]=temp%10;
temp=temp/10;
i++;
}
dispbuf[i]=temp;
if(getdata<77)
{
lowflag=1;
highflag=0;
}
elseif(getdata>153)
{
lowflag=0;
highflag=1;
}
else
{
lowflag=0;
highflag=0;
}
ST=1;
ST=0;
}
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
if((lowflag==1)&&(highflag==0))
{
cnta++;
if(cnta==800)
{
cnta=0;
alarmflag=~alarmflag;
}
if(alarmflag==1)
{
SPK=~SPK;
}
}
elseif((lowflag==0)&&(highflag==1))
{
cntb++;
if(cntb==400)
{
cntb=0;
alarmflag=~alarmflag;
}
if(alarmflag==1)
{
SPK=~SPK;
}
}
else
{
alarmflag=0;
cnta=0;
cntb=0;
}
}
❸ 数字温度计课程设计 不能用单片机 我发愁了三四天了 都没有头绪 能帮我吗
呵呵 不要担心 你去找参考书吧
找op的参考书 就是运算放大器的参考书 有不用单片机的数字温度计
设计起来也不是很复杂
话说回来
现在单片机几毛钱一个为什么不用单片机呢?
❹ 数字温度计单片机课程设计
搜:
做而论道数字温度计
网络一下,即可。
❺ 急求!!!!数字温度计课程设计
说实话,要完全一样的现成答案在这里很难的,除非运气好碰到一个做过类似实例的人就给你了。
这个问题用单片机可以做,用可编程器件和VHDL编程也可以做。这我都会,但是要我花那多时间做好了然后用protel99se画好电路图给你,这根本不可能,谁搞那么累啊。
最好的办法还是自己到网上去搜,下载来改改试试,这样最快。 网上像数字温度计,数字频率计,数字秒表,数字定时器都很多的。
❻ 数字温度计单片机课程设计用74LS573驱动4位数码管
在proteus中用74hc573,做数码管显示的仿真。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint z);
uchar temp,aa,num,numwe,,shi,ge;
uint shu;
void init();
sbit la=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f , 0x06 , 0x5b , 0x4f ,
0x66 , 0x6d , 0x7d ,
0x07, 0x7f , 0x6f ,
0x77, 0x7c , 0x39 ,0x5e ,0x79 ,
0x71 ,0x00
};
void display(uchar ,uchar shi,uchar ge);
void main()
{
shu=219;
init();
while(1)
{
display(,shi,ge);
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar ,uchar shi,uchar ge)
{
wela=1;
P0=0xfe;
wela=0;
la=1;
P0=table[];
la=0;
delay(1);
wela=1;
P0=0xfd;
wela=0;
la=1;
P0=table[shi];
la=0;
delay(1);
wela=1;
P0=0xfb;
wela=0;
la=1;
P0=table[ge];
la=0;
delay(1);
}
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==2)
{
aa=0;
shu--;
if(shu==10)
{
TR0=0;
ET0=0;
}
=shu/100;
shi=shu%100/10;
ge=shu%10;
}
}
❼ 单片机课程设计-----数字温度计(要有原程序)
系统程序主要包括C程序主函数、DS18B20复位函数、DS18B20写字节函数、DS18B20读字节函数、温度计算转换函数、显示函数等等。
以下是DS18B20温度计C语言程序清单:
/*********************************************************************/
//
// DS18B20温度计C程序
// 2005.2.28通过调试
/*********************************************************************/
//使用AT89C2051单片机,12MHZ晶振,用共阳LED数码管
//P1口输出段码,P3口扫描
//#pragma src(d:\aa.asm)
#include "reg51.h"
#include "intrins.h" //_nop_();延时函数用
#define Disdata P1 //段码输出口
#define discan P3 //扫描口
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7; //温度输入口
sbit DIN=P1^7; //LED小数点控制
uint h;
//
//
//*******温度小数部分用查表法**********//
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//
uchar code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
/* 共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" */
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; // 列扫描控制字
uchar data temp_data[2]={0x00,0x00}; // 读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,一个运算暂存用
//
//
//
/***********11微秒延时函数**********/
//
void delay(uint t)
{
for(;t>0;t--);
}
//
/***********显示扫描函数**********/
scan()
{
char k;
for(k=0;k<4;k++) //四位LED扫描控制
{
Disdata=dis_7[display[k]];
if(k==1){DIN=0;}
discan=scan_con[k];delay(90);discan=0xff;
}
}
//
//
/***********18B20复位函数**********/
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();
DQ=0; //
delay(50); // 550us
DQ=1; //
delay(6); // 66us
presence=DQ; // presence=0继续下一步
}
delay(45); //延时500us
presence = ~DQ;
}
DQ=1;
}
//
//
/**********18B20写命令函数*********/
//向 1-WIRE 总线上写一个字节
void write_byte(uchar val)
{
uchar i;
for (i=8; i>0; i--) //
{
DQ=1;_nop_();_nop_();
DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DQ = val&0x01; //最低位移出
delay(6); //66us
val=val/2; //右移一位
}
DQ = 1;
delay(1);
}
//
/*********18B20读1个字节函数********/
//从总线上读取一个字节
uchar read_byte(void)
{
uchar i;
uchar value = 0;
for (i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ = 0; //
_nop_();_nop_();_nop_();_nop_(); //4us
DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us
if(DQ)value|=0x80;
delay(6); //66us
}
DQ=1;
return(value);
}
//
/***********读出温度函数**********/
//
read_temp()
{
ow_reset(); //总线复位
write_byte(0xCC); // 发Skip ROM命令
write_byte(0xBE); // 发读命令
temp_data[0]=read_byte(); //温度低8位
temp_data[1]=read_byte(); //温度高8位
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0x44); // 发转换命令
}
//
/***********温度数据处理函数**********/
work_temp()
{
uchar n=0; //
if(temp_data[1]>127)
{temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1;}//负温度求补码
display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//
display[3]=display[4]/100;
display[1]=display[4]%100;
display[2]=display[1]/10;
display[1]=display[1]%10;
if(!display[3]){display[3]=0x0A;if(!display[2]){display[2]=0x0A;}}//最高位为0时都不显示
if(n){display[3]=0x0B;}//负温度时最高位显示"-"
}
//
//
/**************主函数****************/
main()
{
Disdata=0xff; //初始化端口
discan=0xff;
for(h=0;h<4;h++){display[h]=8;}//开机显示8888
ow_reset(); // 开机先转换一次
write_byte(0xCC); // Skip ROM
write_byte(0x44); // 发转换命令
for(h=0;h<500;h++)
{scan();} //开机显示"8888"2秒
while(1)
{
read_temp(); //读出18B20温度数据
work_temp(); //处理温度数据
for(h=0;h<500;h++)
{scan();} //显示温度值2秒
}
}
//
//*********************结束**************************//
❽ 关于LCD数字显示温度计的课程设计,急,重赏
/*电子时钟源代码*/
#include<graphics.h>
#include<stdio.h>
#include<math.h>
#include<dos.h>
#define PI 3.1415926 /*定义常量*/
#define UP 0x4800 /*上移↑键:修改时间*/
#define DOWN 0x5000 /*下移↓键:修改时间*/
#define ESC 0x11b /*ESC键 : 退出系统*/
#define TAB 0xf09 /*TAB键 : 移动光标*/
/*函数声明*/
int keyhandle(int,int); /*键盘按键判断,并调用相关函数处理*/
int timeupchange(int); /*处理上移按键*/
int timedownchange(int); /*处理下移按键*/
int digithour(double); /*将double型的小时数转换成int型*/
int digitmin(double); /*将double型的分钟数转换成int型*/
int digitsec(double); /*将double型的秒钟数转换成int型*/
void digitclock(int,int,int ); /*在指定位置显示时钟或分钟或秒钟数*/
void drawcursor(int); /*绘制一个光标*/
void clearcursor(int);/*消除前一个光标*/
void clockhandle(); /*时钟处理*/
double h,m,s; /*全局变量:小时,分,秒*/
double x,x1,x2,y,y1,y2; /*全局变量:坐标值*/
struct time t[1];/*定义一个time结构类型的数组*/
main()
{
int driver, mode=0,i,j;
driver=DETECT; /*自动检测显示设备*/
initgraph(&driver, &mode, "");/*初始化图形系统*/
setlinestyle(0,0,3); /*设置当前画线宽度和类型:设置三点宽实线*/
setbkcolor(0);/*用调色板设置当前背景颜色*/
setcolor(9); /*设置当前画线颜色*/
line(82,430,558,430);
line(70,62,70,418);
line(82,50,558,50);
line(570,62,570,418);
line(70,62,570,62);
line(76,56,297,56);
line(340,56,564,56); /*画主体框架的边直线*/
/*arc(int x, int y, int stangle, int endangle, int radius)*/
arc(82,62,90,180,12);
arc(558,62,0,90,12);
setlinestyle(0,0,3);
arc(82,418,180,279,12);
setlinestyle(0,0,3);
arc(558,418,270,360,12); /*画主体框架的边角弧线*/
setcolor(15);
outtextxy(300,53,"CLOCK"); /*显示标题*/
setcolor(7);
rectangle(342,72,560,360); /*画一个矩形,作为时钟的框架*/
setwritemode(0); /*规定画线的方式。mode=0, 则表示画线时将所画位置的原来信息覆盖*/
setcolor(15);
outtextxy(433,75,"CLOCK");/*时钟的标题*/
setcolor(7);
line(392,310,510,310);
line(392,330,510,330);
arc(392,320,90,270,10);
arc(510,320,270,90,10); /*绘制电子动画时钟下的数字时钟的边框架*/
/*绘制数字时钟的时分秒的分隔符*/
setcolor(5);
for(i=431;i<=470;i+=39)
for(j=317;j<=324;j+=7){
setlinestyle(0,0,3);
circle(i,j,1); /*以(i, y)为圆心,1为半径画圆*/
}
setcolor(15);
line(424,315,424,325); /*在运行电子时钟前先画一个光标*/
/*绘制表示小时的圆点*/
for(i=0,m=0,h=0;i<=11;i++,h++){
x=100*sin((h*60+m)/360*PI)+451;
y=200-100*cos((h*60+m)/360*PI);
setlinestyle(0,0,3);
circle(x,y,1);
}
/*绘制表示分钟或秒钟的圆点*/
for(i=0,m=0;i<=59;m++,i++){
x=100*sin(m/30*PI)+451;
y=200-100*cos(m/30*PI);
setlinestyle(0,0,1);
circle(x,y,1);
}
/*在电子表的左边打印帮助提示信息*/
setcolor(4);
outtextxy(184,125,"HELP");
setcolor(15);
outtextxy(182,125,"HELP");
setcolor(5);
outtextxy(140,185,"TAB : Cursor move");
outtextxy(140,225,"UP : Time ++");
outtextxy(140,265,"DOWN: Time --");
outtextxy(140,305,"ESC : Quit system!");
outtextxy(140,345,"Version : 2.0");
setcolor(12);
outtextxy(150,400,"Nothing is more important than time!");
clockhandle();/*开始调用时钟处理程序*/
closegraph(); /*关闭图形系统*/
return 0; /*表示程序正常结束,向操作系统返回一个0值*/
}
void clockhandle()
{
int k=0,count;
setcolor(15);
gettime(t);/*取得系统时间,保存在time结构类型的数组变量中*/
h=t[0].ti_hour;
m=t[0].ti_min;
x=50*sin((h*60+m)/360*PI)+451; /*时针的x坐标值*/
y=200-50*cos((h*60+m)/360*PI); /*时针的y坐标值*/
line(451,200,x,y);/*在电子表中绘制时针*/
x1=80*sin(m/30*PI)+451; /*分针的x坐标值*/
y1=200-80*cos(m/30*PI); /*分针的y坐标值*/
line(451,200,x1,y1); /*在电子表中绘制分针*/
digitclock(408,318,digithour(h)); /*在数字时钟中,显示当前的小时值*/
digitclock(446,318,digitmin(m)); /*在数字时钟中,显示当前的分钟值*/
setwritemode(1);
/*规定画线的方式,如果mode=1,则表示画线时用现在特性的线
与所画之处原有的线进行异或(XOR)操作,实际上画出的线是原有线与现在规定
的线进行异或后的结果。因此, 当线的特性不变, 进行两次画线操作相当于没有
画线,即在当前位置处清除了原来的画线*/
for(count=2;k!=ESC;){ /*开始循环,直至用户按下ESC键结束循环*/
setcolor(12);/*淡红色*/
sound(500);/*以指定频率打开PC扬声器,这里频率为500Hz*/
delay(700);/*发一个频率为500Hz的音调,维持700毫秒*/
sound(200);/*以指定频率打开PC扬声器,这里频率为200Hz*/
delay(300);
/*以上两种不同频率的音调,可仿真钟表转动时的嘀哒声*/
nosound(); /*关闭PC扬声器*/
s=t[0].ti_sec;
m=t[0].ti_min;
h=t[0].ti_hour;
x2=98*sin(s/30*PI)+451; /*秒针的x坐标值*/
y2=200-98*cos(s/30*PI); /*秒针的y坐标值*/
line(451,200,x2,y2);
/*绘制秒针*/
/*利用此循环,延时一秒*/
while(t[0].ti_sec==s&&t[0].ti_min==m&&t[0].ti_hour==h)
{ gettime(t);/*取得系统时间*/
if(bioskey(1)!=0){
k=bioskey(0);
count=keyhandle(k,count);
if(count==5) count=1;
}
}
setcolor(15);
digitclock(485,318,digitsec(s)+1);/*数字时钟增加1秒*/
setcolor(12); /*淡红色*/
x2=98*sin(s/30*PI)+451;
y2=200-98*cos(s/30*PI);
line(451,200,x2,y2);
/*用原来的颜色在原来位置处再绘制秒针,以达到清除当前秒针的目的*/
/*分钟处理*/
if(t[0].ti_min!=m){ /*若分钟有变化*/
/*消除当前分针*/
setcolor(15); /*白色*/
x1=80*sin(m/30*PI)+451;
y1=200-80*cos(m/30*PI);
line(451,200,x1,y1);
/*绘制新的分针*/
m=t[0].ti_min;
digitclock(446,318,digitmin(m)); /*在数字时钟中显示新的分钟值*/
x1=80*sin(m/30*PI)+451;
y1=200-80*cos(m/30*PI);
line(451,200,x1,y1);
}
/*小时处理*/
if((t[0].ti_hour*60+t[0].ti_min)!=(h*60+m)){ /*若小时数有变化*/
/*消除当前时针*/
setcolor(15); /*白色*/
x=50*sin((h*60+m)/360*PI)+451;/*50:时钟的长度(单位:像素),451:圆心的x坐标值*/
y=200-50*cos((h*60+m)/360*PI);
line(451,200,x,y);
/*绘制新的时针*/
h=t[0].ti_hour;
digitclock(408,318,digithour(h));
x=50*sin((h*60+m)/360*PI)+451;
y=200-50*cos((h*60+m)/360*PI);
line(451,200,x,y);
}
}
}
int keyhandle(int key,int count) /*键盘控制 */
{ switch(key)
{case UP: timeupchange(count-1); /*因为count的初始值为2,所以此处减1*/<br> break;<br> case DOWN:timedownchange(count-1); /*因为count的初始值为2,所以此处减1*/<br> break;<br> case TAB:setcolor(15);<br> clearcursor(count); /*清除原来的光标*/<br> drawcursor(count); /*显示一个新的光标*/<br> count++;<br> break;<br> }
return count;
}
int timeupchange(int count) /*处理光标上移的按键*/
{
if(count==1){
t[0].ti_hour++;
if(t[0].ti_hour==24) t[0].ti_hour=0;
settime(t); /*设置新的系统时间*/
}
if(count==2){
t[0].ti_min++;
if(t[0].ti_min==60) t[0].ti_min=0;
settime(t); /*设置新的系统时间*/
}
if(count==3){
t[0].ti_sec++;
if(t[0].ti_sec==60) t[0].ti_sec=0;
settime(t); /*设置新的系统时间*/
}
}
int timedownchange(int count) /*处理光标下移的按键*/
{
if(count==1) {
t[0].ti_hour--;
if(t[0].ti_hour==0) t[0].ti_hour=23;
settime(t);/*设置新的系统时间*/
}
if(count==2) {
t[0].ti_min--;
if(t[0].ti_min==0) t[0].ti_min=59;
settime(t);/*设置新的系统时间*/
}
if(count==3) {
t[0].ti_sec--;
if(t[0].ti_sec==0) t[0].ti_sec=59;
settime(t);/*设置新的系统时间*/
}
}
int digithour(double h)/*将double型的小时数转换成int型*/
{int i;<br>for(i=0;i<=23;i++)<br> {if(h==i) return i;}
}
int digitmin(double m)/*将double型的分钟数转换成int型*/
{int i;<br>for(i=0;i<=59;i++)<br> {if(m==i) return i;}
}
int digitsec(double s) /*将double型的秒钟数转换成int型*/
{int i;<br>for(i=0;i<=59;i++)<br> {if(s==i) return i;}
}
void digitclock(int x,int y,int clock)/*在指定位置显示数字时钟:时\分\秒*/
{char buffer1[10];<br>setfillstyle(0,2);<br>bar(x,y,x+15,328);<br>if(clock==60) clock=0;<br>sprintf(buffer1,"%d",clock);<br>outtextxy(x,y,buffer1);<br>}
void drawcursor(int count) /*根据count的值,画一个光标*/
{switch(count)<br>{<br> case 1:line(424,315,424,325);break;<br> case 2:line(465,315,465,325);break;<br> case 3:line(505,315,505,325);break;<br> }
}
void clearcursor(int count) /*根据count的值,清除前一个光标*/
{switch(count)<br>{<br> case 2:line(424,315,424,325);break;<br> case 3:line(465,315,465,325);break;<br> case 1:line(505,315,505,325);break;<br> }
}
❾ 求新型数字温度计(数电课设)电路图
还有人用AD590啊?你老师出的题?太跟不上形势了!!