#include<../SysVar.h>
//
//
//MC8051使用第1要点:
//MC8051没有IO口,对P0,P1,P2,P3的读写没有任何的意义
//MC8051只有一个定时器,TimerSetTime定时基准是50MS为单位,ET0=1并且EA=1时候,中断timer0(void)发送。MC8051没有计数器,操作SMOD等寄存器没有任何意义
//MC8051有两个串口,Uart1Send和Uart2Send用于发送数据。当接收到数据并且EA=1;;ES=1;时候,中断uart(void) 会执行 ;操作SCON等寄存器没有任何意义
//总之,
//使用MC8051与常见51单片机,就是没有IO,并且定时器和串口的使用方法和普通的51单片机不同外,其他不变,可以用汇编也可以用KEILC编译;
//关键是你要生成一个MC8051.HEX文件放在你先建的工程MC8051文件夹里面
//
//
//MC8051使用第2要点:
//MC8051内核内置了一些函数,比如设置定时器TimerSetTime,串口发送数据Uart1Send,
//我们约定,通过修改某些特殊功能寄存器CmdAdr的值来调用这些函数,CmdAdr的定义见include<../SysVar.h>头文件,用户不得修改
//
//
//MC8051使用第3要点:
//C51单片机的存储方式是大端结构;而HMI产品是小端结构,所以在C51单片机用short类型赋值的时候注意调整
//大小端这点不懂的话请百度搜索一下
//
//
//MC8051使用第4要点:
//MC8051内核的外部存储器空间被隐射到控件的HMI变量上,改变MC8051的外部存储器就是改变控件的显示
//大家都知道用C语言如何访问51单片机的外部RAM吧,那就是XBYTE[???]=????;
//
//屏幕刷新控制:mEn=0,暂停刷新;mEn=1,立即刷新
//该函数可以控制屏幕是否变化;用户应该在给“控件HMI变量”赋值的时候先禁止屏幕刷新;赋值完毕再开启屏幕刷新功能
//////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////第一部分,MC8051内部函数/////////////////////////
//////////////////////////////////////////////////////////////////////////////////
void RefreshLCD(unsigned char mEn)
{
CmdAdr1=mEn; //命令参数
CmdAdr=1; //命令代码
}
//系统中有一个定时器,用户可以调整它的定时时间间隔。时间间隔以50豪秒为基准单位,比如mMS=50,100,150,200,250,.......1000,....;
void TimerSetTime(unsigned short mMS)
{
CmdAdr2=mMS; //命令参数
CmdAdr3=mMS>>8; //命令参数
CmdAdr=3;
}
//用户可以调用Uart1Send函数来向串口一发送一个dat数据
void Uart1Send(char dat)
{
CmdAdr1=dat; //命令参数
CmdAdr=5; //命令代码
}
//用户可以调用Uart2Send数来向串口二发送一个dat数据
void Uart2Send(char dat)
{
CmdAdr1=dat; //命令参数
CmdAdr=6; //命令代码
}
//PlayAudio播放音频文件
unsigned char PlayAudio(char * mFileName)
{
unsigned char m_GlobalCnt8U;
for(m_GlobalCnt8U=0;m_GlobalCnt8U<128;m_GlobalCnt8U++)
{
if(*mFileName==0) break;
XBYTE[m_UserAdr+m_GlobalCnt8U]=*mFileName;
mFileName++;
}
XBYTE[m_UserAdr+m_GlobalCnt8U]=0;
CmdAdr2=m_UserAdr;
CmdAdr3=m_UserAdr>>8;
CmdAdr1=1;
CmdAdr=0x41;
return CmdAdr1;
}
//停止当前的音频播放,用户可以调用PlayStop立即停止当前播放
void PlayStop(void)
{
CmdAdr1=2;
CmdAdr=0x41;
}
//获取当前播放的进度(百分比),返回值0~100;当返回值为100表示已经播放完毕 ,用户可以据此判断是否播放完毕
unsigned char PlayProgress(void)
{
CmdAdr1=3;
CmdAdr=0x41;
return CmdAdr1;
}
//设置控件的HMI变量,调用SetIntVar()设置的HMI变量是必须4个字节的
//HMI变量占据MC8051单片机外部RAM的低地址空间
void SetIntVar(unsigned short mAdr,int mValue)
{
XBYTE[mAdr]=mValue;
XBYTE[mAdr+1]=mValue>>8;
XBYTE[mAdr+2]=mValue>>16;
XBYTE[mAdr+3]=mValue>>24;
}
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////第2部分:用户函数///////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//显示字符串,mCellAdr参数是字符串控件的首地址,pStr是需要显示的字符串的指针
void DispStr(unsigned int mCellAdr,char * pStr)
{
while(*pStr)
{
XBYTE[mCellAdr]=*pStr; //修改控件变量
pStr++;
mCellAdr++;
}
XBYTE[mCellAdr]=0;//最后一个要填0,表示字符串结束
}
//
//本演示程序的“实时曲线”只有20个点,
//程序首先把第一个点暂存到temp上,然后取后面一个点给前面一个点,最后把先前暂存的第一个点赋给最后一个点
//这样曲线就出现一个移动效果,
void MoveCurve(void)
{
unsigned int i;
unsigned char temp;
temp=XBYTE[m_CurveStartPoint]; //首先把第一个点暂存到temp上
for(i=0;i<19;i++)
{
XBYTE[m_CurveStartPoint+i]=XBYTE[m_CurveStartPoint+1+i]; //然后取后面一个点给前面一个点,
}
XBYTE[m_CurveStartPoint+19]=temp;// 最后把先前暂存的第一个点赋给最后一个点
}
unsigned char delay=0;
unsigned int k=0;
void main(void)
{
TimerSetTime(50); //设置MC8051的定时器每隔50毫秒发生一次中断
RefreshLCD(0);//因为下面要修改“字符控件”所以先先禁止刷新屏幕
//PlayAudio("u:\\output.wav"); //调用系统函数播放音频
DispStr(m_String,"Welcome");//显示字符串
RefreshLCD(1);//允许刷新屏幕
EA=1; //打开中断总开关,
ET0=1;//打开定时器中断
ES=1;//打开串口中断
while(1)
{
if(delay>10)//每隔10*50MS执行一次下面的
{
delay=0;
k++;//每隔500豪秒加1
RefreshLCD(0);//因为下面要修改“实时数值控件”和“曲线控件”所以先先禁止刷新屏幕
SetIntVar(m_DataDisplay,k);//设置控件的HMI 变量的大小 ;HMI 变量地址见SysVar.h头文件
MoveCurve(); //移动曲线
RefreshLCD(1);//允许刷新屏幕
}
}
}
//**定时器0中断程序
void timer0(void) interrupt 1
{
delay++;
}
//串口接收中断函数
unsigned char bufcom1;
unsigned char bufcom2;
void uart(void) interrupt 4
{
if(COMNUM==1)//如果是串口一收到数据
{
bufcom1=SBUF;//把接收到的数据放到串口一的缓存上
}
else if(COMNUM==2)//如果是串口二收到数据
{
bufcom2=SBUF; //把接收到的数据放到串口二的缓存上
}
}