stc8a8k--secureCRT-demo,波特率115200,晶振11.0592,定时器2产生波特率

23 篇文章 0 订阅

main.c

#include <stc8a8k.h>
#include <stdio.h> 
#include "intrins.h"
#include "disp.h"

#define FOSC            11059200UL
#define BRT             (65536 - FOSC / 115200 / 4)

sbit LED=P1^7;
sbit PUL0=P0^0;

int count5ms=6;


int pwmfreq=100;
int pulsenum=560;
char dir=1;
char buffer[16];

void UartInit(void);		//115200bps@11.0592MHz
void printf_char_int_long(void);
void printf_float(void);
void printf_String(void);
void UART1_SendData(char dat);
void UartSendStr(char *p);
char putchar(char c);
void Delay800ms();		//@11.0592MHz


void Delay10ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 144;
	j = 157;
	do
	{
		while (--j);
	} while (--i);
}

void Timer0Init(void)		//5毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0x28;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	
	TR0 = 0;		//定时器0开始计时ET0=0
}

void TM0_Isr() interrupt 1 using 1
{
	 static int cnt5ms=0;
	
	 if(cnt5ms>count5ms)//30
	 {
		 cnt5ms=0;
     PUL0 = !PUL0;                                 //测试端口
	 }
	 else 
		 cnt5ms++;
}

 
void main()
{
	unsigned char data0=0x10;
	
	UartInit();
  ES = 1;
  EA = 1;
	Timer0Init();		
	
     TR0 = 0;                                    //启动定时器
    ET0 = 0;                                    //使能定时器中断
//  UartSendStr("Uart Test !\r\n");
//	printf_char_int_long();
//	printf_float() ;
//	printf_String() ;
//	
//	printf ("chardata0= %bd \r\n",data0); 	       // char进制输出
// 	printf ("chardata0=0x%bx\r\n",data0);   // 16进制输出	
	while(1) 		 // 停在这里
	{
//		printf ("chardata0= %bd \r\n",data0); 	       // char进制输出
// 	  printf ("chardata0=0x%bx\r\n",data0);   // 16进制输出
//    Delay800ms()	;	
//   disp_gotoxy(1,2);
//	printf("pwmfreq=%d\r\n",pwmfreq);
//		
//	disp_gotoxy(1,3);
//	printf("pulsenum=%d\r\n",pulsenum);
//		
//	disp_gotoxy(1,4);
//	printf("dir=%d\r\n",dir);

//pwmfreq=pwmfreq+1;
//		pulsenum=pulsenum+15;
//		dir=!dir;
		
//		PUL0=1;
//		Delay10ms()	;	
//		PUL0=0;
//		Delay10ms()	;
		
		
		
	}

}


//UART1 发送串口数据
void UART1_SendData(char dat)
 {
    ES=0;           //关串口中断
     SBUF=dat;           
     while(TI!=1);   //等待发送成功
     TI=0;           //清除发送中断标志
     ES=1;           //开串口中断
}
void UartSendStr(char *p)
{
    while (*p)
    {
        UART1_SendData(*p++);
    }
}
 //重写putchar函数
char putchar(char c)
{
     UART1_SendData(c);
     return c;
}
void Delay800ms()		//@11.0592MHz
{
	unsigned char i, j, k;
	i = 45;
	j = 100;
	k = 200;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void UartInit(void)		//115200bps@11.0592MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器2时钟为Fosc/12,即12T
	T2L = 0xFE;		//设定定时初值
	T2H = 0xFF;		//设定定时初值
	AUXR |= 0x10;		//启动定时器2
}


void UartIsr() interrupt 4 using 1
{
		unsigned char cmdtemp=0;
    if (TI)
    {
        TI = 0;
       
    }
    if (RI)
    {
			  cmdtemp=SBUF;
				switch(cmdtemp)
				{
					case 'q':
						pwmfreq=pwmfreq+10;
					  count5ms=count5ms+5;
					 disp_gotoxy(1,2);
					  printf("count5ms=%d\r\n",count5ms);
						break;
					case 'w':
						pwmfreq=pwmfreq-10;
					  count5ms=count5ms-5;
					 disp_gotoxy(1,2);
					printf("count5ms=%d\r\n",count5ms);
						break;
					
					case 'e':
						 LED=0;
					     TR0 = 0;                                    //启动定时器
              ET0 = 0;   
					break;
					
					case 'r':
						LED=1;
					  TR0 = 1;                                    //启动定时器
            ET0 = 1;   
					break;
					default:break;
				}
        RI = 0;    
    }
}


