单片机定时器与串口通信

文章详细介绍了如何使用C语言和51单片机的T1定时器控制1kHz音频信号,以及实现LED数码管秒表计时和LCD时钟显示功能。还涉及了串口通信的原理和应用。作者反思了在单片机编程中的经验与挑战。
摘要由CSDN通过智能技术生成

利用T1控制发出1kHz的音频信号

利用T1的中断控制P1.7引脚输出频率为1kHz方波音频信号,驱动蜂鸣器发声。系统时钟为12MHz。方波音频信号周期1ms,因此T1的定时中断时间为0.5 ms,进入中断服务程序后,对P1.7求反。

先计算T1初值,系统时钟为12MHz,则机器周期为1µs。1kHz音频信号周期为1ms,要定时计数的脉冲数为a。则T1初值:

      TH1=(65 536 −a) /256;	
      TL1=(65 536 −a) %256
proteus仿真

在这里插入图片描述

c语言代码
#include<reg51.h>  			//?????
sbit sound=P1^7;  			//?sound????P1.7?
#define f1(a) (65536-a)/256		//????????8?????
#define f2(a) (65536-a)%256    		//????????8?????
unsigned int i=500; 
unsigned int j=0; 
void main(void)
{
	 	EA=1;                  		
  		ET1=1;                		     
   		TMOD=0x10; 		
        TH1=f1(i);   
   		TL1=f2(i);      			
   		TR1=1;                 		
   		while(1)
		{              				
     	i=460; 
      	while(j<2000);
      	j=0;
      	i=360; 
      	while(j<2000);
      	j=0;
    }
 }

void T1_(void) interrupt 3 using 0	
{
    	TR1= 0;                 	
   	sound=~sound; 			
    	TH1=f1(i);   			
    	TL1=f2(i);   		
			j++;				
    	TR1=1;                 	
}

51单片机实验结果在这里插入图片描述

LED数码管秒表的制作

用2位数码管显示计时时间,最小计时单位为“百毫秒”,计时范围0.1~9.9s。当第1次按一下计时功能键时,秒表开始计时并显示;第2次按一下计时功能键时,停止计时,将计时的时间值送到数码管显示;如果计时到9.9s,将重新开始从0计时;第3次按一下计时功能键,秒表清0。再次按一下计时功能键,则重复上述计时过程。
本秒表应用定时器模式,计时范围0.1~9.9s。此外还涉及如何编写控制LED数码管显示的程序。

protues仿真

在这里插入图片描述
在这里插入图片描述

c语言代码


#include<reg51.h>


unsigned char code discode1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsigned char code discode2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


unsigned char timer=0;
unsigned char second;
unsigned char key=0;


void main() {
    TMOD=0x01; 
    ET0=1;     
    EA=1;      

    second=0;  
    P0=discode1[second/10];
    P2=discode2[second%10]; 
    while(1) {
        if((P3&0x80)==0x00) { 
            key++;
            switch(key) {
                case 1:
                    TH0=0xee; 
                    TL0=0x00; 
                    TR0=1;    
                    break;
                case 2:
                    TR0=0;    
                    break;
                case 3:
                    key=0;    
                    second=0; 
                    P0=discode1[second/10]; 
                    P2=discode2[second%10]; 
                    break;
            }
            while((P3&0x80)==0x00);
        }
    }
}


void int_T0() interrupt 1 using 0 {
    TR0=0;        
    TH0=0xee;     
    TL0=0x00;     
    timer++;      
    if (timer==20) { 
        timer=0;      
        second++;     
        P0=discode1[second/10]; 
        P2=discode2[second%10]; 
    }
    if(second==99) { 
        TR0=0;        
        second=0;     
        key=2;        
    } else {
        TR0=1;        
    }
}
普中开发板在这里插入图片描述

LCD时钟的设计

使用定时器实现一个LCD显示时钟。采用LCD 1602。
最小计时单位是秒,如何获得1s的定时?可将T0定时时间定为50ms,采用中断方式进行溢出次数累计,满20次,则秒计数变量second加1;若秒计满60,则分计数变量minute加1,同时将秒计数变量second清0;若分钟计满60,则小时计数变量hour加1;若小时计数变量满24,则将小时计数变量hour清0。

proteus仿真图在这里插入图片描述
c语言
#include"reg51.h"
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;
unsigned char s[]={"0123456789"};
unsigned char s1[]={"clock:"};
unsigned char num=0,sec=0,min=25,hour=12;
unsigned char temp0=0,temp1=0,temp2=0,temp3=0,temp4=0,temp5=0;

void delay(unsigned int m)
{
	unsigned int i=0,j=0;
	for(i=0;i<m;i++)
	{
		for(j=0;j<120;j++);
	}
}


void writecom(unsigned char com)
{
	RS=0;
	RW=0;
	E=0	;
	P2=com; 
	delay(5);
	E=1;
	E=0;
}

void writedat(unsigned char dat)
{
	RS=1;
	RW=0;
	E=0	;
	P2=dat; 
	delay(5);
	E=1;
	E=0;
}

void initlcd()
{
	writecom(0x38);
	writecom(0x0c);
	writecom(0x06);
	writecom(0x01);
}

void inittime()
{
	TMOD=0x01;//???0
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	EA=1;
	ET0=1;
	TR0=1;
}

void display()
{		
	unsigned int i=0;
	temp0=sec%10;
	temp1=sec/10;
	temp2=min%10;
	temp3=min/10;
	temp4=hour%10;
	temp5=hour/10;

	writecom(0x80+0x46); 
	delay(5);
	writedat(s[temp5]);
	delay(5);
	writedat(s[temp4]);
	delay(5);
	writedat(':');
	delay(5);
	writedat(s[temp3]);
	delay(5);
	writedat(s[temp2]);
	delay(5);
	writedat(':');
	delay(5);
	writedat(s[temp1]);
	delay(5);
	writedat(s[temp0]);
	delay(5);


	writecom(0x80);
	delay(5);
	while(s1[i]!='\0')
	{
		writedat(s1[i]);
		i++;
	}
	
}

void main()
{
	initlcd();
	inittime();
	while(1)
	{
		display();
	}
}

void inittime_isr() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	num++;
	if(num==20)
	{
		sec++;
		num=0;
	}
	if(sec==60)
	{
		min++;
		sec=0;
	}
	if(min==60)
	{
		hour++;
		min=0;
	}
	if(hour==24)
	{
		hour=0;
	}
}
普中开发板在这里插入图片描述

甲乙两个单片机串口通信

proteus 仿真

在这里插入图片描述
在这里插入图片描述

c语言代码

#include <reg51.h>
  sbit P=PSW^0;		
  unsigned char Tab[8]= {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf,  
                  0xbf, 0x7f};   

 void main(void) 				
 {	
  	unsigned char i;
  	TMOD=0x20;				
  	SCON=0xc0;				
  	PCON=0x00;  	
	TH1=0xfd;				
  TL1=0xfd;
  TR1=1;				
  while(1)
  {	
  	for(i=0;i<8;i++)
     	{
  		Send(Tab[i]);
       	delay( );		
      }
  }
  }
  
void Send(unsigned char dat)		
  {		
  TB8=P; 				
  SBUF=dat;
  while(TI==0); 			
  ;					
  TI=0; 				
  }
   void delay (void) 		
  {	
  	unsigned char m,n;
  	for(m=0;m<250;m++)
  	for(n=0;n<250;n++);
  } 


反思

此次在调整单片机上还有很大欠缺,需要继续多加改进。关于串口调试器还没有搞懂。
关于单片机的接口调整还需多多学习,经常因为接口搞错而无法正常运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值