当前位置: 首页 > news >正文

液压电机东莞网站建设建一个电商平台多少钱

液压电机东莞网站建设,建一个电商平台多少钱,郑州燚空间网络科技有限公司,唐山建设集团网站一、单片机基础介绍 1.何为单片机 单片机#xff0c;英文Micro Controller Unit#xff0c;简称MCU 。内部集成了中央处理器CPU、随机存储器ROM、只读存储器RAM、定时器/计算器、中断系统和IO口等一系列电脑的常用硬件功能 单片机的任务是信息采集#xff08;依靠传感器英文Micro Controller Unit简称MCU 。内部集成了中央处理器CPU、随机存储器ROM、只读存储器RAM、定时器/计算器、中断系统和IO口等一系列电脑的常用硬件功能 单片机的任务是信息采集依靠传感器、处理依靠CPU和硬件设备例如电机LED等的控制 。单片机跟计算机相比单片机算是一个袖珍版计算机一个芯片就能构成完整的计算机系统。但在性能上与计算机相差甚远但单片机成本低、体积小、结构简单在生活和工业控制领域大有所用。 同时学习使用单片机是了解计算机原理与结构的最佳选择。 单片机工作的基本时序 我们都知道在学校是通过铃声来控制所有班级的上下课时间我们都知道单片机执行指令的过程就是从ROM取出一条指令执行来完成它在各个地方的作用那它什么时候取指令这个是顺序呢这里引入一个时序的周期每访问一次ROM的时间就是一个机器周期的时间。 1个机器周期 6个状态周期 12个时钟振荡周期   时钟周期即单片机的基本时间单位若晶体的频率12MHZ那时钟周期 1/12MHZ一个时钟周期 1/12MHZ 1/12000 000每秒 机器周期即12x1/12 000 000 0.000001s 1us,访问一次ROM取指令的时间就是1us 2.单片机命名规则 3.单片机内部结构 重点需记单片机管脚 1.电源Vcc正极     Gnd负极             2.XTAL单片机时钟引脚外接晶振 3.RST复位 4.开发板介绍 开发板原理图 二、单片机的一些基础项目 2-1、点亮一个led灯 #include REGX52.H void main() {P20x7f;//1111 1110 d1 16 15//0111 1111 d8 7 16//1011 1111 d7 11 16} 通过高低电平控制led亮否 2-2、led闪烁 #include REGX52.H #include INTRINS.H//延时函数 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i); }void main() {while(1){P20xfe;//亮Delay500ms();//延时500msP20xff;//灭Delay500ms();//延时500ms} } 通过延时函数使led闪烁 2-3、流水灯 #include REGX52.H #include INTRINS.Hvoid Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i); }void main() {while(1){P20xfe;//1111 1110Delay500ms();P20xfd;//1111 1101Delay500ms();P20xfb;//1111 1011Delay500ms();P20xf7;//1111 0111Delay500ms();P20xef;//1110 1111Delay500ms();P20xdf;//1101 1111Delay500ms();P20xbf;//1011 1111Delay500ms();P20x7f;//0111 1111Delay500ms();} } 位运算做法 2-4、流水灯plus #include REGX52.H #include INTRINS.H//任意延时函数——1ms的延时函数执行x次循环 void Delay1ms(unsigned int xms) //11.0592MHz {unsigned char i, j;while(xms){_nop_();i 2;j 199;do{while (--j);} while (--i);xms--;} }void main() {while(1){P20xfe;//1111 1110Delay1ms(100);P20xfd;//1111 1101Delay1ms(100);P20xfb;//1111 1011Delay1ms(100);P20xf7;//1111 0111Delay1ms(100);P20xef;//1110 1111Delay1ms(100);P20xdf;//1101 1111Delay1ms(100);P20xbf;//1011 1111Delay1ms(100);P20x7f;//0111 1111Delay1ms(100);} } 通过任意延时函数去简化步骤 3-1、通过独立按键控制led闪烁 #include REGX52.Hvoid main() {while(1){if(P3_10)//低电平 按下按键接地为0{P2_00;//d1亮}else {P2_01;}} } 3-2、通过独立按键控制led状态 #include REGX52.H #include INTRINS.H void Delay(unsigned int xms) //11.0592MHz {unsigned char i, j; while(xms){_nop_();i 2;j 199;do{while (--j);} while (--i);xms--; } }void main() {while(1){if(P3_10){Delay(20);//取消前摇while(P3_10);//判断何时松手Delay(20);//取消后摇P2_0~P2_0;//按位取反} } } 取消按键时的抖动使单片机稳定判断状态。按一次亮按一次灭。 3-3、通过独立按键控制led完成二进制 #include REGX52.H #include INTRINS.Hvoid Delay(unsigned int xms) //11.0592MHz {unsigned char i, j; while(xms){_nop_();i 2;j 199;do{while (--j);} while (--i);xms--; } }void main() {unsigned int lednum0;while(1){if(P3_10){Delay(20);while(P3_10);Delay(20);lednum;P2~lednum;} } } 也可以直接用P2--代替最后两句完成二进制运算。 3-4、用独立按键控制led灯移位 #include REGX52.H #include INTRINS.Hvoid Delay(unsigned int xms) //11.0592MHz {unsigned char i, j; while(xms){_nop_();i 2;j 199;do{while (--j);} while (--i);xms--; } }void main() {unsigned int lednum0;P2~0x01;while(1){if(P3_10)//k1{Delay(20);while(P3_10);Delay(20);lednum;if(lednum8)lednum0;P2~(0x01lednum);}if(P3_00)//k2{Delay(20);while(P3_00);Delay(20);if(lednum0)lednum7;else lednum--;P2~(0x01lednum); } }} 4-1 静态数码管 1.常见数码管 2.控制数码管显示的原理图 3.管脚定义对应字母控制对应位置亮上面的为共阴极、下面的为共阳极可以理解为3,8管脚处为供电三角形尖尖有一横的是负极所有共阴极两个图中的数字为引脚 4.下面为多个数码管PCB板的4个为一体同样上面为共阴极、下面为共阳极的原理图 5.STC89C52实现数字显示 ①原理图是共阴极上面给0、下给1亮 ②138译码器输入3ABC,读的时候是从下读 C B A 个口控制输出8个口输出口连接共阴极的是0还是1在这里控制使能端连接按下图给1和0就可以用了 通过CBA给数字0和1二进制转换10进制得到数字几就控制Y几Y0头上“—”是表示低电平有效即给0 ③双向缓冲高电平往低电平送数据 CC2电容作用滤波电容稳定电源确定电路稳定性提高电路工作性能可靠运行 RP4排阻限流防止电流过大 ④这里的P01......P07,就是用P0口后面代码就是通过P0口控制灯的 只有Y5为0其他Y0...Y7都为1 读取顺序都是从下到上 ⑤代码控制公共端从下往上写 二进制101转换为1十进制为5控制Y5即公共端的LED6 要显示下图的数字6 代码实现如下P2控制共阴极P0控制显示数字及结果 ⑥优化操作代码通过数组子函数来优化代码 #include REGX52.H #include INTRINS.Hunsigned char NixieTable[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};void Nixie(unsigned char Location,Number) {switch(Location){case 1:P2_41;P2_31;P2_21;break;case 2:P2_41;P2_31;P2_20;break;case 3:P2_41;P2_30;P2_21;break;case 4:P2_41;P2_30;P2_20;break;case 5:P2_40;P2_31;P2_21;break;case 6:P2_40;P2_31;P2_20;break;case 7:P2_40;P2_30;P2_21;break;case 8:P2_40;P2_30;P2_20;break;}P0NixieTable[Number]; }void main() {Nixie(7,10);while(1);} 要显示的数字对应的值 4-2、动态数码管  #include REGX52.H #include INTRINS.Hunsigned char NixieTable[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};void Delay (unsigned int xms) //11.0592MHz {unsigned char i, j; while(xms--){_nop_();i 2;j 199;do{while (--j);} while (--i); } }void Nixie(unsigned char Location,Number) {switch(Location){case 1:P2_41;P2_31;P2_21;break;case 2:P2_41;P2_31;P2_20;break;case 3:P2_41;P2_30;P2_21;break;case 4:P2_41;P2_30;P2_20;break;case 5:P2_40;P2_31;P2_21;break;case 6:P2_40;P2_31;P2_20;break;case 7:P2_40;P2_30;P2_21;break;case 8:P2_40;P2_30;P2_20;break;}P0NixieTable[Number];Delay(1);//保证亮度P00x00;//清零 }void main() {while(1){Nixie(2,1);// Delay(20);Nixie(3,2);// Delay(20);Nixie(4,3);// Delay(20);} } 注释掉上面的延时调用旁边的管会有些影响需要消影段选、位选影响造成串位如下代码消除 了解 5-1、模块化编程  1驱动先会用后续有详细内容 2模块化功能函数用点C文件写点H文件声明函数在main函数文件引入头文件直接调用 3注意事项 4预编译 5延时函数文件 6头文件延迟 7主函数文件程序入口 8数码管模块用到的头文件要引用 9数码管模块头文件 10函数调用 11显示 5-2 、LCD1602调试工具------- 1调试工具原理图 2模块化代码下完放到自己工程目录下 3将下好的两个文件添加到工程 4文件主要内容如下 5main函数调用 6显示其他管脚冲突所有会一起显示 7其他函数的调用及功能可以设置显示位置和范围 8需要用到延迟函数可以直接将前面模块化文件复制到工程目录下添加进来引用即可 9娱乐小计时器 #include REGX52.H #include LCD1602.h #include Delay.hint Result0;void main() {LCD_Init();//初始化while(1){Result;Delay(1000);LCD_ShowNum(1,1,Result,3);}//计时器6-1.矩阵键盘 1基础介绍 P14-P17给0就代表扫描其他给1没选中一次只能扫描一行P10-P13给0表示按下给1表示没按下逐列扫描 2.代码实现 ①创建工程并把“Delay”与“LCD1602”的模块加入此工程中。 ②编写MatrixKey(矩阵代码 #include REGX52.H #include Delay.hunsigned char MatrixKey() {unsigned char KeyNumber0;P10xff; //按列扫描P1_30; //控制扫描的列if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber1;} //while判断何时松手if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber5;}if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber9;}if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber13;}P10xff;P1_20;if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber2;}if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber6;}if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber10;}if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber14;}P10xff;P1_10;if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber3;}if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber7;}if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber11;}if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber15;}P10xff;P1_00;if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber4;}if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber8;}if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber12;}if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber16;}return KeyNumber; } ③.编写主函数 #include REGX52.H #include Delay.h #include LCD1602.h #include matrixKey.hunsigned char KeyNum;void main() {LCD_Init(); //LCD上电初始化LCD_ShowString(1,1,Helloworld);while(1){KeyNumMatrixKey();if(KeyNum){LCD_ShowNum(2,1,KeyNum,2);} }} ④.软件使用小技巧 快速生成常用格式代码 设置完成后双击就可以生成了 6-2.矩阵键盘密码锁 1把6-1文件全部cv到6-2工程文件中 2代码实现 #include REGX52.H #include Delay.h #include LCD1602.h #include matrixKey.hunsigned char KeyNum; unsigned int Password,count;void main() {LCD_Init();LCD_ShowString(1,1,Helloworld);while(1){KeyNumMatrixKey();if(KeyNum){if(KeyNum10){ //s1~s10按下密码if(count4){Password*10;PasswordKeyNum%10; //这两句是用来实现四位密码的显示count; //计数 防止按下的密码数超过四位 }LCD_ShowNum(2,1,Password,4);//更新显示}if(KeyNum11){ //s11设置为确认键if(Password2345){LCD_ShowString(1,14,OK );Password0; //密码清零count0; //计数清零LCD_ShowNum(2,1,Password,4);//更新显示}else {LCD_ShowString(1,14,ERR);Password0; //密码清零count0; //计数清零LCD_ShowNum(2,1,Password,4);//更新显示}}if(KeyNum12){ //定义S12为取消键Password0;count0;LCD_ShowNum(2,1,Password,4);} }} } 7.定时器介绍 1介绍Delay前面CPU是一直在等的用定时器在Delay时可以去检测按键提高CPU利用率 2模式1最常用 3模式时钟--计数最大65535计数系统TL0\TH0每来一个脉冲1方法计数-TF0(标志位到最大了回到0)-中断 4非门与门图形为控制部分TR0是否启动暂定 5定时器部分 6时钟可以由系统提供上图晶振也可以由外部T0P提供如下图引脚 7C/T,给1连上面为控制器给0连接下面为定时器如下图 8中断系统 9中断资源 10定时器和中断系统 11定时器相关寄存器 7-1.独立按键控制流水灯的模式 1.TMOD寄存器工作模式定时器0配置使用不可位寻址只能整体赋值 2.定时器模式1门控端给0就是tr0单独控制C/TT这里有一横表示低电平有效就给0是用T定时器模式给1用C控制器模式M1,M0工作模式选择 3.TCON控制寄存器可位寻址可以单独每一位赋值 中断溢出标志位 TF0等于1产生中断; TR01定时器是否开启给1开始电机开始工作 IE0、IT0控制外部中断引脚可以不配置 4.定时器配置  TH0\TL0 TH0\TL0 分开储存 代码优化TMOD问题不可位寻址配置两个的时候后面的会把前面的覆盖 因此可采用“与或”法设定TMOD 5.中断配置T0--ET01--EA1PT00 6.定时器配置完成模块化编程 #include REGX52.Hvoid Timer0_Init(void) //1ms11.0592MHz {TMOD 0xF0; //设置定时器模式TMOD | 0x01; //设置定时器模式TL0 0x66; //设置定时器初值TH0 0xFC; //设置定时器初值TF0 0; //清除TF0标志TR0 1; //定时器0开始计时ET01; //下面三行为中断的配置EA1;PT00; } 7.定时器中断函数模板 void Timer0_Routine() interrupt 1 //中断函数 {static unsigned int T0Count; TL0 0x66; //设置定时器初值TH0 0xFC; //设置定时器初值T0Count;if(T0Count1000) //每隔1s{ T0Count0;} } 8.独立按键模块 #include REGX52.H #include Delay.hunsigned char Key() {unsigned char KeyNumber0;if(P3_10){Delay(20);while(P3_10);Delay(20);KeyNumber1;}if(P3_00){Delay(20);while(P3_00);Delay(20);KeyNumber2;}if(P3_20){Delay(20);while(P3_20);Delay(20);KeyNumber3;}if(P3_30){Delay(20);while(P3_30);Delay(20);KeyNumber4;}return KeyNumber; } 9.主函数 #include REGX52.H #include Timer0.h #include key.h #include INTRINS.Hunsigned char KeyNumber,LEDmode; void main() {P20xfe; //与INTRINS.H中的循环左右移函数共同实现流水灯Timer0_Init(); //上电初始化while(1){KeyNumberKey();if(KeyNumber){if(KeyNumber1){LEDmode;if(LEDmode2) LEDmode0;}}} }void Timer0_Routine() interrupt 1 //中断函数 {static unsigned int T0Count; TH064535/256;TL064535%256; T0Count;if(T0Count1000) //每隔1s{T0Count0;if(LEDmode0) P2_crol_(P2,1);if(LEDmode1) P2_cror_(P2,1);} } 7-2.时钟  1.把LCD1602液晶显示、延迟、定时器、的代码复制到工程目录下导入 2.主函数包含其他模块头文件并初始化 3.复制定时器中断函数到main函数下 4.定义变量秒计数、分、小时并显示 5.代码综合 #include REGX52.H #include Delay.h #include LCD1602.h #include Timer0.hunsigned char Sec,Min,Hour; void main() {LCD_Init();//³õʼ»¯Timer0_Init();LCD_ShowString(1,1,CLOCK:);LCD_ShowString(2,1, : :);while(1){LCD_ShowNum(2,1,Hour,2);LCD_ShowNum(2,4,Min,2);LCD_ShowNum(2,7,Sec,2);} }void Timer0_Routine() interrupt 1 {static unsigned int T0Count; TL0 0x66; TH0 0xFC; T0Count;if(T0Count1000) {T0Count0;Sec;if(Sec60){Sec0;Min;if(Min60){Min0;Hour;if(Hour24){Hour0;}}}}} 8-1串口介绍 1介绍 2向单片机发送数据下面框返回上框 3DB9串口传输数据注意使用的电压是否一致使用RS232或RS485电平 4知识点 ①硬件电路 注最少需要三根线实现双向通信TXDRXDGND。VCC不一定需要可独立供电。 ②电平标准  差分信号优点传送距离远1km   TTL与RS23210m ③常见通信接口比较 CAN总线常用于汽车领域因为使用的是差分信号传输传输距离远、稳定。 通信方式的相关术语 ④51单片机里的UART串口  中间部分用来控制波特率依靠定时器来约定速率T1的溢出率通过分频后来控制收发器的采样时间。 SBUF收发数据后会产生相应的TI发送中断/RI接收中断继而进入中断函数进行相应的中断函数内部的操作。 配置ES、EAPS此时不需要配置因为只有一个中断不需要进行优先级判断。 配置好SCON和PCON读SBUF配置定时器T1打开EA和ES即串口可以开始工作。 8-2.实际配置串口  1将延迟函数复制过来并导入工程里面 2配置串口控制寄存器配置模式1最常用REN允许接收给1不允许接收给0也可以给1外面不给发就行 3TI、RI发送完置1硬件只负责但必须软件复位置0 故SCON0x40 PCON 4配置定时器 这里定时器1没有定时器0所有要把高位修改不影响高低位配置用“” |“”这两个方式 选择8位自动重载模式 5可以直接用STC-isp来配置串口  系统频率根据板子选择波特率4800波特率发生器选择8位自动重载时钟12T 6发送数据的函数 7发送单项数据 8模块化 9数据显示模式  8-3.串口实例实现  1每一秒发送一个递增的数字 2电脑通过串口控制LED灯并且返回电脑读入的数据 1.需要打开串口的中断功能 SCON 0x50;  EA1;ES1;  注要分清这里是禁止了定时器1的中断功能只是让它的溢出率去开启串口收发的功能中断的产生是由于串口收发数据产生的中断。 2.编写串口中断函数 串口中断函数模板 void UART_Routine() interrupt 4 {if(RI1){RI0; //复位清0} } 3.整体代码 9-1LED点阵屏 1.介绍 2.显示原理 3.相关图 ①led矩阵图——经测试P0控制列D控制行 ②开发版引脚对应关系 ③74HC595  加-,低电平有效 OE 使能output enable接低电平工作高电平不工作。 RCLK寄存器时钟register clock SRCLR串行清零端 SRCLK串行时钟  SER串行数据 运行方式类似队列 ④总结使用步骤进行行列的选择——列由P0口控制因此给P0赋值就能控制列。行需通过74HC595来间接控制。 9-2.点阵屏的驱动代码  示例代码1-点阵屏显示图形 1)sfr与sbit可位寻址与不可位寻址。 2 进行位声明方便操作。 3编写子函数——控制74HC595把字节数据输出给D的8个引脚。 4 编写LED矩阵显示的子函数 5  自己设计图形调用函数输入数据即可显示 示例代码2-点阵屏显示动画 1把示例1的代码模块化 2定义要显示的动画的数组并初步检测是否显示正常 3实现动态显示 上述代码实现的是流水式的动画也可以改变offset去实现逐帧动画。 4定义的Animation是放在RAM中的有空间限制浪费RAM空间。所以可以加个code把它放在flash里但此时不可在主函数里改变数组内容。 10-1 DS1302实时时钟介绍 1.介绍 定时器计时的缺点1.精度不高  2.消耗单片机的CPU  3.断电不能继续计时 而时钟芯片精度高且有备用电源掉电可以用备用电源继续计时。 2.时钟芯片的引脚定义和应用电路 ①两种封装模式直插封装和贴片封装  ②分为三部分电源部分时钟部分数据交互部分 3. 内部结构框图 4.内部寄存器的定义 秒分时日月年星期年wpwrite protect写保护涓流充电 前两列的为 命令字—— 5. 时序图 前八为指定读还是写后八位读出或者写入指定的数据。 上升沿写入下降沿读出。 6.BCD码 10-2 实例代码 1.时钟 1创建工程cvLCD1602的文件并开始模块化编写DS1302的模块 2 DS1302模块的子函数编写 3初步测试  结果会发现数字到9后会直接到16……这是因为寄存器数据是以BCD码存储的只需将Second改为Second/16*10Second%16就可以转化成十进制正常显示。 4 定义一下各个寄存器的地址方便操作再定义一个存储时间的数组 5 编写DS1302的另外两个子函数——①设定时间 ②读出时间     并声明为外部可调用的函数和数组 6 编写主函数调用函数在LCD显示屏上显示时间 2.功能化时钟——可以用独立按键设置要显示的时间 1需要用到的模块 DS1302模块LCD1602模块独立按键key模块定时器Timer0模块延时函数模块 2编写主函数 主要分为四大部分时钟模式选择显示时间设置时间选择设置的时间位置调整时间大小利用定时器中断去实现选择的时间的位置的动态显示更新显示新的时钟。 #include REGX52.H #include LCD1602.h #include DS1302.h #include Key.h #include Timer0.h #include Delay.hunsigned char KeyNum,MODE,TimeSetSelect,TimeFlashFlag;/*** brief 显示时间* param 无* retval 无*/ void TimeShow(void) {DS1302_ReadTime();LCD_ShowNum(1,1,DS1302_Time[0],2);LCD_ShowNum(1,4,DS1302_Time[1],2);LCD_ShowNum(1,7,DS1302_Time[2],2);LCD_ShowNum(2,1,DS1302_Time[3],2);LCD_ShowNum(2,4,DS1302_Time[4],2);LCD_ShowNum(2,7,DS1302_Time[5],2); }/*** brief 设置时间按键2选择设置的时间位置按键3让时间按键4让时间--* param 无* retval 无*/ void TimeSet(void) {if(KeyNum2){TimeSetSelect;TimeSetSelect % 6;}if(KeyNum3){DS1302_Time[TimeSetSelect];if(DS1302_Time[0]99){DS1302_Time[0]0;}if(DS1302_Time[1]12){DS1302_Time[1]1;}if(DS1302_Time[1]1 || DS1302_Time[1]3 ||DS1302_Time[1]5 ||DS1302_Time[1]7 || DS1302_Time[1]8 || DS1302_Time[1]10 ||DS1302_Time[1]12){if(DS1302_Time[2]31){DS1302_Time[2]1;}}else if(DS1302_Time[1]4 || DS1302_Time[1]6 ||DS1302_Time[1]5 || DS1302_Time[1]9 || DS1302_Time[1]11){if(DS1302_Time[2]30){DS1302_Time[2]1;}}else if(DS1302_Time[1]2){ if(DS1302_Time[0]%100!0DS1302_Time[0]%40||DS1302_Time[0]%1000DS1302_Time[0]%4000){if(DS1302_Time[2]29){DS1302_Time[2]1;}}else if(DS1302_Time[2]28){DS1302_Time[2]1;}}if(DS1302_Time[3]23){DS1302_Time[3]0;}if(DS1302_Time[4]59){DS1302_Time[4]0;}if(DS1302_Time[5]59){DS1302_Time[5]0;}}if(KeyNum4){DS1302_Time[TimeSetSelect]--;if(DS1302_Time[0]0){DS1302_Time[0]99;}if(DS1302_Time[1]0){DS1302_Time[1]12;}if(DS1302_Time[1]1 || DS1302_Time[1]3 ||DS1302_Time[1]5 || DS1302_Time[1]7 || DS1302_Time[1]8 || DS1302_Time[1]10 ||DS1302_Time[1]12){if(DS1302_Time[2]1){DS1302_Time[2]31;}if(DS1302_Time[2]31){DS1302_Time[2]1;}}else if(DS1302_Time[1]4 || DS1302_Time[1]6 ||DS1302_Time[1]5 || DS1302_Time[1]9 || DS1302_Time[1]11){if(DS1302_Time[2]1){DS1302_Time[2]30;}if(DS1302_Time[2]30){DS1302_Time[2]1;}}else if(DS1302_Time[1]2){if(DS1302_Time[0]%100!0DS1302_Time[0]%40||DS1302_Time[0]%1000DS1302_Time[0]%4000){if(DS1302_Time[2]1){DS1302_Time[2]29;}if(DS1302_Time[2]29){DS1302_Time[2]1;}}else {if(DS1302_Time[2]1){DS1302_Time[2]28;}if(DS1302_Time[2]28){DS1302_Time[2]1;}}}if(DS1302_Time[3]0){DS1302_Time[3]23;}if(DS1302_Time[4]0){DS1302_Time[4]59;}if(DS1302_Time[5]0){DS1302_Time[5]59;}}//动态显示选择位if(TimeSetSelect0 TimeFlashFlag1 ){LCD_ShowString(1,1, );}else {LCD_ShowNum(1,1,DS1302_Time[0],2);}if(TimeSetSelect1 TimeFlashFlag1 ){LCD_ShowString(1,4, );}else {LCD_ShowNum(1,4,DS1302_Time[1],2);}if(TimeSetSelect2 TimeFlashFlag1 ){LCD_ShowString(1,7, );}else {LCD_ShowNum(1,7,DS1302_Time[2],2);}if(TimeSetSelect3 TimeFlashFlag1 ){LCD_ShowString(2,1, );}else {LCD_ShowNum(2,1,DS1302_Time[3],2);}if(TimeSetSelect4 TimeFlashFlag1 ){LCD_ShowString(2,4, );}else {LCD_ShowNum(2,4,DS1302_Time[4],2);}if(TimeSetSelect5 TimeFlashFlag1 ){LCD_ShowString(2,7, );}else {LCD_ShowNum(2,7,DS1302_Time[5],2);} }void main() {Timer0_Init();LCD_Init();DS1302_Init();DS1302_WriteByte(0x8e,0x00); LCD_ShowString(1,1, - - );LCD_ShowString(2,1, : : );DS1302_SetTime();while(1){//通过按键1控制时钟的模式模式0为显示时钟模式1为设置时间KeyNumkey();if(KeyNum1){if(MODE0){MODE1;TimeSetSelect0;}else if(MODE1) {MODE0;DS1302_SetTime();}}switch(MODE){case 0:TimeShow();break;case 1:TimeSet();break;}}}//利用定时器中断来动态显示选择的时间位置 void Timer0_Routine() interrupt 1 {static unsigned int T0Count; TL0 0x66; TH0 0xFC; T0Count;if(T0Count1000) {T0Count0;TimeFlashFlag!TimeFlashFlag;} }11.蜂鸣器 1介绍 NPN高电平导通     PNP低电平导通 由P15的高低电平取反控制BZ的高低电平 2乐理知识 ①介绍C1-C2升高8度。往右升高往左降低相邻半音黑白1对应中央C1i表示升即C2部分降低8度下面加一个点降低2个8度下面加两个点白键相邻两个键为半音#升高半音b:降低半音。 ②-表示时长如图中的665-其中5占两个节拍 ③音符 一般以四分音符为一个基准 ④音符频率对照 ⑤以a440hz为基准到另一个a中间等比12频分 ⑥单片机晶振芯片每秒震荡的次数称为时钟频率震荡一次所需时间称为振荡周期。12个震荡周期是一个机器周期机器频率晶振频率/12计时周期1/机器周期即每过一个计时周期定时器计数1 给定时器的TL和TH赋重装载值使定时器每过所需周期的一半时计数1因为需要给震荡信号故计数周期原周期的二分之一从而使蜂鸣器发出对应频率的声音。 3实例代码 1.蜂鸣器鸣响 ①蜂鸣器模块函数 ②主函数——按下独立按键在数码管上显示按的第几个键并且蜂鸣器鸣响。 2.蜂鸣器演奏音乐—有时间再补 12.AT24C02I2C总线 1.存储器介绍 RAM存储速度快但是掉电丢失   ROM掉电不丢失但是速度慢。 2.AT24C02介绍 引脚及应用电路 3. I2C总线 I2C通信 时序结构 4.示例程序 1——用独立按键设置想要写入的数据并读出显示在LCD上断电不丢失。 ①程序编写整体思路编写I2C模块AT24C02模块main模块 ②编写I2C模块 先进行位声明再分别编写子函数开始结束发送和接受一个字节发送和接收应答位 ③编写AT24C02模块 先定义一下AT24C02的地址写是0xA0,读是0xA1 再用I2C里的函数去编写写入一个字节和读出一个字节的函数 ④编写main模块 用独立按键控制想要写入的数据并读出显示在LCD上断电不丢失。 2——秒表用定时器扫描数码管 ①先创建新的工程包含所需的模块——独立按键数码管延迟函数定时器ATI2C ②改造独立按键模块——用定时器扫描独立按键 这样就不用像原来一样在检测时停在while死循环里影响主函数进程 ③改造数码管模块——改造成用定时器扫描数码管 先在main模块的中断函数里加上一个计数定时器的T0Count2这样每隔一段时间就会调用一下NixieLoop函数而NixieLoop函数会不断扫描并在数码管上显示每一位数字。NixieSetBuf函数会根据输入的位置和数字改变Buf数组里的值继而让NixieLoop扫描显示对应的值。 ④ 编写主函数 #include REGX52.H #include Timer0.h #include key.h #include Delay.h #include Nixie.h #include AT24C02.hunsigned char KeyNum; unsigned char Min,Sec,Minisec; unsigned char Runflag;void main() {Timer0_Init();while(1){KeyNumKey();if(KeyNum1) //按键1控制开始和停止计时{Runflag!Runflag;}if(KeyNum2) //按键2清0{Min0;Sec0;Minisec0;}if(KeyNum3) //按键3将数据写入AT{AT24C02_WriteByte(0,Min);Delay(5);AT24C02_WriteByte(1,Sec);Delay(5);AT24C02_WriteByte(2,Minisec);Delay(5);}if(KeyNum4) //按键4读出数据{MinAT24C02_ReadByte(0);SecAT24C02_ReadByte(1);MinisecAT24C02_ReadByte(2);}Nixie_SetBuf(1,Min/10);Nixie_SetBuf(2,Min%10);Nixie_SetBuf(3,11);Nixie_SetBuf(4,Sec/10);Nixie_SetBuf(5,Sec%10);Nixie_SetBuf(6,11);Nixie_SetBuf(7,Minisec/10);Nixie_SetBuf(8,Minisec%10);} }//计时中断函数 void Sec_Loop() {if(Runflag){Minisec;if(Minisec100){Minisec0;Sec;if(Sec60){Sec0;Min;if(Min60){Min0;}}} } }void Timer0_Routine() interrupt 1 //ÖжϺ¯Êý {static unsigned int T0Count1,T0Count2,T0Count3; TL0 0x66; //ÉèÖö¨Ê±Æ÷³õÖµTH0 0xFC; //ÉèÖö¨Ê±Æ÷³õÖµT0Count1;if(T0Count120) {T0Count10;Key_Loop();}T0Count2;if(T0Count22) {T0Count20;Nixie_Loop();}T0Count3;if(T0Count310){T0Count30;Sec_Loop();} } 13.1 DS18B20——温度传感器 1.介绍 2.引脚及应用电路 3.内部结构框图 最后一列分别是温度传感器内部的模拟温度传感器能进行数据的转换存储高报警位的EEPROM存储低报警位的EEPROM调节精度校验码 前两个字节分别存储数据的低位和高位 总体思路先发送温度转换的指令再发送读数据的指令。因此我们接下来要学习如何通过单总线来发送数据和接收数据。 4.单总线介绍 ①介绍 ②时序结构 5.DS18B20操作流程 本节需要的指令SKIP ROMCONVERT T让温度转换器进行数据的转换READ SCRATCHPAD读暂存器依次读出每一个字节。 包括符号整数部分小数部分其中负数以补码形式存储 13.2示例代码 1-DS18B20温度读取 ①整体思路——先写OneWire模块包括初始化发送一位读出一位发送一个字节接收一个字节再写DS18B20模块包括温度转换指令函数读取数据函数最后编写main函数。 ②OneWire模块编写 ③DS18B20模块编写 ④main函数 实例代码2-DS18B20温度报警器 ①要用到的模块AT24C02DelayDS18B20LCD1602OneWireI2CkeyTimer0 ②main函数 #include REGX52.H #include DS18B20.h #include key.h #include LCD1602.h #include Delay.h #include AT24C02.h #include Timer0.hfloat T,TShow; char TLow,THigh; unsigned char KeyNum;void main() {DS18B20_ConverT();Delay(1000);THighAT24C02_ReadByte(0);TLowAT24C02_ReadByte(1);if(THigh125 || TLow-55 || THighTLow){THigh20;TLow15;}LCD_Init();LCD_ShowString(1,1,T:);LCD_ShowString(2,1,TH:);LCD_ShowString(2,9,TL:);LCD_ShowSignedNum(2,4,THigh,3);LCD_ShowSignedNum(2,12,TLow,3);Timer0_Init();while(1){KeyNumKey();/*温度读取及显示*/DS18B20_ConverT();TDS18B20_ReadT();if(T0){LCD_ShowChar(1,3,-);TShow-T;}else {LCD_ShowChar(1,3,);TShowT;}LCD_ShowNum(1,4,TShow,3);LCD_ShowChar(1,7,.);LCD_ShowNum(1,8,(unsigned long)(TShow*100)%100,2);/*阈值判断及显示*/if(KeyNum){if(KeyNum1){THigh;if(THigh125){THigh125;}}if(KeyNum2){THigh--;if(THighTLow){THigh;}}if(KeyNum3){TLow;if(TLowTHigh){TLow--;}}if(KeyNum4){TLow--;if(TLow-55){TLow-55;}}LCD_ShowSignedNum(2,4,THigh,3);LCD_ShowSignedNum(2,12,TLow,3);AT24C02_WriteByte(0,THigh);Delay(5);AT24C02_WriteByte(1,TLow);Delay(5);}if(TTHigh){LCD_ShowString(1,13,OV:H);}else if(TTLow){LCD_ShowString(1,13,OV:L);}else {LCD_ShowString(1,13,OV: );}} }void Timer0_Routine() interrupt 1 //中断函数 {static unsigned int T0Count; TL0 0x66; TH0 0xFC; T0Count;if(T0Count20) {T0Count0;Key_Loop();} }为防止定时器扫描按键时会打断OneWire的传送与接收 可以在OneWire里先关闭EA再打开EA。 14-1 LCD1602液晶显示屏 1.介绍 2.引脚及应用电路 3.内部结构框图 4.存储器结构 5.时序结构 6.LCD1602指令集 7.LCD1602操作流程 14-2 功能代码编写 之后可以在main函数里调用流动的指令实现流动字幕 15-1 直流电机 1.介绍 2.电机驱动电路 大功率器件直接驱动只能使电机朝着一个方向转不具备调换电机正反方向的功能。 H桥驱动可以控制电机正反转。 3.电机调速——PWM介绍 给电全速转不给电不转利用惯性可以设置一个在周期内高电平与低电平的时间使之呈现中间速度 15-2 示例代码 1.LED呼吸灯——用来理解PWM 2.电机调速  ①创建新工程需要用到的模块DelayTimer0Nixiekey ②main函数编写 #include REGX52.H #include Delay.h #include key.h #include Nixie.h #include Timer0.hsbit MotorP1^0; //位声明unsigned char Counter,Compare; unsigned char KeyNum,Speed;void main() {Timer0_Init();while(1){KeyNumKey();if(KeyNum1){Speed;Speed%4;if(Speed0){Compare0;}if(Speed1){Compare50;}if(Speed2){Compare75;}if(Speed3){Compare100;}}Nixie(1,Speed);} }void Timer0_Routine() interrupt 1 {TL0 0xA4; TH0 0xFF; Counter;if(Counter100) {Counter0;}if(CounterCompare){Motor1;}else{Motor0;} } 16-1 AD/DA 1.介绍 2.硬件电路模型 3.实际硬件电路 4.运算放大器 四大运算放大器的经典电路 5.DA原理 6.AD 7.AD/DA性能指标 8.XPT2046 SPI通信CS片选DCLK时钟DIN数据输入DOUT数据输出 每个从机单独有个CS与主机连接剩下三根线共用 16-2.实例代码 1.AD模数转换——在LCD上显示滑变热敏电阻光敏电阻的值 ①需要的模块DelayLCDXPT2046 ②XPT2046模块的编写 先进行位声明再写读取AD值的函数读AD值要给一个命令字说明以什么模式读取的什么部位的AD值 #include REGX52.H #include Delay.hsbit XPT2046_CSP3^5; sbit XPT2046_DCLKP3^6; sbit XPT2046_DINP3^4; sbit XPT2046_DOUTP3^7;unsigned int XPT2046_ReadAD(unsigned char Command) {unsigned char i;unsigned int ADValue;XPT2046_DCLK0;XPT2046_CS0;for(i0;i8;i){XPT2046_DINCommand(0x80i);XPT2046_DCLK1;Delay(1);XPT2046_DCLK0;}for(i0;i16;i){XPT2046_DCLK1;Delay(1);XPT2046_DCLK0;if(XPT2046_DOUT) {ADValue|(0x8000i);}}XPT2046_CS1;if(Command0x08){return ADValue8;}else{return ADValue4;} } ③main函数 2.DA数模转换——实现呼吸灯 ①用PWM的工程改造即可 ②换IO口把Motor换成DA的口再结合PWM调速即可实现。 17-1 红外遥控 1.介绍 2.硬件电路 3.基本发送与接收 4.NEC编码 5.51单片机的外部中断 17-2.实例代码 1.红外遥控显示按键键码 ①配置外部中断INT0并编写设置定时器时间和读取定时器时间以及控制定时器开启的子函数 ②编写红外遥控模块IR #include REGX52.H #include Timer0.h #include Int0.hunsigned int IR_Time; unsigned char IR_State;unsigned char IR_Data[4]; //数据缓存器 unsigned char IR_pData; //指向存储的位置unsigned char IR_DataFlag; unsigned char IR_RepeatFlag; unsigned char IR_Address; unsigned char IR_Command;void Int0_Routine(void) interrupt 0 {if(IR_State0){Timer0_SetCounter(0);Timer0_Run(1);IR_State1;}else if(IR_State1){ IR_TimeTimer0_GetCounter();Timer0_SetCounter(0);if(IR_Time12442-500 IR_Time12442500) //根据时间来判断是否是start信号{IR_State2;}else if(IR_Time10368-500 IR_Time10368500) //判断是否是repeat信号{IR_RepeatFlag1;Timer0_Run(0);IR_State0;}else //其它未知的出错情况{IR_State1;}}else if(IR_State2){IR_TimeTimer0_GetCounter();Timer0_SetCounter(0);if(IR_Time 1032-500 IR_Time1032500){IR_Data[IR_pData/8]~(0x01(IR_pData%8));IR_pData;}else if(IR_Time 2074-500 IR_Time2074500){IR_Data[IR_pData/8]|(0x01(IR_pData%8));IR_pData;}else {IR_pData0;IR_State1;}if(IR_pData32){IR_pData0;if((IR_Data[0]~IR_Data[1]) (IR_Data[2]~IR_Data[3]) ){IR_DataFlag1;IR_AddressIR_Data[0];IR_CommandIR_Data[2];}Timer0_Run(0);IR_State0;}} }③编写main #include REGX52.H #include Delay.h #include LCD1602.h #include Int0.h #include IR.hunsigned char Num; unsigned char Address; unsigned char Command;void main() {LCD_Init();IR_Init();LCD_ShowString(1,1,ADDR CMD NUM);LCD_ShowString(2,1,00 00 000);while(1){if(IR_GetDataFlag() || IR_GetRepeatFlag()) //可实现连加连减功能{AddressIR_GetAddress();CommandIR_GetCommand();LCD_ShowHexNum(2,1,Address,2);LCD_ShowHexNum(2,7,Command,2);if(CommandIR_VOL_MINUS){Num--;}if(CommandIR_VOL_ADD){Num;}LCD_ShowNum(2,12,Num,3);}} } 2.红外遥控控制电机调速 ①改造电机调速的文件 ②因为按键和红外遥控都用了定时器0因此我们先把原本按键的定时器0改为定时器1 main函数部分做对应调整 ③Motor模块封装 ④加入红外模块改造main函数
http://www.w-s-a.com/news/333338/

