单片机课程设计应用系统论文.doc
湖南工业大学课 程 设 计资 料 袋 电气与信息工程 学院(系、部) 2014 2015 学年第 1 学期 课程名称 单片机应用系统 指导教师 贺正芸 职称 讲师 学生姓名 专业班级 学号 题 目 对外部脉冲计数及温度报警系统设计 成 绩 起止日期 2014年 12 月 25 日 2015 年 1 月 4 日目 录 清 单序号材 料 名 称资料数量备 注1课程设计任务书2课程设计说明书3课程设计图纸张456湖南工业大学课程设计任务书 2014 2015 学年第 1 学期电气与信息工程 学院(系、部) 专业 班级课程名称: 单片机应用系统设计题目: 对外部脉冲计数及温度报警系统设计完成期限:自 2014 年 12 月 25 日至 2015 年 1 月 4 日共 2 周内容及任务1.1 外部脉冲自动计数,自动显示:(1)设计255计数器:0255计数,计满后自动清0,重新计数(在数码管中显示)。(2)设计50000计数器:050000计数,计满后自动清0,重新计数(在数码管中显示)。1.2设计一个温度报警系统: 温度显示范围为051度,当温度大于40度时,上限报警指示灯点亮,并驱动电机1转动;当温度小于于10度时,下限报警指示灯点亮,并驱动电机2转动。1.3* 长短按键的设计(附加题) 系统从000开始,一个按键若短按一下(0.5s以内),则个位数加1;如果长按2s不放,则个位数按步长0.2s快速进满后,十位数按步长0.5s加1;加到100则停止并长时间显示。注:要求首先采用PROTEUS完成单片机最小系统的硬件电路设计及仿真;程序仿真测试通过后,再下载到单片机板上进行硬件调试。进度安排起止日期工作内容2014. 12.25讲述设计内容及基本原理2014.12.262013.12.31进行系统的设计2013.12.31-2014.1.4进行系统的调试主要参考资料1 刘苗生、潘宗预.单片机测控系统设计.中国物质出版社,2006年2 周润景,张丽娜.基于PROTEUS的电路及单片机系统设计与仿真M .北京航天航空大学出版社,2006指 导 教 师 (签字): 年 月 日系(教研室)主任(签字): 年 月 日单 片 机 课 程 设 计(单片机原理与应用)课程设计(题目)对外部脉冲计数及温度报警系统的设计起止日期: 2014 年 12 月 26 日 至 2015 年 1 月 5 日 小 组 成 员 学生姓名班级学号成绩指导教师(签字)目录绪论1一、设计任务1二、设计思路1三、单片机硬件电路原理图2四、设计内容31.255数码管计数31.1)系统设计总框图31.2)设计仪器31.3)proteus8仿真31.4)硬件实物图41.5)源程序52.50000数码管计数52.1)系统设计总框图52.2)设计仪器62.3)proteus8仿真62.4)硬件实物图62.5)源程序73.温度控制报警器93.1)系统设计总框图93.2)设计仪器93.3)proteus8仿真103.4)硬件实物图103.5)源程序11五、心得与体会15绪论单片机(Single chip microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。而51系列单片机是各单片机中最为典型和最有代表性的一种。这次课程设计的目的就是要通过对它的学习应用,从而达到学习、设计、开发单片机软硬件的能力。一、 设计任务:11 外部脉冲自动计数,自动显示。111设计一个255计数器:0255计数,计满后自动清0,重新计数(在数码管中显示)。112设计一个50000计数器:050000计数,计满后自动清0,重新计数(在数码管中显示)。1. 2设计一个温度报警系统: 温度显示范围为051度,当温度大于40度时,上限报警指示灯点亮,并驱动电机1转动;当温度小于10度时,下限报警指示灯点亮,并驱动电机2转动。二、设计思路1. 设计一个255计数器:0255计数,计满后自动清0,重新计数(在数码管中显示)。原理:255可用8位二进制数表示,故本设计可直接采用可以重装载的计数器T1模式二进行计数。然后对TL1的内容进行相应的二进制-十进制转换:首先TL1的内容除以64H,所的商就是十进制的百位,然后用余数除以0AH,所得的商就是十进制数的十位,余数即相应的十进制的个位。接着将相应的十进制数进行译码,并在LED数码管上显示出来。每来一个脉冲其显示的结果加一,直加至255然后T1重新开始计数。2设计一个50000计数器:050000计数,计满后自动清0,重新计数(在数码管中显示)。原理: 将TH1和TL1中的十六进制数转为BCD码,入口:HT1,TL1中是 16 位二进制数,其中TH1中是高 8 位;出口:R2 R3 R4 中是 BCD 码,其中R2中是万位,R3中是千、百位,R4中是十、个位。再转为对应的个.十.百.千.万位。送到缓冲区。接着调用显示子程序。3.设计一个温度报警系统:温度显示范围为051度,当温度大于40度时,上限报警指示灯点亮,并驱动电机1转动;当温度小于于10度时,下限报警指示灯点亮,并驱动电机2转动。三、单片机硬件电路原理图四、设计内容1255数码管计数1.1)系统设计总框图1.2)设计仪器单片机开发实验仪1.3)proteus8仿真1.4)源程序ORG 0000HAJMP STARTORG 001BHAJMP TINT1ORG 0030HSTART:MOV TMOD,#60H ;计数方式2MOV TH1,#00H ;初值0MOV TL1,#00H SETB TR1SETB ET1SETB EALOOP:LCALL DISPSJMP LOOPTINT1:RETIDISP: MOV A,TL1 MOV B,#64HDIV AB;A为百位 MOV DPTR,#SEGTABMOVC A,A+DPTR MOV P2,#05H ;位选5 MOV P0,A ;送百位数据 ACALL DELAYMOV A,BMOV B,#0AHDIV AB;A为十位,B为个位MOVC A,A+DPTR MOV P2,#06H ;位选6 MOV P0,A ;送十位数据 ACALL DELAY MOV A,BMOVC A,A+DPTR MOV P2,#07H;位选7 MOV P0,A ;送个位数据 ACALL DELAY RETDELAY:MOV R5,#05H ;延时1msLOOP1: MOV R6,#0FFH DJNZ R6,$ DJNZ R5,LOOP1 RETSEGTAB:DB 3FH,06H,5BH,4FH,66H ;0,1,2,3,4DB 6DH,7DH,07H,7FH,6FH ;5,6,7,8,9END1.5)硬件电路实物2.50000数码管计数2.1)系统设计总框图2.2)设计仪器单片机开发实验仪2.3)proteus8仿真2.4)硬件电路实物图2.5)源程序 ORG 0000HAJMP STARTORG 0030HWANWEI EQU 20HQIANWEI EQU 21HBAIWEI EQU 22HSHIWEI EQU 23HGEWEI EQU 24HSTART: MOV R0, #20H;显示缓冲数据MOV R1, #01H;位选缓冲MOV TMOD,#50H ;计数工作方式1MOV TH1, #00H ;初值0MOV TL1, #00HSETB TR1SETB ET1SETB EALOOP:LCALL DISPSJMP LOOPDISP: LCALL READDISP1:MOV P2, R1MOV P0, R0LCALL DELAYINC R0INC R1CJNE R1,#06H,DISPMOV R1, #01H MOV R0, #20HSJMP DISP1READ: MOV R5, TH1 MOV R6, TL1 CJNE R5, #0C3H,READ1 CJNE R6, #51H,READ1 MOV TH1,#00H ;初值0 MOV TL1,#00H;调用子程序把R5 R6中的数字,转换成BCD码,送到R2 R3 R4READ1:LCALL TXBCD MOV A, R4 MOV B, #16 DIV AB ;除以16,目的是分离出高、低四位 MOV DPTR,#SEGTAB MOVC A, A+DPTR MOV SHIWEI, A ;存放十位 MOV A,B MOVC A,A+DPTR MOV GEWEI, A ;存放个位 MOV A, R2 MOVC A,A+DPTR MOV WANWEI, A ;存放万位 MOV A, R3 MOV B, #16 DIV AB MOVC A,A+DPTR MOV QIANWEI, A MOV A,B MOVC A,A+DPTR MOV BAIWEI, A RET;两个字节的二进制数转换成BCD码的程序如下:;功能:16位二进制数变换成为 BCD 码;;入口:R5 R6 中是 16 位二进制数,其中R5中是高 8 位;;出口:R2 R3 R4 中是 BCD 码,其中R2中是万位,R3中是千、百位,R4中是十、个位。TXBCD: CLR A MOV R2, A ;先清零 MOV R3, A MOV R4, A MOV R7, #16;共转换十六位数READ2: CLR C MOV A, R6 ;从待转换数的高端移出一位到Cy RLC A MOV R6, A MOV A, R5 RLC A MOV R5, A MOV A,R4 ;送到BCD码的低端 ADDC A, R4 ;带进位加。自身相加,相当于左移一位 DA A ;十进制调整,变成BCD码 MOV R4, A MOV A, R3 ADDC A, R3 DA A MOV R3, A MOV A, R2 ADDC A, R2 MOV R2, A DJNZ R7,READ2 ;共转换十六位数 RETDELAY: MOV R5,#05H ;延时1msLOOP2: MOV R6,#0FFH DJNZ R6,$ DJNZ R5,LOOP2 RETSEGTAB: DB 3FH,06H,5BH,4FH,66H ;0,1,2,3,4DB 6DH,7DH,07H,7FH,6FH ;5,6,7,8,9END3.温度控制报警器3.1)系统设计总框图3.2)设计仪器单片机开发实验仪3.3)proteus8仿真3.4)硬件电路由于环境温度接近15-18摄氏度,为了显示结果,把温度报警上限调到18摄氏度,把单个数码管的一段当成LED报警灯,报警灯亮,3.5)源程序 #include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P37;sbit BEEP=P36;sbit HI_LED=P14;sbit LO_LED=P15;bit HI_Alarm=0,LO_Alarm=0;bit DS18B20_IS_OK=1;uchar code DSY_CODE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00; /数码管共阴极段码 uchar code df_Table=0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9; /温度小数位对照表uchar CurrentT=0; /温度整数部分uchar Display_Digit=0,0,0,0; /数码管待显示的各位温度uchar Temp_Value=0x00,0x00; /DS0832读取的温度值 uint Time0_Count=0; / 定时器中断计数char Alarm_Temp_HL2=40,10;/*延时程序*/void Delay(uint x)while(-x);/*DS18B20初始化*/uchar Init_DS18B20() uchar status; DQ=1;Delay(8); DQ=0;Delay(90); DQ=1;Delay(8); status=DQ; Delay(100); DQ=1; return status; /*DS18B20读字节*/ uchar ReadOneByte() uchar i,dat=0; DQ=1;_nop_(); for(i=0;i<8;i+) DQ=0;dat >>=1;DQ=1;_nop_();_nop_(); if (DQ) dat |=0x80; Delay(30); DQ=1; return dat; /*DS18B20写字节*/ void WriteOneByte(uchar dat) uchar i; for(i=0;i<8;i+) DQ=0;DQ=dat & 0x01;Delay(5); DQ=1; dat>>=1; /*从DS18B20读取温度*/ void Read_Temperature() if( Init_DS18B20()=1) DS18B20_IS_OK=0; else WriteOneByte(0xCC); WriteOneByte(0x44); Init_DS18B20(); WriteOneByte(0xCC); WriteOneByte(0xBE); Temp_Value0=ReadOneByte(); Temp_Value1=ReadOneByte(); DS18B20_IS_OK=1; /*给DS18B20设置报警值*/ void Set_Alarm_Temp_Value() Init_DS18B20(); WriteOneByte(0xcc); /跳过序列号 WriteOneByte(0x4e); /将设定的温度报警值写入DS18B20 WriteOneByte(Alarm_Temp_HL0); /写TH WriteOneByte(Alarm_Temp_HL1); /写TL WriteOneByte(0x7f); /12位精度 Init_DS18B20(); WriteOneByte(0xcc); /跳过序列号 WriteOneByte(0x48); /将温度报警值存入DS18B20/*温度值显示*/ void Display_Temperature() /显示温度uchar i;uchar t=150; /延时值uchar ng=0,np=0; /负数标示,及负号显示位置char Signed_Current_Temp;if(Temp_Value1&0xf8)=0xf8) /如果为负数,取反加1;设置负数标示及负号显示位置Temp_Value1=Temp_Value1;Temp_Value0=Temp_Value0+1;if(Temp_Value0=0x00)Temp_Value1+;ng=1;np=0xfd;Display_Digit0=df_TableTemp_Value0&0x0f; /查表显示温度小数位CurrentT=(Temp_Value0&0xf0)>>4)|(Temp_Value1&0x07)<<4);Signed_Current_Temp=ng? -CurrentT : CurrentT;HI_Alarm= Signed_Current_Temp >= Alarm_Temp_HL0 ? 1:0;LO_Alarm= Signed_Current_Temp <= Alarm_Temp_HL1 ? 1:0;Display_Digit3=CurrentT/100;Display_Digit2=CurrentT%100/10;Display_Digit1=CurrentT%10;if(Display_Digit3=0) /高位为0,不现实,负号后移 Display_Digit3=10; np=0xfb; if(Display_Digit2=0) Display_Digit2=10; np=0xf7; for(i=0;i<30;i+)/刷新数码管显示温度值P0=0X39;P2=0X7F;Delay(t);P2=0XFF;P0=0X63;P2=0XBF;Delay(t);P2=0XFF;P0=DSY_CODEDisplay_Digit0;P2=0XDF;Delay(t);P2=0XFF;P0=(DSY_CODEDisplay_Digit1)|0X80;P2=0XEF;Delay(t);P2=0XFF;P0=DSY_CODEDisplay_Digit2;P2=0XF7;Delay(t);P2=0XFF;P0=DSY_CODEDisplay_Digit3;P2=0XFB;Delay(t);P2=0XFF;if(ng)P0=0X40;P2=np;Delay(t);P2=0XFF;/*定时器0中断,控制报警声音*/ void T0_INT()interrupt 1 TH0=-1000/256; TL0=-1000%256; BEEP=!BEEP; if(+Time0_Count=400) Time0_Count=0; if(HI_Alarm)HI_LED=HI_LED; else HI_LED=1; if(LO_Alarm)LO_LED=LO_LED; else LO_LED=1; void main() IE=0X82; TMOD=0X01; /方式1计数 TH0=-1000/256; TL0=-1000%256; TR0=0; HI_LED=1; LO_LED=1; Set_Alarm_Temp_Value(); Read_Temperature(); Delay(50000); Delay(50000); while(1) Read_Temperature(); if(DS18B20_IS_OK) if(HI_Alarm=1|LO_Alarm=1)TR0=1; else TR0=0; Display_Temperature(); elseP0=P2=0X00; 五.心得与体会在这次单片机课程设计中,我获益匪浅。 首先,在选题后极大考验了我对芯片手册的自学能力,由于芯片手册是英文版的,所以在学习的过程中耗费了一定的时间,但是,最后我还是顺利完成了对芯片手册的阅读,而且,由于单片机设计中,用到的芯片很少,所以总体来说,不是很困难。 其次,在对整个设计有了大体的认识之后,我便开始进行程序设计以及电路仿真。在程序设计之前,要对整个流程有一个清晰的认识,在查阅了一些资料后,参照上文中的软件设计中的流程图,并在老师及同学的帮助下完成了程序的编写。还有,在本次设计过程中,开发板比实验箱精简了部分功能,但是使用起来更加方便,电路图更加明了,这大大减少了我们对于硬件的学习时间,使得我们能够将更多的时间用来编写程序;开发板的另一个优点就是效果特别稳定,不用担心是硬件出了问题。 总体来说,单片机设计的思路并不难,但要做到每一步都细心认真很难。这次的设计能顺利完成要非常感谢同学的帮助以及老师的指导,让我学到了很多东西!