单片机设计.docx
- 文档编号:14102501
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:26
- 大小:19.60KB
单片机设计.docx
《单片机设计.docx》由会员分享,可在线阅读,更多相关《单片机设计.docx(26页珍藏版)》请在冰点文库上搜索。
单片机设计
#include
#include
以下是DS1302芯片的操作程序
unsignedcharcodedigit[10]={"0123456789"};//定义字符数组显示数字
sbitDATA=P1^1;//位定义1302芯片的接口,数据输出端定义在P1.1引脚
sbitRST=P1^2;//位定义1302芯片的接口,复位端口定义在P1.1引脚
sbitSCLK=P1^0;//位定义1302芯片的接口,时钟输出端口定义在P1.1引脚
sbitTIMEADDSET=P3^0;//位定义1302芯片的接口,星期调整定义在P3.2引脚
sbitTIMEDECSET=P3^1;//位定义1302芯片的接口,星期调整定义在P3.2引脚
sbitTIMEMODSET=P3^2;//位定义1302芯片的接口,星期调整定义在P3.2引脚
sbitALARM=P3^6;//位定义51单片机的接口,闹钟输出
unsignedcharTIMEMOD=1;
日历结构体:
包括年、月、日、小时、分、秒
typedefstructSYSTEMTIME
{
unsignedcharSecond;
unsignedcharMinute;
unsignedcharHour;
unsignedcharDay;
unsignedcharMonth;
unsignedcharYear;
//unsignedcharWeek;
}
Systemtime;//定义的时间类型
SystemtimeCurrenttime;
日历结构体:
包括闹钟的小时、分、秒
unsignedcharalarmhour=0,alarmminute=0,alarmsecond=0;//分别储存苗、分、小时,日,月,年
函数功能:
延时若干微秒
入口参数:
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) { //SystemtimeCurrenttime; Currenttime.Second=55; Currenttime.Minute=59; Currenttime.Hour=23; Currenttime.Day=21; Currenttime.Month=5; Currenttime.Year=11; //Currenttime.Week=2; WriteSet1302(0x8E,0x00);//根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,((Currenttime.Second/10)<<4|(Currenttime.Second%10)));//根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,((Currenttime.Minute/10)<<4|(Currenttime.Minute%10)));//根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,((Currenttime.Hour/10)<<4|(Currenttime.Hour%10)));//根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x86,((Currenttime.Day/10)<<4|(Currenttime.Day%10)));//根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((Currenttime.Month/10)<<4|(Currenttime.Month%10)));//根据写月寄存器命令字,写入月的初始值 WriteSet1302(0x8c,((Currenttime.Year/10)<<4|(Currenttime.Year%10)));//根据写年寄存器命令字,写入年的初始值 //WriteSet1302(0x8a,((Currenttime.Week/10)<<4|(Currenttime.Week%10)));//根据写星期寄存器命令字,写入年的初始值 } 以下是对液晶模块的操作程序 sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚 sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚 sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚 sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚 函数功能: 延时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(0x4c);//写显示地址,将在第2行第13列开始显示 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(0x49);//写显示地址,将在第2行第10列开始显示 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(0x46);//写显示地址,将在第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给硬件一点反应时间 } 函数功能: 显示闹钟秒 入口参数: x voidDisplayAlarmSecond(unsignedcharx) { unsignedchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x1d);//写显示地址,将在第2行第13列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 } 函数功能: 显示闹钟分钟 入口参数: x voidDisplayAlarmMinute(unsignedcharx) { unsignedchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x1a);//写显示地址,将在第2行第10列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 } 函数功能: 显示闹钟小时 入口参数: x voidDisplayAlarmHour(unsignedcharx) { unsignedchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x17);//写显示地址,将在第2行第7列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 } 函数功能: 显示校验模式 入口参数: x voidDisplayTMode(unsignedcharx) { unsignedchari;//j,k,l分别储存温度的百位、十位和个位 i=x; WriteAddress(0x56);//写显示地址,将在第2行第13列开始显示 switch(i) { case1: WriteData('Y');WriteData('e');WriteData('a');WriteData('r');WriteData('');WriteData('');WriteData('');break; case2: WriteData('M');WriteData('o');WriteData('n');WriteData('t');WriteData('h');WriteData('');WriteData('');break; case3: WriteData('D');WriteData('a');WriteData('y');WriteData('');WriteData('');WriteData('');WriteData('');break; case4: WriteData('H');WriteData('o');WriteData('u');WriteData('r');WriteData('');WriteData('');WriteData('');break; case5: WriteData('M');WriteData('i');WriteData('n');WriteData('u');WriteData('t');WriteData('e');WriteData('');break; case6: WriteData('S');WriteData('e');WriteData('c');WriteData('o');WriteData('n');WriteData('d');WriteData('');break; case7: WriteData('A');WriteData('H');WriteData('o');WriteData('u');WriteData('r');WriteData('');WriteData('');break; case8: WriteData('A');WriteData('M');WriteData('i');WriteData('n');WriteData('u');WriteData('t');WriteData('e');break; case9: WriteData('A');WriteData('S');WriteData('e');WriteData('c');WriteData('o');WriteData('n');WriteData('d');break; } delaynms(50);//延时1ms给硬件一点反应时间 } 函数功能: 校时加1 入口参数: x voidTimeSetAdd(unsignedcharx) { unsignedchari=x;//i为校验关键字1为年,2月,3日,4时,5分,6秒,7周 switch(i) { case1: Currenttime.Year++; WriteSet1302(0x8c,((Currenttime.Year/10)<<4|(Currenttime.Year%10)));//根据写星期寄存器命令字,写入星期的初始值 break; case2: if(Currenttime.Month<12) Currenttime.Month++; else Currenttime.Month=1; WriteSet1302(0x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 设计