/*DA控制输出,二极管明暗闪烁*/
#include<reg52.h>
#include"delay.h"
#include"tlc5615.h"
#include"24c02.h"
#include"tlc2543.h"
#include"1602.h"
#include<math.h>
#include<stdio.h>
#define N_ad 100 //read_ad/N_ad
#define N_da 1024 //最大值1024
sbit key1=P3^3;
sbit key2=P2^4;
sbit key3=P2^5;
sbit key4=P3^2;
uint time0,ti1;//定时器0的计数位
uchar flag_time0=0; //记录三角波的上坡和下坡
uint read_ad=100; //ad的值
float num_da=0;
uchar select; //波形模式选择
uchar a,flag; //串口使用的
uint bo;//sin函数处理之后的值
void send_char(char aa){
SBUF=aa;
while(!TI);
TI=0;
}
void keyscan(){
if(key1==0){
delay(10);
if(key1==0){
select=1;//sanjiao();
while(!key1);}
}
if(key2==0){
delay(10);
if(key2==0){
select=2;//fangbo();
while(!key2);}
}
if(key3==0){
delay(10);
if(key3==0){
select=3;//zhengxian();
while(!key3);}
}
if(key4==0){
delay(10);
if(key4==0){
select=4;//juchi();
while(!key4);
}
}
write_add(1,select);
}
/*****************************/
/*****************************/
void main()
{
uchar qian,bai,shi,ge;
uchar qian1,bai1,shi1,ge1;
uchar j;
uint wp;
select=read_add(1);
TMOD=0X21;
TH0=(65536-30)/256;
TL0=(65536-30)%256;
TH1=0XFD;
TL1=0XFD;
SM0=0;
SM1=1;
EA=1;
ES=1;
ET0=1;
TR0=1;///启动定时器0
// TR0=0;
REN=1;
TR1=1;
PS=1; //将串口优先级设置最高
//模式选择
ES=0;
TI=1;
puts("波形模式选择(十六进制): \n");
// putchar('\n');
printf("\t\t\t 01 sanjiaobo\n");
puts("\t\t\t 02 方波");
printf("\t\t\t 03 zhengxianbo\n");
puts("\t\t\t 04 锯齿波\n");
while(!TI);
TI=0;
ES=1;
init_24c02();
init_1602();
// select=read_add(1); 不能放在这儿,因为执行上一条ES=1是,会立马进入中断。现象是不能保存数据
while(1)
{ write_add(1,select);
keyscan();
for(j=10;j>0;j--){
read_ad+=read2543(0);
}
read_ad/=10;
wp= 31* (read_ad/N_ad+1);//ms
qian=wp/1000;
bai=wp%1000/100;
shi=wp%100/10;
ge=wp%10;
write_com(0x80);
// write_com(0x01);//清屏
switch(select){
case 1: write_date('s');
write_date('a');
write_date('n');
write_date('j');
write_date('a');
write_date('o'); break;
case 2: write_date('f');
write_date('a');
write_date('n');
write_date('g');
write_date(' ');
write_date(' '); break;
case 3: write_date('s');
write_date('i');
write_date('n');
write_date(' ');write_date(' ');write_date(' '); break;
case 4: write_date('j');
write_date('u');
write_date('c');
write_date('h');
write_date('i');write_date(' ');break;
default:break;
}
write_com(0x80+0x40);
write_date(0x30+qian);
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
write_date('m');
write_date('s');
write_com(0x80+0x08);
qian1=read_ad/1000;
bai1=read_ad%1000/100;
shi1=read_ad%100/10;
ge1=read_ad%10;
write_date(0x30+qian1);
write_date(0x30+bai1);
write_date(0x30+shi1);
write_date(0x30+ge1);}
}
void timer0() interrupt 1 using 1
{
TR0=0;
TH0=(65536-30)/256;
TL0=(65536-30)%256;
time0++;
// keyscan();
switch(select){
case 1:if(flag_time0==0) { //三角波 31* (read_ad/N_ad+1) ms
if(time0>=(read_ad/N_ad)){
time0=0;
DA(ti1);
ti1++;
if(ti1>=(N_da-1)) //////////////
flag_time0=1;
}
}else{
if(time0>=(read_ad/N_ad)){
time0=0;
DA(ti1);
ti1--;
if(ti1<=0)
flag_time0=0;}
} ; break;
case 2: if(flag_time0==0) { //方波
if(time0>=(read_ad/N_ad)){
time0=0;
DA(0);
flag_time0=~flag_time0;}
}else{
if(time0>=(read_ad/N_ad)){
time0=0;
DA(N_da-1);
flag_time0=~flag_time0;
}
};break;
case 3: if(time0>=(read_ad/N_ad)){ //正弦波
time0=0;
bo=(2.5/2*(sin(num_da/1023*2*3.1415926)+1))/2.5*1023; //必须为1023个点,否则现实的波形不正确
num_da++;
if(num_da>=1024)
num_da=0;
DA(bo);
} ;break;
case 4: if(time0>=(read_ad/N_ad)){ //锯齿波
time0=0;
DA(ti1);
ti1++;
if(ti1>=N_da)
ti1=0;
};break;
default :break;
}
TR0=1;
}
void serial() interrupt 4 using 3
{ a=SBUF;
flag=1;
RI=0;
if(a==0x01) //只能用十六进制发送
select=1;
else if(a==0x02)
select=2;
else if(a==0x03)
select=3;
else if(a==0x04)
select=4;
write_add(1,select);
if(flag==1){
flag=0;
ES=0;
send_char(a);
ES=1;
} |