1、单 片 机 课 程 设 计系统总体设计思路: 此系统主要包括三大部分:单片机STC89C52、温度传感器DS18B20、八段共阴极数码管STC89C52数码管显示温度传感器DS18B20按键系统总框架图一单片机STC89C52介绍 STC89C52引脚图STC89C52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在线系统可编程Flash,使得STC89C52为众多嵌入式控制应用系
2、统提供高灵活、超有效的解决方案。 STC89C52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。8 位微控制器 8K字节在系统可编程 FlashP0 口:P0口是一个8位漏极开路的双向I/O口。
3、作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下, P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4 个 TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外
4、部计数输入(P1.0/T2)和时器/计数器2 的触发输入(P1.1/T2EX),具体如下表所示。 在flash编程和校验时,P1口接收低8位地址字节。引脚号第二功能P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)P1.5 MOSI(在线系统编程用)P1.6 MISO(在线系统编程用)P1.7 SCK(在线系统编程用)P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个 TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,
5、被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX DPTR) 时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用 8位地址(如MOVX RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p2 输出缓冲器能驱动4 个 TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻
6、的原因,将输出电流(IIL)。 P3口亦作为STC89C52特殊功能(第二功能)使用,如下表所示。在flash编程和校验时,P3口也接收一些控制信号。端口引脚 第二功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 INTO(外中断0)P3.3 INT1(外中断1)P3.4 TO(定时/计数器0)P3.5 T1(定时/计数器1)P3.6 WR(外部数据存储器写选通)P3.7 RD(外部数据存储器读选通)此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。RST复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。ALE/PROG当访问
7、外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。PSEN程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当S
8、TC89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。EA/VPP外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。二温度传感器DS18B20 DS18B20内部结构图DS18B20的数字温度计提供9至1
9、2位(可编程设备温度读数。信息被发送到/从DS18B20 通过1线接口,所以中央微处理器与DS18B20只有一个一条口线连接。为读写以及温度转换可以从数据线本身获得能量,不需要外接电源。 因为每一个DS18B20的包含一个独特的序号,多个ds18b20s可以同时存在于一条总线。这使得温度传感器放置在许多不同的地方。测温范围 55125,固有测温分辨率0.5。工作电源: 35V/DC 1.5 在使用中不需要任何外围元件 1.6 测量结果以912位数字量方式串行传送温度的读取 DS18B20在出厂时以配置为12位,读取温度时共读取16位,所以把后11位的2进制转化为10进制后在乘以0.0625便为
10、所测的温度,还需要判断正负。前5个数字为符号位,当前5位为1时,读取的温度为负数;当前5位为0时,读取的温度为正数。16位数字摆放是从低位到高位。温度读取流程图三数码管 此系统共有四个数码管,每个数码管需要八个I/O口,而单片机的I/O口是有限的,故此系统采用动态数码管显示方式。单片机通过软件设置 ,每次选择控制其中的一个数码管,由于时间的间隔短,四个数码管看起来是一起显示的。四主程序#include#include#include#include#includegeneral.h/#includelcd1602.h#includeDS18B20.hunsigned char table=0x
11、C0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,; /不带小数点的编码extern unsigned int temp;extern float f_temp;unsigned int i;/unsigned int displayBuffer6=1,2,3,4,5,6;void LCD_init(void)P2=0x0f;P0=0x00; /* double Shi(unsigned char Dis)WORD i;double sum;int k;sum=0;for(i=0,k=-4;i11;i+,k+)sum+=Disi*pow(2,k)r
12、eturn sum; */void led(signed int m,signed int n,signed int p,signed int q) P2=0xef;P0=tableq;delay(5);P2=0xdf;P0=tablep;delay(5);P2=0xbf;P0=tablen+0x80;delay(5);P2=0x7f;P0=tablem;delay(5);unsigned int display(unsigned int y,signed int f,signed int g) SWORD a,b,c,d;a=y/1000 + f ; b=(y%1000)/100+g ; c
13、=(y%100)/10; d=(y%10)/1;if(b=0)for(i=16;i0;i-)led(a,b,c,d);else if(b9)a+=b/10;b=b%10;for(i=16;i0;i-)led(a,b,c,d);else b=0-b;if(b%10=1)f-=1;b=10-(b%10);if(b=10)b=0;for(i=16;i0;i-)led(a,b,c,d);return f; void main(void) unsigned int e,Sum1,k;signed int h,j;LCD_init();h=0;j=0; while(1) tempchange();e=ge
14、t_temp();Sum1=e*10; P2=0xff; for(k=0;k0;x-)for(y=110;y0;y-);void dsreset(void) /18B20复位,初始化函数 unsigned int i; ds=0; i=103; while(i0)i-; ds=1; i=4; while(i0)i-;bit tempreadbit(void) /读1位函数 unsigned int i; bit dat; ds=0;i+; /i+ 起延时作用 ds=1;i+;i+; dat=ds; i=8;while(i0)i-; return (dat);unsigned char temp
15、read(void) /读1个字节 unsigned char i,j,dat; dat=0; for(i=1;i=8;i+) j=tempreadbit(); dat=(j1); /读出的数据最低位在最前面,这样刚好一个字节在DAT里 return(dat);void tempwritebyte(unsigned char dat) /向18B20写一个字节数据 unsigned int i; unsigned char j; bit testb; for(j=1;j1; if(testb) /写 1 ds=0; i+;i+; ds=1; i=8;while(i0)i-; else ds=0
16、; /写 0 i=8;while(i0)i-; ds=1; i+;i+; void tempchange(void) /DS18B20 开始获取温度并转换 dsreset(); delay(1); tempwritebyte(0xcc); / 写跳过读ROM指令 tempwritebyte(0x44); / 写温度转换指令unsigned char get_temp() /读取寄存器中存储的温度数据 unsigned char a,b; dsreset(); delay(1); tempwritebyte(0xcc); tempwritebyte(0xbe); a=tempread(); /读
17、低8位 b=tempread(); /读高8位 temp=(b&0X0f)4; /两个字节组合为1个字 temp=temp|a; f_temp=temp*0.0625; /温度在寄存器中为12位 分辨率位0.0625 temp=f_temp*100+0.5; /乘以10表示小数点后面只取1位,加0.5是四舍五入 return temp; /temp是整型五学习收获此次课程设计包括电路板的焊接与用数码管实现温度显示系统设计两大部分。通过对电路板的焊接,我们对一些元件有了初步的认识,在焊接元件水平上也有所进步。总之,第一部分的学习让我们在硬件上有所收获。第二部分的设计主要是软件编程上的学习,通过对程序的研究学习以及上网查资料,我们对此程序中的算法有了一些认识,已经掌握了用单片机控制按键及读取温度传感器数据的程序思路,通过第二部分的学习我们在软件水平上有了新的突破。