- 博客(32)
- 收藏
- 关注
原创 STC12C5A60S2单片机输出pwm的方法
所谓的pwm输出就是让单片机在某个管脚上按照时间输出特定频率和占空比的矩形方波。这里面有两个参数,一是频率,二是占空比。若CCAP0L的值为0,则计数器从0开始就让输出脚输出高电平,此时的占空比为100%。//空闲时不计数,不产生中断,时钟源为定时器0的溢出。让定时器0按照需要的频率的256倍频率溢出。例如需要1000赫兹的频率,让计数器溢出频率为256K。CL从FF溢出到00的时候 CCAP0H的值自动装载到CCAP0L可以实现无干扰的调整占空比。最具有实用性的是010,定时器0的溢出脉冲。
2024-07-30 09:36:02 383
原创 small RTOS逐步分析(1)
small rtos 是陈明计先生根据51机器的特点,专门写的少内存专用rtos。用来保证移植性,当然作者是为了适应大部分使用者来写的,每个人可以根据自己实际的的编译器重新定义。不同的cpu,宏和常量有可能不同,在做系统移植的时候要调整这个文件内容。首先,作者推荐了一种编程技巧,那就是专门写一个点H文件,把需要包含的内容和定义的内容都放在这个头文件里。
2023-12-22 18:13:12 665
原创 一步一步写51操作系统(一)
我对操作系统的任务调度很感兴趣,特别好奇几个死循环是怎么切换的,虽然操作系统原理的书上讲的很多通过定时器中断,把时间切成时间片,每个任务执行一段时间片后,切换到下一个任务;仔细研究就会发现,每次调动子程序块的时候,硬件自动把将来要执行的下一条命令的地址存入堆栈,PC是16位内推,堆栈是8位,每个PC地址占用堆栈的两位字节,SP 内容指向了高字节。这是先申请俩字节,每个任务对应一个字节,用来存放SP的值,等到切换命令到来时候,用来寻找各自的任务栈中存放的PC值的。把任务1的函数地址存到了自己单独的堆栈空间。
2023-12-21 15:26:33 626
原创 *p++和*(p++)以及(*p)++的区别
P++,因为*和++的优先级一样,结合方式都是自右向左,先执行P++使P指向下一个地址,然后再执行*操作,即取P已经增加了1后,指向的地址的数值。(*P)++,指的是先取p指向的地址的变量的数值,然后数组再自增1。一般是定义一个变量,把取的值增一后存入变量中。即,先取arr[0]的值,然后又增1,把此值给a;p此时仍然指向arr[0];程序先把arr数组的首地址给了p;然后执行p++操作,此时p指向了arr[1];(或者:p=arr[0])*(P++)和*P++一样的功能。
2023-05-21 07:50:33 938
原创 c语言随机数的产生方法
但是虽然每次调用rand(),函数时值不一样,他们是一个系列,可是下一次运行程序时候,出来的随机数还是这个序列。这是因为rand()函数要产生一个随机数必须依靠一个种子数,如果没有约定,种子数就是1;写程序时候有时候需要产生一个随机数,c语言有内建的随机数产生函数rand();这样种子数就是随时间变化的数,rand()函数随机出来的数就不是固定的序列了。这时,a变量内存的是0到32767(32位操作系统)之间的一个随机数。这样每次程序运行产生的第一个随机数都一样,第二个也一样以后都一样。
2022-12-02 18:53:23 1291
原创 C语言循环语句之do---while循环的条件问题
do while语句是一种出口条件循环,即在执行完循环体后,才根据测试条件决定是否再次执行循环。因此,该循环至少必须执行一次。意思就好像是标准的英国人说英语的语法,你要一直做什么直到什么;所以do--while循环也叫做。do while 语句创建一个循环,在(’之前,重复执行statement部分。你要不停的做,直到某个条件成立;通俗点说就是只要条件不为真就重复循环。循环体可是一条简单语句或复合语句。,重复执行循环体中的内容。在expression为。
2022-12-02 18:21:32 2014
原创 modbus通讯主机发送命令校验方法
modbus是工业自动化领域常用的通讯协议,主机在从机发送命令的过程中,为了纠错,常常用crc校验。本文就主机部分展开;在MFC方法下可以这样实现;
2022-09-04 20:04:37 1154
原创 c++中的变量和引用
写程序的时候如果把内存地址号拿来直接处理会引起很多麻烦,程序员要反复查找地址,所以引入了符号代替地址这个方法,这个代替地址的符号就是变量;大部分教科书说这是给变量名起了一个别名...
2022-07-23 09:21:34 314
原创 随机数的产生方法
1)如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个新值,这个值必须在每次程序运行时都不一样(比如从1970年到目前为止流逝的时间)。但是,如果下次调用rand()函数之前不改变x的值产生的依然是一系列的伪随机数,尤其在循环的时候;为了解决这个问题,在每次调用rand()之前先调用一次srand(intx)函数,这样rand()产生的随机数在x和32767之间;产生11到15之间的随机数,含11,含15,用rand_num%5+11就行,以此类推;.....
2022-07-20 22:34:16 907
原创 C++拷贝构造函数
(“拷贝构造函数”)是一种特殊的构造函数。“拷贝构造函数”是一种名称;它有以下特点;1、函数的名称必须和类名称一致。2、它有唯一的一个参数,该参数是const类型,不可变的。例如:类Cstudent的"拷贝构造函数"的形式为Cstudent(const Cstudent &x)。这个x是个任意符号,尊守变量命名原则;下面用例子说明;......
2022-07-13 13:03:41 288
原创 c++中this指针的作用
this 指针是一个隐含指针。它指向正在调用成员函数的那个对象实例。其中有一个成员函数 int get_age;取得年龄的数值;在主程序中调用成员函数:第6行 age = dog1.get_age();调用成员函数int get_age(),此时内部隐含的this指针指向了dog1这个实例; 其实在程序的第3行,用类名Cdog定义实例dog1和dog2的时候,编译器已经给实例dog1分配了内存,这个内存的首地址,编译器是知道的;在第6行age = do............
2022-07-11 08:03:32 1219
原创 宽字符在程序中的使用
在TCHAR.H里,有这么小段define.#ifdef _UNICODE #define _tWinMain wWinMain #else #define _tWinMain WinMain #endif由于为了支持UNICODE,C运行库对WinMain其实区分了UNICODE版和ANSI版.对UNICODE版的程序,C运行库将调用wWinMain,而对于ANSI版的应用,则调用WinMain.这是第一点. 第二点:MFC的代码设计时是自动支持UNICODE的,所以,MFC的WinMa
2022-07-09 18:44:19 118
原创 c++语言多文件编程的方法;
为了编写大型程序方便管理,把不同的函数写到不同的文件内不失是一种好方法,那么文件a内的函数,如何调用文件b内的函数呢?下面用例子说明;第一步,编写被调用的函数文件,当然每个文件都可以是被调用文件,这里以不含主函数的文件为被调用文件;文件名add.cpp; 第二步,编写与被调用文件同名的头文件add.h第三步,编写调用文件,本文件可以是包含主函数的文件也可以是其他的文件,c++里面的函数都是平等的,本文件havemain.cpp;调用文件要包含被调用文件的头文件;用哪个变量就用extern关
2022-07-09 18:41:57 2792 3
原创 winc++由系统提供的窗口类
由系统提供的窗口类 弹出式菜单窗口 桌面窗口 对话框 MDI子窗口区域 BUTTON 按钮控件窗口 SCROLLBAR 滚动条控件窗口 STATIC 静态控件窗口 COMBOBOX 组合框控件窗口 EDIT 编辑控件窗口 ComboLBox 列表框控件窗口 RICHEDIT 多信息编辑控件窗口 SysTabControl3
2022-07-07 07:11:37 313
原创 2021-04-17
单片机程序设计中要经常的在数制之间进行转换,以51为例介绍16进指数转化为bcd码的方法准备一个char数组用来存放转换后的结果;例如数组低位存高位,高位存低位;
2022-07-06 09:21:11 106
原创 WNDCLASS(WNDCLASSEX)结构介绍
WNDCLASS结构包含了窗口类的属性。 这个结构在使用RegisterClassEx函数注册窗口类时被WNDCLASSEX结构所取代。如果不需为窗口类设置小图标时,仍然可以使用WNDCLASS和RegisterClass。 typedef struct { UINT style; WNDPROC lpfnWndProc;
2022-07-06 09:19:40 2380
原创 数据结构LVCOLUMN和LVITEM
VC++列表视图控件有两个重要的数据结构LVCOLUMN和LVITEM。LVCOLUMN用于定义报表方式下的“列”的结构;LVITEM用于定义行或者叫做“项”的结构。这两个结构的定义及说明如下:typedef struct _LVCOLUMN {UINT mask; //说明此结构中哪些成员是有效的int fmt; //列的对齐方式int cx;
2022-07-05 21:21:59 661
原创 我是如何成为富翁的3
2020年6月份左右,发现一款自动化设备。我似乎能做,经过调研,开始设计。机械,结构,电器,电子。设备,一个人搞。直到现在。还没有上市,搞了一年了。哈哈。之前发的几个技术文章都是我设计过程中的一些事情。线路板用力创eda。设计了两轮了。我自己感觉快成了。...
2022-01-16 09:42:33 129 1
原创 我是如何成为富翁的2
其实在1993年,我跑出来了一年左右,设计了一款所谓的治疗眼睛的仪器。在浙江慈溪横河镇开模。后来那个公司赚了很多钱。由于考虑到要评职称就又回到了国企。1996年到2004年间在市场上闯荡,赚钱并不多,2004年后半年,接了个给油库做发油机的活。工控机做主机,单片机做下位机。这次是我真正下了力气写程序的时候。整整45天,用汇编写了12K。单片机用了两个,互相通讯,互为唤醒者。一块跑主程序,一块跑键盘、液晶显示。经过后来使用效果良好。自此深入地理解了单片机和外围。时间到了2005年,因为自己没啥起色,又打算
2022-01-16 09:33:04 129 1
原创 我是如何成为富翁的
在我想要学习写程序之前,是个电子爱好者,经常鼓捣点电子玩意,小时候的收音机一类。到了1990年大学毕业,分配到了电视机厂做电视机结构设计工作,在这里我如鱼得水地学习了电视机的全部知识,捎带着学习了录像机VCD机等知识。到了工作到5-6个年头的时候,电视机技术炉火纯青了。比如修理电视机啥的,基本上看看状况就直接动手换件。万用表都少用。后来不甘心国营工厂的低效率,屡屡有创业的冲动。在此期间精通了塑料制品设计,常用的塑料特性了如指掌。精通了小冲压产品设计。当时都是爬图板画米格纸,然后描图员描成硫酸纸,然后晒图。当
2022-01-15 15:34:12 162
原创 KS0108控制的12864液晶屏的反白显示办法
看了许多网上文章,没有清楚介绍12864液晶反白显示的。不才拙见呈给众码友以博一洒;反白常用的手法是读出液晶屏内存储器的相应数据,然后按位取反,再写入液晶相应内存;12864读取液晶内存的手法比较特别,直接按照时序图写数据不行,它要求使能信号至少完成两次反转才行。首先命令给予地址,使能信号给予低电平,延时半个周期约200ns然后,rs,rw,置位。再延时200ns;使能信号置位;至此完成一次虚读,不把总线数据读入变量;再延时450ns,使能变低;再延时450ns;使能变高
2022-01-15 10:04:41 1628 1
原创 CRC-16 / MODBUS 校验计算方法二
单片机在传输modbus数据的时候需要进行crc校验,本文介绍另一种校验方法;第一步 设置一个16位寄存器,例如为:jicun ;寄存器初始值为 0xFFFF。第二步CRC-16 / MODBUS的多项式为0xA001。第三步 开始计算,把需要校验的字节与寄存器的低位相异或,结果仍存在寄存器; 例如: jicun = zijie1^ jicun第四步:难点来了,注意此步分两种情况, A:判断寄存器的最低比特位,如果为1......
2021-04-30 06:55:52 3398 6
原创 51单片机const unsigned char number[16]是啥意思
单片机程序中const unsigned char number[16]= 这句话的具体含义是什么单片机程序中constunsignedcharnumber[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};这句话的具体含义是什么这句话的具体含义是 const是指定义的变量不能被改动,(它是constant的缩写),整句话的意思是定义了一个不可变的无符号字符型数组,数组占6个c
2021-04-18 06:17:07 1807
原创 16进制数转化为bcd码的方法
单片机设计中经常进行数制之间的转换,int类型数据可以存放65535以下的数。转化为bcd码用以下方法;unsigned int hexresult; //待转化的16进制数;unsigned char bcdresult[5]; //转化后的bcd码存入数组;void hex2bcd() { bcdresult[0]=hexresult%10;//个位 bcdresult[0]=(hexresult/10)%10;//十位 bcdresult[0]=(hexresult/10
2021-04-17 16:04:03 9019 2
原创 VB中CharUpperBuff()的用法
在VB中经常用到字母的大小写转换,CharUpperBuff()是把小写字母转化为大写字母的api 函数,使用前需要声明;Private Declare Function CharUpperBuff Lib "user32" Alias "CharUpperBuffA" (ByVal lpsz As String, ByVal cchLength As Long) As Long其中的参数lpsz...
2018-04-20 12:24:51 819
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人