void printf_char_int_long(void)
{
	char a=-100;
	int b=-2000;
	long c=6553600;
	printf ("char %bd  int %d  long %ld\r\n",a,b,c); 	       // 10进制输出
	// 输出带符号10进制整数(正数不输出符号)
  // 实际输出:char -100  int -2000 long 6553600 
	printf ("char_0x%bx  int_0x%x  long_0x%lx\r\n",a,b,c);   // 16进制输出	
	// 输出无符号16进制整数,x表示按小写输出,X表示按大写输出
  // 实际输出:char_0x9c  int_0xf830 long_0x640000  
  printf ("a_int %d\r\n",(int)(a)); 	           // 不用宽度标识符
	// 实际输出:a_int -100	
	printf ("char %bd,int %d,long %ld\r\n",a,b,c);   // %bd后也可以有其它普通字符
	// 输出带符号10进制整数(正数不输出符号)
    // 实际输出:char -100,int -2000,long 6553600 
}

void printf_float(void) 		
{
	float a= 3.14159265798932;
	float  f = 10.0,g = 22.95;
	printf("Max is %f\r\n",a);    // Max is 3.141593,	默认小数点后6位
	printf("%.4f\r\n",a);	 		// 3.1416
	printf("%.12f\r\n",a);	    // 3.140593000000
	//%.4f 表示按小数点后4 位数据输出,%.12f表示按小数点后12位数据输出
	printf ("%f , %g\r\n", f, g);	  //输出:10.000000 , 22.95 
} 

void printf_String(void) 
{
	char buf [] = "Test String";
	char *p = buf;
	printf ("String %s is at address %p\r\n",buf,p);
   //输出:String Test String is at address i:0022    
} 	

disp.h

#ifndef __DISP_H
#define __DISP_H

void disp_clean(void);
void disp_cursor_reset(void);
void disp_gotoxy(int x,int y);
void disp_cursor_up(int y);
void disp_cursor_down(int y);
void disp_cursor_left(int x);
void disp_cursor_right(int x);
void disp_cursor_hide(void);
void disp_cursor_show(void);

#endif

disp.c

#include "disp.h"
#include "stdio.h"

void disp_clean(void)
{
	printf("\033[2J");
}


void disp_cursor_reset(void)
{
		printf("\033[H");
}
void disp_gotoxy(int x,int y)
{
		printf("\033[%d;%dH",y,x);
}
void disp_cursor_up(int y)
{
	printf("\033[%dA",y);
}
void disp_cursor_down(int y)
{
	printf("\033[%dB",y);
}
void disp_cursor_left(int x)
{
	printf("\033[%dD",x);
}
void disp_cursor_right(int x)
{
	printf("\033[%dC",x);
}
void disp_cursor_hide(void)
{
	printf("\033[?25l");
}
void disp_cursor_show(void)
{
	printf("\033[?25h");
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STC8A8K64S4A12单片机开发板软硬件技术资料+软件DEMO例程源码: 01参考程序 02原理图与结构图纸 STC8 使用手册.pdf STC8系列单片机技术参考手册-20170517.pdf 文件资料 01-P33口LED灯运行 02-P2口跑马灯实验 03- 定时器0 模式0 04- 定时器1 模式0 05-定时器2 06- 看门狗实验 06-定时器0 P35模拟10位或16位PWM输出程序 08-串口1发送 8位自动重装载 09-串口1收发 8位自动重装载 10-串口1仅发 16位重装载 11- 串口1收发 16位重装载 12-外部中断 1 13 模拟I2C读写24C 串口监测 14-外部FLASH读写 串口监测 15-中景园电子0.96OLED显示屏IIC_例程 15-中景园电子0.96OLED显示屏IIC_例程.zip 16-中景园电子0.96OLED显示屏SPI_例程 16-中景园电子0.96OLED显示屏SPI_例程.zip 17-中景园电子0.96OLED显示屏0.96OLED带字库 17-中景园电子0.96OLED显示屏0.96OLED带字库.zip 18-中景园电子1.44寸LCD-51(图片显示) 19-中景园电子1.8寸LCD-51(模拟SPI中文显示) 20-中景园电子2.4寸不带触摸51单片机测试(要求大于16K ROM的单片机) 21-中景园电子3.5寸FTFT_LCD_SPI接口 12864详细中文资料.pdf 1602中文资料.doc 1838红外接收头.pdf 24c0系列.pdf AMS1117.pdf C数组、BIN、BMP图片制作 elh.pdf DS18B20.pdf FAT及FATFS资料 I2C.doc ILI9325DS_ID9325.pdf MMA7361.pdf MMA7361L.pdf NRF24l01模块说明书.pdf PCB设计资料.pdf sd卡读写.pdf SD卡资料.pdf UCOS+UCGUI学习资料 UG-2864HSWEG01 user guide.pdf W25X16中文手册.pdf XPT2046中文资料.pdf 关于舵机的死区.txt 红外遥控器编码大全.pdf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值