for(j=0;j<120;j++);
}
main()
{
SYSTEMTIMECurrentTime;
LCD_Initial();
Initial_DS1302();
GotoXY(0,0);
Print("Date:
");
GotoXY(0,1);
Print("Time:
");
while
(1)
{
DS1302_GetTime(&CurrentTime);
DateToStr(&CurrentTime);
TimeToStr(&CurrentTime);
GotoXY(6,0);
Print(CurrentTime.DateString);
GotoXY(6,1);
Print(CurrentTime.TimeString);
Delay1ms(300);
}
}
3、Proteus7软件平台下实现软硬件仿真,效果如下:
实验41-Wire接口实验——DS18b20温度
一、实验目的:
通过学生在Proteus7软件平台实现电路图设计,使学生充分掌握1-Wire工作原理,并掌握DS18b20温度的软硬件实现方法。
二、实验环境:
计算机、Proteus7软件、KeilC
三、实验步骤:
1、电路原理图设计
参考原理图:
2、在KeilC软件平台下编写程序代码,参考如下:
#include//用AT89C51时就用这个头文件
//#include//用华邦W78E58B时必须用这个头文件
#include
#include
#include
#include
#include
#include
#include"LCD1602.h"////液晶显示头文件
//sbitDQ=P3^4;//定义DQ引脚为P3.4
unsignedchart[2],*pt;//用来存放温度值,测温程序就是通过这个数组与主函数通信的
unsignedcharTempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'\0'};
//显示实时温度,上电时显示+125.00C
unsignedcharTempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,
0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'\0'};
//显示温度上下限,上电时显示TH:
+125TL:
+124C
unsignedcharcodedotcode[4]={0,25,50,75};
/***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*******
再将表值分离出十位和个位后送到十分位和百分位********************/
voidcovert0(unsignedcharTH,unsignedcharTL)//将温度上下限转换为LCD显示的数据
{
if(TH>0x7F)//判断正负,如果为负温,将其转化为其绝对值
{
TempBuffer0[3]=0x2d;//0x2d为"-"的ASCII码
TH=~TH;
TH++;
}
elseTempBuffer0[3]=0x2b;//0x2B为"+"的ASCII码
if(TL>0x7f)
{
TempBuffer0[11]=0x2d;//0x2d为"-"的ASCII码
TL=~TL+1;
}
elseTempBuffer0[11]=0x2b;//0x2B为"+"的ASCII码
TempBuffer0[4]=TH/100+0x30;//分离出TH的百十个位
if(TempBuffer0[4]==0x30)TempBuffer0[4]=0xfe;//百位数消隐
TempBuffer0[5]=(TH%100)/10+0x30;//分离出十位
TempBuffer0[6]=(TH%100)%10+0x30;//分离出个位
TempBuffer0[12]=TL/100+0x30;//分离出TL的百十个位
if(TempBuffer0[12]==0x30)TempBuffer0[12]=0xfe;//百位数消隐
TempBuffer0[13]=(TL%100)/10+0x30;//分离出十位
TempBuffer0[14]=(TL%100)%10+0x30;//分离出个位
}
voidcovert1(void)//将温度转换为LCD显示的数据
{
unsignedcharx=0x00,y=0x00;
t[0]=*pt;
pt++;
t[1]=*pt;
if(t[1]>0x07)//判断正负温度
{
TempBuffer1[0]=0x2d;//0x2d为"-"的ASCII码
t[1]=~t[1];/*下面几句把负数的补码*/
t[0]=~t[0];/*换算成绝对值*********/
x=t[0]+1;/***********************/
t[0]=x;/***********************/
if(x>255)/**********************/
t[1]++;/*********************/
}
elseTempBuffer1[0]=0x2b;//0xfe为变"+"的ASCII码
t[1]<<=4;//将高字节左移4位
t[1]=t[1]&0x70;//取出高字节的3个有效数字位
x=t[0];//将t[0]暂存到X,因为取小数部分还要用到它
x>>=4;//右移4位
x=x&0x0f;//和前面两句就是取出t[0]的高四位
t[1]=t[1]|x;//将高低字节的有效值的整数部分拼成一个字节
TempBuffer1[1]=t[1]/100+0x30;//+0x30为变0~9ASCII码
if(TempBuffer1[1]==0x30)TempBuffer1[1]=0xfe;//百位数消隐
TempBuffer1[2]=(t[1]%100)/10+0x30;//分离出十位
TempBuffer1[3]=(t[1]%100)%10+0x30;//分离出个位
t[0]=t[0]&0x0c;//取有效的两位小数
t[0]>>=2;//左移两位,以便查表
x=t[0];
y=dotcode[x];//查表换算成实际的小数
TempBuffer1[5]=y/10+0x30;//分离出十分位
TempBuffer1[6]=y%10+0x30;//分离出百分位
}
voiddelay(unsignedchari)
{
while(i--);
}
main()
{
unsignedcharTH=110,TL=-20;//下一步扩展时可能通过这两个变量,调节上下限
//测温函数返回这个数组的头地址
while
(1)
{
pt=ReadTemperature(TH,TL,0x3f);//上限温度-22,下限-24,分辨率10位,也就是0.25C
//读取温度,温度值存放在一个两个字节的数组中,
delay(100);
covert1();
covert0(TH,TL);
LCD_Initial();//第一个参数列号,第二个为行号,为0表示第一行
//为1表示第二行,第三个参数为显示数据的首地址
LCD_Print(0,0,TempBuffer0);
LCD_Print(0,1,TempBuffer1);
}
}
3、Proteus7软件平台下实现软硬件仿真,效果如下:
实验5A/D转换实验
一、实验目的:
通过学生在Proteus7软件平台实现电路图设计,使学生充分掌握A/D工作原理,并掌握AD0808的软硬件实现方法。
二、实验环境:
计算机、Proteus7软件、KeilC
三、实验步骤:
1、电路原理图设计
参考原理图:
2、在KeilC软件平台下编写程序代码,参考如下:
#include
#include"1602.h"
#defineucharunsignedchar
#defineuintunsignedint
uchar*p,a[3];
voiduchar2string(uchar);
voidLCD_disp_string(ucharx,uchary,uchar*Date);
sbitEOC=P3^0;
sbitST=P3^6;
sbitOE=P3^7;
voidmain()
{
ucharconvertnum;
uinttemp;
P2=0xff;
P3=0xff;
p=a;
LCD_init(0x38,0x0c,0x04,LCD_CLEAR_SCREEN);
delay_ms(10);
LCD_disp_string(0,0,"AD0808Show:
");
LCD_disp_string(0,1,"Value:
");
while
(1)
{
ST=0;
ST=1;
ST=0;
while(EOC==0)
OE=1;
convertnum=P2;
OE=0;
temp=convertnum*5;
temp=temp/256;
convertnum=temp;
uchar2string(convertnum);
LCD_disp_string(7,1,p);
delay_ms
(1);
}
}
/********************显示函数*******************/
voidLCD_disp_string(ucharx,uchary,uchar*Data)
{
if(y==LINE1)
{
LCD_send_command(LINE1_HEAD+x);
for(;x='\0';x++)
{
LCD_send_data(*(Data++));
}
}
if(y==LINE2)
{
LCD_send_command(LINE2_HEAD+x);
for(;x='\0';x++)
{
LCD_send_data(*(Data++));
}
}
}
/********************转化函数*******************/
voiduchar2string(ucharcons)
{unsignedintb;
a[2]=cons%10+'0';
b=cons/10;
a[1]=b%10+'0';
a[0]=b/10+'0';
}
3、Proteus7软件平台下实现软硬件仿真,效果如下:
实验6综合实验——基于51的电子计算器
一、实验目的:
通过本次实验,对学生的综合设计能力进行锻炼,掌握实际开发项目的设计开发流程。
二、实验环境:
计算机、Proteus7软件、KeilC
三、实验步骤:
1、电路原理图设计
参考原理图:
2、在KeilC软件平台下编写程序代码,参考如下:
;4FUNCTIONCALCULATORPROGRAM
;Assumes1.2MHzClockforscantiming.
;TODO:
CustomCharacterforthe'M'sign
;Checkinstancesofmultipledecimalpointpresses(allcovered?
)
;Resetvector
org0000h
jmpstart
;Startoftheprogram
org0100h
start:
movA,#030h;1line,8bits
callwrcmd
movA,#LCD_SETVISIBLE+4
callwrcmd
movA,#LCD_SETDDADDR+15;Startatrighthandsideofthedisplay
callwrcmd
movA,#LCD_SETMODE+3;AutomaticIncrement-Displayshiftleft.
callwrcmd
mov025h,#00h;Setoutputmode(floatingpoint).
callboundsbuffer;Initialisetheboundsbuffer-usedforerrorchecking.
movmode,#4;Initialisethe