找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 309|回复: 7
打印 上一主题 下一主题
收起左侧

从单片机基础到程序框架(全集PDF)

  [复制链接]
跳转到指定楼层
楼主
山水间 发表于 2020-9-8 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
吴坚鸿先生在21ic论坛上连载的帖子最终整理成的书,前期内容是C语言基础,后面是51单片机的基础,文章很有思想深度,不同于市场上所卖的单片机书籍,它从项目开发的角度来写,有很多内容是一般书籍上没有的,值得推广学习。吴坚鸿先生免费把书籍分享给社会,在此感谢他的付出。

从单片机基础到程序框架(全集 2019pdf版).pdf

4.21 MB, 下载次数: 75, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
神出没 发表于 2020-9-9 10:15 | 只看该作者
这个作者真的好伟大。要是有目录就完美了
回复

使用道具 举报

板凳
yygdzjs 发表于 2020-9-9 10:49 | 只看该作者
讲的比较仔细,初学者有可能说教程单片机比较老了.我们学习的是思路.
国产的51单片机 增强型51比较多些. 模块功能的寄存器稍作修改就可以.
例如:赛元的SC92F8003

/*
*****************************************************
* 文件名: main.c
* 备注: 主函数
* 测试功能 :C语言学习程序 P15发送数据
   UART0 串口发送数据后,占小部分data,其它IO资源释放
     //--sc92f8003.h--
          //P1PH |= 0x20; // P15 上拉使能(测试上拉可用可不用)
                SCON |= 0x50; //模式1 10位全双工;允许接收     
                tmp = 16000000L / 9600; //
                   //--使用定时器1--
                //T2CON &= 0xCF; //选择定时器1(默认)
                TH1 = (u8)(tmp >> 8); //定时器1计数器的 高8位
                TL1 = (u8) tmp; //        //定时器1计数器的 低8位
          //IPUART = 1; // 串口高优先级 使能
                //EA = 1; //使能总中断
                //EUART = 0; //串口中断 使能               
          //TI = 0;       

//--注销部分开始---
* 测试功能:UART0串口功能 IO输入(P17 P00 P01) 输出(P12 P13 P14)
* 功能说明:
* 硬件资源:
//芯片设置内部时钟 16MHZ ,看门狗除能 低电压2.9V  复位脚做 P17IO
//                sbit LED1 = P1^2; // LED口
//                sbit LED2 = P1^3; //
//                sbit LED3 = P1^4; //
//                sbit KEY_INPUT1 = P1^7; // 按键口
//                sbit KEY_INPUT2 = P0^0; //
//                sbit KEY_INPUT3 = P0^1; //
//                UART0 串口
//                ConfigUART0(0,9600); //-串口配置参数-引脚 P15(TX0) P16(RX0)
//                // ConfigUART0(1,9600); //串口配置参数-引脚 P20(TX0A) P11(RX0A)
//--注销部分结束---
*
*****************************************************
*/
  //#include "REG52.H"
