c51单片机_c51单片机编程 - CSDN
精华内容
参与话题
  • C51学习五)单片机与PC通过串口通信

    万次阅读 多人点赞 2017-03-05 19:34:35
    2.求出给定波特率对应的T1定时器初始值(因为传统的C51是用T1定时器产生波特率的) 3.写程序 2.串口模块 什么是串口?串口就是COM口,串口是串行发送数据的,是一位位地发送数据位,常见的是9针串口。但在一般的C

    1.开发步骤

    2.串口模块

    3.SBUF是什么

    4.串口相应寄存器

    5.给定波特率求定时值

    6.代码实现


    1.开发步骤

    1.设置串口中断寄存器

    2.求出给定波特率对应的T1定时器初始值(因为传统的C51是用T1定时器产生波特率的)

    3.写程序


    2.串口模块

    什么是串口?串口就是COM口,串口是串行发送数据的,是一位位地发送数据位,常见的是9针串口。但在一般的C51学习版和开发版上都有集成CH340转换芯片,

    使得用usb口就可以代替串口,所以用一般的学习板进行开发,只要插上usb线就可以进行串口测试。


    3.SBUF是什么

    SBUF是一个寄存器,作为一个缓冲区,当单片机准备接收数据时,会先把数据放到SBUF中,然后再接收。发送也是,当单片机准备发送数据时,会先把数据放到

    SBUF中,再发送出去


    4.串口相应寄存器

    SCON串口控制寄存器(主要用方式1)

    SM1,SM0:

    SM0 SM1 工作方式 功能 波特率
    0 0 方式0 8位同步移位寄存器 晶振频率 / 12
    0 1 方式1 10位UART 可变
    1 0 方式2 11位UART 晶振频率/32或晶振频率/64
    1 1 方式3 11位UART 可变

    SM2:----多机通信控制位(可以先不理)

    多机通信是工作在方式2和方式3的,所以SM2主要用于方式2和方式3,多级通信时,SM2=1,当SM2=1时,只有当接收到的数据帧第9位(RB8)为1时,

    单片机才把前八位数据放入自己的SBUF中,否则,将丢弃数据帧。当SM2=0时,不论RB8的值是什么,都会把串口收到的数据放到SBUF中。


    REN:-----允许接收位

    REN用于控制是否允许接收数据,REN=1时,允许接收数据,REN=0时,拒绝接收数据


    TB8:-------是要发送的第9位数据位

    在方式2和方式3中,TB8是要作为数据帧第9位被发送出去的,在多机通信中,可用于判断当前数据帧的数据是地址还是数据,TB8=0为数据,TB8=1为地址


    RB8:-------接收到的第9位数据位

    当单片机已经接收一帧数据帧时,会把数据帧中的第9位放到 RB8中。方式0不使用RB8,在方式2和方式3中,RB8为接收到的数据帧的第9位数据位。


    TI:-----发送中断标志位

    方式0中,不用管他。其他方式下,当发送数据完毕,硬件会将其置1,当 TI 被置1,会向CPU发送中断请求。我们记得要在中断服务程序中把 IT 置回0.


    RI:-----接收中断标志位

    当接受完一帧数据时,RI  由硬件置1,当RI 被置1,会向CPU请求中断。同样要在中断服务程序中把 RI 置回0。


    PCON功率控制寄存器

    这个寄存器只有一个位SMOD,在方式1,2.,3时,波特率都与SMOD有关,当SMOD=1时,波特率会增加一倍。复位时,SMOD变回0



    5.给定波特率求定时值

    串口中断要有定时器T1参加,因为C51是用定时器1来产生波特率的。

    因此就需要给 定时器T1 设置初值。


    首先,我们要选择一个合适的波特率,波特率关乎数据发送的快慢,一般我们选择9600b/s好了,你选2400也没问题。

    一般我们会选择定时器的方式2(这里不是说上面的方式2,而是最大计数为256且自动重载定时器初值的方式)

    使用这种方式是因为它能自动重载定时器初值,不用在中断服务程序中人工重设,可以减少误差。

    下面给出公式:

    Fosc:为晶振频率

    (256-X):最终要求的是X,256出现的原因是定时器的方式2最大技术是256,如果是方式1,则是65536-X

    最后把X化成16进制,高八位赋给 TH1,第八位赋给 TL1


    例子:


    或者可以直接下载一个51波特率计算器:



    6.代码实现:

    测试前提:首先要在PC机(电脑)上下载个串口助手,用于接收51单片机的数据。


    C51发送数据到电脑:

    #include <reg51.h>
    
    typedef   unsigned char  uint8;
    typedef   unsigned int   uint16;
    
    uint8 Buf[]="hello world!\n";
    
    void delay(uint16 n)
    {
    	while (n--);
    }
    
    /*波特率为9600*/
    void UART_init(void)
    {
        SCON = 0x50;        //串口方式1
    
        TMOD = 0x20;        // 定时器使用方式2自动重载
        TH1 = 0xFD;    //9600波特率对应的预设数,定时器方式2下,TH1=TL1
        TL1 = 0xFD;
    
        TR1 = 1;//开启定时器,开始产生波特率
    }
    
    /*发送一个字符*/
    void UART_send_byte(uint8 dat)
    {
    	SBUF = dat;       //把数据放到SBUF中
    	while (TI == 0);//未发送完毕就等待
    	TI = 0;    //发送完毕后,要把TI重新置0
    }
    
    /*发送一个字符串*/
    void UART_send_string(uint8 *buf)
    {
    	while (*buf != '\0')
    	{
    		UART_send_byte(*buf++);
    	}
    }
    
    main()
    {
    	UART_init();
    	
    	while (1)
    	{
    		UART_send_string(Buf);
    		delay(20000);
    	}
    
    }
    效果:串口助手连接后会不停显示 hello world。(串口助手波特率要设成和单片机发送波特率一样,COM口也是)



    电脑发送数据到单片机:

    #include<reg52.h>
    #define uchar unsigned char
    #define uint  unsigned int
    uchar buf;
    void main(void)
    {
    SCON=0x50;//设定串口工作方式0101 0000
    PCON=0x00;
    TMOD=0x20;
    EA=1;
    ES=1;
    TL1=0xfd;//波特率9600
    TH1=0xfd;
    TR1=1;
    while(1);
    }
    
    //串行中断服务函数
    void serial() interrupt 4
    	{
    	ES=0;		//暂时关闭串口中断
    	RI=0;
    	buf=SBUF;	//把收到的信息从SBUF放到buf中。
    	switch(buf)
    	{
    	case 0x31: P1=0xfe;break;   //二进制 0011 0001  十进制 49 控制字符 1  16进制 0X31
    	case 0x32: P1=0xfd;break;	 //1111 1101
    	case 0x33: P1=0xfb;break;
    	case 0x34: P1=0xf7;break;
    	case 0x35: P1=0xef;break;   
    	case 0x36: P1=0xdf;break;	
    	case 0x37: P1=0xbf;break;
    	case 0x38: P1=0x7f;break;
    	}
    	ES=1;		//重新开启串口中断
    
    }
    
    
    效果:当用电脑的串口助手向单片机发送数字1的时候,单片机会亮起LED0,以此类推。

    展开全文
  • C51单片机

    2018-09-12 13:04:14
    一、工程建立 建立工程 // new project -&amp;amp;gt; 保存(弹窗否)并选择cpu为atm89c51(弹窗否) 创建新文本 //(FILE下方空白图标-&amp;...将c文件添加到工程 //(右击souce文件夹 -&...

    一、工程建立

    1. 建立工程 // new project -> 保存(弹窗否)并选择cpu为atm89c51(弹窗否)
    2. 创建新文本 //(FILE下方空白图标-> 保存并命名为main.c)
    3. 将c文件添加到工程 //(右击souce文件夹 -> add file to…)
    4. 生成hex文件 //(第三行魔法棒 -> output -> 勾选creat hex)
    5. 设置晶振频率 //(第三行魔法棒 -> target -> 修改为12Mhz)

    二、LED

    <1-1>、LED点亮

    #include "reg52.h"    //调用52单片机头文件
    
    sbit led1=P2^0;       //位定义led1为P2.0端口
    
    void main()
    {
        while(1)
        {
            led1=0;       //循环令led1电平为0(点亮led)
        }
    }

    <1-2>、LED闪烁

    #include "reg52.h"    //包含52单片机头文件
    
    typedef unsigned int u16;    //重定义数据类型 0~65535
    typedef unsigned char u8;    //0~255
    
    sbit led1=P2^0;       //位定义led1为P2.0端口
    
    u16 i;
    
    /********定时器0初始化函数*******/
    void Timer0Init()
    {
        TMOD|=0X01;        //定时器工作方式寄存器TMOD赋值(确定T0,T1工作方式)
        TH0=0XFC;TL0=0X18; //设初值(1ms)
        ET0=1;             //选择中断方式T0
        EA=1;              //打开总中断
        TR0=1;             //启动定时
    }
    
    /*********主函数********/
    void main()
    {
        Timer0Init();
        while(1)
        {
            if(i==1000)          //定时达到1s时
            {
                i=0;
    
                led1=~led1;        //将led1电平置反
            }             
        }
    }
    
    /************定时器0中断函数**************/
    void Timer0() interrupt 1
    {
        TH0=0XFC;TL0=0X18;      //重新装入初值
        i++;    
    }

    <1-3>、一个LED循环移位

    #include <reg52.h>    //调用52单片机头文件
    
    typedef unsigned int u16;    //重定义数据类型 0~65535
    typedef unsigned char u8;    //0~255
    
    u16 i,n;                    //设置循环变量
    
    /********定时器0初始化函数*******/
    void Timer0Init()
    {
        TMOD|=0X01;        //定时器工作方式寄存器TMOD赋值(确定T0,T1工作方式)
        TH0=0XFC;TL0=0X18; //设初值(1ms)
        ET0=1;             //选择中断方式T0
        EA=1;              //打开总中断
        TR0=1;             //启动定时
    }
    
    /*********主函数********/
    void main()
    {
        Timer0Init();
        while(1)
        {
            if(i==1000)          //定时达到1s时
            {
                i=0;
    
                P2=~(0x01<<n);   //将0000 0111左移n位后取反
                if(++n==8)
                    n=0;         //n为8时瞬间重新置0
            }             
        }
    }
    
    /************定时器0中断函数**************/
    void Timer0() interrupt 1
    {
        TH0=0XFC;TL0=0X18;      //重新装入初值
        i++;    
    }

    <1-4>、三个LED循环移位

    #include <reg52.h>    //调用52单片机头文件
    
    typedef unsigned int u16;    //重定义数据类型 0~65535
    typedef unsigned char u8;    //0~255
    
    u16 i,n;                    //设置循环变量
    
    /********定时器0初始化函数*******/
    void Timer0Init()
    {
        TMOD|=0X01;        //定时器工作方式寄存器TMOD赋值(确定T0,T1工作方式)
        TH0=0XFC;TL0=0X18; //设初值(1ms)
        ET0=1;             //选择中断方式T0
        EA=1;              //打开总中断
        TR0=1;             //启动定时
    }
    
    /*********主函数********/
    void main()
    {
        Timer0Init();
        while(1)
        {
            if(i==1000)  //定时达到1s时
            {
                i=0;
    
                if(n<6)
                    P2=~(0x07<<n); //将0000 0111左移n位后取反
                if(n==6)
                    P2=~0xc1;
                if(n==7)
                    P2=~0x83;
                if(++n==8)        
                    n=0;    //n为8时瞬间重新置0                 
            }             
        }
    }
    
    /************定时器0中断函数**************/
    void Timer0() interrupt 1
    {
        TH0=0XFC;TL0=0X18;      //重新装入初值
        i++;    
    }
    展开全文
  • 此压缩包内包含完整C51单片机联系实例,包含各大模块,是学习单片机不可或缺的练习实例,好不好,谁用谁知道~
  • C51单片机简介

    千次阅读 2018-11-23 07:14:05
    --------------------------------------------- -- 创建人:Ruo_Xiao ...----------------------------- -- 时间:2018-10-28 -- 修改人:Ruo_Xiao -- 内容:修正了Intel系列51单片机的名称。 -------...
    ---------------------------------------------
    --    创建人:Ruo_Xiao
    --    邮箱:xclsoftware@163.com
    -----------------------------
    --    时间:2018-10-28
    --    修改人:Ruo_Xiao
    --    内容:修正了Intel系列51单片机的名称。
    -----------------------------
    --    时间:2018-10-29
    --    修改人:Ruo_Xiao
    --    内容:增加了引脚图和功能模块的划分。
    -----------------------------
    --    时间:2018-11-04
    --    修改人:Ruo_Xiao
    --    内容:增加对引脚和硬件结构的描述。
    ---------------------------------------------

    一、单片机的定义

        1、将CPU、存储器、I/O接口和总线制作在一块芯片上的超大规模集成电路。

        2、英文全称:Single Chip MicroComputer。 

        3、又名:MCU,微控制单元。英文全称:Micro Controller Unit

    二、51单片机定义和历史

        51单片机是对所有兼容Intel 8031指令系统的单片机的统称,该系列单片机的始祖是Intel的8004单片机。由于Intel忙于PC端芯片,故将51单片机的授权卖给了ATMEL、Philips等。

    三、51单片机的种类

    *Intel(英特尔)的:8031、8051、8751,8032、8052、8752等,前面带“MCS”,全称: Micro Controller System

    *ATMEL(艾德梅尔)的:89C51、89C52、89C2051,89S51(RC),89S52(RC)等,前面带“AT”;

    *Philips(飞利浦)、华邦、Dallas(达拉斯)、Siemens(西门子)等公司的许多产品;

    STC(国产宏晶)单片机:89C51、89C52、89C516、90C516等众多品牌,前面带“STC”,全称:SysTem Chip

    四、51单片机的引脚(40个)

    1、电源及时钟引脚:VccVssXTAL1XTAL2

    2、控制引脚:PSENALE/PROGEARST

    3、I/O口引脚:P0~P3

    五、51单片机的硬件结构

    1、如下图所示:

    2、按照功能划分,由如下部件组成:

    (1)微处理器(运算器 + 控制器):8位

    (2)数据存储器(RAM):片内128B(52系列为256B),片外最多64KB。

    (3)程序存储器(ROM/EPROM)

    • 8031无此部件。
    • 8051为4K的ROM。
    • 8751位4K的EPROM。

    片外最多拓展至64KB。

    (4)特殊功能寄存器(SFR):21个,是一些控制寄存器和状态寄存器,是一个具有特殊功能的RAM区。

    (5)并行I/O口(P0~P3)

    (6)串行口:1个全双工的串行口(RXD、TXD)。

    (7)定时器/计数器:2个16位的定时计数器,具有4种工作方式。

    (8)中断系统

    • 具有5个中断源:外部(INT0、INT1)、内部(定时/计数器T0、T1和片内串行口)。
    • 2个中断优先级。

    各个部件由单一的总线相连。

     

     

    (SAW:Game Over!)

    展开全文
  • 【入门必看】单片机c语言教程

    万次阅读 多人点赞 2018-05-23 14:48:12
    单片机的C语言采用C51编译器(简称C51)。由C51产生的目标代码短,运行速度高,存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言PL/M51语言目标代码混合使用。现在就一起来...
    展开全文
  • 单片机C51数据类型和存储器类型

    万次阅读 2016-09-21 23:04:14
    一、数据类型 我们51单片机使用的C语言的数据类型分为以下几种: ...图1中例出了C51所有的基本类型,可供大家参考。 二、储存器类型 我们51单片机使用的C语言的存储器类型分为以下几种:  
  • C51单片机学习思维导图

    千次阅读 多人点赞 2019-09-30 12:46:48
    C51单片机学习总结:
  • 用visual_studio编写c51单片机程序

    万次阅读 2017-11-17 15:56:24
    第一步,软件安装:  安装VisualStudio2008,建议全部安装。安装VisualAssistX。安装KeiluVision。   第二步,添加环境变量:  以Windows7为例,在桌面计算机上右击,选择属性,打开属性对话框,在左列...在P
  • C51单片机小程序(一)

    千次阅读 2018-08-26 21:13:55
    好久没碰单片机了,有些生疏了。到现在还依稀记得自己独自坐在电脑屏幕前自学单片机,硬生生的去看了单片机的基础,现在想想还是挺有趣的。附上当初一点初学的单片机小程序,请大家勿怪! 用P1口作为输出口,接8...
  • 51单片机之循环移位

    万次阅读 2012-12-06 16:53:35
    51单片机之循环移位函数 今天在看书的时候看到了循环移位函数,想跟大家分享下,呵呵,大牛们不要嘲笑,由于本人刚起步,莫笑。 如果你使用keil软件编写C51程序的话,那么你可以打开Keil下的C51下的HLP文件,...
  • 如何让keil5可开发51系列单片机

    万次阅读 多人点赞 2020-03-17 21:37:49
    通常,我们使用keil5开发32,keil...1.下载 C51相关依赖包 从官网下载 (或者使用最下面提供的链接下载!!!) 2.安装按照默认配置,点击下一步即可 3.打开keil5,新建项目,选择对应型号的51...
  • 但对于“寸土寸金”的单片机来说,问题可没那么简单。 看看我代码中这句弃之不用的代码吧: //sprintf(sFileLen,"%d",fileLen*128);print(sFileLen); //使用这个库函数,体积一下增加2563. 我的程序空间马上溢出...
  • 单片机C51 helloworld小程序

    千次阅读 2013-10-30 10:42:21
    使用proteus仿真电路,keil4编写程序,实现单片机LED灯循环亮灭。 #include #define uint unsigned int void main() { uint n=5000; while(1) { P1=0xfe; while(n--); P1=0xff; while(n--); } } ...
  • 蜂鸣器有有源和无源的几种。也称为直流蜂鸣器和交流蜂鸣器。有源蜂鸣器只要通上直流电,就会发出预定的声音,比如,连续嘀声,或者间断嘀嘀声,这种声音无法控制,频率也无法改变。一般用在一些简单应用场合。...
  • 51单片机入门教程(0)—— 开发环境配置

    万次阅读 多人点赞 2018-10-06 09:55:15
    本教程包含51单片机开发环境Keil_C51的安装、破解和汉化,以及51单片机仿真环境proteus的安装、破解。 (说明:本教程仅供学习交流之用,禁止任何商业用途!请在24小时之内删除,如要使用Keil请购买正版) 1、 Keil_...
  • 用keilC写代码写了差不多一个月,真是造了什么孽啊,当时以为没有办法,现在写多了越写越垃圾,毕竟也是见过世面的,好多年以前还用过vs写过代码的,实在受不了了,然后...(PS:keilC C51版本不支持代码自动补全!...
  • 使keil5支持51单片机

    万次阅读 2018-03-22 18:26:57
    需要用到的工具:...keil5默认不支持51,51单片机的工程放到keil5会报错:keil5 --- Error: failed to execute 'G:\keil\C51\BIN\C51.EXE'安装方法:1.运行c51v954a.exe,将路径选...
  • 运行80C51单片机C51语言编写程序,在51实验小系统上实现“十以内的简易计算器”,即:定义51实验小系统上的按键分别为0~9数字键、‘+’、“-”“*”“/”‘=’、退格等功能键;识别相关按键,按照十以内加法的正确...
  • 1、Keil uVision5软件的C51安装包及破解软件 2、Keil uVision5软件的MDK(ARM)安装包及破解软件 3、新唐(Nuvoton)单片机关于Keil uVision5软件的支持包 4、STC(宏晶)单片机关于Keil uVision5软件的支持包 二、...
  • keil for C51 找不到芯片包

    千次阅读 2018-06-07 11:05:10
    1、keil有C51版本,先到keil 官网下载2、先退出KEIL(以免冲突),运行STC-ISP V6.31(或更高版本), 在右侧的【Keil关联设置】标签点击【添加MCU型号到Keil中】按钮,系统提示“STC型号添加成功!”即可将全系列宏晶STC...
1 2 3 4 5 ... 20
收藏数 10,181
精华内容 4,072
关键字:

c51单片机