#include <reg52.h>
sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4;
unsigned char code sin[]={0x8B,0x98,0xA4,0xB0,0xBB,0xC6,0xD0,0xD9,0xE2,0xE9,0xEF,0xF5,0xF9,0xFC,0xFE
,0xFE,0xFE,0xFC,0xF9,0xF5,0xEF,0xE9,0xE2,0xD9,0xD0,0xC6,0xBB,0xB0,0xA4,0x98,0x8B
,0x7F,0x73,0x66,0x5A,0x4E,0x43,0x38,0x2E,0x25,0x1C,0x15,0x0F,0x09,0x05,0x02,0x00
,0x00,0x00,0x02,0x05,0x09,0x0F,0x15,0x1C,0x25,0x2E,0x38,0x43,0x4E,0x5A,0x66,0x73
, 0x7F};
unsigned char i = 0; //動態掃描的索引
unsigned int cnt = 0; //記錄 T0 中斷次數 同時50HZ正弦波輸出點
unsigned long t=0;
void main()
{
unsigned long sec = 0; //記錄50HZ輸出點數
unsigned long sec2=0;
float E0; //正弦波幅值
//1HZ正弦波輸出點
EA = 1; //使能總中斷
ENLED = 0; //使能 U3,選擇控制數碼管
ADDR3 = 1; //因為需要動態改變 ADDR0-2 的值,所以不需要再初始化了
TMOD = 0x01; //設置 T0 為模式 1
// void conminucation()
TH0 = 0xFE; //為 T0 賦初值 FEE0,定時 0.2ms
TL0 = 0xE0;
ET0 = 1; //使能 T0 中斷
TR0 = 1; //啟動 T0
while (1)
{
if (cnt >= 1) //判斷 T0 溢出是否達到 1 次
{ //幅值最大為5V
cnt = 0; //第一路
P2 = sin[sec] ;
sec++; //秒計數自加 1
if(sec>62)
sec=0;
}
if(t>=50) //第二路
{
t=0;
P3 = sin[sec2];
sec2++;
if (sec2>62)
sec2=0;
}
}
}
/* 定時器 0 中斷服務函數 */
void InterruptTimer0() interrupt 1
{ TH0 = 0xFE; //為 T0 賦初值 FEE0,定時 0.2ms
TL0 = 0xE0;
cnt++; //中斷次數計數值加 1
t++;
}
程序在上面 可是那個1HZ的正弦波峰峰值 離5V差的很遠。而且波形很差。每個點都會有一定的下降。這是為什么啊
|