#include "sc92f8003.h"
void View(unsigned long u32ViewData);
void to_BufferData(unsigned long u32Data,unsigned char *pu8Buffer,unsigned char u8Type);
void SendString(unsigned char *pu8String);
/*---C语言学习区域的开始。-----------------------------------------------*/
void main() //主函数
{
                unsigned char a; //定义一个变量 a。
                unsigned int b; //定义一个变量 b。
                unsigned long c; //定义一个变量 c。
                a=100; //给变量 a 赋值。
                b=10000; //给变量 b 赋值。
                c=1000000000; //给变量 c 赋值。
                View(a); //在电脑串口端查看第 1个数 a。
                View(b); //在电脑串口端查看第 2个数 b。
                View(c); //在电脑串口端查看第 3个数 c。
       
                while(1)
                {
                }
}
/*---C语言学习区域的结束。-----------------------------------------------*/
void View(unsigned long u32ViewData)
{
                static unsigned char Su8ViewBuffer[43];
                code unsigned char Cu8_0D_0A[]={0x0d,0x0a,0x00};
                code unsigned char Cu8Start[]={"开始..."};
                static unsigned char Su8FirstFlag=0;
                static unsigned int Su16FirstDelay;
                if(0==Su8FirstFlag)
                {
                        Su8FirstFlag=1;
                        for(Su16FirstDelay=0;Su16FirstDelay<10000;Su16FirstDelay++);
                        SendString(Cu8Start);
                        SendString(Cu8_0D_0A);
                        SendString(Cu8_0D_0A);
                }
                to_BufferData(u32ViewData,Su8ViewBuffer,1);
                SendString(Su8ViewBuffer);
                to_BufferData(u32ViewData,Su8ViewBuffer,2);
                SendString(Su8ViewBuffer);
                to_BufferData(u32ViewData,Su8ViewBuffer,3);
                SendString(Su8ViewBuffer);
                to_BufferData(u32ViewData,Su8ViewBuffer,4);
                SendString(Su8ViewBuffer);
                SendString(Cu8_0D_0A);
}


void to_BufferData(unsigned long u32Data,unsigned char *pu8Buffer,unsigned char u8Type)
{
                code unsigned char Cu8Array1[]={0xB5,0xDA,0x4E,0xB8,0xF6,0xCA,0xFD,0x00};
                code unsigned char Cu8Array2[]="十进制:";
                code unsigned char Cu8Array3[]="十六进制:";
                code unsigned char Cu8Array4[]="二进制:";
                static unsigned char Su8SerialNumber=1;
                static unsigned int Su16BufferCnt;
                static unsigned int Su16TempCnt;
                static unsigned int Su16TempSet;
                static unsigned long Su32Temp1;
                static unsigned long Su32Temp2;
                static unsigned long Su32Temp3;
                static unsigned char Su8ViewFlag;
               
                if(1==u8Type)
                {
                        for(Su16BufferCnt=0;Su16BufferCnt<7;Su16BufferCnt++)
                        {
                                pu8Buffer[Su16BufferCnt]=Cu8Array1[Su16BufferCnt];
                        }
                        pu8Buffer[2]=Su8SerialNumber+'0';
                        pu8Buffer[Su16BufferCnt]=0x0d;
                        pu8Buffer[Su16BufferCnt+1]=0x0a;
                        pu8Buffer[Su16BufferCnt+2]=0;
                        Su8SerialNumber++;
                        return;
                }
                else if(2==u8Type)
                {
                        for(Su16BufferCnt=0;Su16BufferCnt<7;Su16BufferCnt++)
                        {
                                pu8Buffer[Su16BufferCnt]=Cu8Array2[Su16BufferCnt];
                        }
                        Su32Temp1=1000000000;
                        Su32Temp2=10;
                        Su16TempSet=10;
                }
                else if(3==u8Type)
                {
                        for(Su16BufferCnt=0;Su16BufferCnt<9;Su16BufferCnt++)
                        {
                                pu8Buffer[Su16BufferCnt]=Cu8Array3[Su16BufferCnt];
                        }
                        Su32Temp1=0x10000000;
                        Su32Temp2=0x00000010;
                        Su16TempSet=8;
                }
                else
                {
                        for(Su16BufferCnt=0;Su16BufferCnt<7;Su16BufferCnt++)
                        {
                                pu8Buffer[Su16BufferCnt]=Cu8Array4[Su16BufferCnt];
                        }
                        Su32Temp1=0x80000000;
                        Su32Temp2=0x00000002;
                        Su16TempSet=32;
                }

          Su8ViewFlag=0;
                for(Su16TempCnt=0;Su16TempCnt<Su16TempSet;Su16TempCnt++)
                {
                                Su32Temp3=u32Data/Su32Temp1%Su32Temp2;
                                if(Su32Temp3<10)
                                {
                                        pu8Buffer[Su16BufferCnt]=Su32Temp3+'0';
                                }
                                else
                                {
                                        pu8Buffer[Su16BufferCnt]=Su32Temp3-10+'A';
                                }

                                if(0==u32Data)
                                {
                                        Su16BufferCnt++;
                                        break;
                                }
                                else if(0==Su8ViewFlag)
                                {
                                        if('0'!=pu8Buffer[Su16BufferCnt])
                                        {
                                                Su8ViewFlag=1;
                                                Su16BufferCnt++;
                                        }
                                }
                                else
                                {
                                        Su16BufferCnt++;
                                }       
                                Su32Temp1=Su32Temp1/Su32Temp2;
                }
                pu8Buffer[Su16BufferCnt]=0x0d;
                pu8Buffer[Su16BufferCnt+1]=0x0a;
                pu8Buffer[Su16BufferCnt+2]=0;
}


