学习笔记
学习科目: |
单片机 |
学习安排: |
单片机 |
开始时间: |
2022-02-08 |
结束时间: |
2022-02-08 |
金沙滩1602与串口示例的最后一个程序
1、main函数
#include<reg52.h>
sbit BUZZ=P1^3;
bit flagBUZZon=0;
unsigned char T0RH=0;
unsigned char T0RL=1;
void configTimer0(unsigned char ms);
extern void configUART(unsigned int baud);
extern void initlcd1602();
extern void UartRxMonitor(unsigned char ms);
extern void Uartdrive();
extern void LcdAreaClean(unsigned char x,unsigned char y,unsigned char len);
extern void LcdShowstr(unsigned char x,unsigned char y,unsigned char *str);
extern void UartWrite(unsigned char *buf,unsigned char len);
void main()
{
EA=1;
configTimer0(1);
configUART(9600);
initlcd1602();
while(1)
{
Uartdrive();
}
}
bit CmpMemory(unsigned char *part1,unsigned char *part2,unsigned char len)
{
while(len--)
{
if(*part1++!=*part2++)
{
return 0;
break;
}
}
return 1;
}
void Uartaction(unsigned char *buf,unsigned char len)
{
unsigned char i;
unsigned char code cmd0[]="buzz on";
unsigned char code cmd1[]="buzz off";
unsigned char code cmd2[]="showstr ";
unsigned char code cmdlen[]={
sizeof(cmd0)-1,sizeof(cmd1)-1,sizeof(cmd2)-1
};
unsigned char code *cmdptr[]={
&cmd0[0],&cmd1[0],&cmd2[0]
};
for(i=0;i<sizeof(cmdlen);i++)
{
if(len>=sizeof(cmdlen[i]))
{
if(CmpMemory(buf,cmdptr[i],cmdlen[i]))
{
break;
}
}
}
switch(i)
{
case 0:flagBUZZon=1;break;
case 1:flagBUZZon=0;break;
case 2:
buf[len]='\0';
LcdShowstr(0,0,buf+cmdlen[2]);
i=len-cmdlen[2];
if(i<16)
{
LcdAreaClean(i,0,16-i);
}
break;
default:
UartWrite("bad.command\r\n",sizeof("bad.command\r\n")-1);
return;
}
buf[len++]='\r';
buf[len++]='\n';
UartWrite(buf,len);
}
void configTimer0(unsigned char ms)
{
unsigned long tmp;
tmp=32768000/12;
tmp=tmp*ms/1000;
tmp=65536-tmp;
tmp=tmp+18;
T0RH=(unsigned char)(tmp>>8);
T0RL=(unsigned char)tmp;
TMOD&=0xF0;
TMOD|=0x01;
TH0=T0RH;
TL0=T0RL;
TR0=1;
ET0=1;
}
void interruptTimer0() interrupt 1
{
TH0=T0RH;
TL0=T0RL;
if(flagBUZZon)
BUZZ=~BUZZ;
else
BUZZ=1;
UartRxMonitor(1);
}
2、LCD1602函数
#include<reg52.h>
#define LCD1602_DB P0
sbit LCD1602_RS=P2^0;
sbit LCD1602_RW=P2^1;
sbit LCD1602_E=P1^2;
void delay()
{
unsigned char i;
for(i=0;i<=3;i++);
}
void LcdWaitReady()
{
unsigned char sta=0;
LCD1602_DB=0xFF;
LCD1602_RS=0;
LCD1602_RW=1;
do
{
LCD1602_E=1;
sta=LCD1602_DB;
delay();
LCD1602_E=0;
}
while(sta&0x80);
}
void LcdWritecmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_DB=cmd;
delay();
LCD1602_E=1;
delay();
LCD1602_E=0;
}
void LcdWritedat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_DB=dat;
delay();
LCD1602_E=1;
delay();
LCD1602_E=0;
}
void LcdSetCursor(unsigned char x,unsigned char y)
{
unsigned char addr;
if(y==0)
{
addr=0x00+x;
}
else
{
addr=0x40+x;
}
LcdWritecmd(0x80+addr);
}
void LcdShowstr(unsigned char x,unsigned char y,unsigned char *str)
{
LcdSetCursor(x,y);
while(*str!='\0')
{
LcdWritedat(*str++);
}
}
void LcdAreaClean(unsigned char x,unsigned char y,unsigned char len)
{
LcdSetCursor(x,y);
while(len--)
{
LcdWritedat(' ');
}
}
void initlcd1602()
{
LcdWritecmd(0x38);
LcdWritecmd(0x0C);
LcdWritecmd(0x06);
LcdWritecmd(0x01);
}
3、串口函数
#include<reg52.h>
bit flagFrame=0; //Ö¡½óêüíê±êÖ¾
bit flagTxd=0; //μ¥×Ö½ú·¢Ëííê±Ï±êÖ¾
unsigned char cntRxd=0; //½óêü×Ö½ú¼ÆêyÆ÷
unsigned char pdata bufRxd[64];
extern void Uartaction(unsigned char *buf,unsigned char len);
void configUART(unsigned int baud)
{
SCON=0x50;
TMOD&=0x0F;
TMOD|=0x20;
TH1=255-32768000/12/32/baud;
TL1=TH1;
ET1=0;
TR1=1;
ES=1;
}
void UartWrite(unsigned char *buf,unsigned char len)
{
while(len--)
{
flagTxd=0;
SBUF=*buf++;
while(!flagTxd);
}
}
unsigned char UartRead(unsigned char *buf,unsigned char len)
{
unsigned char i;
if(len>cntRxd)
{
len=cntRxd;
}
for(i=0;i<len;i++)
{
*buf++=bufRxd[i];
}
cntRxd=0;
return len;
}
void UartRxMonitor(unsigned char ms)
{
static unsigned char cntbkt=0; //ÅD¶Ï′®¿úêÇ·ñèÔ·¢Ëíêy¾Y
static unsigned char idletmr=0; //¼Æê±Î»
if(cntRxd>0)
{
if(cntbkt!=cntRxd)
{
cntbkt=cntRxd;
idletmr=0;
}
else
{
if(idletmr<30)
{
idletmr+=ms;
if(idletmr>=30)
{
flagFrame=1;
}
}
}
}
else
{
cntbkt=0;
}
}
void Uartdrive()
{
unsigned char len;
unsigned char pdata buf[40];
if(flagFrame)
{
flagFrame=0;
len=UartRead(buf,sizeof(buf));
Uartaction(buf,len);
}
}
void interruptUART() interrupt 4
{
if(RI)
{
RI=0;
if(cntRxd<sizeof(bufRxd))
{
bufRxd[cntRxd++]=SBUF;
}
}
if(TI)
{
TI=0;
flagTxd=1;
}
}
|
|