单片机就是一个小的计算机,不过他没有计算机那么好,方便的输入输出设备,计算机的输入设备就是鼠标,键盘等,方便的很,输出设备就是显示器,将输出非常清晰的显示在屏幕上。但是单片机的输入输出都是他的引脚,需要通过编程控制。
单片机和PC机相同的地方就是都有CPU(我把单片机的微控制器核也叫CPU),内存(单片机的ROM,RAM,FLASH等),时钟系统,中断系统,定时器等等。
一, 单片机最小系统就是单片机能够运行起来的必要条件:
1.电源 2.晶振 3.复位电路
二,一些重要概念
设置单片机内部的寄存器和端口引脚以便输出高低电平控制其他(连接在单片机上)器件而已。
1:配置时钟,2:配置IO口,3:配置复位方式,看门狗设置等等
次要的是:中断(外部,定时器,串口),串口,ADC,XRAM读写,内部FLASH等。
3. 1个机器周期 =12个时钟周期(晶振的振荡周期)
4. while(1);让单片机一直工作,等待中断!防止程序跑飞等。
7种寻址方式:
1.立即寻址 MOV A,#01H
2.直接寻址 MOV A,20H
3.寄存器寻址 MOV A,R3(A,B,Cy,DPTR)
4.寄存器间接寻址 MOVA,@R0 R1
5.变址寻址 MOVC A, @A+DPTR
6.相对寻址 SJMP rel; (PC)←(PC) + 2(指令长度) + rel
7.位寻址 位寻址是直接寻址方式的一种,其特点是对8位二进制数中的某一位的地址进行操作。
MOV 00h,C,MOV 20H.0, C ,PSW.6
6. XRAM(分内外)读写
1> XBYTE[address]=data 写数据
data=XBYTE[address] 读数据;
2>char xdata *mydat;
......
mydat=(char xdata*)0x0030;
*mydat=31;
3>汇编方式
mov dptr,#1000h
mov a,#55h
movx @dptr,a
7. 读端口信号是必须先向端口写“1”,然后再读,这就是单片机口信号的准双向的含义。切记!
8. 模拟输入或数字I/O,推挽(强)或漏极开路输出(IO,inout)
9. 一些寄存器默认设置即可,配置了可能会有警告。usb clock.clksel=1 10. Keil C 里面Lib库文件的生成与调用,可以自己做lib。
ram高128位只能间接寻址。idata,一些人可能没有用到idata,发现data不够用。
12 1s=1000ms=1000000us=1000000000ns.
x M晶振定时 y ms: TH1 = (65536 - (x/12)*y*1000) / 256; TL1 = (65536 - (x/12)*y*1000) % 256;16位的哦,亲!
假设C8051F020单片机的晶振是22114800Hz,测每秒计22114800个数 经过12分频后,每秒计22114800÷12=1842900个数,如果设置计数器初值是 0xfe90(即十进制65165),则需要计的数的个数为65535-65165=360,那么定时器的 时间为(360÷1842900)(S)≈0.195ms,即0.2ms。
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long #define bool bit
#include<C8051F330.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long //引脚定义
sbit In1= P0^3; sbit In2= P0^7; sbit In3= P1^3; sbit In4= P1^7; sbit Out1= P0^3; sbit Out2= P0^7; sbit Out3= P1^3; sbit Out4= P1^7;
//----------------------------------------------------------------------------- //功能:延时 //入口参数:yc //出口参数:无 //-----------------------------------------------------------------------------
void delay(uint time)
{
while(--time);
}
//----------------------------------------------------------------------------- //功能:单片机C8051F330初始化 //入口参数:无 //出口参数:无 //-----------------------------------------------------------------------------
void Mcu_Init(void) {
PCA0MD&=~0x40; //禁止内部看门狗
OSCICN = 0x83; //内部振荡控制寄存器,使能H-F,八分频
OSCICL = 0x00; //期望输出频率也是24.5MHz
CLKSEL = 0x00; //系统时钟取自内部高频振荡器
RSTSRC = 0x04; //检测到时钟丢失时允许系统复位
}
//----------------------------------------------------------------------------- //功能:MCU I/O口配置 //入口参数:无 //出口参数:无 //-----------------------------------------------------------------------------
void PORT_Init (void) {
P0MDOUT = 0x88; //P0.3,P0.7推挽输出
P1MDOUT = 0x88; //P1.3,P1.7推挽输出
XBR0 = 0x00;
XBR1 = 0x40; //使能交叉开关和弱上拉 }
//----------------------------------------------------------------------------- // 功能:所有设备初始化 //----------------------------------------------------------------------------- // 入口参数:无 // 出口参数:无 //-----------------------------------------------------------------------------
void Init_Device (void) {
Mcu_Init();
PORT_Init();
} void main() {
Init_Device();
delay(10);
while(1){ }
}
标签:void,单片机,寻址,-------------------------------------------------------------------- From: https://blog.51cto.com/u_15045304/5966120