利用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++);
}
反思
此次在调整单片机上还有很大欠缺,需要继续多加改进。关于串口调试器还没有搞懂。
关于单片机的接口调整还需多多学习,经常因为接口搞错而无法正常运行。