完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
学习单片机也有一短时间了,可针对单片机的内设以及外设都是过了就过了,没有进行一个系统的巩固认知,以下我就将对这三款单片机做一个系统的复习以及一些简单代码的编写,一方面练习自己写代码的速度,另一方面巩固一下学过的东西! 如有什么错误,欢迎大家指出。 技术交流QQ 909478789 内设篇 概述: .学习单片机第一步显然就是对IO的操作了,学会灵活的操作IO口将是入门嵌入式的第一步!以下实验对于基础的,我将只列出一些简单的驱动程序,对稍微难理解的会做出一些详细的注解说明 一. IO口操作实验 51系列 /************************************************** 编写人: 时间 : 注意事项: 修改时间: /********说明:以下程序对P0.0的操作,实现与******** ******P0.0相连接的led点亮(假设是低电平点亮*******/ ****************************************************/ #include #define uint unsigned int #define uchar unsigned char //宏定义 ***it Led=P0^0; //位定义 Void mian() { Led=0; //点亮led While(1); } /************************************************** 编写人: 时间 : 注意事项: 修改时间: /********说明:以下程序对P0.0的操作,实现与******** ******P0.0相连接的led闪烁(假设是低电平点亮)*******/ ****************************************************/ #include #define uint unsigned int #define uchar unsigned char //宏定义 ***it Led=P0^0; //位定义 Void delay_ms(uint x) { uint i,j; For(i=120;i>0;i--) For(j=x;j>0;j--); } Void mian() { For(;;) { Led=0; //点亮led Delay_ms(1000); //保持1s的点亮状态 Led=1; Delay_ms(1000); //保持1s的熄灭状态 } //如此一亮一灭达到闪烁的效果 } /************************************************** 编写人: 时间 : 注意事项: 修改时间: /********说明:以下程序对P0的操作,实现与******** ******P0相连接的led循环移动(假设是低电平点亮)*******/ ****************************************************/ #include #define uint unsigned int #define uchar unsigned char //宏定义 #define data P0 Uchar core led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; Void delay_ms(uint x) { i,j; For(i=120;i>0;i--) For(j=x;j>0;j--); } Void mian() { Uint i; While(1) { For(i=0;i<8;i++) { Data=d; Delay_ms(1000); } } } /***************************************************************************** * 以上程序我用的是数组的方式, 大家也可以用左右移函数的方法* * 当用此方法时需要加上头文件 #include ******************************************************************************/ 430系列 1.430芯片相比51操作较为麻烦,但处理速度却忧于51,430有它特有的优势那就是低功耗! 以下我就针对430芯片IO口做一个简单操作,让我们来了解430于51到底有何不同之处! 实验前我们需要了解几个寄存器,不用于51单片机,430的IO作为输入和输出,都是通过相关的寄存器设置来进行选择的 PXDIR : DIR即directiong (方向寄存器) PXSEL :选择内部的时钟输出寄存器 PXOUT:输出寄存器 PXIN : 读取IO口状态寄存器 /********************************************** 以下函数实现与430 P1.0引脚相连接LED实现闪烁 **************************************************/ 说明:1.430芯片不支持位的读写操作 2.430上电后默认为输入模式 3.430上电后默认开启看门狗 #include #define uint unsigned int Void delay_ms(int) /*这里暂且用软件延时的方法,后面会涉及到更精确的看门定时器,通用定时器*/ { Uint i,j; For(i=m;i>0;i--) For(j=0;j<100;j++); } Vod mian () { /******以下几个寄存器的操作就是对io操作的关键,掌握这几个寄存器的操作基本就已经掌握了430io的操作了*/ P1DIR|=0X01; P1SEL|=0XFF; P1OUT&=~0X00; While(1) { P1OUT|=BIT0; Delay_ms(1000); P1OUR&=~BIT0; Delay_ms(1000); } } /******************************************************* STM32系列 这款芯片,速度上提升了不止一个档次,而且安全性极高,功能上更加全面,但操作上比起前两款芯片,都要复杂的多! 1.开发化境 MDK 2.固件库开发, 寄存器开发 3.不同版本的固件库,存在差异,这也是大多数人编写代码编译出错的原因 以下我就将针对库函数和寄存器操作分别进行代码的简单编写..... 基于固件库3.5版本 /*************************** 实现功能:led点亮 *****************************/ #include /*********** 以下我们会用到RCC的配置函数 GPIO的配置函数 但这里为什么我没写它们两个的头文件,原因是在stm32f10x.h第8296行包含了一个头文件#include ***********/ void delay(u16 i) { u16 x ,j; for(x=110;x>0;x--) for(j=i;j>0;j--); } void RCC_Configuration() { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}; RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource()!=0x08); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_0); } int main() { RCC_Configuration(); GPIO_Configuration(); while(1) { GPIO_SetBits(GPIOA,GPIO_Pin_0); delay(10000); GPIO_ResetBits(GPIOA,GPIO_Pin_0); delay(50000); } } /****************** 寄存器开发*******************/ #include void Stm32_Clock_Init(u8 PLL) { unsigned char temp=0; //RCC_DeInit(); RCC->CR|=0x00010000; while(!(RCC->CR>>17)); RCC->CFGR=0X00000400; PLL-=2; RCC->CFGR|=PLL<<18; RCC->CFGR|=1<<16; FLASH->ACR|=0x32; RCC->CR|=0x01000000; while(!(RCC->CR>>25)); RCC->CFGR|=0x00000002; while(temp!=0x02) { temp=RCC->CFGR>>2; temp&=0x03; } } void LED_Init(void) { RCC->APB2ENR|=1<<3; //GPIOB GPIOB->CRL&=0XFFFFFFF0; GPIOB->CRL|=0X00000003; GPIOB->ODR|=1; } int main() { u32 i; Stm32_Clock_Init(9); LED_Init(); while(1) { GPIOB->ODR = 0 for(i=0;i<1000000;i++); GPIOB->ODR = 1; for(i=0;i<1000000;i++); } } /*********************************************************** *关于Io口的操作实验完结,下一章将针对这三款芯片的中断 *进行简单的复习. * ************************************************************/ |
|
相关推荐
4 个讨论
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-3-28 21:32 , Processed in 0.586838 second(s), Total 74, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 深圳华秋电子有限公司
电子发烧友 (电路图) 粤公网安备 44030402000349 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号