通过串口控制单片机输出方波
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/****************************************************************
程序名称: 程序自动接收电脑端发送过来的8个字符,如果发过来的
字符是0-9的数字,正常在数码管上显示,如果是其他的显示-
同时将结果发送回电脑端
说明:使用本程序你必须把电脑端的串口调试软件上把显示方式设置为 "字符"
波特率设置为9600,串口COM号设置为USB上的COM号,其他的默认
*****************************************************************/
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit b2 = P0^3;
sbit P02 = P0^2;
sbit P01 = P0^1;
int i1,i2,i3;
int f1,f2,f3,f4,f5;
int b1,b3;
sbit ADC_EN_PORT = P3^7;
sbit led_latch_port = P2^5;
sbit ds1302_en_port = P2^2;
#define sled_wm_port P2
#define sled_dm_port P0
void DelayUs2x(unsigned char t);//us级延时函数声明
void DelayMs(unsigned char t); //ms级延时
/*定义数码管显示字符跟数字的对应数组关系*/
uchar code sled_mun_to_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f nodisp*/
#define henggan 0xbf
/*定义需要点亮的数码管*/
uchar code sled_bit_table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar data sled_data[8]; /*0-7号SLED缓冲值*/
uchar data led_lighten_bit=0 ; /*LED灯点亮标志位0-7*/
void init() /* 串口定时器外部中断初始化 */
{
TMOD = 0x21;
TH1 = 0xfd;
TL1 = 0xfd; /* 9600 */
TR1 = 1;
SCON = 0x50; /* 工作在方式1*/
EA = 1; /*开总中断*/
}
/*-----------------------------------------------
显示部分程序,采用定时器0产生中断,1MS更新一次
------------------------------------------------*/
void SLED_Disp() interrupt 4
{
unsigned char Temp;
if(RI)
{
RI=0;
Temp=SBUF;
if(b1==0)
{
if(Temp==0x48)
{
b2=1;
b3=1;
P02=0;
b1=1;
}
else{
b2=0;}
}
if(b3!=1)
{
if(b2==0){
if(Temp==0x3A)
{
i2=0x00;
i1=0x00;
f2=0x00;
f1=0x00;
b1=0;
}
else {
b1=1;
i2=i2*0x0a;
i1=Temp-0x30;
i2=i2+i1;
i3=i2;
SBUF=Temp;
}
}
else{
if(Temp==0x3A)
{
f2=0x00;
f1=0x00;
i2=0x00;
i1=0x00;
b1=0;
}
else{
b1=1;
f2=f2*0x0a;
f1=Temp-0x30;
f2=f2+f1;
f3=f2;
SBUF=Temp;
}
}
}
b3=0;
}
if(TI)
TI=0;
}
void main()
{
init(); /*允许串口接收*/
ES =1;
i1=0x00;
i2=0x00;
i3=0x00;
b1=0;
b2=0;
b3=0;
f1=0x00;
f2=0x00;
f3=0x00;
while(1){
f4=i3*(100/f3);
f5=0x64*(100/f3);
P01 =1;
DelayMs(f4);
P01=0;
DelayMs(f5-f4) ;
}
}
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{