欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機串口和定時器0沖突了怎么辦?
[打印本頁]
作者:
setsuna520
時間:
2019-7-16 10:33
標題:
單片機串口和定時器0沖突了怎么辦?
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit up = P1^0;
sbit down = P1^1;
sbit thousand = P2^0; //數碼管com與顯示數組
sbit hundred = P2^1;
sbit tan = P2^2;
sbit one = P2^3;
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint frequency; //電機上下的次數,上升算一次,下降算一次
uint num = 0; //定時器計數
void putin(uchar c) ; //串口輸出
void ddelay(uint z); //設置一秒
void show(uint z); //數碼管顯示數字
void main()
{
uint q = 0;
frequency = 0;
up = 0;
down = 1;
TMOD = 0x21; //定時器1方式2 定時器0方式1
TH0 = (65536-45872)/256; //裝初值11.0592M晶振定時50ms數為45872
TL0 = (65536-45872)%256;
TH1 = 0xf4; //裝載初值
TL1 = 0xf4;
SCON = 0x50; //串口方式1
PCON = 0x00; //不倍增
EA = 1; //打開全局中斷
ES = 1; //打開串口中斷
ET0 = 1; //打開定時器0中斷
TR0 = 1; //打開定時器0,開始計時
TR1 = 1; //打開定時器1,用于串口通信
while(1)
{
if(num == 20) //如果到了20次,說明1秒時間
{
q++;
num=0;
if(q == 3) //每3秒串口發送數據
{
up = ~up; //指示燈
down = ~down;
frequency++;
q = 0; //重置時間
putin(0xff);
}
}
putin(0xfe);
show(frequency);
}
}
void ddelay(uint z) //設置一秒
{
unsigned char h, i, j, k, l;
for (l = z; l > 0; l--)
for (h = 5; h > 0; h--)
for (i = 4; i > 0; i--)
for (j = 116; j > 0; j--)
for (k = 214; k > 0; k--);
}
void putin(uchar c) //串口輸出
{
SBUF = c;
while(TI == 0);
TI = 0;
}
void show(uint z) //數碼管顯示數字
{
uchar i,j,k,l;
i = z/1000;
j = (z%1000)/100;
k = (z%100)/10;
l = z%10;
P0 = 0xff;
P0 = table[i];
thousand = 0;
thousand = 1;
P0 = 0xff;
P0 = table[j];
hundred = 0;
hundred = 1;
P0 = 0xff;
P0 = table[k];
tan = 0;
tan = 1;
P0 = 0xff;
P0 = table[l];
one = 0;
one = 1;
}
void T0_time()interrupt 1 //定時器0中斷
{
TH0=(65536-45872)/256; //重新裝載初值
TL0=(65536-45872)%256;
num++;
}
復制代碼
作者:
yzwzfyz
時間:
2019-7-16 13:41
T0中斷優串口中斷,串口中斷時間間隔是一個字節的串轉并時間,相對來說是較長的。只有T0的中斷服務程序運行時間,小于串口的“一個字節的串轉并時間”,串口是不會丟數據的。
解決的方案是:
兩種中斷的服務程序盡可能用時少。
作者:
ahshmj
時間:
2019-7-16 17:40
串口別用循環等待,也用中斷方式。如果一個字節還沒發送或接收完,這時產生了定時器中斷,有可能會影響到串口發送和接收。需要根據需要設置中斷優先權。
11.0592的晶振的初裝值不對啊應該是65536-46080 就是(11.0592/12)*50000=46080
作者:
Laplacey
時間:
2019-7-16 21:59
可以在進入串口的子程里面把總中斷給關了,快出去了再開,被定時器打斷會出好多亂碼
作者:
yzwzfyz
時間:
2019-7-17 10:43
地板的方式是錯誤的,沙發OK。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1