单片机

      单片机就是一个小的计算机,不过他没有计算机那么好,方便的输入输出设备,计算机的输入设备就是鼠标,键盘等,方便的很,输出设备就是显示器,将输出非常清晰的显示在屏幕上。但是单片机的输入输出都是他的引脚,需要通过编程控制。

       单片机和PC机相同的地方就是都有CPU(我把单片机的微控制器核也叫CPU),内存(单片机的ROM,RAM,FLASH等),时钟系统,中断系统,定时器等等。

      一, 单片机最小系统就是单片机能够运行起来的必要条件:

   1.电源 2.晶振 3.复位电路  没有电源就没有能源,就不能工作;没有晶振,就没有时钟电路,就没有节拍,指令就不能按一定的步调运行;没有复位电路,单片机就很不可靠,会出现“死机”、“程序走飞(PC)”等现象。
   
   二,一些重要概念
    1. 我们对单片机编程不过就是设置单片机内部的寄存器和端口引脚以便输出高低电平控制其他(连接在单片机上)器件而已。
    2. 编程中最重要的是1:配置时钟,2:配置IO口,3:配置复位方式,看门狗设置等等
       次要的是:中断(外部,定时器,串口),串口,ADC,XRAM读写,内部FLASH等。   
    3. 1个机器周期 =12个时钟周期(晶振的振荡周期)   
    4. while(1);让单片机一直工作,等待中断!防止程序跑飞等。
    5. 51单片机共111条汇编指令,
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。
11. ram高128位只能间接寻址。idata,一些人可能没有用到idata,发现data不够用。
12 1s=1000ms=1000000us=1000000000ns.
13.
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){            }
 
}
发布了510 篇原创文章 · 获赞 270 · 访问量 137万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览