




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录1 单片机系统概述21.1 课题简介21.2 课题内容及要求22 系统分析22.1 80C51芯片32.2 led显示32.3 喇叭(蜂鸣器)、直流电机32.4 继电器32.5 数码管42.6 时钟42.7 eeprom读写42.8 独立按键43 系统设计43.1系统总体设计53.2 硬件设计63.2.1电路原理图63.2.2 实习设备材料63.2.3 焊接63.2.4 实物图73.3软件设计74 代码编写85 程序调试286 运行与测试281 单片机系统概述1.1 课题简介目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。1.2 课题内容及要求本设计着重在于动手焊接单片机开发版,编写代码,测试软件,系统实现16个独立键盘控制功能,并从实践经验出发对单片机系统做了详细的分析和研究,增进对单片机的感性认识,加深对计算机硬件基础理论知识方面的理解。通过查阅有关资料,掌握PROTEL的使用。掌握电路设计的一般方法,在我院自主开发的ES-01单片机开发板上焊接电路,掌握计算机硬件调试的基础方法、电路仿真的过程。并通过简单课题的硬件设计、调试练习,提高查阅资料的能力和撰写论文报告的能力。了解必须提交的各项工程文件,也达到巩固、充实和综合运用所学知识解决实际问题的目的,提高分析问题、解决问题的能力。并重点掌握硬件焊接调试、软件编程、统调的技能。2 系统分析单片机全称叫单片微型计算机(Single Chip Microcomputer),是一种集成电路芯片,采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统。单片机系统是在单片机上增加一些外围芯片和软件组完成的完整系统。本次系统功能的实现可分为各个模块,因此首先编写各模块的子代码,由于模块之间的独立,需要进行整合。2.1 80C51芯片t图2.1 580C51芯片主电源引脚2.2 led显示图2.2 LED显示2.3 喇叭(蜂鸣器)、直流电机图2.3 喇叭、直流电机电路2.4 继电器图2.4 继电器2.5 数码管图2.5 数码管显示2.6 时钟图2.6 实时时钟2.7 eeprom读写图2.7 eeprom读写2.8 独立按键图2.8 独立按键3 系统设计 一个完备的单片机系统包括硬件和软件两大部分,其中硬件部分包括扩展的存储器、键盘、显示、前向通道、后向通道、控制接口电路以及相关芯片的外围电路等;软件的功能就是指挥单片机按预定的功能要求进行操作的程序。对于一个单片机系统只有软、硬件紧密配合,协调一致,这样才是高性能的单片机系统。3.1系统总体设计系统总体设计是单片机系统设计的前提,合理的总体设计是系统成败的关键。总体设计关键在于对系统功能和性能的认识和合理分析,系统单片机及关键芯片的选型,系统基本结构的确立和软、硬件功能的划分。开始明确任务选择芯片划分软、硬件功能软件设计硬件设计联机仿真调试固化程序、独立运行排除故障、修改软件结束图3.1 单片机系统研制过程3.2 硬件设计3.2.1电路原理图图3.2 电路原理图图3.2 底层布线图3.3 顶层布线图3.4 顶层+底层布线3.2.2 实习设备材料表3.1 设备材料工具电烙铁、吸锡工具、镊子、钳子、锡丝、万用表开发板器件二极管、三极管、电阻(排阻)、电容、排针、稳压管、LED、液晶、单片机板、加载器板、电源开关、晶振、保险、按键、5V蜂鸣器、5V继电器、电阻(1K、10K、20K)3.2.3 焊接 焊接就是将各种元器件固定在电路板上,它不但能固定零件,而且能保证可靠的电流通路,焊接质量的好坏,将直接影响单片机的质量。1. 焊接过程:(1)、烙铁是焊接的主要工具之一。新烙铁使用前应用锉刀将烙铁头部倒角磨光,以防焊接时毛刺将印刷电路板焊盘损坏。然后用焊锡在烙铁头上沾附一层光亮的锡,这样烙铁就可以使用了 (2)、烙铁温度和焊接时间要适当 焊接时应让烙铁头加热到温度高于焊锡溶点,并掌握正确的焊接时间。一般不超过10秒钟。时间过长会使印刷电路板铜铂跷起,损坏电路板及电子元器件。 (3) 焊接方法 一般采用直径1.0-1.2mm的焊锡丝。焊接时左手拿锡丝,右后拿烙铁。在烙铁接触焊点的同时送上焊锡丝,焊锡的量要适量。太多易引起搭焊短路,太少元件又不牢固。 2. 调试运行:在进行调试的时候,用万用表测试每个元器件的管脚,尤其是电阻、电容。和三极管,由于元器件较多,所以防止安装时安装上了错误的原件;电容要注意它的正负脚的方向,确保电源正极接电容的长管脚;三极管也要测试三个管脚的电压,保证发射极正偏集电极反偏,使三极管正常工作在放大区内。最后要检查芯片放着合适的位置,方向不要放反,给电路板装上支架,这样所有的调试工作就完成了。3.2.4 实物图图3.5 焊接实物图3.3软件设计 独立键盘本系统以矩阵键盘为基础,进行整合。在其功能按键上添加函数,使其按下按键时能够独立实现代码功能,如下图2.1所示。实时时钟Eeprom读写步进电机数码管显示继电器蜂鸣器Led流水灯独立按键图3.1 软件实现功能4代码编写#include #includeunsigned char code digit10=0123456789; #define uchar unsigned char /数据类型的宏定义#define uint unsigned int /数据类型的宏定义#define MOTOR_BUFF 0x2F#define PORT0 P0#defineOP_READ0xa1/ 器件地址以及读取操作,0xa1即为1010 0001B#defineOP_WRITE 0xa0/ 器件地址以及写入操作,0xa0即为1010 0000B#define LED_BUFF 0x2Esbit LED_CS=P25; /LED灯 sbit DS1302_CS=P26; /实时时钟sbit LCD_CS=P36; sbit MOTOR_CS=P27; /喇叭sbit DISP_HCS=P36; /数码管行片选sbit DISP_VCS=P37; /数码管列片选sbit SCLK=P20; /位定义1302芯片的接口,时钟输出端口定义在P1.0引脚sbit DATA=P21; sbit RST=P26; sbit SCL=P22; /将串行时钟总线SCL位定义在为P3.4引脚sbit SDA=P23; /将串行数据总线SDA位定义在为P3.5引脚/unsigned char code table1=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/定义共阳数码管显示字型码 unsigned char sec=0; /定义计数值,每过1秒,sec加1 bit write=0; /写24C08的标志;sbit shiwei=P36; /十位选通定义 sbit gewei=P37; /个位选通定义unsigned char code RUN8=0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09; /步进电机相序表void DelayMS(unsigned char time);unsigned int L1 = LED_BUFF|10;unsigned int L2 = LED_BUFF|11;unsigned int L3 = LED_BUFF|12;unsigned int L4 = LED_BUFF|13;sbit KEYA = P10;sbit KEYB = P11;sbit KEYC = P12;sbit KEYD = P13;unsigned char code table=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF; /共阳数码管显示字型码数组 1011 1111 - void DelayMS(unsigned char time) unsigned char i;while(time-) for(i=0;i246;i+); /循环246约为1ms void delaynus(unsigned char n) unsigned char i; for(i=0;in;i+); void Display2(unsigned char temp, unsigned char j)LED_CS = 0; DISP_VCS = 1;switch(j)case 0: PORT0 = 0x01;DISP_VCS = 0;DISP_HCS = 1;P0 = tabletemp;DISP_HCS = 0;DelayMS(1); break;case 1: PORT0 = 0x02; DISP_VCS = 0;DISP_HCS = 1;P0 = tabletemp;DISP_HCS = 0;DelayMS(1); break; case 2: PORT0 = 0x04; DISP_VCS = 0;DISP_HCS = 1;P0 = tabletemp;DISP_HCS = 0;DelayMS(1); break;case 3: PORT0 = 0x08; DISP_VCS = 0;DISP_HCS = 1;P0 = tabletemp;DISP_HCS = 0;DelayMS(1); break; return;/*函数功能:向1302写一个字节数据入口参数:x*/ void Write1302(unsigned char dat) unsigned char i; SCLK=0; /拉低SCLK,为脉冲上升沿写入数据做好准备 delaynus(2); /稍微等待,使硬件做好准备 for(i=0;i=1; /将dat的各数据位右移1位,准备写入下一个数据位 /*函数功能:根据命令字,向1302写一个字节数据入口参数:Cmd,储存命令字;dat,储存待写的数据*/ void WriteSet1302(unsigned char Cmd,unsigned char dat) RST=0; /禁止数据传递 SCLK=0; /确保写数居前SCLK被拉低 RST=1; /启动数据传输 delaynus(2); /稍微等待,使硬件做好准备 Write1302(Cmd); /写入命令字 Write1302(dat); /写数据 SCLK=1; /将时钟电平置于高电平状态 RST=0; /禁止数据传递 /*函数功能:从1302读一个字节数据入口参数:x*/ unsigned char Read1302(void) unsigned char i,dat;delaynus(2); /稍微等待,使硬件做好准备for(i=0;i=1; if(DATA=1) /如果读出的数据是1 dat|=0x80; /将1取出,写在dat的最高位 SCLK=1; /将SCLK置于高电平,为下降沿读出 delaynus(2); /稍微等待 SCLK=0; /拉低SCLK,形成脉冲下降沿 delaynus(2); /稍微等待 return dat; /将读出的数据返回 /*函数功能:根据命令字,从1302读取一个字节数据入口参数:Cmd*/ unsigned char ReadSet1302(unsigned char Cmd) unsigned char dat; RST=0; /拉低RST SCLK=0; /确保写数居前SCLK被拉低 RST=1; /启动数据传输 Write1302(Cmd); /写入命令字 dat=Read1302(); /读出数据 SCLK=1; /将时钟电平置于已知状态 RST=0; /禁止数据传递 return dat; /将读出的数据返回/*函数功能: 1302进行初始化设置*/ void Init_DS1302(void) unsigned char flag; flag= ReadSet1302(0x81);if(flag&0x80) /判断时钟芯片是否关闭 WriteSet1302(0x8E,0x00); /根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,0x00); /根据写秒寄存器命令字,写入秒的初始值WriteSet1302(0x82,0x02); /根据写分寄存器命令字,写入分的初始值WriteSet1302(0x84,0x16); /根据写小时寄存器命令字,写入小时的初始值WriteSet1302(0x86,0x22); /根据写日寄存器命令字,写入日的初始值WriteSet1302(0x88,0x05); /根据写月寄存器命令字,写入月的初始值WriteSet1302(0x8c,0x11); /根据写年寄存器命令字,写入年的初始值WriteSet1302(0x90,0xa5); /打开充电功能 选择2K电阻充电方式WriteSet1302(0x8E,0x80); /根据写状态寄存器命令字,写入保护指令 void display(unsigned char i) DISP_VCS=1;P0=0x01;DISP_VCS=0;DISP_HCS=1;LCD_CS=1; P0=tablei;LCD_CS=0;DISP_HCS=0; void led()int i=8; /用以控制循环次数unsigned char a=0xFE; P0 = 0xff; /端口初始化 P1 = 0xff; P2 = 0xff; P3 = 0xff;LED_CS = 1;P0=a;DelayMS(500); /延时1s /点亮1位while(i) /循环8次一次点亮8位LED a=a7; P0=a; DelayMS(500); /延时1s i-; P0=0x00; /全亮DelayMS(500); /延时1sP0=0xff; /全灭DelayMS(500); /延时1sLED_CS = 0; void speaker() uint SPEAKER = MOTOR_BUFF | (16); uint i = 4;while(i)MOTOR_CS = 1;SPEAKER = 16;P0 = SPEAKER&0x40;DelayMS(1000);MOTOR_CS = 0; i-;void relay() uchar i = 12;while(i)MOTOR_CS = 1;PORT0 = 0xef;DelayMS(600);MOTOR_CS = 0;i-; display1() unsigned char i;LCD_CS = 1; DISP_VCS = 1;PORT0 = 0x0F;DISP_VCS = 0;DelayMS(500);DISP_HCS = 1;for(i=0;i4,0); Display2(ReadValue&0x0F),1); ReadValue = ReadSet1302(0x81); /从秒寄存器读数据 Display2(ReadValue&0x70)4,2); Display2(ReadValue&0x0F),3); void motor_ffw() unsigned char i;for (i=0; i8; i+) P0 = RUNi; /取数据DelayMS(2); /调节转速 void Init() P0 = 0xFF;P1 = 0xFF;P2 = 0x80;P3 = 0x00;void step() Init(); MOTOR_CS=1; while(1) motor_ffw(); /调用旋转处理函数/*函数功能:延时1ms*/void delay1ms() unsigned char i,j; for(i=0;i10;i+) for(j=0;j33;j+) ; /*函数功能:延时若干毫秒入口参数:n*/ void delaynms(unsigned char n) unsigned char i;for(i=0;in;i+) delay1ms(); void start()/ 开始位SDA = 1; /SDA初始化为高电平“1” SCL = 1; /开始数据传送时,要求SCL为高电平“1”_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SDA = 0; /SDA的下降沿被认为是开始信号_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SCL = 0; /SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递) /*函数功能:结束数据传送*/void stop()/ 停止位SDA = 0; /SDA初始化为低电平“0”_nSCL = 1; /结束数据传送时,要求SCL为高电平“1”_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SDA = 1; /SDA的上升沿被认为是结束信号_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SDA=0;SCL=0;/*函数功能:检测应答位*/bit Ask() /检测应答 bit ack_bit; /储存应答位 SDA = 1; / 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线, /以让SDA线转由接收设备(AT24Cxx)控制_nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SCL = 1; /根据上述规定,SCL应为高电平_nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期_nop_(); /等待一个机器周期 ack_bit = SDA; /接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节 /若送高电平,表示没有接收到,传送异常 结束发送SCL = 0; /SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)return ack_bit;/ 返回AT24Cxx应答位/*函数功能:从AT24Cxx读取数据出口参数:x*/unsigned char ReadData()/ 从AT24Cxx移入数据到MCUunsigned char i;unsigned char x; /储存从AT24Cxx中读出的数据for(i = 0; i 8; i+)SCL = 1; /SCL置为高电平x=1; /将x中的各二进位向左移一位x|=(unsigned char)SDA; /将SDA上的数据通过按位“或“运算存入x中SCL = 0; /在SCL的下降沿读出数据return(x); /将读取的数据返回/*函数功能:向AT24Cxx的当前地址写入数据入口参数:y (储存待写入的数据)*/在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0void WriteCurrent(unsigned char y)unsigned char i;for(i = 0; i 8; i+)/ 循环移入8个位 SDA = (bit)(y&0x80); /通过按位“与”运算将最高位数据送到S /因为传送时高位在前,低位在后_nop_(); /等待一个机器周期 SCL = 1; /在SCL的上升沿将数据写入AT24Cxx _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SCL = 0; /将SCL重新置为低电平,以在SC线形成传送数据所需的个脉冲y = 1; /将y中的各二进位向左移一位 /*函数功能:向AT24Cxx中的指定地址写入数据入口参数:add (储存指定的地址);dat(储存待写入的数据)*/void WriteSet(unsigned char add, unsigned char dat)/ 在指定地址addr处写入数据WriteCurrentstart(); /开始数据传递WriteCurrent(OP_WRITE); /选择要操作的AT24Cxx芯片,并告知要对其写入数据 Ask();WriteCurrent(add); /写入指定地址Ask();WriteCurrent(dat); /向当前地址(上面指定的地址)写入数据Ask();stop(); /停止数据传递delaynms(4); /1个字节的写入周期为1ms, 最好延时1ms以上/*函数功能:从AT24Cxx中的当前地址读取数据出口参数:x (储存读出的数据) */unsigned char ReadCurrent()unsigned char x;start(); /开始数据传递WriteCurrent(OP_READ); /选择要操作的AT24Cxx芯片,并告知要读其数据Ask();x=ReadData(); /将读取的数据存入xstop(); /停止数据传递return x; /返回读取的数据/*函数功能:从AT24Cxx中的指定地址读取数据入口参数:set_addr出口参数:x */unsigned char ReadSet(unsigned char set_addr)/ 在指定地址读取start(); /开始数据传递WriteCurrent(OP_WRITE); /选择要操作的AT24Cxx芯片,并告知要对其写入数据Ask();WriteCurrent(set_addr); /写入指定地址Ask();return(ReadCurrent(); /从指定地址读出数据并返回/*/void LEDshow() /LED显示函数 P0=tablesec/10; shiwei=0; delaynms(2); shiwei=1;P0=tablesec%10; gewei=0; delaynms(2); gewei=1;/*/*函数功能:主函数*/void eeprom( ) SDA = 1; / SDA=1,SCL=1,使主从设备处于空闲状态SCL = 1; sec=ReadSet(2);/读出保存的数据赋于secwhile(1) LEDshow(); DelayMS(100000);step();if(write=1) /判断计时器是否计时一秒 write=0; /清零 WriteSet(2,sec); /在24c08的地址2中写入数据sec void key()MOTOR_CS = 0; while(1) if(KEYA = 0) DelayMS(5);if(KEYA = 0)L1 = 10;LED_CS = 1;P0 = L1&0x01;LED_CS = 0;while(!KEYA); else if(KEYB = 0) DelayMS(5);if(KEYB = 0)L2 = 11;LED_CS = 1;P0 = L2&0x02;LED_CS = 0;while(!KEYB); else if(KEYC = 0) DelayMS(5);if(KEYC = 0)L3 = 12;LED_CS = 1;P0 = L3&0x04;LED_CS = 0;while(!KEYC); else if(KEYD = 0) DelayMS(5);if(KEYD = 0)L4 = 13;LED_CS = 1;P0 = L4&0x08;LED_CS = 0;while(!KEYD); void main( ) unsigned char temp; LED_CS=0x00; DS1302_CS=0x00; MOTOR_CS=0x00;DISP_HCS=0x00;DISP_VCS=0x00;display(16); /初始显示 -while(1) P1=0xff; /先向P1口写1;端口读状态P1=0x0f;temp=P1; if(temp!=0x0f) DelayMS(100); if(temp!=0x0f) P1=0x7f; temp=P1;switch(temp) case(0x7e):led();break; /s1case(0x7d):speaker();break; /s2case(0x7b):relay();break; /s3case(0x77):display1();break; /s4P1=0xbf;temp=P1;switch(temp) case(0xbe):clock();b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美丽拼音教学课件
- 员工感恩培训
- 技术部考试试题及答案
- 交通银行2025宿州市半结构化面试15问及话术
- 邮储银行2025白城市秋招面试典型题目及参考答案
- 中国银行2025黄石市秋招群面案例总结模板
- 2025年3D打印的金属成型工艺
- 2025年3D打印的药物递送系统
- 中国银行2025阳泉市笔试英文行测高频题含答案
- 农业银行2025成都市秋招群面案例总结模板
- 网络货运行业知识培训课件
- 人体十二经络系统解析
- 1.8《天气的影响》教学设计-教科版三上科学(新教材)
- 消防系统信号传输方案
- T-WHCIA 1008-2025 城市道路软弱土地基处理技术规程
- DB15∕T 3644-2024 国有企业阳光采购规范
- 2025年7月广东深圳市光明区审计局招聘专干1人笔试参考题库附答案解析
- 2025年交通安全宣传周知识竞赛考试题库及答案(含各题型)
- 2025年江西省赣州市《综合基础知识》事业单位招聘考试国考真题(附答案)
- 2025年云南文山交通运输集团公司招聘考试笔试试卷【附答案】
- 2025年深圳中级电工试题及答案
评论
0/150
提交评论