51单片机C语言编程100例.docx
- 文档编号:7178594
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:23
- 大小:21.56KB
51单片机C语言编程100例.docx
《51单片机C语言编程100例.docx》由会员分享,可在线阅读,更多相关《51单片机C语言编程100例.docx(23页珍藏版)》请在冰豆网上搜索。
51单片机C语言编程100例
/*函数的使用和熟悉*/
;;;if(DeCode()==1)
Function();if(DeCode()==1)
Function();//如果满足条件,执行遥控功能
}
EX0=1;//开启外中断EX0
}
//实例98:
基于DS1302的日历时钟
#include<>//包含单片机寄存器的头文件
#include<>//包含_nop_()函数定义的头文件
/***********************************************************************
以下是DS1302芯片的操作程序
************************************************************************/
unsignedcharcodedigit[10]={"09"};//定义字符数组显示数字
sbitDATA=P1^1;//位定义1302芯片的接口,数据输出端定义在引脚
sbitRST=P1^2;//位定义1302芯片的接口,复位端口定义在引脚
sbitSCLK=P1^0;//位定义1302芯片的接口,时钟输出端口定义在引脚
/*****************************************************
函数功能:
延时若干微秒
入口参数:
n
***************************************************/
voiddelaynus(unsignedcharn)
{
unsignedchari;
for(i=0;i ; } /***************************************************** 函数功能: 向1302写一个字节数据 入口参数: x ***************************************************/ voidWrite1302(unsignedchardat) { unsignedchari; SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备 delaynus (2);//稍微等待,使硬件做好准备 for(i=0;i<8;i++)//连续写8个二进制位数据 { DATA=dat&0x01;//取出dat的第0位数据写入1302 delaynus (2);//稍微等待,使硬件做好准备 SCLK=1;//上升沿写入数据 delaynus (2);//稍微等待,使硬件做好准备 SCLK=0;//重新拉低SCLK,形成脉冲 dat>>=1;//将dat的各数据位右移1位,准备写入下一个数据位 } } /***************************************************** 函数功能: 根据命令字,向1302写一个字节数据 入口参数: Cmd,储存命令字;dat,储存待写的数据 ***************************************************/ voidWriteSet1302(unsignedcharCmd,unsignedchardat) { RST=0;//禁止数据传递 SCLK=0;//确保写数居前SCLK被拉低 RST=1;//启动数据传输 delaynus (2);//稍微等待,使硬件做好准备 Write1302(Cmd);//写入命令字 Write1302(dat);//写数据 SCLK=1;//将时钟电平置于已知状态 RST=0;//禁止数据传递 } /***************************************************** 函数功能: 从1302读一个字节数据 入口参数: x ***************************************************/ unsignedcharRead1302(void) { unsignedchari,dat; delaynus (2);//稍微等待,使硬件做好准备 for(i=0;i<8;i++)//连续读8个二进制位数据 { dat>>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位 if(DATA==1)//如果读出的数据是1 dat|=0x80;//将1取出,写在dat的最高位 SCLK=1;//将SCLK置于高电平,为下降沿读出 delaynus (2);//稍微等待 SCLK=0;//拉低SCLK,形成脉冲下降沿 delaynus (2);//稍微等待 } returndat;//将读出的数据返回 } /***************************************************** 函数功能: 根据命令字,从1302读取一个字节数据 入口参数: Cmd ***************************************************/ unsignedcharReadSet1302(unsignedcharCmd) { unsignedchardat; RST=0;//拉低RST SCLK=0;//确保写数居前SCLK被拉低 RST=1;//启动数据传输 Write1302(Cmd);//写入命令字 dat=Read1302();//读出数据 SCLK=1;//将时钟电平置于已知状态 RST=0;//禁止数据传递 returndat;//将读出的数据返回 } /***************************************************** 函数功能: 1302进行初始化设置 ***************************************************/ voidInit_DS1302(void) { WriteSet1302(0x8E,0x00);//根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,((0/10)<<4|(0%10)));//根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,((0/10)<<4|(0%10)));//根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,((12/10)<<4|(12%10)));//根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x86,((16/10)<<4|(16%10)));//根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((11/10)<<4|(11%10)));//根据写月寄存器命令字,写入月的初始值 WriteSet1302(0x8c,((8/10)<<4|(8%10)));//根据写小时寄存器命令字,写入小时的初始值 } /******************************************************************************* 以下是对液晶模块的操作程序 *******************************************************************************/ sbitRS=P2^0;//寄存器选择位,将RS位定义为引脚 sbitRW=P2^1;//读写选择位,将RW位定义为引脚 sbitE=P2^2;//使能信号位,将E位定义为引脚 sbitBF=P0^7;//忙碌标志位,,将BF位定义为引脚 /***************************************************** 函数功能: 延时1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 ***************************************************/ voiddelay1ms() { unsignedchari,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; } /***************************************************** 函数功能: 延时若干毫秒 入口参数: n ***************************************************/ voiddelaynms(unsignedcharn) { unsignedchari; for(i=0;i delay1ms(); } /***************************************************** 函数功能: 判断液晶模块的忙碌状态 返回值: result。 result=1,忙碌;result=0,不忙 ***************************************************/ bitBusyTest(void) { bitresult; RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1;//E=1,才允许读写 _nop_();//空操作 _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给result E=0;//将E恢复低电平 returnresult; } /***************************************************** 函数功能: 将模式设置指令或显示地址写入液晶模块 入口参数: dictate ***************************************************/ voidWriteInstruction(unsignedchardictate) { while(BusyTest()==1);//如果忙就等待 RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_();//空操作两个机器周期,给硬件反应时间 P0=dictate;//将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 指定字符显示的实际地址 入口参数: x ***************************************************/ voidWriteAddress(unsignedcharx) { WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x" } /***************************************************** 函数功能: 将数据(字符的标准ASCII码)写入液晶模块 入口参数: y(为字符常量) ***************************************************/ voidWriteData(unsignedchary) { while(BusyTest()==1); RS=1;//RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" P0=y;//将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 对LCD的显示模式进行初始化设置 ***************************************************/ voidLcdInitiate(void) { delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38);//显示模式设置: 16×2显示,5×7点阵,8位数据接口 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x38); delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x38);//连续三次,确保初始化成功 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x0c);//显示模式设置: 显示开,无光标,光标不闪烁 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x06);//显示模式设置: 光标右移,字符不移 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除 delaynms(5);//延时5ms ,给硬件一点反应时间 } /************************************************************** 以下是1302数据的显示程序 **************************************************************/ /***************************************************** 函数功能: 显示秒 入口参数: x ***************************************************/ voidDisplaySecond(unsignedcharx) { unsignedchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x49);//写显示地址,将在第2行第7列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 显示分钟 入口参数: x ***************************************************/ voidDisplayMinute(unsignedcharx) { unsignedchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x46);//写显示地址,将在第2行第7列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 显示小时 入口参数: x ***************************************************/ voidDisplayHour(unsignedcharx) { unsignedchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x43);//写显示地址,将在第2行第7列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 显示日 入口参数: x ***************************************************/ voidDisplayDay(unsignedcharx) { unsignedchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x0c);//写显示地址,将在第2行第7列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 显示月 入口参数: x ***************************************************/ voidDisplayMonth(unsignedcharx) { unsignedchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x09);//写显示地址,将在第2行第7列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 显示年 入口参数: x ***************************************************/ voidDisplayYear(unsignedcharx) { unsignedchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x06);//写显示地址,将在第2行第7列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 主函数 ***************************************************/ voidmain(void) { unsignedcharsecond,minute,hour,day,month,year;//分别储存苗、分、小时,日,月,年 unsignedcharReadValue;//储存从1302读取的数据 LcdInitiate();//将液晶初始化 WriteAddress(0x01);//写Date的显示地址,将在第1行第2列开始显示 WriteData('D');//将字符常量写入LCD WriteData('a');//将字符常量写入LCD WriteData('t');//将字符常量写入LCD WriteData('e');//将字符常量写入LCD WriteData(': ');//将字符常量写入LCD WriteAddress(0x08);//写年月分隔符的显示地址,显示在第1行第9列 WriteData('-');//将字符常量写入LCD WriteAddress(0x0b);//写月日分隔符的显示地址,显示在第1行第12列 WriteData('-');//将字符常量写入LCD WriteAddress(0x45);//写小时与分钟分隔符的显示地址,显示在第2行第6列 WriteData(': ');//将字符常量写入LCD WriteAddress(0x48);//写分钟与秒分隔符的显示地址,显示在第2行第9列 WriteData(': ');//将字符常量写入LCD Init_DS1302();//将1302初始化 while (1) { ReadValue=ReadSet1302(0x81);//从秒寄存器读数据 second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化 DisplaySecond(second);//显示秒 ReadValue=Re
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 语言 编程 100