#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差的很远。而且波形很差。每个点都会有一定的下降。这是为什么啊
|