EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2006/12/5 12:09:49

2

关于投票

单片机开发程序大全

我这里有单片机试验,带原理图,带C语言,汇编语言的(这里只是很少一部分,如果想要全的,请吧PID控制算法的C语言程序发给我,我会把余下的文件发给你,谢谢)rar  发到这个邮箱:jianmin5xin@163.com

系统分类: 单片机  |  用户分类: 以前的  |  标签: 单片机 开发 C语言 汇编 合集  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1975) | 回复(17)

发表于 2006/11/16 14:00:31

2

关于投票

一个关于单片机库函数编写的问题(原创)

 当你调用一些函数时,为了避免反复复制和粘贴(在这个过程中经常还会导致拷贝错误,并且难以发现错误所在)的问题,我们最好是将经常用的一些函数或者协议编写成库函数,然后在主函数声明一下,就可以随便提取运用了。

  但是,当你用的时候,却频频提示错误,为什么?
 首先,你的库函数中肯定要用一些其他的库函数,然后在主程序中,你又调用了这些库函数。KEIL 51编辑器,只允许调用一次库函数,这样你当然会遇到提示错误
  另外,我们知道库函数的一些参数对于我们能够灵活运用单片机开发,具有很深远的意义。
比如,我们可能会在打开的库函数文件里看到如下的定义
   RSM  0x0014;
它的意思是,RSM它的操作地址是0014,当我们用C语言编程时,不用去知道RSM这个引脚或者寄存器的地址0014,只需对RSM就可以直接操作了。
(说明,上面的例子,原理的确是这样的,不过具体上的操作是有错误的
现看这个例子:如果有一款新的单片机,除了指令内核于51兼容外,多了T3MOD,T3CON,T3L和T3H四个寄存器空间来控制T3,其地址分别是0xC0,0xC1,0xC2和0xC3。如果厂商不提供起存起定义头文件,改写REG52.H使之能用于该单片机
  我们可以这么写
 sfr T3MOD="0xc0";
 sfr T3CON="0xc1";
 sfr T3H="0xc3";
 sfr T3L="0xc2";
 从上面的定义方法来说,我们最上面的定义方法是错了
应该改为:sfr RSM="0x0014";
     )
   理解这个原理,我们可以自己动手将库函数升级,用于不同型号单片机的开发。

系统分类: 单片机  |  用户分类: 以前的  |  标签: 库函数  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1195) | 回复(1)

发表于 2006/11/16 13:55:32

2

关于投票

关于一个提高效的执行代码(原创)

这么一个问题,假设有两个寄存器m和n(有可能地址不相邻),分别存放着一个16位数值的,高八位和低八位的数值。那么让你将这个十六位数值打印出来,该如何操作?
我们通常的做法是:
  int a;
  a="m";
  a+=n*256;
大家可以汇编运行一下,他的汇编结果大概在20行左右。不过这个是个通用做法,简单,然而代价是低效。
如果地址是相邻的,那么我们可以这么写:
  float a;
  a="m";
这个汇编结果是3行,它是巧妙的运用了float数据类型的16位的特点,给它高八位便能将相邻的余下八位自动导出。注意,M必须存放的是高八位,N必须存发的是低八位,如果反过来,结果是错误的。这个程序的特点是,高效快速,但是有限制,“地址相邻"。
那么有没有一个即高效又通用的程序呢?
答案是肯定的。笔者刚刚试验了一下,效果特别显著
这个程序利用了共用体和结构体的结合
#define  unsigned int unit
union a
{
 uint t;
 struct b
   {
     unit m;
     uint n;
      }str;
  }uni;
main()
{
 uni.str.m="2";
 uni.str.n="3";
 printf{"the code is%d",uni.t};
  }
大家可以用一下,当然还会有很多的问题,也许我没意识到,希望大家能进来探讨

系统分类: 单片机  |  用户分类: 以前的  |  标签: 寄存器 库函数  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(968) | 回复(1)

发表于 2006/11/16 13:39:54

2

关于投票

结构化编程--指向函数的指针(初稿)

1.对一个DA转换器进行传递数值,DA转换的地址在0x2000,如果用MOVX对其操作,如何操作?
  用MOVX操作的话,将数据类型定义为xdata,然后_at_即可
方法有三种:
(1)  
void DAchange(unsigned char i)
     {
   xdata m_at_0x2000;
     m="i";
        }
(2)
include "absacc.h"
void DAchange(unsigned char i)
{
 XBYTE[0x2000]=i;
   }
(3)
void DAchange(unsigned char i)
{
 xdata unsigned char *p;
 p=(xdata unsigned char *)0x2000;
 *p="i";
   }
 
2.利用指向函数的指针,可以进行结构化编程。
int max(int a,int b)
{
    return(a>=b?a:b);
     }
int min(int c,int d)
{
   return(a>=b?b:a);
    }
int process(int m,int n,int(*f)())
{
  return (f(m,n));
  }
main()
{
int max(int a,int b);
int min(int c,int d);
process(int a,int b,(*)f());
int a,b,j,k;
scanf("put:%d,%d",&a,&b);
j="process"(a,b,max());
k="process"(a,b,min());
printf("%d,%d",j,k);
   }
注意:这个程序只是我自己敲的,还没进行验证。

系统分类: 单片机  |  用户分类: 以前的  |  标签: 指针 指向函数的  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1076) | 回复(2)

Total , Page /