单片机编程框架剖析.docx
- 文档编号:20695519
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:32
- 大小:123.38KB
单片机编程框架剖析.docx
《单片机编程框架剖析.docx》由会员分享,可在线阅读,更多相关《单片机编程框架剖析.docx(32页珍藏版)》请在冰豆网上搜索。
单片机编程框架剖析
/******************************************************************************
延时框架
/*****************************************************************************/
voiddelay(unsignedinta)//延时函数延时ams
{
unsignedintx,y;
for(x=a;x>0;x--)
{
for(y=120;y>0;y--);
}
}
/******************************************************************************
音乐框架
/*****************************************************************************/
#include
unsignedcharbackTL0;//让计时器保存之前的大小,中断之后继续
unsignedcharbackTH0;
//中高低音的计时器开始数值
unsignedintlow[]={0xf88c,0xf95b,0xfa15,0xfa67,0xfb04,0xfb90,0xfc0c};
unsignedintmid[]={0xfc44,0xfcac,0xfd09,0xfd34,0xfd82,0xfdc8,0xfe06};
unsignedinthigh[]={0xfe22,0xfe56,0xfe85,0xfe9a,0xfec1,0xfee4,0xff03};
//unsignedintmusic[]={0xf88c,0xf95b,0xfa15,0xfa67,0xfb04,0xfb90,0xfc0c,0xfc44,0xfcac,0xfd09,0xfd34,0xfd82,0xfdc8,0xfe06,0xfe22,0xfe56,0xfe85,0xfe9a,0xfec1,0xfee4,0xff03};
sbitP15=P1^5;//音乐输出端口为P1.5可设其他端口
voidinter()interrupt1using1//计时器中断
{
P15=~P15;
TL0=backTL0;
TH0=backTH0;
}
voidsettimer()//中断允许
{
TMOD=0x01;//设置模式详情看STC资料书
EA=1;//总中断允许
ET0=1;
TR0=1;
}
voiddelay89ms(unsignedinta)//延时函数89ms是一个四分音符的长度(一分钟80拍)
{
unsignedintx,y,f;
f=a*93;
for(x=f;x>0;x--)
{
for(y=120;y>0;y--);
}
}
voidplay(inta,intde,intcl)
//低中高音播放子函数a是放第几个音,第一个音(do)为0,re为1,以此类推xi是6
//de是延时长度,一个四分音符为5,cl为123分别为低中高音
{
a=a-1;
switch(cl){
case
(1):
TL0=(unsignedchar)music[a];
TH0=(unsignedchar)(music[a]>>8);
break;
case
(2):
TL0=(unsignedchar)music[a+7];
TH0=(unsignedchar)(music[a+7]>>8);
break;
case(3):
TL0=(unsignedchar)music[a+14];
TH0=(unsignedchar)(music[a+14]>>8);
break;
}
backT0L=TL0;
backT0H=TH0;
delay89ms(de);
}voidmain()
{
settimer();
while
(1)
{
}
}
/******************************************************************************
按键框架(独立按键)
/*****************************************************************************/
sbitK1=P3^0;//RxD
//sbitK2=P3^1;//TxD
//sbitK3=P3^2;//INT0
//sbitK4=P3^3;//INT1
unsignedinti;//用于按键延时计数
if(K1==0)//检测按键K1是否按下
{
Delay10ms();//消除抖动
if(K1==0)//再次检测按键是否按下
{/*这里写需要执行的动作*/}
while((i<50)&&(K1==0))//检测按键松手检测,如果不松手超过延时也会自动结束等待
{
Delay10ms();//等待10ms
i++;
}
i=0;
}
/******************************************************************************
数码管框架(88888888)
/*****************************************************************************/
sbitLSA=P2^2;//片选信号
sbitLSB=P2^3;
sbitLSC=P2^4;
//P2^234组成3位位选信号4323个为000时启动从左至右第一个数码管
//001为第二个以此类推111激活最左边的
//另外一种方法是用P2=i<<2;来实现激活从左至右第i个管子
//如果P2=2,也就是P2=00000010,我们想激活第2个管子,左移2位后,00001000
//P2^432就是010,也就是第二个的片选信号
unsignedcharcodeDIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9的值
//unsignedcharcodeDIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
P0=DIG_CODE[/*0-9*/]//显示数字
//如果要动态显示也就是多个数码管,交替显示,可以利用人的视觉暂停作用使人看到多个数码管同时显示的效果
//同样静态就是一个数码管长开即可
/******************************************************************************
键盘矩阵框架
/*****************************************************************************/
unsignedintKeyValue;//0-15,表示第几个按键按下,数值可以自己替换
voidKeyDown(void)
{
chara;
P1=0x0f;
if(P1!
=0x0f)
{
Delay10ms();//去抖动
if(P1!
=0x0f)
{
//测试列
P1=0X0F;
switch(P1)
{
case(0X07):
KeyValue=0;break;
case(0X0b):
KeyValue=1;break;
case(0X0d):
KeyValue=2;break;
case(0X0e):
KeyValue=3;break;
//default:
KeyValue=17;//检测出错回复17意思是把数码管全灭掉。
}
//测试行
P1=0XF0;
switch(P1)
{
case(0X70):
KeyValue=KeyValue;break;
case(0Xb0):
KeyValue=KeyValue+4;break;
case(0Xd0):
KeyValue=KeyValue+8;break;
case(0Xe0):
KeyValue=KeyValue+12;break;
//default:
KeyValue=17;
}
while((a<50)&&(P1!
=0xf0))//检测按键松手检测
{
Delay10ms();
a++;
}
a=0;
}
}
}
//行线和列线是通过某个按键的按下和抬起实现联通和断开的并且导线两端上的信号是经过“与”的关系再体现到导线上的
/******************************************************************************
lcd液晶显示框架(型号LCD1602)
/*****************************************************************************/
//lcd头文件lcd.h
#ifndef__LCD_H_
#define__LCD_H_
/********************************************************************
当使用的是4位数据传输的时候定义,使用8位取消这个定义
********************************************************************/
#defineLCD1602_4PINS
#include
//---重定义关键词---//
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
#endif
/**********************************
PIN口定义
**********************************/
#defineLCD1602_DATAPINSP0
sbitLCD1602_E=P2^7;
sbitLCD1602_RW=P2^5;
sbitLCD1602_RS=P2^6;
/**********************************
函数声明
**********************************/
voidLcd1602_Delay1ms(uintc);//在51单片机12MHZ时钟下的延时函数误差0us
voidLcdWriteCom(ucharcom);//LCD1602写入8位命令子函数
voidLcdWriteData(uchardat);//LCD1602写入8位数据子函数
voidLcdInit();//LCD1602初始化子程序
#endif
//lcd头文件实现lcd.c
#include"lcd.h"
/****************************************************************
*函数名:
Lcd1602_Delay1ms
*函数功能:
延时函数,延时1ms
*输入:
c
*输出:
无
*说名:
该函数是在12MHZ晶振下,12分频单片机的延时。
*****************************************************************/
voidLcd1602_Delay1ms(uintc)//误差0us
{
uchara,b;
for(;c>0;c--)
{
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/****************************************************************
*函数名:
LcdWriteCom
*函数功能:
向LCD写入一个字节的命令
*输入:
com
*输出:
无
*****************************************************************/
#ifndefLCD1602_4PINS//当没有定义这个LCD1602_4PINS时
voidLcdWriteCom(ucharcom)//写入命令
{
LCD1602_E=0;//使能
LCD1602_RS=0;//选择发送命令
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=com;//放入命令
Lcd1602_Delay1ms
(1);//等待数据稳定
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);//保持时间
LCD1602_E=0;
}
#else
voidLcdWriteCom(ucharcom)//写入命令
{
LCD1602_E=0;//使能清零
LCD1602_RS=0;//选择写入命令
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=com;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);
LCD1602_E=0;
//Lcd1602_Delay1ms
(1);
LCD1602_DATAPINS=com<<4;//发送低四位
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);
LCD1602_E=0;
}
#endif
/****************************************************************
*函数名:
LcdWriteData
*函数功能:
向LCD写入一个字节的数据
*输入:
dat
*输出:
无
****************************************************************/
#ifndefLCD1602_4PINS
voidLcdWriteData(uchardat)//写入数据
{
LCD1602_E=0;//使能清零
LCD1602_RS=1;//选择输入数据
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=dat;//写入数据
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);//保持时间
LCD1602_E=0;
}
#else
voidLcdWriteData(uchardat)//写入数据
{
LCD1602_E=0;//使能清零
LCD1602_RS=1;//选择写入数据
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=dat;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);
LCD1602_E=0;
LCD1602_DATAPINS=dat<<4;//写入低四位
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);
LCD1602_E=0;
}
#endif
/********************************************************************
*函数名:
LcdInit()
*函数功能:
初始化LCD屏
********************************************************************/
#ifndefLCD1602_4PINS
voidLcdInit()//LCD初始化子程序
{
LcdWriteCom(0x38);//开显示
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1
LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点
}
#else
voidLcdInit()//LCD初始化子程序
{
LcdWriteCom(0x32);//将8位总线转为4位总线
LcdWriteCom(0x28);//在四位线下的初始化
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1
LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点
}
#endif
//使用lcd时
#include"lcd.h"
unsignedcharPuZh[]="PechinScience";//定义传送字符串
unsignedchari;
LcdInit();//初始化
for(i=0;i<16;i++)
{
LcdWriteData(PuZh[i]);//循环输入字符,一次一个
}
/*LCD1602对写进去的数据字节呢是以ASCII码识别的。
另外这里只是一个框架,若要熟练运用液晶屏,需要自己学习他的引脚,时序等等*/
/******************************************************************************
时钟芯片ds1302框架
/*****************************************************************************/
//ds1302.h
#ifndef__DS1302_H_
#define__DS1302_H_
//---包含头文件---//
#include
#include
//---重定义关键词---//
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
#endif
//---定义ds1302使用的IO口---//
sbitDSIO=P3^4;
sbitRST=P3^5;
sbitSCLK=P3^6;
//---定义全局函数---//
voidDs1302Write(ucharaddr,uchardat);
ucharDs1302Read(ucharaddr);
voidDs1302Init();
voidDs1302ReadTime();
//---加入全局变量--//
externucharTIME[7];//加入全局变量
#endif
//ds1302.c
#include"ds1302.h"
//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年最低位读写位;-------//
ucharcodeREAD_RTC_ADDR[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
ucharcodeWRITE_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。
---//
//---存储顺序是秒分时日月周年,存储格式是用BCD码---//
ucharTIME[7]={0,0,0x12,0x01,0x01,0x02,0x13};
/******************************************************************************
*函数名:
Ds1302Write
*函数功能:
向DS1302命令(地址+数据)
*输入:
addr,dat
*输出:
无
******************************************************************************/
voidDs1302Write(ucharaddr,uchardat)
{
ucharn;
RST=0;
_nop_();//延时一个机器周期
SCLK=0;//先将SCLK置低电平。
_nop_();
RST=1;//然后将RST(CE)置高电平。
_nop_();
for(n=0;n<8;n++)//开始传送八位地址命令
{
DSIO=addr&0x01;//数据从低位开始传送
addr>>=1;
SCLK=1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK=0;
_nop_();
}
for(n=0;n<8;n++)//写入8位数据
{
DSIO=dat&0x01;
dat>>=1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 编程 框架 剖析