17.3.2 程序设计

在KeilµVision3集成开发环境中采用C51语言来进行程序设计,具体操作步骤如下。

(1)在KeilµVision3集成开发环境中,选择“Project”→“New”→“µVision Project”命令,新建一个工程,并保存。

(2)在弹出的选择器件对话框中选择Atmel公司的AT89S52,如图17.10所示。

17.3.2 程序设计 - 图1

图 17.10 选择单片机AT89S52

(3)单击“确定”按钮,此时询问是否添加启动代码,如图17.11所示。

17.3.2 程序设计 - 图2

图 17.11 添加启动代码

(4)单击“是”按钮,选择添加启动代码,完成工程的建立。

(5)选择“File”→“New”命令,新建一个程序文件,并保存为*.C文件,可以在其中输入程序源代码,示例如下。


include<stdio.h>//头文件

include<reg52.h>

define uchar unsigned char//预定义

define FALSE 0

define TRUE 1

sbit ONEWIRE_DQ=P2^0;//定义P2^0引脚为DS18S20的DQ引脚

/*全局变量声明**/

uchar DS18S20ROM[8];//DS18S20 ROM位

uchar ROMFound[5][8];//DS18S20的ROM代码表

uchar CRCdsc;//用于CRC校验

/*子函数声明**/

void Delay(int useconds);

uchar Reset(void);

void WriteBit(char val);

void WriteByte(char val);

uchar ReadBit(void);

uchar ReadByte(void);

void ReadROMNumber(void);

uchar CRCCheck(uchar x);

uchar SearchDevice(uchar EndFlag,uchar LastData);

uchar FindFirstDevice(void);

void ReadData(void);

void FindDevices(void);

void ReadTemperature(void);

/*主函数**/

void main(void)

{

uchar MenuOption;//功能选择

uchar LastData=0;

uchar EndFlag=0;

SCON=0x50;//初始化串行口模式1

TMOD=0x20;//初始化T1为定时功能,模式2

PCON=0x80;//设置SMOD=1

TL1=0xF4;//波特率4800bit/s,初值

TH1=0xF4;

TR1=1;//启动T1

TI=1;//启动发送

while(1)//主循环

{

printf(“AT89S52 Control 1-Wire DS18S20\n”);

printf(“\n*\n”);

printf(“Select Control Menu Option\n”);

printf(“1.Reset All 1-Wire Devices.\n”);

printf(“2.Read DS18S20 ROM Number.\n”);

printf(“3.Search DS18S20 ROM.\n”);

printf(“4.Find All DS18S20 Devices.\n”);

printf(“5.Read DS18S20 Scratch.\n”);

printf(“6.Read Temperature.\n”);

printf(“7.Exit Program.\n”);

printf(“Please Input Menu Option:\n”);

MenuOption=_getkey();//从键盘输入选择数字

switch(MenuOption)

{

case‘1’://复位1-Wire总线

printf(“\n You Select 1.Reset All 1-Wire Devices.\n”);

printf(“\nResetting!……\n”);

Reset();//复位函数

printf(“\nReset Over!\n”);

break;

case‘2’://读DS18S20 ROM

printf(“\n You Select 2.Read DS18S20 ROM Number.\n”);

printf(“\nReading!……\n”);

ReadROMNumber();//读取ROM代码函数

printf(“\nRead Over!\n”);

break;

case‘3’://搜索DS18S20

printf(“\n You Select 3.Search DS18S20 ROM\n”);

printf(“\nSearching!……\n”);

FindFirstDevice();//搜索第一个器件

printf(“\nDS18S20 ROM CODE=%02X%02X%02X%02X\n”,

ROMFound[5][7],ROMFound[5][6],ROMFound[5][5],ROMFound[5][4],

ROMFound[5][3],ROMFound[5][2],ROMFound[5][1],ROMFound[5][0]);

printf(“\nSearch Over!\n”);

break;

case‘4’://搜索所有DS18S20

printf(“\n You Select 4.Find All DS18S20\n”);

printf(“\nFinding!……\n”);

FindDevices();//查找器件函数

printf(“\nFind Over!\n”);

break;

case‘5’://读取高速暂存器

printf(“\n You Select 5.Read DS18S20 Scratch\n”);

printf(“\nReading!……\n”);

WriteByte(0xCC);//跳过ROM序列号命令(代码为CCH)

ReadData();//读取高速暂存器

printf(“\nRead Over!\n”);

break;

case‘6’://读取温度

printf(“\n You Select 6.Read DS18S20 Temperature\n”);

printf(“\nReading!……\n”);

ReadTemperature();//读取温度值

printf(“\nRead Over!\n”);

break;

case‘7’://退出程序

printf(“\n You Select 7.Exit\n”);

goto Exit;//转向Exit标号处

break;

default:

printf(“\n Error:Please Select Right Menu Option\n”);

break;

};

}

Exit:printf(“Exit the program!”);//退出

}


在程序中,定义了P2.0引脚为1-Wire的数据总线。主函数中,首先初始化串行口为模式1,并设置波特率为4800bit/s。接着通过while循环语句来扫描串口输入,用户可以通过串口输入指令来完成DS18S20的各项操作。在该程序中,用到了前面介绍的子函数。

提示调试以上程序时,还需将本章前面所介绍过的各类子函数添加到主函数后面。