17.3.2 程序设计
在KeilµVision3集成开发环境中采用C51语言来进行程序设计,具体操作步骤如下。
(1)在KeilµVision3集成开发环境中,选择“Project”→“New”→“µVision Project”命令,新建一个工程,并保存。
(2)在弹出的选择器件对话框中选择Atmel公司的AT89S52,如图17.10所示。
图 17.10 选择单片机AT89S52
(3)单击“确定”按钮,此时询问是否添加启动代码,如图17.11所示。
图 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的各项操作。在该程序中,用到了前面介绍的子函数。
提示调试以上程序时,还需将本章前面所介绍过的各类子函数添加到主函数后面。