单片机学习笔记(数字分离首位是0不显示)
单片机_两个数码管显示00~99
按键控制加、减显示00-99(P1接8个独立按键,P10按下为加,P11按下为减,P2
接LED数码管的A- -H并加一个560欧的上拉排阻,P0接数码管DS1- -DS8位选)//
#include<reg52.h>
sbit P0_0=P0^0; //个位数字
sbit P0_1=P0^1; //十位数字
/按键控制加、减显示00-99(P1接8个独立按键,P10按下为加,P11按下为减,P2
接LED数码管的A- -H并加一个560欧的上拉排阻,P0接数码管DS1- -DS8位选)
**************************************************************//
{
case 0xfe: num++;if(num==100) num=0; break;
case 0xfd: if(num==0) num=99;else num--;break;
default: break;
}
delay(10); //延时
P0_1=1; //关闭个位显示
}
}
void key_ccan(void)
{
unsigned char ii;
P1=0xff;
ii=P1;
void delay(int k); //Tab为数码管显示值,存入一个数组内
void key_ccan(void); //声明按键扫描函数
unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}unsigned char i,shi,ge,num,count=10; //num为被显示的数字
单片机自学笔记
{ int a=3; int b = 4; a=a^b; b=b^a; a=a^b; printf("a=%d b=%d",a,b); } 4、“取反”运算符(~) 他是一元运算符,用于求整数的二进制反码,即分别将操作数各二进制 位上的1变为0,0变为1。 例如:~77(8) 源代码: #include <stdio.h> main() { int a=077; printf("%d",~a); } 5、左移运算符(<<) 左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右 操作数指定(右操作数必须是非负 值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。 例如:将a的二进制数左移2位,右边空出的位补0,左边溢出的位舍 弃。若a=15,即00001111(2),左移2 位得00111100(2)。 源代码: #include <stdio.h> main() { int a=15; printf("%d",a<<2); } 左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<< 2=60,即乘了4。但此结论只适用于该 数左移时被溢出舍弃的高位中不包含1的情况。
单片机自学笔记
预备知识 N进制转化为十进制,按权展开,相加即可。 十进制转化为N进制,整数部分除N求余取整,逆序排列。 二进制转十六进制,先记住:0=0000 1=0001 2=0010 3=0011······E=1110 F=1111这个你应该知道的吧然后再转化,比如:二进制 1101010010.10101先把它从小数点往左右数,四位数一组,不足的补0 所以得到: 0011 0101 0010.1010 1000按照转化的公式: 0011=3 0101=5 0010=2 1010=A 1000=8所以十六进制就是: 352.A8 十六进制转二进制,首先把十六进制数04271544中的每一位数转换为二 进制数,每个数要分四位,不足四位的前面加零,请看下面演示:0 00004 01002 00107 01111 00015 01014 01004 0100将得出四位二进制数串连 起来就是结果了所以,十六进制04271544转换二进制为 100001001110001010101000100 (前面的0就省了) 十六进制 二进制0 00001 00012 00103 00114 01005 01016 01107 01118 10009 1001A 1010B 1011C 1100D 1101E 1110F 1111其中ABCDE对应十进制中的 10,11,12,13,14,15。 2. 数字电路中只有两种电平: 高和低 TTL电平: 高 +5V 低 0V RS232电平:计算机串口 高 -12V 低+12V 所以计算机与单片机之间通讯时需要加电平转换芯片如MAX232 常用进制十进制和十六进制 十六进制:c51 前缀0x,汇编后缀H. 十进制:无,省了(D). 二进制数的逻辑运算 与运算 运算符为”·” 0·X=0 1·1=1 决定事物结果的全部条件同时具备时,结果才会发生。 或运算 决定事物结果的条件中,只要任何一个满足,结果就会发生。 运算符为”+”, 1+X=1 0+0=0。 非运算 只要条件具备了,结果便不会发生,而条件不具备时,结果一 定发生。运算符“-”
单片机数码管初始化
单片机数码管初始化在单片机中,数码管的初始化涉及到配置引脚、设置数码管的显示模式、亮度等。
以下是一个通用的示例,以STM32为例,使用CubeMX和HAL库进行数码管的初始化。
假设使用的是STM32CubeMX工具,你可以按照以下步骤初始化数码管:1.打开STM32CubeMX,创建一个新的工程。
2.在“Pinout & Configuration”选项卡中,找到你所连接数码管的引脚,将其配置为输出。
3.如果你的数码管需要外部电源,则在"Configuration"选项卡中找到"Power Consumption",设置外部供电。
4.在"Configuration"选项卡的"Project Manager"中,选择生成相应的工程文件(如Keil、IAR等)。
5.在生成的代码中找到main.c文件,添加数码管的初始化代码。
下面是一个STM32CubeMX生成的HAL库代码的示例,用于STM32的数码管初始化:#include "main.h"#include "stm32f4xx_hal.h"void SystemClock_Config(void);static void MX_GPIO_Init(void);int main(void) {HAL_Init();SystemClock_Config();MX_GPIO_Init();while (1) {// Your application code}}void SystemClock_Config(void) {RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_S CALE1);RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 25;RCC_OscInitStruct.PLL.PLLN = 360;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 7;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1 |RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_5) != HAL_OK) {Error_Handler();}}void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();// 数码管连接到GPIOA的Pin 0-7GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}void Error_Handler(void) {// 用户自定义的错误处理代码while (1) {}}#ifdef USE_FULL_ASSERTvoid assert_failed(char *file, uint32_t line) {// 用户自定义的断言处理代码}#endif在这个例子中,数码管连接到GPIOA的引脚0到7,这些引脚被配置为输出,并用于驱动数码管的显示。
PIC单片机学习笔记
PIC 单片机学习笔记
1.前言
为了给前一段时间学习PIC16F616 型单片机的一个总结和方便大家的交流,
我写了这篇关于PIC 单片机的学习心得,都是在看了手册和编程调试后用自己的语言组织的,其中有不足或者有疑问的地方希望大家能及时的给予纠正和批评,提出宝贵的意见.
2.PIC 单片机的概述
PIC16F616 是一款14 引脚、8 位的CMOS 单片机.采用精简指令集,仅有35
条指令,由于采用了数据总线和指令总线分离的哈佛总线结构,使得除少量指令不是单周期之外,大部分的指令都是单周期指令.这样有利于提高单片机的运行速度和执行效率.
PIC16F616 这款单片机供电电压可以在2V 到5.5V 之间,内部集成了一个
RC 振荡器,频率可以配置成8MHZ 或者4MHZ,也可以用外部晶振提供时钟.内
部集成有AD 转换、比较器等硬件模块,还具有上电复位、欠压复位、看门狗、代码保护等功能.三个定时器、PWM 发生器等可以由用户编程.下面我来
一一介绍关于PIC 单片机的这些模块和功能.
3.存储器。
MSP430G2553学习笔记(数据手册)
MSP430G2553学习笔记(数据手册)MSP430G2553性能参数(DIP—20) 工作电压范围:1.8~3。
6V。
5种低功耗模式。
16位的RISC结构,62。
5ns指令周期.超低功耗:运行模式—230µA;待机模式—0.5µA;关闭模式—0.1µA;可以在不到1µs的时间里超快速地从待机模式唤醒.基本时钟模块配置:具有四种校准频率并高达16MHz的内部频率;内部超低功耗LF振荡器;32。
768KHz晶体;外部数字时钟源。
两个16 位Timer_A,分别具有三个捕获/比较寄存器。
用于模拟信号比较功能或者斜率模数(A/D)转换的片载比较器。
带内部基准、采样与保持以及自动扫描功能的10位200—ksps 模数(A/D)转换器。
16KB闪存,512B的RAM。
16个I/O口。
注意:MSP430G2553无P3口!MSP430G2553的时钟基本时钟系统的寄存器DCOCTL—DCO控制寄存器DCOxDCO频率选择控制1MODxDCO频率校正选择,通常令MODx=0注意:在MSP430G2553上电复位后,默认RSEL=7,DCO=3,通过数据手册查得DCO频率大概在0.8~1。
5MHz之间。
BCSCTL1—基本时钟控制寄存器1XT2OFF不用管,因为MSP430G2553内部没有XT2提供的HF时钟XTS不用管,默认复位后的0值即可DIV Ax设置ACLK的分频数00 /101 /210 /411 /8RSELxDCO频率选择控制2BCSCTL2-基本时钟控制寄存器2SELMxMCLK的选择控制位00 DCOCLK01 DCOCLK10 LFXT1CLK或者VLOCLK11 LFXT1CLK或者VLOCLK DIVMx设置MCLK的分频数00 /101 /210 /411 /8SELSSMCLK的选择控制位0 DCOCLK1 LFXT1CLK或者VLOCLK DIVSx设置SMCLK的分频数00 /101 /210 /411 /8DCORDCO直流发生电阻选择,此位一般设00 内部电阻1 外部电阻BCSCTL3—基本时钟控制寄存器3XT2Sx不用管LFXT1Sx00 LFXT1选为32。
51单片机不加锁存器数码管动态显示0-999
51单片机不加锁存器数码管动态显示0-999使用STC89C52RC单片机,数码管为共阳数码管PNP驱动,P3.4-P3.6控制位选,P0口控制段选信号,图中P8接到有上拉电阻的P0口,P9接到P3.4-P3.6,附上图和程序!#include <reg52.h>sbit wei1=P3^6; /*百位*/sbit wei2=P3^4; /*个位*/sbit wei3=P3^5; /*十位*/unsigned char code LedChar[] = { //数码管显示字符转换表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};void delay(int z);unsigned char i=0; //动态扫描的索引unsigned int cnt=0; //记录T0 中断次数void main(){unsigned long sec=0; //记录经过的秒数EA=1; //使能总中断TMOD=0x01; //设置T0 为模式1TH0=0xB8; //为T0 赋初值0xFC67,定时1msTL0=0x00;ET0=1; //使能T0 中断TR0=1; //启动T0while (1){if (cnt>=1000) //判断T0 溢出是否达到1000 次{cnt=0; //达到1000 次后计数值清零sec++; //秒计数自加1}wei1=0;P0=LedChar[sec%10];wei1=1;delay(5);wei2=0;P0=LedChar[sec/10%10];wei2=1;delay(5);wei3=0;P0=LedChar[sec/100%10];wei3=1;delay(5);if(sec>999){sec=0;}}}void delay(int z){int x,y;for(x=z;x>0;x--)for(y=10;y>0;y--);}/* 定时器0 中断服务函数*/ void InterruptTimer0() interrupt 1 {TH0 = 0xFC; //重新加载初值TL0 = 0x67;cnt++; //中断次数计数值加1 }。
单片机 arm 学习笔记
Arm学习笔记芯片内BootLoader版本号:2.2RDP除能次数:0RDP使能次数:0芯片PID:00000410 Medium-density芯片FLASH容量为128KB芯片SRAM容量为65535KB(此信息仅供参考,新版本芯片已不包含此信息)96位的芯片唯一序列号:[49FF6B064966505047540887][066BFF49 50506649 87085447]读出的选项字节:A55AFF00FF00FF00FF00FF00FF00FF001.普通IO的的使用首先、通过RCC_APB2PeriphClockCmd()函数是设置外设时钟。
ARM与C51单片机不同的是,不用外设的时候,如IO口、ADC、定时器等等,都是禁止时钟的,以达到节能的目的,只有要用到的外设,才开启它的时钟。
因此在需要用到GPIOB和GPIOD 的时候,我们需要先开启它的时钟,具体用到的是函数库里面的函数:void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)其中,第一个参数需要指示要开启什么端口的时钟,RCC_APB2Periph_GPIOx就是开启GPIOx 的时钟,第二个参数需要指示是开启还是关闭,ENABLE/DISABLE。
开启外设时钟之后,然后就开始对GPIO的配置寄存器进行设置了,本文代码为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);然后初始化相关参数,通过命令GPIO_InitTypeDef GPIO_InitStructure; /* Configure the LED0 pin */初始化结构体GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //选择管脚,是你想用到的管脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输入输出的8种模式,这要根据外电路和作用选择GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//选择速度可选2M 10M 50MGPIO_Init(GPIOA, &GPIO_InitStructure);最后,就可以通过io口的相关命令对于io口进行操作。
单片机数码管显示实验总结(范本)
单片机数码管显示实验总结单片机数码管显示实验总结篇一:单片机c语言版数码管动态显示实验报告数码管动态显示实验一、实验要求1. 在Prteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路2. 在电路中增加四个7段数码管(共阳/共阴自选),将P1口作数据输出口与7段数码管数据引脚相连,P2.0~P2.3引脚输出选控制信号3. 在Keil软件中编写程序,采用动态显示法,实现数码管显示变量unsigned int sh_va lue的值(sh_v alue的值范围为0000~9999),即把sh_value的千百十个位的值用数码管显示出来。
二、实验目的 1. 巩固Prte us软件和Keil软件的使用方法 2. 学习端口输入输出的高级应用3. 掌握7段数码管的连接方式和动态显示法4.掌握查表程序和延时等子程序的设计三.实验说明(条理清晰,含程序的一些功能分析计算)如下图(五)所示,由P1口将要显示的数字输给七段数码管;再由P2第四位输给数码管的公共端,作为扫描输入信号;用外部中断P 3.2和P3.3分别接PB1与P B2,实现数字的增减。
所要实现的功能是,开始运行电路功能图时,四个数码管分别显示0000,按下PB1增1,直到9999回到0000,相反按下PB2减1,直到0000回到9999。
在算相关数据时,由于要显示个十百千的不同数字,要调用disp函数,disp[0]=sh/1000; //显示千位的值disp[1]=sh%1000/100; //显示百位的值disp[2]=sh%100/10; //显示十位的值 di sp[3]=sh%10; //显示个位的值本实验需要用到I E寄存器与TCN寄存器。
四、硬件原理图及程序设计(一)硬件原理图设计图(五)开始运行prteu s,四个数码管显示0000,按下PB1数码管增1,按下PB2数码管减1。
单片机STM32学习笔记
推挽输出与开漏输出的区别推挽输出推挽输出::可以输出高可以输出高,,低电平低电平,,连接数字器件连接数字器件; ;开漏输出开漏输出::输出端相当于三极管的集电极输出端相当于三极管的集电极. . 要得到高电平状态需要上拉电阻才行要得到高电平状态需要上拉电阻才行. . 适合于做电流型的驱动电流型的驱动,,其吸收电流的能力相对强其吸收电流的能力相对强((一般20ma 以内以内). ).推挽结构一般是指两个三极管分别受两互补信号的控制推挽结构一般是指两个三极管分别受两互补信号的控制,,总是在一个三极管导通的时候另一个截止另一个截止. .要实现“线与”需要用OC(open collector)collector)门电路门电路门电路..是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中以推挽方式存在于电路中,,各负责正负半周的波形放大任务各负责正负半周的波形放大任务,,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小关管每次只有一个导通,所以导通损耗小,,效率高。
输出既可以向负载灌电流,也可以从负载抽取电流。
抽取电流。
问题:问题:很多芯片的供电电压不一样,有3.3v 和5.0v 5.0v,需要把几种,需要把几种IC 的不同口连接在一起,是不是直接连接就可以了?实际上系统是应用在I2C 上面。
上面。
简答:简答:1、部分3.3V 器件有5V 兼容性,可以利用这种容性直接连接兼容性,可以利用这种容性直接连接2、应用电压转换器件,如TPS76733就是5V 输入,转换成3.3V 3.3V、、1A 输出。
输出。
开漏电路特点及应用在电路设计时我们常常遇到开漏(在电路设计时我们常常遇到开漏(open drain open drain )和开集()和开集()和开集(open collector open collector )的概念。
所)的概念。
所谓开漏电路概念中提到的“漏”就是指MOSFET 的漏极。
51单片机教材(免费完整版)
单片机教程原作:进墨者目录单片机教程第一课:单片机概述 (2)单片机教程第二课:单片机的内部、外部结构(一) (2)单片机教程第三课:几个基本概念 (5)单片机教程第四课:第一个小程序 (8)单片机教程第五课:延时程序分析 (10)单片机教程第六课:单片机的内外部结构分析(四) (12)单片机教程第七课:单片机内部结构分析(五) (15)单片机教程第八课(寻址方式与指令系统) (19)单片机教程第九课:数据传递指令 (22)单片机教程第十课数据传递类指令指令 (25)单片机教程第十一课:算术运算类指令 (28)单片机教程第十二课:逻辑运算类指令: (32)单片机教程第十三课:逻辑与指令 (34)单片机教程第十四课:条件转移指令 (38)单片机教程第十五课:位及位操作指令 (41)单片机教程第十六课:计数器与定时器 (44)单片机教程第十七课:定时/计数器的方式控制字 (46)单片机教程第十八课:中断系统 (49)单片机教程第十九课:定时、中断练习一 (52)单片机教程第二十课:定时/计数器实验2 (57)单片机教程第二十一课:串行接口 (60)单片机教程第二十二课:串行口应用编程实例 (65)单片机教程第二十三课:LED数码显示器的连接与编程 (68)单片机教程第二十四课:动态扫描显示接口 (72)单片机教程第二十五课:键盘接口与编程 (78)单片机教程第二十六课:矩阵式键盘接口技术及编程 (83)单片机教程第二十七课:初学单片机几个不易掌握的概念 (87)单片机教程第二十八课:单片机音乐程序的设计与实验 (90)单片机教程第一课:单片机概述1、何谓单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。
在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。
而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。
单片机数码管显示-消影问题
单⽚机数码管显⽰-消影问题看郭天祥的单⽚机书中数码管部分,使⽤ P0=0xff 的⽅法可以消除段选数据对位选的⼲扰,另外使⽤我下⾯的⽅法可以达到同样的效果。
但即便这样数码管仍有影⼦,这种状况是,当前数码管有下⼀个数码管的影⼦,或者当前数码管有前⼀个数码管的影⼦。
分析⼀下产⽣原因,当我们点亮⼀个数码管后,总要先将段选或者位选改为下⼀个数码管的值,⽽不能同时改变。
当先改变段选时,那么当前数码管就会有短暂的时间显⽰下⼀个数码管的数字。
当先改变位选时,下⼀个数码管就会有短暂的时间显⽰当前数码管的数字。
那么解决⽅法是,先将段选置0送⼊锁存器,改变位选的值为下⼀个数码管,最后再改变段选值。
同理另⼀种⽅法是,先将位选赋值 0xff 即关闭所有数码管,改变段选值,最后改变位选值。
另外⼀种勉强可以的⽅法是,增加延时时间,这样正常数字显⽰时间就相对影⼦数字的短暂时间变长,看起来影⼦就变得暗了,但延时太长导致数码管闪烁,所以这种⽅法不建议,郭天祥书中的⽰例程序使⽤这种⽅法。
只贴出前2种⽅法的代码。
#include <reg52.h>#include <intrins.h>sbit we=P2^7;sbit du=P2^6;unsigned char code table[] = {0x3f , 0x06 , 0x5b , 0x4f,0x66 , 0x6d , 0x7d , 0x07,0x7f , 0x6f , 0x77 , 0x7c,0x39 , 0x5e , 0x79 , 0x71,0x00};void show();void delayms(unsigned time);unsigned char num[6]={0,0,14,13,0,12};unsigned char count=0;unsigned char nums=0;unsigned char numm=0;void main(){EA=1;ET0=1;TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;TR0=1;show();}void t0_time() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;count++;if(count%20==0){count=0;nums++;if(nums==60){nums=0;numm++;num[2]=numm%10;num[3]=numm/10;}num[0]=nums%10;num[1]=nums/10;}}void show(){unsigned char i;while(1)for(i=0;i<6;i++){P0=0;du=1;du=0;P0=~(0x20>>i);we=1;we=0;P0=table[num[i]];du=1;du=0;delayms(1);}}void delayms(unsigned time) {unsigned i,j;for(i=time;i>0;i--)for(j=110;j>0;j--);}interrupt.c第⼆种void show(){unsigned char i;while(1)for(i=0;i<6;i++){P0=0xff;we=1;we=0;P0=table[num[i]];du=1;du=0;P0=~(0x20>>i);we=1;we=0;delayms(1);}}interrupt.c。
BLE协议学习笔记
1.布好局后要先将地孔扇出,避免布好线后找不到位置放过孔。特别是多 层板更好事先将地孔放好。所有的地周围都要放,待布完线后敷铜时与地 平面形成回路。 2.地平面敷铜后要将引脚间的铜箔剪除,以防短路。 3.敷好铜的地平面如与另一面同GND,则可多补几个过孔。
地与地平面是有区别的,地是指电路图中的GND,GND在布线时有时会走 很远的线,并不能很好地提供信号的回路,而地平面是大面积的敷铜,虽 然与GND是一个网点,但地平面的主要作用是为信号形成回路而设计的, GND与靠近的地平面相连可以缩短信号回路。
左图给出了 PIN_CNF[n] 寄存器图, 其中同样有 “DIR”, “INPUT”, “PULL”, “DRIVE”, “SENSE”等 配置位。 这个 寄存器是对 每个PIN脚的 设置。
一直对此描述不懂,后来经青风指点 明白了:字段:DRIVE Standard 0, standard 1是芯片内部的配 置几种形式,当我们将该字段ID赋0~7 时是指其驱动能力由弱到强的7个等级。 即:0最弱 其内配置为S0S1(Standard 0,Standard 1)
讯联电子提供nRF52832板及芯片和技术支持
nRF52832芯片的特点(括号内为nRF51的比较):
•32/64MHZ外部时钟 •片上集成512KB FLASH,64 KB RAM(存储空间翻倍) •7.7mA TX at +4dBm 5.5mA TX at 0dBm 5.5mA RX at 1Mbs •多达20个PPI通道(增加4个) •发射功率-20dBm-4dBm •超低待机电流:400nA(更低) •接收灵敏度 -96dBm (BLE)(提升3dBm) -92.5dBm (ANT)
•空中兼容NRF24L系列、NRF24AP系列、NRF51系列SOC
学习笔记
○162256简介:62系列是最常用的单片机系统扩展RAM元器件,其类型有6216、6232、6264、62128、62256或62512等多种,62后面的数字表示此元器件中可以存储的位(单位:千bit),我们通常的说法是将此值除以8,比如62256将256除以8,我们一般称之为32K 的RAM。
如果学习过二进制就可以知道,区分两个字节需要一根地址线就可以:0或者1;而区分四个字节需要2根地址线;区分八个字节需要三根地址线…..以此类推,我们可以计算出要区分32K的RAM区,需要15根地址线,也就是器件上面的A0-A14管脚用于确定唯一的一个字节内容。
我们现在学习的51单片机是8位的,所以必须用两个IO口来联接这个RAM器件,通常我们用P0(低字节)和P2(高字节)两个端口来确定此器件的地址,而P0口是51单片机标准的总线口,是地址线和数据线复用的,所以与62256联接时需要加一片锁存器来锁存地址。
即先将地址送到锁存器(通常用74HC373)中,然后P0口空闲下来后开始接收或发送数据至62256。
○2P0口有三个功能:1、外部扩展存储器时,当做数据总线(如图1中的D0~D7为数据总线接口)2、外部扩展存储器时,当作地址总线(如图1中的A0~A7为地址总线接口)3、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。
P1口只做I/O口使用:其内部有上拉电阻。
P2口有两个功能:1、扩展外部存储器时,当作地址总线使用2、做一般I/O口使用,其内部有上拉电阻;P3口有两个功能:除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置,具体功能请参考我们后面的引脚说明。
○3电压跟随器就是输出电压与输入电压是相同的,就是说,电压跟随器的电压放大倍数恒小于且接近1。
电压跟随器的显著特点就是,输入阻抗高,而输出阻抗低。
在电路中,电压跟随器一般做缓冲级及隔离级。
单片机上电复位后psw的值
单片机上电复位后psw的值在单片机中,psw(Program Status Word)寄存器是一个非常重要的寄存器,用于存储着单片机的状态信息。
当单片机上电复位后,psw寄存器的值会发生变化,本文将从不同的方面介绍单片机上电复位后psw寄存器的值。
psw寄存器是一个8位的寄存器,其中包含了许多位字段,用于表示不同的状态信息。
在单片机上电复位后,psw寄存器的初始值为0x00,也就是所有的位都为0。
下面将逐个介绍psw寄存器的每一位的含义和初始值。
1. CY(Carry Flag)位:用于存储进位标志位。
在单片机上电复位后,CY位的初始值为0,表示没有进位。
2. AC(Auxiliary Carry Flag)位:用于存储辅助进位标志位。
在单片机上电复位后,AC位的初始值为0,表示没有辅助进位。
3. F0(User-defined Flag 0)位:用于存储用户自定义标志位。
在单片机上电复位后,F0位的初始值为0。
4. RS0(Register Bank Select 0)位:用于选择寄存器组0或寄存器组1。
在单片机上电复位后,RS0位的初始值为0,表示选择寄存器组0。
5. RS1(Register Bank Select 1)位:用于选择寄存器组2或寄存器组3。
在单片机上电复位后,RS1位的初始值为0,表示选择寄存器组2。
6. OV(Overflow Flag)位:用于存储溢出标志位。
在单片机上电复位后,OV位的初始值为0,表示没有溢出。
7. P(Parity Flag)位:用于存储奇偶标志位。
在单片机上电复位后,P位的初始值为0,表示结果中1的个数为偶数。
8. F1(User-defined Flag 1)位:用于存储用户自定义标志位。
在单片机上电复位后,F1位的初始值为0。
可以看出,psw寄存器的初始值为0,表示各个状态位都处于初始状态。
在单片机的运行过程中,这些状态位的值会根据实际情况发生变化,用于表示不同的状态信息。
LCD1602学习笔记
//若 0xC0 则是第二行。
for( j=0 ; j<i ; j ++)
{
lcd_wdat(0x20) ;
//此地址显示空白
}
Delay_ms(800);
//不显示的时间
前面加个 FOR 循环则可实现多次闪烁。
3、打字效果 (逐字累加显示) 如下:
lcd_wcmd(0x06) ;
//光标右移 1 格,AC 值加 1,字符全部不动
void lcd_init();
//LCD 初始化函数声明
/*********以下是延时函数**********/
void Delay_ms(uint xms)
{
uint i,j;
for (i=xms;i>0;i--)
for (j=110;j>0;j--);
}
/*********以下是 LCD 忙碌检查函数******/
字符型 LCD1602 驱动程序软件包
#include<STC89.H>
#include<intrins.h>
//_nop_()函数的引用
#define uchar unsigned char
#define uint unsigned int sbit LCD_RS=P2^0; sbit LCD_RW=P2^1; sbit LCD_EN=P2^2; void Delay_ms(uint xms);
//0X04 则为光标左移 1 格,AC 值减 1,字符全部不动
lcd_wcmd (0x80|addr) ; //0x80 为第一行显示,addr 为显示的列数地址
//若 0xC0 则是第二行显示。
i=0 ; while(line1_data[i]!='\0')
arduino学习笔记
为什么要使用Arduino?
有很多的单片机和单片机平台都适合用做交互式系统的设计。例如:Parallax Basic Stamp,Netmedia’s BX-24,Phidgets,MIT’s Handyboard和其它等等提供类似功能的。所有这些工具,你都不需要去关心单片机编程繁琐的细节,提供给你的是一套容易使用的工具包。Arduino同样也简化了同单片机工作的流程,但同其它系统相比Arduino在很多地方更具有优越性,特别适合老师,学生和一些业余爱好者们使用:
2、单片机有什么用?
实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用酷睿处理器吗?应用的关键是看是否够用,是否有很好的性能价格比。如果一台冰箱都需要用酷睿处理起来进行温度控制,那价格就是天价了。
单片机通常用于工业生产的控制、生活中与程序和控制有关(如:电子琴、冰箱、智能空调等)的场合。
arduino学习笔记2
通过Arduino编译器查看串口数据
最简单的例子:
void setup()
{
Serial.begin(9600); //打开串口,设置波特率为9600
int val;
val=analogRead(5);//传感器接到模拟口5,数值根据自己的需要可变
便宜-和其它平台相比,Arduino板算是相当便宜了。最便宜的Arduino版本可以自己动手制作,即使是组装好的成品,其价格也不会超过200元。
跨平台-Arduino软件可以运行在Windows,Macintosh OSX,和Linux操作系统。大部分其它的单片机系统都只能运行在Windows上。
蓝桥杯单片机编程笔记
蓝桥杯单片机编程笔记一、IO口编程 (2)二、数码管动态扫描和定时器 (3)三、矩阵键盘 (5)四、串口通讯和串口中断 (6)五、外部中断的使用 (13)六、实时时钟DS1302的使用 (13)七、PCF8591与IIC总线的使用 (15)八、DS18B20温度芯片的使用 (21)九、超声波传感器的使用 (22)十、步进电机与直流电机的使用 (25)十一、扩展:宏定义编程方法(推荐) (28)十二、注意事项(常见编程错误) (28)一、IO口编程IO编程,该开发板使用了573锁存器,通过P2口的5,6,7位连接3-8译码器,扩展出了8个口,其中4个口分别连接4个573锁存器,这里以LED的锁存器来举例:原理图573:分析代码:P2=((P2&0x1f)|0x80);其中0x1f=00011111,P2与0x1f进行与运算,高三位清零,其余位保持原来状态,不改变,即把控制3-8译码器的高三位留出来:接着再或上0x80;容易发现0x80=10000000;或运算,与1或结果为1,与0或结果不变,所以或上0x80只需看P2的高三位,则高三位为100,对应3-8译码器的话,P2^7=1;P2^6=0;P2^5=0;所以输出Y4=0;Y4再经过与非运算,看下图示:则输出Y4C=1;即LED对应的锁存器的片选信号被选中,锁存器打通,接下来就可以对P0口进行操作,操作完之后,P2=P2&0x1f;P2高三位直接清零,此时Y4C=0,则把锁存器锁上了。
类似的方法,数码管、蜂鸣器等都是如此操作,选中锁存器代码:P2=((P2&0x1f)|(这里填对应锁存器的位移号))。
二、数码管动态扫描和定时器数码管显示分为段选和位选,数码管定义和显示函数:code unsigned char tab[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};unsigned char dspbuf[]={10,10,10,10,10,10,10,10};unsigned char dspcom=0;void display(){//段选,消隐P2=((P2&0x1f)|0xe0);P0=0xff;P2=P2&0x1f;//位选P2=((P2&0x1f)|0xc0);P0=(1<<dspcom);P2=P2&0x1f;//段码输入P2=((P2&0x1f)|0xe0);P0=tab[dspbuf[dspcom]];P2=P2&0x1f;if(++dspcom==8)dspcom=0;}注意:这里1左移dspcom位,刚开始dspcom=0,则1左移dspcom位依旧为1,接着dspcom每次自增1,1对应二进制0000 0001,即把1每次向左移,每次都比上一次多移一位,直至8位移完,对应8个数码管。
pic学习记录(自动保存的)
PIC 器件具有几个包含配置位或熔丝的存储单元。
这些位指定基本的器件操作,例如振荡器模式、看门狗定时器、编程模式和代码保护。
未正确设置这些位可能导致代码失败或器件无法运行。
对于 PIC18 器件,这些位可以使用配置 pragma 伪指令进行设置。
(在未来版本中,也会对于其他 8 位器件引入 pragma 伪指令。
)该 pragma 伪指令具有以下形式。
#pragma config setting = state|value#pragma config register = value其中, setting 是配置设置描述符(如 WDT), state 是所需状态的文本描述(如OFF)。
value 字段是一个可以优先用于描述符的数值。
* PIC16F1x端口控制实验* 芯片型号:PIC16F1936* 主要特性:增强性中档8位CPU,8K Flash,512字节RAM,最高速度8MIPS,11通道10位 AD,2个比较器,96段LCD控制器,16通道电容触摸模块,3个增强性PWM/捕获模块*/#include/* 配置芯片的工作方式,相当于其他单片机的熔丝位 */// CONFIG1#pragma config FOSC = INTOSC // 使用内部时钟#pragma config WDTE = OFF // 禁止看门狗#pragma config PWRTE = OFF // PWRT disabled#pragma config MCLRE = ON // MCLR/VPP pin function is MCLR#pragma config CP = OFF // 禁止程序代码保护(debug时要关闭代码保护)#pragma config CPD = OFF // 禁止EEPROM的保护#pragma config BOREN = ON // 使能欠压复位#pragma config CLKOUTEN = OFF // 禁止CLKOUT功能#pragma config IESO = ON // Internal/External Switchover mode is enabled#pragma config FCMEN = ON // Fail-Safe Clock Monitor is enabled)// CONFIG2#pragma config WRT = OFF // 禁止代码自编程保护#pragma config VCAPEN = OFF // All VCAP pin functionality is disabled#pragma config PLLEN = OFF // 禁止4x PLL#pragma config STVREN = ON // Stack Overflow or Underflow will cause a // Reset)#pragma config BORV = LO // 欠压复位电压为低档位(低档位为1.9V,高档位为2.5V)#pragma config LVP = OFF // 高压编程模式/* 定义系统时钟,在延时函数中需要这个定义 */#define _XTAL_FREQ 16000000UL#define Close_LED() TB4 = 0 // RB4输出低电平#define Open_LED() TB4 = 1 // RB4输出高电平int main(void){/* 禁止4X PLL,内部16MHz时钟源 */OSCCON = 0B11111000;/* 清除PORTB数据锁存寄存器 */LATB = 0;/* 设置RB4端口为输出口,注意PIC有点特殊,1为输入0为输出 */TRISBbits.TRISB4 = 0;/* RB4输出低电平 */TB4 = 0;/* 设置RB5端口为输入 */TRISBbits.TRISB5 = 1;/* RB5设置为数字端口 */ANSELBbits.ANSB5 = 0;/* 使能RB5内部上拉,作为数字输入端口在设计时要注意并不是所有端口都有内部上拉的 */WPUBbits.WPUB5 = 1;/* 等待按键按下 */while(PORTBbits.RB5 == 1);while (1){__delay_ms(1000);Open_LED();__delay_ms(1000);Close_LED();}}器件配置位可以在Window>Pic Memory Views>Configuration Bits中查询或者直接生成代码。
数码管的常见问题
【技术分享】数码管显示常见问题总结2015-03—30吴鉴鹰(原创)一、数码管显示原理我们最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其他的基本相同。
所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。
数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮.而共阳极就是将八个LED的阳极连在一起.其原理图如下。
其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。
一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线.显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。
数码管的8段,对应一个字节的8位,a对应最低位,dp对应最高位.所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111,即0x3f;共阳数码管的字符编码为11000000,即0xc0.可以看出两个编码的各位正好相反。
如下图。
二、数码管出现暗红现象现象描述:单片机穿行口的范式0为同步移位寄存器方式,外接一个串入并出的移位寄存器,可以扩展为一个并行口.但是发现数码管显示数据的时候,出现暗红现象。
电路连接图原因:数据在串行输出期间,输出允许控制端没有关闭,从而导致串口输出端不稳定产生暗红现象。
三、数码管闪烁1:动态扫描驱动的时候,时间调整的不对,时间太短,就会闪烁,时间太长,就会出玩不应该亮的位微亮,所以,这是调整延时时间的事2:有可能是程序要求这样闪烁吧,别说不可能,有时候在某些系统中,还故意设有这种功能.3:即使用专用芯片,只要是扫描式的驱动,他也会闪烁,只是我们看起来不太明显。
4:如果从程序中讲的话,即使扫描时间合理,也有可能会因为程序的不合理性而出现闪动,这种情况一般为两种失误:a中断时间影响了扫描周期的时间,即中断时间长于扫描周期,就会出现闪烁 b闪烁的常用数据内存被快速更改后又改过来,属于寄存器的重复使用,这两种情况我都碰到过.四、数码管亮度不一致现象:动态显示一连几个数码管,有的亮有的暗原因:1、用单片机IO口驱动三极管从而去驱动数码管,三家管基极电阻选取不正常,三极管导通程度不一样,对于显示不同值时所需电流不同,当显示所需电流小的数字,显示比较亮,显示所需电流大的数字,三家管导通不彻底,从而每一个LED上的电路偏小从而偏暗.比如:每一个LED所需电流100mA,但是在三家管最大限度导通最大电流只能有500mA,则在数字5以下显示明亮,在5以上显示较暗。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
思路:1、把这个数对10取模 123456%10 结果是 6 就把第一位分离出来了
2、把这个数除10后再进行对10取模 123456/10 结果12345 再12345%10 结果是5 就把第二位分离出来了
{
LedBuff[i] = LedChar[buf[i]];
}
}
unsigned char code LedChar[]={ //0-F在数码管上显示的数据表用数组存放
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
{
LedBuff[i] = 0xFF;
}
else //如果首位不是零,则跳r(; i>=0; i--) //i继承了上面语句的数值,把该位的数字通过Ledchar[buf[i]]数组,进行转换为该数字的显示数据并赋值给数码管显示缓存
};
unsigned char LedBuff[6] = { //每位数字显示的数据储存数组缓存,设置初始值是0xff
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
{
signed char i; //定义变量i用于循环数的位数
unsigned char buf[6]; //定义一个数组用于保存分离出来各位的数据
for(i=0; i<6; i++)
{
buf[i] = num % 10;
num = num / 10;
} //上面2个语句就是循环6次,把1个6位数进行按位分离后存放在数组buf中
for(i=5; i>=1; i--) //进行首位是零,不显示
{
if(buf[i] == 0) //如果首位是零,则把数码管显示缓存数据为0XFF,由于是共阳极数码管,如果数据是0xff 则数码管不显示
3、进行这样的循环 这个数是6位就循环6次,把结果存放在一组变量中,这样就把这个数的各位都进行分离出来了
4、数字首位为0,数码管不显示0,数字当中或末尾是0则显示0
程序
5、经过循环语句后,就把数字每位的数据储存在了数字显示缓存数字Ledbuff[]中了
void ShowNumber(unsigned long num) //显示数字函数,参数是1个长整形的数字num