Em là sinh viên mới tập tọe học điện tử, xin các anh giải đáp cho em mấy vấn đề:
Em đang làm mạch đo tần số bằng 8051 hiển thì trên PC qua cổng RS232. Em dùng T0 tạo xung mở khóa, dùng T1 đếm xung đi vào trong thời gian mở khóa. Nhưng muốn giao tiếp với cổng RS232 thì phải dùng bộ nhớ đệm SBUF mà tốc độ baud phụ thuộc vào T1. Khi này T1 phải hoạt động ở chế độ định thời. Em làm như sau: khi hết 1 xung mở khóa, em lưu giá trị T1 vào 1 biến temp rồi tăng T1 lên 255. Khi bắt đầu xung mở khóa sau thì TF1 sẽ lên 1 và ngắt. Trong hàm ngắt, e tắt cả T0 và T1 rồi chuyển TMOD=0x02 và đưa temp ra SBUF. Nhưng kết quả là T0 sau khi chạy hết chu kỳ đầu thì giữ nguyên giá trị 1, còn T1 thì chỉ đếm được 1 lần.
Các anh chỉ bảo cho em với
Em cám ơn các anh.
(Em không up đựoc file mạch lên, nên đành up ảnh, các anh thông cảm)
#include <REGX51.H>
#include <stdio.h>
char dem, tylexung, temp, flag=1;
int time;
void khoitao()
{
EA=0;
TMOD=0x61;
TH0=0x00;
TL0=0x00;
TH1=0x00;
TL1=0x00;
ET1=1;
ET0=1;
dem=0;
EA=1;
TR0=1;
TR1=1;
}
void t0() interrupt 1
{
TR0=0;
TF0=0;
if(dem<tylexung+1)
P2_0=1;
dem++;
if(dem==tylexung+1)
{
P1=TL1;
temp=TL1;
P2_0=0;
TL1=255;
}
if(dem>tylexung) P2_0=0;
if(dem==10) dem=0;
TH0=0x00;
TL0=0x00;
TR0=1;
}
void t1() interrupt 2
{
TR1=0;
TR0=0;
TF1=0;
TF0=0;
TMOD=0x20;
TL1=TH1=-3;
SCON=0x50;
TR1=1;
time=5000;
while(time)
{
while(!TI);
TI=0;
SBUF=temp;
time--;
}
flag=1;
}
void main()
{
while(1)
{
if(flag)
{
khoitao();
flag=0;
P2_7=flag;
}
tylexung=5;
}
}
Em đang làm mạch đo tần số bằng 8051 hiển thì trên PC qua cổng RS232. Em dùng T0 tạo xung mở khóa, dùng T1 đếm xung đi vào trong thời gian mở khóa. Nhưng muốn giao tiếp với cổng RS232 thì phải dùng bộ nhớ đệm SBUF mà tốc độ baud phụ thuộc vào T1. Khi này T1 phải hoạt động ở chế độ định thời. Em làm như sau: khi hết 1 xung mở khóa, em lưu giá trị T1 vào 1 biến temp rồi tăng T1 lên 255. Khi bắt đầu xung mở khóa sau thì TF1 sẽ lên 1 và ngắt. Trong hàm ngắt, e tắt cả T0 và T1 rồi chuyển TMOD=0x02 và đưa temp ra SBUF. Nhưng kết quả là T0 sau khi chạy hết chu kỳ đầu thì giữ nguyên giá trị 1, còn T1 thì chỉ đếm được 1 lần.
Các anh chỉ bảo cho em với
Em cám ơn các anh.
(Em không up đựoc file mạch lên, nên đành up ảnh, các anh thông cảm)
#include <REGX51.H>
#include <stdio.h>
char dem, tylexung, temp, flag=1;
int time;
void khoitao()
{
EA=0;
TMOD=0x61;
TH0=0x00;
TL0=0x00;
TH1=0x00;
TL1=0x00;
ET1=1;
ET0=1;
dem=0;
EA=1;
TR0=1;
TR1=1;
}
void t0() interrupt 1
{
TR0=0;
TF0=0;
if(dem<tylexung+1)
P2_0=1;
dem++;
if(dem==tylexung+1)
{
P1=TL1;
temp=TL1;
P2_0=0;
TL1=255;
}
if(dem>tylexung) P2_0=0;
if(dem==10) dem=0;
TH0=0x00;
TL0=0x00;
TR0=1;
}
void t1() interrupt 2
{
TR1=0;
TR0=0;
TF1=0;
TF0=0;
TMOD=0x20;
TL1=TH1=-3;
SCON=0x50;
TR1=1;
time=5000;
while(time)
{
while(!TI);
TI=0;
SBUF=temp;
time--;
}
flag=1;
}
void main()
{
while(1)
{
if(flag)
{
khoitao();
flag=0;
P2_7=flag;
}
tylexung=5;
}
}
Comment