SM2:多机通信控制位
REN:串行口接收使能控制端;REN=1时,允许接收,REN=0时,禁止接收 TB8:发送接收数据位8 RB8:接收数据位8
TI:发送中断标志位;TI=1表示帧发送结束,TI可由软件置0 RI:接收中断标志位;RI=1表示帧接收完成,RI可由软件置0
7.4. 在方式1和方式3的通信模式下,波特率通过那个定时器驱动产生?采用何种定时方式?如果要求采用晶振为11.0592MHz,产生的传送波特率为2400b/s,应该怎样对定时器初始化操作?
答:由定时器1驱动产生,采用定时器1的工作方式2,自动从装初值 当晶振为11.0592MHz,波特率为2400b/s,由波特率公式: 波特率=
(2SMOD/32)?fOSC/(12?(256?a))
a?256?11.0592?106/(384?2400)
可求得初值a为F4H 初始化操作: TMOD=0x20; TL1=0xF4; TH1=0xF4; PCON=0x00; SCON=0x00; TR1=1;
8.3 在由单片机80C51和一片ADC0809组成的数据采集系统中,假设ADC0809的地址为0x7ff8~0x7fff,画出接口电路图,并编写每隔1ms轮流采集一次8个通道数据的程序。采样100次取平均值。 答:电路图书上实例有,做了如下改动
1.控制端ADDA,ADDB,ADDC分别接P2^0,P2^!,P2^2.
2.删去了译码器与逻辑器件器件,74LS373,74HC14,74HC02, 3.中断检测端EOC接P3^2。
参考程序如下,自己写的没经过仿真, #include
#define uchar unsigned char//宏定义 #define uint unsigned int
#define AD_0 XBYTE[0xff8]//定义通道访问地址 #define AD_1 XBYTE[0xff9] #define AD_2 XBYTE[0xffa] #define AD_3 XBYTE[0xffb] #define AD_4 XBYTE[0xffc] #define AD_5 XBYTE[0xffd]
29
#define AD_6 XBYTE[0xffe] #define AD_7 XBYTE[0xfff]
sbit busy=P3^2;//定义中断请求端 uchar count=0;//定义采样次数
uchar datcode[100]={0};//定义数据存放数组 int dat=0,dat1=0;//定义临时数据与最终平均数据 uchar i,j,num;//定义变量 void main() {
TMOD=0x01;//定时器0 工作方式1
TL0=(65536-1000)/256;//1ms中断一次 TH0=(65536-1000)%6;
EA=1;//开总中断,定时器中断,打开定时器0 ET0=1; TR0=1;
while(count<100)//100次数据求和函数 {
dat1=dat1+datcode[i]; count++; }
dat=dat1/100; if(count>=100) count=0; }
void timer0() interrupt 1//中断函数 {
TMOD=0x01;
TL0=(65536-1000)/256; TH0=(65536-1000)%6;
AD_0=0;//启动0通道AD转换 while(busy==1) {
num=AD_0+1;//把0通道数据附给num,并指向AD_1通道查询 datcode[i+1]=num; j++;
if(j==7)//八次查询完毕退出循环 {
busy=0; j=0; } } }
30