显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 
 

日历

 
 
模块内容加载中...
 
 
 
 
 

天气

 
 
模块内容加载中...
 
 
 
 
 
 
 

湖北省 武汉市 天秤座

 发消息  写留言

 
we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.
 
近期心愿make it happen, make it happy, make it harmony
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 
 
 
 

TLC5615测试电路

2017-7-27 9:19:07 阅读25 评论0 272017/07 July27

TLC5615 是TI公司的产品,是具有串行接口的DAC,其输出为电压型,而且最大输出电压是基准电压值的两倍,性能比早期电流型输出的 DAC 要好。只需要通过 3 根串行总线就可以完成 10 位数据的串行输入, 易于和SPI等接口连接。

接线原理图:

代码如下:

#include <reg51.h> #include <intrins.h> sbit CLK=P2^4; sbit CS=P2^5; sbit DIN=P2^6; sbit DOUT=P2^7;//though not in use void delay(unsigned int m) { unsigned char z; for(;m>0;m--) for(z=100;z>0;z--); } void Init_TLC5615() { CS=1; CLK=0; } void DAConversion_TLC5615(unsigned int dat) { unsigned char i; CS=0;//the first come out bit is MSB dat<<=2;//fill last 2 bits with 0 for(i=0;i<12;i++) { CLK=0; DIN=(dat&0x800)>>11; CLK=1;//raising edge

作者  | 2017-7-27 9:19:07 | 阅读(25) |评论(0) | 阅读全文>>

ADC0808仿真测试

2017-7-26 15:26:16 阅读22 评论0 262017/07 July26

用ADC0808做了一个数字显示的电压计,主要为了学习ADC0808/ADC0809的使用原理和方法。

接线见图(是不是很夸张,4个IO口都用了):

示波器是非必须的,主要是为了观察由中断调制出来的时钟脉冲,因为ADC0808需要外部脉冲,这里采用的是软件模拟的方式,通过计时器中断,用P3.3口输出。

关键的代码如下:

#include <reg51.h> #include <intrins.h> #include <stdio.h> #include "LCM1602.h" sbit OE=P3^0; sbit EOC=P3^1; sbit START=P3^2; sbit CLK=P3^3; sbit ALE=P1^0; sbit ADDA=P1^1; sbit ADDB=P1^2; sbit ADDC=P1^3; unsigned char buff[16]; void Init_ADC0808() { ALE=0; ADDA=0; ADDB=0; ADDC=0;//select analog channel ALE=1;//address lock enable START=1;//clear registers _nop_();_nop_();_nop_(); OE=0;//Do not allow output CLK=0; } void main() { float

作者  | 2017-7-26 15:26:16 | 阅读(22) |评论(0) | 阅读全文>>

A和ACC区别

2017-7-20 17:18:06 阅读32 评论0 202017/07 July20

我们在很多51单片机的教材和资料上,可以看到类似的描述:

与运算器相关的寄存器(3个):ACC、B和PSW。ACC是累加器是单片机中最繁忙的寄存器……,实际编程时,ACC用A表示。这个地方就很容易让人产生误解,以为A和ACC是一样的。例如,我们要把R7中的数据移动到累加器中,用语句:

MOV ACC,R7

或者

MOV A,R7

好像程序运行起来并没有什么差别。

然而实际情况并非如此,累加器写成A或ACC在51汇编语言指令中是有区别的。根本的原因是:ACC在汇编后的机器码必有一个字节的操作数,即累加器的字节地址E0H,A在汇编后则隐含在指令操作码中。所以在指令中A不能用ACC来替代,而对A的特殊功能寄存器直接寻址和累加器某一位的寻址要用ACC,而不能写成A。

例如,指令INC A对应记得机器码是04H,而写成INC ACC后则成了INC direct的格式,对应机器码为05E0H,其中E0就是累加器的地址。

又比如,指令XRL A,#data,对应的机器码是64(data)H,即XRL A,#4BH对应的机器码是两字节的644BH,而指令XRL ACC,#data,对应的机器码是63E0(data)H,即XRL ACC,#4BH对应的机器码是三字节的63E04BH,其中E0是ACC的地址,而4B则是直接数。

此外,用A和用ACC,导致很多时候周期数也不同,例如,INC A和INC ACC的虽然都是1,但是像XRL A,#data和XRL ACC,#dat

作者  | 2017-7-20 17:18:06 | 阅读(32) |评论(0) | 阅读全文>>

C51串口方式1发送

2017-7-17 10:56:48 阅读27 评论0 172017/07 July17

概述

串口在工作方式1时,是波特率可调的10位通用异步接口UART,一帧数据包含10位,即1位起始位(=0),8位数据位和1位停止位(=1)。其波特率取决于定时器1的溢出率以及PCON中波特率选择位SMOD。

波特率调制

定时器1作为波特率发生器时,通常工作在模式2下,即自动装载8位初始值的定时器。波特率计算方式如下:

波特率=fosc/12/(256-X)*2^SMOD/32

其中X就是定时器的初始值,SMOD位为0时,相当于波特率不加倍,SMOD=1,波特率加倍。

例如晶振频率是11.0592MHz,如果SMOD=0,则为了调出9600Bit/s的波特率:

11.0592*10^6/12/(256-X)/32=9600

计算得:X=253,转化为HEX是0xFD。其他波特率可采用类似方式计算。

发送

发送时,只要将数据写入SBUF,就会启动发送器发送,数据发送完毕之后硬件将中断标志TI置1,如果要进行下一次发送,必须将TI清零。另外, 在有串口中断响应函数时,可以采用软件将TI置1,主动创造一个中断(即使没有产生实质的数据传输)。

代码

#include <reg51.h> #include <intrins.h> unsigned char INFO[] = "The quick brown fox jumps over the lazy dog.";//串口输出数据 unsigned

作者  | 2017-7-17 10:56:48 | 阅读(27) |评论(0) | 阅读全文>>

C51计数器功能练习

2017-7-6 17:36:41 阅读34 评论0 62017/07 July6

任务要求是,每按三次按钮,翻转LED灯的状态。当然用一个全局变量来实现是很简单的,不过需要考虑消抖,而且还会占用CPU时间,这里用计时器/计数器方式实现,关于C51计时器/计时器的详细资料我就不介绍了,这里直接贴设计图和代码:

代码:

/* 定时器/计数器0 用作计数器,工作模式0 */ #include <reg51.h> //计数次数 int CNT=3; void main() { P2=0x01; P1=0xaa; EA=1;//全局中断允许 //计时器/计数器0 ET0=1;//中断0允许 //C/~T=1,作为计时器,外部脉冲接P3.4(负跳变+1) //M1M0=00,工作模式0 TMOD=0x04; //装入初值 TH0=(8192-CNT)/32; TL0=(8192-CNT)%32; //启动 TR0=1; while(1) { //此处处理正常例程 } } //计时器/计数器0中断处理 void INT_timer0() interrupt 1 { //立即处理 P2=~P2; P1=~P1; //再次装入初值 TH0=(8192-CNT)/32; TL0=(8192-CNT)%32; }

作者  | 2017-7-6 17:36:41 | 阅读(34) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017

注册 登录  
 加关注