器,此时TL1作计数用,自动重装载的值在TH1内。设计数的预置值(初始值)为X,那么每过256-X个机器周期,定时器溢出一次。为了避免溢出而产生不必要的中断,此时应禁止T1中断。
7.4 答:
参考程序如下: #include
#define uchar unsigned char code uchar
tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7D,0x07,0x7f,0x6f};
uchar send[]={0x04,0x03,0x02,0x01,0x08,0x07,0x06,0x05}; int i,t;
//延时函数,当t取值12000时,若晶振fosc=12MHz,大约延时1s void delay(t) {for(i=0;i main() { unsigned char i,j,k,m; SCON=0x00; //串行口工作方式 while(1) { for(i=0;i<6;i++) {SBUF=(tab[send[i]]); // 发送第i个数据 while(TI==0); // 等待发送是否完成 TI=0; // TI清0 } delay(12000) ; for(m=6;m<12;m++) {SBUF=(tab[send[m]]); // 发送第i个数据 while(TI==0); // 等待发送是否完成 TI=0; // TI清0 } delay(12000) ; } } 7.5 答: 参考程序如下: 甲机发送 发送子程序参考如下: #include #include #define uchar unsigned char uchar FREQ; void main(void) { // 以下是设置中断和定时器 EA=1; PT0=1; ET0=1; TCON=0x08; TMOD=0x21; /*定时器计数变量*/ // 定时器0为产生10ms的中断,定时器1为9600bit/s 的波特率发生器 TH0=-10000/256; TL0=-10000%6; TL1=0xfd; TH1=0xfd; SCON=0xd8; PCON=0x00; TR1=1; // 开定时器 //串行口方式3发送 TR0=1; TI=1; while(1){} } // 定时器0的中断服务程序,向串口发送“A”数据 void intsvr1(void) interrupt 1 { // 重新装入定时器0的初值; TH0=-10000/256; TL0=-10000%6; FREQ=FREQ+1; if (FREQ==100) { FREQ=0; printf(\ } } // 发送字符 // 定时器T0的低四位赋值 // 1秒判断 乙机接收子程序参考如下: #include #define uchar unsigned char void main(void) { uchar astring; //在11.059MHz晶振下,设置串行口波特率为9600bit/s,用串行口方式3接收 TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; SCON=0xdb; PCON=0x00; while(1) { while(RI==0); RI=0; astring=SBUF; lcd_display(); //液晶显示参考前面章节程序 } } 7.6 答: 参考程序如下: #include #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3; bit read_flag= 0 ; //串行口初始化函数:init_serialcomm //函数功能:串行口初始化,设置波特率为4800bit/s,允许串口中断 //形式参数:无 //返回值:无 void init_serialcomm( void ) { SCON = 0x50 ; //SCON: 串行口方式1,允许接收 TMOD |= 0x20 ; //设置定时器1为方式2定时 PCON |= 0x80 ; //SMOD=1; TH1 = 0xf4 ; // 波特率4800bit/s, fosc=11.0592MHz TL1 = 0xf4 ; IE = 0x90 ; //开串口中断 TR1 = 1 ; // 启动定时器1 } //发送字符函数:send_char_com //函数功能:向串口发送一个字符 //形式参数:存放字符的变量ch, unsigned char类型 //返回值:无 void send_char_com( unsigned char ch) { SBUF=ch; while (TI== 0 ); TI= 0 ; } //发送字符串函数:send_string_com //函数功能:向串口发送一个字符串,strlen为该字符串长度 //形式参数:字符串变量*str, unsigned char 类型; 字符串长度strlen, unsigned int //类型 //返回值: 无 void send_string_com( unsigned char *str, unsigned int strlen) { unsigned int k= 0 ; do { send_char_com(*(str + k)); k++; } while (k < strlen); } //串口接收中断函数 void serial () interrupt 4 using 3 { if (RI) { unsigned char ch; RI = 0 ; ch=SBUF; if (ch> 127 ) { count3= 0 ; inbuf1[count3]=ch; checksum= ch- 128 ; } else { count3++; inbuf1[count3]=ch; checksum ^= ch; if ( (count3==(INBUF_LEN- 1 )) && (!checksum) ) //最后一个字节是否为前 几个字节//后7位的异或校验和 { read_flag= 1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错, //就置位取数标志 } } } } void main() { init_serialcomm(); while ( 1 ) { //初始化串口 //主函数
相关推荐: