最小系统的P1.0,P1.1接串行静态显示的DIN,CLK端。打开相关模块电源。
2. 用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机锁
紧插座中,请注意仿真器的方向:缺口朝上。请指导老师检查接线后再打开模块电源。打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加源程序,进行编译,直到编译无误。全速运行程序。 3. 程序正常运行后,按下自锁开关‘控制’SIC。LED数显为 “XX”为十
进制温度测量值, “XX”为十进制温度设定值,按下自锁开关“控制”SIC则加热源开始加热,温度也随着变化,当加热到设定的控制温度时如40度时,停止加热。
注意:实验完成以后务必关闭该模块,防止没有控制无限加热造成模块损坏 VCC+12V+12V+12V四、电路原理图 JDQR8CC3C 1K0.1uF IN4007JDQ100+12V D1CT1CCONTROLR7C10KR9C 210K T2CS1CR10C100K2U3C9013 18ACCONTROL 901327KER14CTLP521 R13C75/2W2.2K R11CR12C22K100 实验程序 #include
#define uchar unsigned char #define uint unsigned int
sbit DQ=P2^0;//ds18b20与单片机连接口 sbit Din=P1^0;// sbit CLK=P1^1;// unsigned char code LED_Map[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,0,0x40 };//0-F , ,- uchar data disdata[5]; uint tvalue;//温度值
uchar tflag;//温度正负标志 void delay(int count) {
unsigned int i;
for(i=0;i //数码显示 28235117133146 void display() { uchar LED_code[5]; uchar i,j,chr,sel; /////////////// for(i=0;i<4;i++) LED_code[i]=LED_Map[disdata[i]]; //LED_code[i]=LED_Map[0]; if((LED_code[0]==0)&&(tflag==1)&&(LED_code[1]!=0)) LED_code[0]=0x40;//显示负号 if((LED_code[1]==0)&&(tflag==1)) LED_code[0]=0x40; for(i=0;i<4;i++) { chr= LED_code[3-i]; // if(i==1) chr= chr|0x80; sel=0x80; for(j=0;j<8;j++) { Din=chr&sel; CLK=0; sel=sel>>1; delay(1); CLK=1; delay(1); } } } /******************************ds1820程***************************************/ void delay_18B20(unsigned int i)//延时1微秒 { while(i--); } void ds1820rst()/*ds1820复位*/ { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低 delay_18B20(100); //精确延时大于480us DQ = 1; //拉高 delay_18B20(40); 序 } uchar ds1820rd()/*读数据*/ { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; //给脉冲信号 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } void ds1820wr(uchar wdata)/*写数据*/ {unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata>>=1; } } //////////////////////////////////////////////////////// read_temp()/*读取温度值并转换*/ {uchar a,b; ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0x44);//*启动温度转换*/ ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0xbe);//*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else {tvalue=~tvalue+1;//求负数绝对值 tflag=1; } tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue); } /*******************************************************************/ void ds1820disp()//温度值显示 { disdata[0]=tvalue/1000;//百位数 disdata[1]=tvalue00/100;//十位数 disdata[2]=tvalue0/10;//个位数 disdata[3]=tvalue;//小数位 if(disdata[0]==0) { disdata[0]=0x10;//如果百位为0,不显示 if(disdata[1]==0) { disdata[1]=0x10;//如果百位为0,十位为0也不显示 } } display(); } /********************主程序*************************/ void main() { uint i; while(1) { read_temp();//读取温度 ds1820disp();//显示 for(i=0;i<255;i++) delay(100); } } 五 实心得体会 通过软件编及仿真,了解了温度传感器电路的工作原理,编程过程中,熟悉 并了解温度控制的基本原理,以及熟悉了解并掌握了一线总线接口的使用 实验五 步进电机控制实验 一、实验目的 1.了解步进电机控制的基本原理 2.掌握控制步进电机转动的编程方法 3.了解单片机控制外部设备的常用电路 二、实验说明 1. 输入给定程序,配置选项,调试并运行程序,观察程序控制下仿真器输 出的变化。 2. 选中此项keil为硬件仿真 3. 设置Port 串口:一般为COM3,Baudrate 波特率为最大值:115200bit/s, 最后确认 4. 步进电动机有三线式、五线式、六线式三种,但其控制方式均相同,必 须以脉冲电流来驱动。若每旋转一圈以20个励磁信号来计算,则每个励磁信号前进18度,其旋转角度与脉冲数成正比,正、反转可由脉冲顺序来控制。 5. 步进电动机的励磁方式可分为全步励磁及半步励磁,其中全步励磁又有 1相励磁及2相励磁之分,而半步励磁又称1-2相励磁。图为步进电动机的控制等效电路,适应控制A、B、/A、/B的励磁信号,即可控制步进电动机的转动。每输出一个脉冲信号,步进电动机只走一步。因此,依序不断送出脉冲信号,即可步进电动机连续转动。 6. 用C51进行程序设计,选择汇编或者C语言编程均可,要求程序结构清 晰,模块化结构,反复调用部分做成子模块,有必要的注释。编写程序上机调试通过,实验报告要求提交程序流程图及源程序。 三、实验内容及步骤(完成分值:100分/单个程序) 本实验需要用到本实验需要用到单片机最小应用系统(F1区)、步进电机模块(M2区)和查询式键盘(B2区)。 1. 单片机最小应用系统的P1.0、P1.1、P1.2、P1.3口分别接步进电机模块 的SA、SB、SC、SD。最小系统的P2.0、P2.1、P2.2分别对应的接查询式键盘的K0、K1、K2键。打开相关模块的电源开关。 2. 用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机锁 紧插座中,请注意仿真器的方向:缺口朝上。请指导老师检查接线后再打开模块电源。打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加源程序,进行编译,直到编译无误。全速运行程序。 3. 按下K0键电机正转,K1反转,K2电机STOP。 四、电路原理图