void SendString(unsigned char *pu8String)
{
        static unsigned int Su16SendCnt;
        static unsigned int Su16Delay;
        u32 tmp; //
         //-REG52.H-
        //SCON=0x50;
        //TMOD=0X21;
        //TH1=TL1=256-(11059200L/12/32/9600);
        //TR1=1; //sc92f8003 芯片 不能开启
        //ES = 0;
        //TI = 0;
       
    //--sc92f8003.h--
          //P1PH |= 0x20; // P15 上拉使能(测试上拉可用可不用)
                SCON |= 0x50; //模式1 10位全双工;允许接收     
                tmp = 16000000L / 9600; //
                   //--使用定时器1--
                //T2CON &= 0xCF; //选择定时器1(默认)
                TH1 = (u8)(tmp >> 8); //定时器1计数器的 高8位
                TL1 = (u8) tmp; //        //定时器1计数器的 低8位
          //IPUART = 1; // 串口高优先级 使能
                //EA = 0; //使能总中断
                EUART = 0; //串口中断 使能               
          TI = 0;       
       
        for(Su16SendCnt=0;Su16SendCnt<43;Su16SendCnt++)
        {
                if(0==pu8String[Su16SendCnt])
                {
                        break;
                }
                else
                {
                        SBUF =pu8String[Su16SendCnt];
                        //for(Su16Delay=0;Su16Delay<800;Su16Delay++);//-REG52.H-延时
                        for(Su16Delay=0;Su16Delay<2400;Su16Delay++);//-sc92f8003.h-延时
                        TI = 0;
                }
        }
}
回复

使用道具 举报

地板
liyezhao2019 发表于 2020-9-9 11:00 | 只看该作者
有目录版的 在他群文件里
回复

使用道具 举报

5#
 楼主| 山水间 发表于 2020-9-11 16:23 | 只看该作者
yygdzjs 发表于 2020-9-9 10:49
讲的比较仔细,初学者有可能说教程单片机比较老了.我们学习的是思路.
国产的51单片机 增强型51比较多些.  ...

谢谢您的回复呢,真的觉得这本书很不错,一般的单片机书籍讲解的没有这么仔细,而且单片机部分也只涉及最基本的,这本书中单片机部分把项目中能用到的知识也做了深入讲解,真希望有更多的人能够看到
回复

使用道具 举报

6#
51heixc 发表于 2020-9-13 10:12 | 只看该作者
很好的学习资料,感谢作者
回复

使用道具 举报

7#
ziyueboy 发表于 2020-9-13 14:40 来自手机 | 只看该作者
中间水准的设计开发人员,看吴师傅的教程,也会有很多的启发,这本书不会教你太多如何写代码,而是教你单片机思路。是不可多得神作。我看了好多遍,每一次都有所启发,特别是在不注意的边边角角,总有些许收获。神作
回复

使用道具 举报

8#
7631001 发表于 2020-9-15 19:53 | 只看该作者
伟大的作者!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表