1. 基于msp430单片机的ADC0809模数转换的c语言程序
今天看了一上午的ADC,原理好像理清楚了,但是一到编程的时候,犯蒙了....这是我写的程序,总感觉哪里不对劲,但又说不上来...拿出来,但愿能给你启示,也希望要是你想明白了,回头给我点提示,呵呵...先谢谢了。(我是研究MSP430的新手,希望多多向大家学习!)
#include <msp430x20x3.h>
void int_clk() //系统时钟初始化
{
unsigned int i;
BCSCTL1&=~XT2OFF; //打开XT振荡器
BCSCTL2|=SELM1+SELS;//MCLK 8M and SMCLK 1M
do
{
IFG1 &= ~OFIFG; //清除振荡错误标志
for(i = 0; i < 100; i++)
_NOP(); //延时等待
}
while ((IFG1 & OFIFG) != 0); //如果标志为1继续循环等待
IFG1&=~OFIFG;
}
void delay(unsigned int itimelenFirst,unsigned int itimelenSecond) //延时程序
{
unsigned int i,j;
for(i=0;i<itimelenFirst;i++)
{
for(j=0;j<itimelenSecond;j++);
}
}
void main()
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |=0xfd;
//初始化adc
P1OUT &=~ 0x01; //START 复位
P1OUT &=~ 0x04; //0E 复位
P1OUT &=~ 0x08; //CLOCK 复位
P1OUT &=~ 0x10; //ALE 复位,关闭地址选择
while(1)
{
P1OUT |= 0x01; //START 上升沿
P1OUT |= 0x10; //打开地址选择
delay(10,1000); //延时以清空逐次逼近寄存器SAR,并将转换结束信号EOC变为低电平
P1OUT &=~ 0x01; //START 下降沿,启动ADC开始转换
P1OUT &=~ 0x10; //关闭地址选择
for(int i=0;i<8;i++) //P1.3为ADC提供CLOCK脉冲信号
{
delay(60;1000);
P1OUT ^= 0x08;
}
do
{
P1OUT &=~ 0x04;
}
while((P1IN &0x02)==0) //判断转换是否结束
//转换结束后
P1OUT |= 0x04; //转换所得数据出现在输出端
}
}
2. 求大神把下面ADC0808A/D模数转换汇编改成C语言
首先你没有给电路连接图,仅凭汇编中的地址很难想象,下面只有使用伪代码表示,控制接口自行定义了。假设可以位寻址。
int seg_table[]={0x3F,0x06,...};//数码管的表
GPIO(start) = 0;//启动,低电平有效
while(!EOC);//等待转换完成
LED = DATA;//读入数据,LED显示
int temp = DATA;
delay_ms();
int i =0;
while(temp)
{
an = temp&0x0f;
temp >>= 4;
GPIO(an) = 0;
GPIO(an) = seg_table[an];
GPIO(an) = 0;
wei = i++;
GPIO(wei) = 0;
GPIO(wei) = wei;
delay_ms();
}
对于串行发送很简单,
for(i= 0;i<8;i++)
{
GPIO_BITx = DATA&0x01;
ATA >>= 1;
}
3. C语言中的数学符号如何表示(大全)
abs(计算整型数的绝对值)
相关函数 labs, fabs
表头文件 #include<stdlib.h>
定义函数 int abs (int j)
函数说明 abs()用来计算参数j的绝对值,然后将结果返回。
返回值 返回参数j的绝对值结果。
范例 #ingclude <stdlib.h>
main(){
int ansert;
answer = abs(-12);
printf("|-12| = %d\n", answer);
}
执行 |-12| = 12
/*---------------------------------*/
exp(计算指数)
相关函数 log,log10,pow
表头文件 #include<math.h>
定义函数 double exp(double x);
函数说明 exp()用来计算以e为底的x次方值,即ex值,然后将结果返回。
返回值 返回e的x次方计算结果。
附加说明 使用GCC编译时请加入-lm。
范例 #include<math.h>
main()
{
double answer;
answer = exp (10);
printf("e^10 =%f\n", answer);
}
执行 e^10 = 22026.465795
/*-----------------------------------*/
sqrt(计算平方根值)
相关函数 hypotq
表头文件 #include<math.h>
定义函数 double sqrt(double x);
函数说明 sqrt()用来计算参数x的平方根,然后将结果返回。参数x必须为正数。
返回值 返回参数x的平方根值。
错误代码 EDOM 参数x为负数。
附加说明 使用GCC编译时请加入-lm。
范例 /* 计算200的平方根值*/
#include<math.h>
main()
{
double root;
root = sqrt (200);
printf("answer is %f\n",root);
}
执行 answer is 14.142136
/*--------------------------------*/
fabs(计算浮点型数的绝对值)
相关函数:abs
表头文件:#include<math.h>
定义函数:double fabs(double x);
函数说明:fabs()用来计算浮点型数x的绝对值,然后将结果返回。
返回值:返回参数x的绝对值计算结果
#include <math.h>
main()
{
double answer;
answer=fabs(-3.141592);
printf("|-3.141592|=%f\n",answer);
}
执行结果
|-3.141592|=3.141592
4. C++中的模数是什么意思 啊
相似的很多,相同很少,c++兼容c,但是加入很多面向对象的功能
5. 51单片机c语言,ADC模数转换的问题
对于这个,要这么看:
假设中断A是优先级高的中断,中断B是优先级低的中断
如果在正常执行的过程中,发生中断A,那么,中断A执行完成后,会返回正常程序;
如果在正常执行过程中,发生中断B,又在中断B处理过程中发生中断A,那么,中断A执行完成后,一定要返回的是中断B,这是由硬件决定的,不是软件决定的,所以,软件没有任何指令可以让中断A执行完成后直接跳过还没有执行完的中断B而直接回到主程序,因为这是硬件决定的,软件做不到,即便你在高级中断A中关闭了中断B,但是因为你原来的中断B还没有执行完,所以,仍然要把没执行完的部分执行下去,才能返回到正常程序.
对于ARM系列的可以,对于51来说,是不行的,因为51软件指令不允许修改PC寄存器的值
6. c语言中1%2等于多少
首先我们要理解的是%在c语言中是什么运算。在c语言中,%指的是取余数。
有了以上知识作为铺垫,我们来看一下1%2结果到底是什么。
1除以2,商是0,余数是1,所以1%2的结果是1。
拓展资料:
关于“/”的“%”的总结
除法运算符“/”。二元运算符,具有左结合性。参与运算的量均为整型时,结果为整型,舍去小数。如果运算量中有一个为实型,结果为双精度实型。
求余运算符“%”,二元运算符,具有左结合性。参与运算的量均为整型。
求余运算的结果等于两个数相除后的余数。
“%”取模运算符还有一些小的应用,例如:
①当你想要通过rand()获得随机数时,rand()%100;产生0-99的随机数。
假如要产生16-59之间的数,可以这样写:rand()%44+16(这里44由59-16+1得到)。
rand()%44 即可获得0-43的随机数,再加上16即可得到16-59的随机数了;
②除了第一点以外,“%”运算还通常用于N进制的转换。例如:
如果是二进制转换,那么就可以通过/与%的结合使用则可以得到转换之后的二进制数了(其实就是短除法)
当原数被除至剩余0时,它的上一次模数就是最高位进制数。
30(10)->11110(2)/与%的结合使用通常都可用于获得最低位数又或者获得所需的某位数。例如:
“/”通常可以去掉尾数,而“%”通常都用于获得尾数。
7. C语言康辉老师模的问题
“模”是“Mod”的音译,模运算多应用于程序编写中。 Mod的含义为求余。
这个数是16位0的补码
2的8次方=256是在八位时的情况
望采纳
另外你的问题描述很乱啊
8. 为什么用c语言求余求模来把两位数分离,和赋定时初值
求余和求模操作,在C语言中实际上是同一个操作,即模除运算,符号为%.
a%b其含义为:求a除以b所得余数。
在C语言中,可以使用整型模除和除法配合,来获取两位数的个位和十位。
其原理为如下。
对于两位数x,如果其个位数为b,十位数为a,(0<=a,b<=9)写成ab的形式,其真值为10a+b。
于是求x的个位数的表达式可以写成x%10,是因为
x%10 = (10a+b)%10=10a%10+b%10=0+b=b
这里用到了模除相关知识。
对于10a,一定是a的倍数,所以,10a对10取余一定为0。
而b为0到9的数字,比10小,对10取余时值为本身。
x/10 = (10a+b)/10 = 10a/10 +b/10=a+0 = a
这里用到的是整型除法的知识。
10a/10=a和b/10=0
其中,b<10,对于整型,除法结果只取整数部分,于是b/10=0.
通过以上推理,可以得到,对于10进制二进制数x,x/10为十位数,而x%10为个位数。
至于提问中的赋定时初值,这个没有要求一定用模除或除法。但有时会要求分段做初始化。比较常见的有两种。
1 系统为提高效率,或其他的原因,对定时器接口做了分别的封装,而使其适用于不同量级的定时。比如分别封装为毫秒级别的和秒级别的。
这样对于一个超过一秒且带有毫秒数的定时,就需要分化为秒级和毫秒级两部分。比如2500毫秒,就需要分化成2秒+500毫秒的形式。
基于两位数取各个位的同样原理,对于时间x,可以得到计算秒的表达式为x/1000, 同时计算毫秒的表达式为x%1000。
2 系统对定时器的设置为寄存器形式,分为高位和低位。
以双字节16位寄存器为例,对于时间x,可以写成高位为x/256,和低位为x%256的格式。
事实上,这种写法是低效的,C语言提供的更高效的位操作同样可以实现该目的,即
低位为x&0xFF, 高位为((unsigned short)x>>8)&0xFF。由于本项操作与提问关系不大,所以不对其原理进行介绍了。
9. C语言中的模数
1、你把原题贴一下会说的更清楚些;
2、原问题中“商和模数”是一起说的,“商”应该是整除的得数,模数就是整除的余数;
10. C语言模数1e9 + 7是什么意思
1e9 是科学计数法
表示1乘10的9次幂
然后再加7
表示浮点数
1000000007