相关文章:

  • 做网站就是做服务中国效能建设网站
  • 唐河企业网站制作怎么样抖音seo排名软件哪个好
  • 做棋牌网站团队wordpress无限加载
  • 思创医惠网站建设微网站是手机网站吗
  • 宁波海曙网站建设市场营销管理
  • 网站被降权了怎么办做网站网页维护手机App开发
  • 营销型网站建设熊掌号tomcat 网站开发
  • 东莞网站建设seo广州 flash 网站
  • js网站评论框租房网站那些地图区域统计怎么做的
  • 企业门户网站平台建设招标采购文件长沙做网站找哪家好
  • 关于实验室建设的英文网站图文分销系统开发
  • wordpress 媒体库管理自己的网站什么做优化
  • 网站建设基本流程价格厦门seo网站推广
  • 辽宁响应式网站建设价格企业所得税率
  • 网站编辑及seo招聘上海做网站公司做网站的公司
  • 杭州四喜做网站建设么ja.wordpress.org
  • 旅游网站策划书企业公司名字大全
  • 营销型网站的标准郑州新密网站建设
  • 建设网站的公司管理公司网站设计
  • 手机网站有什么区别是什么意思不让网站开发公司进入后台
  • 网站正在建设中_敬请期待做宠物店网站
  • 个体营业执照可以做网站服务吗宣传品牌网站建设
  • 做平台是做网站和微信小程序的好别邯郸捕风科技有限公司
  • 公司做哪个网站比较好巴顿品牌设计官网
  • 济宁北湖建设局网站我要推广
  • mc网站的建设大型网站开发
  • 给网站做推广一般花多少钱全国最大的外发加工网
  • linux 网站301江西seo推广方案
  • c2c电子商务网站定制开发wordpress html单页
  • 查询网站空间商自己做的网站如何放到微信