99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖

stm8單片機--學好高端單片機stm32和DSP的轉折點

        單片機對于工程師來說是必備的一種知識,對于硬件工程師也是一樣。但是大多數人了解的大多是51單片機,因為它基礎,簡單,是個老古董了。但是大多還在應用,其固有的穩定性,一直也在有市場份額。但是,隨著一個高大上的產品出來之后,51單片機有點力不從心了。stm32,dsp的崛起,給51單片機也快劃上了完美的句號。

        我們的本科時候也是學51單片機,老師一直強調他是什么什么基礎,如果學單片機一定要從51學起,這句話一點沒有錯!同樣,如果想學好高端的東西,一定要慢慢積累,學習是一個漸變的過程,并不是像動畫片里,把書吃進肚子里,之后就什么都會了一樣。

        我要感謝我的大學老師,fan老師,他教會了我很多單片機的知識,他也自己出了幾本單片機的書以及在淘寶網上賣開發板。很帥氣的老師,人長的也相當的精神。接下來就來給大家送出海量資源------stm8的各種應用程序!最重要的是應用!全部都是我自己調試的,編譯都通過的程序。硬件電路也很簡單,有什么不懂的可以提出來,我們一起去討論,我也在和你們學習。謝謝大家!

 

全部回復(59)
正序查看
倒序查看
2014-04-08 13:06
第一個:LED閃爍
/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */
#include "stm8s208r.h"
/******************函數聲明***************************************/
void delay(unsigned int time);
/******************主函數***************************************/
void main(void)
{
	PB_DDR |= 0x01;							//選擇輸出模式
	PB_CR1 |= 0x01;							//推挽輸出模式
	PB_CR2 |= 0x00;							//低速輸出模式
	while (1)
	{
		PB_ODR &= 0xfe;					//小燈亮
		delay(50000);					//調用延時函數
		PB_ODR |= 0x01;					//小燈滅
		delay(50000);					//調用延時函數
	}	
}
/******************延時子程序***************************************/
void delay(unsigned int time)
{
	while(time --);					//在此循環time次,實現延時
}
 
0
回復
2014-04-08 13:08

第二個:STM8控制8個數碼管

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */

#include"stm8s208r.h"
/*---------------------函數聲明--------------------------*/
void delay(unsigned int delay_time);
void display_SMG(void);
/*----------------SMG_table 共陽數碼管段選編碼-----------*/
unsigned char SMG_table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/*---------------對應顯示數字0123456789------------------*/
main()
{	
/*--------------端口初始化-------------------------------*/
	PB_DDR = 0XFF;  					//定義PB口為輸出,用于控制數碼管段選
	PB_ODR = 0XFF;						//定義PB初始輸出為高,數碼管初始不亮
	PB_CR1 = 0XFF;						//定義推挽輸出	
	PB_CR2 = 0XFF;						//定義快速輸出
	PG_DDR = 0XFF;  					//定義PG口為輸出,用于控制數碼管段選
	PG_ODR = 0XFF;						//定義PG初始輸出為高,數碼管初始不亮
	PG_CR1 = 0XFF;						//定義推挽輸出	
	PG_CR2 = 0XFF;						//定義快速輸出
/*-------------------------------------------------------*/	
	while (1)
	{
		display_SMG();					//用數碼管顯示數字
	}
}
/*--------------數碼管顯示函數----------------------------*/
void display_SMG(void)
{
	/*--------------第8個數碼管顯示2------------------------*/
	PB_ODR = SMG_table[2];	 //段選,讓全部數碼管顯示2 
	PG_ODR = 0X7F;					 //位選,0111 1111 讓第8個數碼管亮
	delay(500);
	/*--------------第7個數碼管顯示0------------------------*/
	PB_ODR = SMG_table[0];
	PG_ODR = 0XBF;					 //段選,讓全部數碼管顯示0
	delay(500);							 //位選,1011 1111 讓第7個數碼管亮
	/*--------------第6個數碼管顯示1------------------------*/
	PB_ODR = SMG_table[1];
	PG_ODR = 0XDF;					 //段選,讓全部數碼管顯示1 
	delay(500);							 //位選,1101 1111 讓第6個數碼管亮
	/*--------------第5個數碼管顯示1------------------------*/
	PB_ODR = SMG_table[1];
	PG_ODR = 0XEF;					 //段選,讓全部數碼管顯示1
	delay(500);							 //位選,1110 1111 讓第5個數碼管亮
	/*--------------第4個數碼管顯示0------------------------*/
	PB_ODR = SMG_table[0];
	PG_ODR = 0XF7;					 //段選,讓全部數碼管顯示0
	delay(500);							 //位選,1111 0111 讓第4個數碼管亮
	/*--------------第3個數碼管顯示1------------------------*/
	PB_ODR = SMG_table[1];
	PG_ODR = 0XFB;					 //段選,讓全部數碼管顯示1
	delay(500);							 //位選,1111 1011 讓第3個數碼管亮
	/*--------------第2個數碼管顯示1------------------------*/
	PB_ODR = SMG_table[1];
	PG_ODR = 0XFD;					 //段選,讓全部數碼管顯示1
	delay(500);						 	 //位選,1111 1101 讓第2個數碼管亮
	/*--------------第1個數碼管顯示0------------------------*/
	PB_ODR = SMG_table[0];
	PG_ODR = 0XFE;					 //段選,讓全部數碼管顯示0
	delay(500);							 //位選,1111 1110 讓第1個數碼管亮
}
/*--------------延時函數----------------------------*/
void delay(unsigned int delay_time)
{
	while(delay_time != 0)
	{
		delay_time--;
	}
}

 

0
回復
2014-04-08 13:08
@SKY丶輝煌
第一個:LED閃爍/*MAIN.Cfile**Copyright(c)2002-2005STMicroelectronics*/#include"stm8s208r.h"/******************函數聲明***************************************/voiddelay(unsignedinttime);/******************主函數***************************************/voidmain(void){PB_DDR|=0x01;//選擇輸出模式PB_CR1|=0x01;//推挽輸出模式PB_CR2|=0x00;//低速輸出模式while(1){PB_ODR&=0xfe;//小燈亮delay(50000);//調用延時函數PB_ODR|=0x01;//小燈滅delay(50000);//調用延時函數}}/******************延時子程序***************************************/voiddelay(unsignedinttime){while(time--);//在此循環time次,實現延時} 
不錯 學習學習
0
回復
2014-04-08 13:09

第三個:stm8直接驅動一個數碼管

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */

#include"stm8s208r.h"
/*---------------------函數聲明--------------------------*/
void delay(unsigned int delay_time);
void display_SMG(void);
/*----------------SMG_table 共陽數碼管段選編碼-----------*/
unsigned char SMG_table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/*---------------對應顯示數字0123456789------------------*/
main()
{	
/*--------------端口初始化-------------------------------*/
	PB_DDR = 0XFF;  					//定義PB口為輸出,用于控制數碼管段選
	PB_ODR = 0XFF;						//定義PB初始輸出為高,數碼管初始不亮
	PB_CR1 = 0XFF;						//定義推挽輸出	
	PB_CR2 = 0XFF;						//定義快速輸出
/*-------------------------------------------------------*/	
	while (1)
	{
		display_SMG();					//用一個數碼管顯示數字
	}
}
/*--------------數碼管顯示函數----------------------------*/
void display_SMG(void)
{
	unsigned int i;
	/*--------------用一個數碼管顯示0~9---------------------*/
	for(i = 0;i < 10;i ++)
	{
		PB_ODR = SMG_table[i];
		delay(50000);
	}
}
/*--------------延時函數----------------------------*/
void delay(unsigned int delay_time)
{
	while(delay_time != 0)
	{
		delay_time--;
	}
}

 

0
回復
2014-04-08 13:09

第四個:tim1捕獲比較通道數數

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */

#include"stm8s208r.h"
/*******************函數聲明*******************************/
void TIM1_Init(void);
void GPIO_Init(void);
/*******************主函數*********************************/
main()
{
	GPIO_Init();
	TIM1_Init();
	//開啟TIM1
	TIM1_CR1 |= 0X01;
	while (1)
	{
		PB_ODR = ~TIM1_CNTRL;
	}
}
/*******************TIM1外部時鐘模式1初始化****************/
void TIM1_Init(void)
{
	//輸入捕獲1濾波器設置為采樣頻率FSAMPLING = FMASTER/32,N = 8
	TIM1_CCMR1 |= 0XF0;
	//捕獲發生在TI2F的低電平或下降沿
	TIM1_CCER1 = 0x20;
	//TIM1工作在外部時鐘模式1
	TIM1_SMCR |= 0X07;
	//選擇TI2作為輸入源
	TIM1_SMCR |= 0X60;
}
/*******************GPIOC初始化****************************/
void GPIO_Init(void)
{
	//PB口顯示TIM1_CNTRL中的值,設置PB口為推挽快速輸出方式
	PB_ODR = 0XFF;
	PB_DDR = 0XFF;
	PB_CR1 = 0XFF;
	PB_CR2 = 0XFF;
	//PC2為TIM1的捕獲/比較通道2,設置為上拉輸入
	PC_DDR = 0X00;
	PC_CR1 = 0XFF;
}

 

0
回復
2014-04-08 13:10

第5個:TIM1定時產生1HZ方波信號

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */

#include"stm8s208r.h"
/*********************函數聲明****************************/
void GPIO_Init(void);
void TIM1_Init(void);
void delay(unsigned int time);
void main(void)
{
	GPIO_Init();
	TIM1_Init();
	TIM1_CR1 |= 0X01;						//置位CEN位,開始計數
	_asm("rim");
	while (1);
}
/*********************GPIO初始化***************************/
void GPIO_Init(void)
{
	PB_ODR |= 0X01;							//PB0上電為1
	PB_DDR |= 0X01;							//設置PB0口為輸出
	PB_CR1 |= 0X01;							//推挽輸出
	PB_CR2 |= 0X01;							//快速輸出
}
/*********************TIM1初始化***************************/
void TIM1_Init(void)
{
	//系統時鐘為2Mhz,20分頻,計數器頻率為100Khz
	TIM1_PSCRH = 0;
	TIM1_PSCRL = 19;
	//開溢出中斷
	TIM1_IER = 0X01;
	//計數50000次,為0.5s
	TIM1_ARRH = (unsigned char)(50000 >> 8);
	TIM1_ARRL = (unsigned char)50000;
	//設置計數器的值,使定時器一開始即可產生更新事件
	TIM1_CNTRH = (unsigned char)(50000 >> 8);
	TIM1_CNTRL = (unsigned char)50000;
}
/*********************延時函數*****************************/
void delay(unsigned int time)
{
	while(time --);
}
/*****************TIM1溢出中斷服務程序*********************/
@far @interrupt void TIM1_OVF_IRQ(void)
{
	TIM1_SR1 &= 0XFE;
	PB_ODR ^= 0X01;
}

 

0
回復
2014-04-08 13:11

第6個:定時500ms讓LED閃起來

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */

#include"stm8s208r.h"
unsigned int count = 0;
/*****************函數聲明************************/
void GPIO_Init(void);
void TIM4_Init(void);
/*****************主函數**************************/
main()
{
	GPIO_Init();
	TIM4_Init();
	_asm("rim");
	TIM4_CR1 |= 0X01;				//開始計時
	while (1);
}
/*****************GPIO初始化**********************/
void GPIO_Init(void)
{
	PB_ODR = 0X00;					//輸出初始值為0X00;
	PB_DDR = 0XFF;					//設置PB口方向為輸出
	PB_CR1 = 0XFF;					//設置為推挽輸出
	PB_CR2 = 0X00;					//低速模式
}
/*****************TIM4初始化**********************/
void TIM4_Init(void)
{
	TIM4_PSCR = 0X03;				//預分頻值2MHZ/(2^3) = 250khz
	TIM4_IER = 0X01;				//開定時器中斷
	TIM4_ARR = 250;					//自動重裝值,1/250k*250 = 1ms
	TIM4_CNTR = 250;				//計數器初始值給250,目的是一開始
													//級計數就產生一次溢出從而產生更新
													//事件來使預分頻器的值啟用
}
/*****************TIM4中斷服務程序**********************/
@far @interrupt void TIM4_IRQ(void)
{
	count ++;
	TIM4_SR = 0X00;
	if(count == 500)
	{
		PB_ODR ^= 0XFF;
		count = 0;
	}
}

 

0
回復
2014-04-08 13:12

第7個:獨立按鍵啟用內部上拉

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */

#include"stm8s208r.h"
/*---------------------函數聲明--------------------------*/
void delay(unsigned int delay_time);
void display_SMG(void);
void key_press(void);
/*----------------SMG_table 共陽數碼管段選編碼-----------*/
unsigned char SMG_table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/*---------------對應顯示數字0123456789------------------*/
/*-------------------------------------------------------*/
unsigned char Number;				//顯示的數字
main()
{	
/*--------------端口初始化-------------------------------*/
	PB_DDR = 0XFF;  					//定義PB口為輸出,用于控制數碼管段選
	PB_ODR = 0XFF;						//定義PB初始輸出為高,數碼管初始不亮
	PB_CR1 = 0XFF;						//定義推挽輸出	
	PB_CR2 = 0XFF;						//定義快速輸出
	PE_DDR &= 0XFE;						//定義PE0口為輸入,檢測按鍵輸入
	PE_CR1 |= 0X01;						//定義為上拉輸入,芯片內部啟用上拉電阻
	PE_CR2 &= 0XFE;						//定義不時能中斷
/*-------------------------------------------------------*/	
	while (1)
	{
		key_press();						//用查詢法判斷按鍵是否按下
		display_SMG();					//用數碼管顯示Number值
	}
}
/*----------------按鍵處理函數----------------------------*/
void key_press()
{
/*----------------判斷按鍵是否按下------------------------*/
	if((PE_IDR & 0X01) == 0)
	{
		delay(13000);						//延時10~20ms去除抖動
		if((PE_IDR & 0X01) == 0)//再次判斷按鍵是否按下,若按下,Number+1
		{
			if(Number < 9)
				Number++;
			else
				Number = 0;
		}
	}
}
/*--------------數碼管顯示函數----------------------------*/
void display_SMG(void)
{
/*----------------用一個數碼管顯示Number------------------*/
	PB_ODR = SMG_table[Number];
}
/*--------------延時函數----------------------------*/
void delay(unsigned int delay_time)
{
	while(delay_time != 0)
	{
		delay_time--;
	}
}

 

0
回復
SKY丶輝煌
LV.10
10
2014-04-08 13:13

第8個:跑馬燈

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */
#include"stm8s208r.h"			//開始時的頭文件包含
/***********************函數聲明***************************/
void delay(unsigned int time);					//聲明延時函數
/***********************主函數*****************************/
void main(void)
{
	unsigned char i = 0;
	PB_ODR = 0XFF;          //設置輸出寄存器的輸出數值,初始
													//化小燈全滅
	PB_DDR = 0XFF;					//設置I/O口B為輸出
	PB_CR1 = 0XFF;					//設置I/O口B為推挽方式
	PB_CR2 = 0X00;					//輸出最快速度為2MHZ
	while (1)
	{
			switch(i)						//讓小燈從低位到高位依次亮
			{
					case 0:	PB_ODR = 0XFE;
									break;
					case 1:	PB_ODR = 0XFD;
									break;
					case 2:	PB_ODR = 0XFB;
									break;
					case 3:	PB_ODR = 0XF7;
									break;
					case 4:	PB_ODR = 0XEF;
									break;
					case 5:	PB_ODR = 0XDF;
									break;	
					case 6:	PB_ODR = 0XBF;
									break;	
					case 7:	PB_ODR = 0X7F;
									break;
					default :PB_ODR = 0XFE;
			}
			delay(40000);			  //延時約20ms
			i++;								//讓i加1下次執行程序時進入到case
			if(i == 8)
			{
					i = 0;
			}
	}
}
/*******************延時子程序***************************/
void delay(unsigned int time)
{
	while(time --);						//讓while執行time次程序達到延時 的目的
}

 

0
回復
SKY丶輝煌
LV.10
11
2014-04-08 13:14

第9個:數組與萬能流水燈

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */
#include"stm8s208r.h"
/********************定義一個二維數組*********************/
/********************裝入使小燈花樣閃亮的數據*************/
/*********************************************************/
unsigned char dis[5][8] =
{
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f},
{0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe},
{0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff},
{0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00},
{0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f}
};
/************************函數聲明**************************/
void GPIO_Init(void);										//GPIO口的初始化子程序
void display(void);											//用PB口顯示花樣小燈子程序
void delay(unsigned int time);					//延時子程序
/************************主函數****************************/
int main(void)
{
	GPIO_Init();													//端口初始化
	while (1)															//死循環
	{
		display();													//始終讓小燈顯示花樣
	}
}
/************************GPIO口的初始化****************************/
void GPIO_Init(void)
{
	PB_ODR = 0XFF;												//初始使小燈全滅
	PB_DDR = 0XFF;												//DDR為0是輸入,1是 輸出。 此處為PB的8個端口均為輸出
	PB_CR1 = 0XFF;												//推挽輸出模式
	PB_CR2 = 0X00;												//低速輸出模式
}
/************************小燈花樣顯示子程序************************/
void display(void)
{
	unsigned char i,j;
	for(i =0;i<5;i++)											//循環二維數組的行數
	{
		for(j= 0;j<8;j++)										//循環二維數組的每行中的數據
		{
			PB_ODR = dis[i][j];								//把數據給PB口使小燈顯示
			delay(50000);
		}
	}
}
/*****************************延時子程序*****************************/
void delay(unsigned int time)
{
	while(time--);
}

 

0
回復
SKY丶輝煌
LV.10
12
2014-04-08 13:15

第10個:外部按鍵中斷

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */

#include"stm8s208r.h"						//必須包含的頭文件
/******************函數聲明****************************/
void delay(unsigned int time);
/********************主函數****************************/
main()
{
	EXTI_CR1 = 0XF2;							//設置端口A的中斷出發方式為 僅下降沿觸發
	PA_DDR &= 0XEF;								//設置PA4腳為輸入模式,當做 中斷觸發引腳連接按鍵
	PB_DDR = 0XFF;								//設置端口B的所有引腳均為輸 出,控制小燈
	PA_CR1 |= 0X10;								//設置PA4為中斷上拉輸入方式
	PA_CR2 |= 0X10;
	PB_CR1 |= 0XFF;								//設置端口B為推挽輸出模式
	PB_CR2 &= 0X00;
	_asm("rim");									//這是一條匯編語句,功能是打開總的中斷使能
	PB_ODR = 0X0F;								//讓小燈的高4位亮
	while(1);											//因為用中斷程序控制小燈所以死循環內空跑
}
/*******************中斷服務程序***********************/
@far @interrupt void EXTI_PORTA_IRQHandler(void)
{
	if((PA_IDR & 0X10) == 0)					//判斷是否是PA4出發產生 的中斷
	{
		delay(50);											//延時去抖
		if((PA_IDR &0X10) == 0)					//判斷是否依然是低,若是則說明不是抖動
		{
			while((PA_IDR & 0X10) == 0);	//等待松開
			PB_ODR = ~PB_ODR;							//取反讓小燈高低4位交替 亮滅
		}
	}
}
/*******************延時子程序**************************/
void delay(unsigned int time)
{
	while(time --);
}

 

0
回復
SKY丶輝煌
LV.10
13
2014-04-08 13:15

第11個:心律不齊的LED分頻因子

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */

#include"stm8s208r.h"
_Bool LED @PG_ODR:0;
void Delay(unsigned int t);
main()
{
	unsigned char i;
	PG_DDR |= 0X01;
	PG_CR1 |= 0X01;
	PG_CR2 |= 0X01;
	while(1)
	{
		//HSI不分頻,單片機工作在16MHZ
		CLK_CKDIVR = 0X00;
		for(i = 0;i<5;i++)
		{
			LED = 0;
			Delay(50000);
			LED = 1;
			Delay(50000);
		}
		//HSI 8分頻,單片機工作在2MHZ
		CLK_CKDIVR = 0X18;
		for(i = 0;i<5;i++)
		{
			LED = 0;
			Delay(50000);
			LED = 1;
			Delay(50000);
		}

	}
}
void Delay(unsigned int t)
{
	while(t--);
}

 

0
回復
SKY丶輝煌
LV.10
14
2014-04-08 13:16

第12個:用for循環遛馬

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */

#include"stm8s208r.h"									//包含stm8頭文件
/***********************函數聲明**********************/
void delay(unsigned int time);				//延時函數

/************************主函數***********************/
void main(void)
{
	unsigned char i;
	PB_ODR = 0XFE;											//低電平有效,點亮第一個LED
	PB_ODR = 0XFF;											//I/O口初始化,將PB口 設為輸出狀態
	PB_CR1 = 0XFF;											//PB口(CR1)置1推挽輸出
	PB_CR2 = 0X00;											//CR2置0低速模式,初始化完成
	while (1)
	{
		PB_ODR = 0XFE;
		for(i = 0;i <8;i++)								//賦初值配合for循環使 用
		{
			delay(50000);
			PB_ODR <<= 1;										//左移一位,點亮下一個LED
			PB_ODR |= 0X01;									//左移后最低位自動補0 ,所以需要將最低位置高
		}
	}
}
/********************延時子程序***********************/
void delay (unsigned int time)
{
	while(time --);
}

 

0
回復
SKY丶輝煌
LV.10
15
2014-04-08 13:17

第13個:中斷嵌套,中斷優先級

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */

#include"stm8s208r.h"
void delay(unsigned int t);
main()
{
	//8個LED
	PG_ODR = 0XFF;
	PG_DDR = 0XFF;
	PG_CR1 = 0XFF;
	PG_CR2 = 0X00;
	
	//PD6中斷
	PD_DDR &= ~(1 << 7);
	PD_CR1 |= (1 << 7);
	//僅下降沿觸發
	EXTI_CR2 |= 0X04;
	PD_CR2 |= (1 << 7);
	
	//PD7中斷
	PD_DDR &= ~(1 << 6);
	PD_CR1 |= (1 << 6);
	//僅下降沿觸發
	EXTI_CR1 |= (2 << 6);
	PD_CR2 |= (1 << 6);
	
	//PB軟件優先級設置為1級
	ITC_SPR2 &= ~(1 << 1);
	
	//PB6中斷
	PB_DDR &= ~(1 << 6);
	PB_CR1 |= (1 <<6);
	//僅下降沿觸發
	EXTI_CR1 |= (2 << 2);
	PB_CR2 |= (1 << 6);
	
	//開總中斷
	_asm("rim");
	while (1)
	{
		PG_ODR = 0X00;
	}
}
void delay(unsigned int t)
{
	unsigned int i;
	while(t--)
	for(i = 0;i< 5000; i++);
}
@far @interrupt void PB_IRQ(void)
{
	if((PB_IDR & (1 << 6)) == 0)
	{
		PG_ODR = 0X0F;
		delay(50);
		PG_ODR = 0X0F;
		delay(50);
		_asm("sim");
	}
}
@far @interrupt void PD_IRQ(void)
{
	if((PD_IDR & (1 << 6)) == 0)
	{
		PG_ODR = 0XF0;
		delay(50);
		PG_ODR = 0XF0;
		delay(50);
	}
}
@far @interrupt void TLI_IRQ(void)
{
	PG_ODR = 0XAA;
	delay(10);
}

 

 

0
回復
SKY丶輝煌
LV.10
16
2014-04-08 13:18
@SKY丶輝煌
第13個:中斷嵌套,中斷優先級/*MAIN.Cfile**Copyright(c)2002-2005STMicroelectronics*/#include"stm8s208r.h"voiddelay(unsignedintt);main(){//8個LEDPG_ODR=0XFF;PG_DDR=0XFF;PG_CR1=0XFF;PG_CR2=0X00;//PD6中斷PD_DDR&=~(1
下午要去上課,毛澤東思想和鄧小平理論,晚上回來再更新。高檔單片機或者dsp最強大的是其庫功能!
0
回復
SKY丶輝煌
LV.10
17
2014-04-08 13:19
@SKY丶輝煌
下午要去上課,毛澤東思想和鄧小平理論,晚上回來再更新。高檔單片機或者dsp最強大的是其庫功能!

有關中斷的程序,interrupt里面的程序未給出,晚上回來也會補充。

謝謝大家,跟大家學習。

0
回復
2014-04-08 13:24
@SKY丶輝煌
有關中斷的程序,interrupt里面的程序未給出,晚上回來也會補充。謝謝大家,跟大家學習。
  好棒~
0
回復
SKY丶輝煌
LV.10
19
2014-04-08 19:25
@電源網-儷儷
[圖片] 好棒~
謝謝
0
回復
SKY丶輝煌
LV.10
20
2014-04-08 22:27

第14個:tim1外部時鐘源模式2從外部觸發引腳數脈沖數

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */
#include"stm8s208r.h"
/********************函數聲明****************************/
void TIM1_Init(void);
void GPIO_Init(void);
/********************主函數******************************/

main()
{
	GPIO_Init();
	TIM1_Init();
	//開啟TIM1
	TIM1_CR1 |= 0X01;
	while (1)
	{
		PE_ODR = ~TIM1_CNTRL;
	}
}
/******************TIM1外部時鐘模式1初始化*****************/
void TIM1_Init(void)
{
	//低電平或下降沿有效
	TIM1_ETR |= 0X80;
	//外部觸發預分頻值為2
	TIM1_ETR |= 0X10;
	//外部觸發濾波器設置為采樣頻率Fsampling = Fmaster/32,N=8
	TIM1_ETR |= 0X0F;
	//使能外部時鐘模式2
	TIM1_ETR |= 0X40;
}
/****************GPIO初始化********************************/
void GPIO_Init(void)
{
	//PG口顯示TIM1_CNTRL中的值
	PG_ODR = 0XFF;
	PG_DDR = 0XFF;
	PG_CR1 = 0XFF;
	PG_CR2 = 0XFF;
	//PB3為TIM1外部觸發引腳,設置為上拉輸入
	PB_DDR = 0X00;
	PB_CR1 = 0XFF;
}

 

0
回復
SKY丶輝煌
LV.10
21
2014-04-08 22:27

第15個:tim1測量方波周期

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */

#include"stm8s208r.h"
unsigned long frequency;
unsigned int captureValue1,captureValue2;
unsigned char gewei,shiwei,baiwei,qianwei;
unsigned char dis[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void TIM1_Init(void);
void CCO_Init(void);
void GPIO_Init(void);
void Display(void);
void Delay(unsigned int t);
main()
{
	unsigned int i;
	/********************系統時鐘不分頻,為16Mhz*************/
	CLK_CKDIVR = 0X00;
	GPIO_Init();
	CCO_Init();
	TIM1_Init();
	while (1)
	{
		/********************捕獲使能**************************/
		TIM1_CCER1 |= 0X01;
		/*******************等待CC1IF被置位********************/
		while((TIM1_SR1 & 0X02) == 0);
		captureValue1 = (unsigned int)TIM1_CCR1H << 8;
		captureValue1 |= TIM1_CCR1L;
		/*******************等待第二次被置位******************/
		while((TIM1_SR1 & 0X02) == 0);
		captureValue2 = (unsigned int)TIM1_CCR1H << 8;
		captureValue2 |= TIM1_CCR1L;
		/*******************捕獲禁止**************************/
		TIM1_CCER1 &= 0XFE;
		/*(captureValue2 - captureValue1)/16000000為測量周期,
					因為進行了8分頻,所以實際頻率*8  ***************/
		frequency = (8 * 16000000UL)/(captureValue2 - captureValue1);
		/*****************單位換算成khz,小數點后1位**********/
		frequency = frequency/100;
		/*****************顯示頻率****************************/
		for(i = 0;i < 500;i++)
		Display();
	}
}
void CCO_Init(void)
{
	/*****************時鐘輸出為FLSI******************/
	CLK_CCOR |= 0X02;
	/****************開啟CCO時鐘輸出******************/
	CLK_CCOR |= 0X01;
}
void TIM1_Init(void)
{
	//CC1通道被配置為輸入,IC1映射在TI1FP1上
	TIM1_CCMR1 |= 0X01;
	//IC1PSC[1:0]被配置為11,即8分頻
	TIM1_CCMR1 |= (0X03 << 2);
	//定時器開始計數
	TIM1_CR1 |= 0x01;
}
void GPIO_Init(void)
{
	//數碼管段選
	PG_ODR = 0XFF;
	PG_DDR = 0XFF;
	PG_CR1 = 0XFF;
	PG_CR2 = 0XFF;
	//數碼管位選
	PB_ODR = 0XFF;
	PB_DDR = 0XFF;
	PB_CR1 = 0XFF;
	PB_CR2 = 0XFF;
}
void Display(void)
{
	qianwei = frequency / 1000;
	baiwei = (frequency % 1000) / 100;
	shiwei = (frequency % 100) / 10;
	gewei = frequency % 10;
	PG_ODR = dis[gewei];
	PB_ODR = 0XFE;
	Delay(100);
	PB_ODR = 0XFF;
	//十位亮小數點
	PG_ODR = dis[shiwei] & 0x7f;
	PB_ODR = 0XFD;
	Delay(100);
	PB_ODR = 0XFF;
	PG_ODR = dis[baiwei];
	PB_ODR = 0XFB;
	Delay(100);
	PB_ODR = 0XFF;
	PG_ODR = dis[gewei];
	PB_ODR = 0XF7;
	Delay(100);
	PB_ODR = 0XFF;
}
void Delay(unsigned int t)
{
	while(t --);
}

 

0
回復
SKY丶輝煌
LV.10
22
2014-04-08 22:28

第十六個:tim1測量pwm方波占空比

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */

#include"stm8s208r.h"
unsigned long frequency;
unsigned char dutyCycle;
unsigned int captureValue1,captureValue2;
unsigned char gewei,shiwei,baiwei,qianwei,dutyCycle1,dutyCycle2;
unsigned char dis[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void TIM1_Init(void);
void GPIO_Init(void);
void Display(void);
void Delay(unsigned int t);
main()
{
	unsigned int i;
	//系統時鐘不分頻,為16Mhz
	CLK_CKDIVR = 0X00;
	GPIO_Init();
	TIM1_Init();
	while (1)
	{
		//清除CC1IF,CC2IF標志位
		TIM1_SR1 &= 0XF9;
		//清除CC1OF標志位
		TIM1_SR2 &= 0XFD;
		//使能捕獲,CC1E = 1,CC2E = 1
		TIM1_CCER1 |= 0X11;
		while((TIM1_SR1 & 0X02) == 0);
		//等待CC2IF被置位
		while((TIM1_SR1 & 0X04) == 0);
		captureValue1 = (unsigned int)TIM1_CCR2H << 8;
		captureValue1 |= TIM1_CCR2L;
		//等待CC1OF被置位
		while((TIM1_SR2 & 0X02) == 0);
		captureValue2 = (unsigned int)TIM1_CCR1H << 8;
		captureValue2 |= TIM1_CCR1L;
		//捕獲禁止
		TIM1_CCER1 &= 0XEE;
		//16000000UL/captureValue2為測量周期,取倒數為頻率
		frequency = (16000000UL/captureValue2);
		//單位換算成KHZ,小數點后1位
		frequency = frequency / 100;
		//captureValue1/captureValure2為占空比
		dutyCycle = (captureValue1 * 100)/captureValue2;
		//顯示頻率
		for(i = 0; i < 400; i++)
		Display();
	}
}
void TIM1_Init(void)
{
	//CC1通道被配置為輸入,IC1映射在TI1FP1上,CC1S = 01
	TIM1_CCMR1 |= 0X01;
	//TI1FP1上升沿有效,CC1P = 0
	TIM1_CCER1 &= ~(1 << 1);
	//CC2通道被配置為輸入,IC2映射在TI1FP2上CC2S = 10
	TIM1_CCMR2 |= 0X02;
	//TI1FP2下降沿有效,CC2P = 1
	TIM1_CCER1 |= (1 << 5);
	//觸發輸入信號為TI1FP1,TS = 101
	TIM1_SMCR |= 0X50;
	//觸發模式為復位觸發,SMS = 100
	TIM1_SMCR |= 0X04;
	//定時器開始計數
	TIM1_CR1 |= 0X01;
}
void GPIO_Init(void)
{
	//數碼管段選
	PG_ODR = 0XFF;
	PG_DDR = 0XFF;
	PG_CR1 = 0XFF;
	PG_CR2 = 0XFF;
	//數碼管位選
	PB_ODR = 0XFF;
	PB_DDR = 0XFF;
	PB_CR1 = 0XFF;
	PB_CR2 = 0XFF;
}
void Display(void)
{
	qianwei = frequency / 1000;
	baiwei = (frequency % 1000) / 100;
	shiwei = (frequency % 100) / 10;
	gewei = frequency % 10;
	dutyCycle1 = dutyCycle % 10;
	dutyCycle2 = dutyCycle / 10;
	
	PG_ODR = dis[gewei];
	PB_ODR = 0XFE;
	Delay(100);
	PB_ODR = 0XFF;
	//十位亮小數點
	PG_ODR = dis[shiwei] & 0x7f;
	PB_ODR = 0XFD;
	Delay(100);
	PB_ODR = 0XFF;
	
	PG_ODR = dis[baiwei];
	PB_ODR = 0XFB;
	Delay(100);
	PB_ODR = 0XFF;
	
	PG_ODR = dis[qianwei];
	PB_ODR = 0XF7;
	Delay(100);
	PB_ODR = 0XFF;
	
	PG_ODR = dis[dutyCycle2];
	PB_ODR = 0X7F;
	Delay(100);
	PB_ODR = 0XFF;
	
	PG_ODR = dis[dutyCycle1];
	PB_ODR = 0XBF;
	Delay(100);
	PB_ODR = 0XFF;
}
void Delay(unsigned int t)
{
	while(t --);
}

 

0
回復
SKY丶輝煌
LV.10
23
2014-04-08 22:29

第17個:tim1邊沿對齊pwm

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */
/*******************************************************
**  		功能:PWM控制直流電機轉速
**	 		描述:TIM1工作在邊沿對齊模式 (向上計數)
**							PC1輸出 75%占空比的PWM
**							PC2輸出	50%占空比的PWM
**			說明:使用內部HSI 16MHZ
*******************************************************/

#include"stm8s208r.h"
_Bool IN1 @PB_ODR:3;
_Bool IN2 @PB_ODR:4;
_Bool IN3 @PB_ODR:5;
_Bool IN4 @PB_ODR:6;

void GPIO_Init(void);
void MotorCW(void);
void MotorCCW(void);
void MotorStop(void);
void TIM1_OC1_INIT(void);
void TIM1_OC2_INIT(void);
void Delay(unsigned int t);

main()
{
	//內部HSI時鐘不分頻,f= 16MHZ
	CLK_CKDIVR = 0X00;
	GPIO_Init();
	TIM1_OC1_INIT();
	TIM1_OC2_INIT();
	while (1)
	{
		MotorCW();
		Delay(60000);
		MotorCCW();
		Delay(60000);
		MotorStop();
		Delay(60000);
	}
}
void Delay(unsigned int t)
{
	while(t--);
}
void GPIO_Init(void)
{
	PB_DDR = 0X78;
	PB_CR1 = 0X78;
	PB_CR2 = 0X78;
}
void MotorCW(void)
{
	IN1 = 1;
	IN2 = 0;
	IN3 = 1;
	IN4 = 0;
}
void MotorCCW(void)
{
	IN1 = 0;
	IN2 = 1;
	IN3 = 0;
	IN4 = 1;
}
void MotorStop(void)
{
	IN1 = 0;
	IN2 = 0;
	IN3 = 0;
	IN4 = 0;
}
void TIM1_OC1_INIT(void)
{
	//定時器溢出值TIM1_ARR = 0X3E80 = 16000,輸出波形頻率為1KHZ
	TIM1_ARRH = 0X3E;
	TIM1_ARRL = 0X80;
	//CCR1 = 0X2EE0 = 12000,輸出波形占空比為75%
	TIM1_CCR1H = 0X2E;
	TIM1_CCR1L = 0XE0;
	//OC1M[110]PWM1模式
	TIM1_CCMR1 = 0X60;
	//CC1P = 0,CC1E = 1;高電平有效
	TIM1_CCER1 = 0X01;
	//空閑狀態為高
	TIM1_OISR = 0X01;
}
void TIM1_OC2_INIT(void)
{
	//CCR2 = 0X1F40 = 8000,輸出波形占空比為50%
	TIM1_CCR2H = 0X1F;
	TIM1_CCR2L = 0X40;
	//0C2M[110]PWM1模式
	TIM1_CCMR2 = 0X60;
	//CC2P = 0,CC2E = 1;高電平有效
	TIM1_CCER2 = 0X11;
	//空閑狀態為高
	TIM1_OISR = 0X01;
	//CEN = 1開定時器,CMS[1:0]邊沿對齊模式DIR選擇向上計數模式
	TIM1_CR1 = 0X01;
	//打開OCI輸出使能
	TIM1_BKR = 0X80;
}

 

0
回復
SKY丶輝煌
LV.10
24
2014-04-09 08:45

第18個:AD簡易數字電壓表

/* MAIN.C file
 * 
 * Copyright (c) 2002-2005 STMicroelectronics
 */

#include"stm8s208r.h"
unsigned char const shumaguan[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//ADCValue數組存放A/D采樣值,voltageADC為數字濾波后的結果
unsigned int ADCValue[10] = {0},voltageADC = 0;
//voltage為電壓計算結果,單位mV
unsigned int voltage = 0;

void GPIO_Init(void);
void ADC_Init(void);
void ADConvert(void);
void DigitalFiltering(void);
void Display(void);
void Delay(unsigned int t);
main()
{
	unsigned char i;
	GPIO_Init();
	ADC_Init();
	while (1)
	{
		//連續轉換10次
		ADConvert();
		//數字濾波
		DigitalFiltering();
		i = 200;
		while(i--)
		Display();
	}
}
void GPIO_Init(void)
{
	//PG口數碼管段選,PE口數碼管位選
	PG_ODR = 0XFF;
	PG_DDR = 0XFF;
	PG_CR1 = 0XFF;
	PE_ODR = 0XFF;
	PE_DDR = 0XFF;
	PE_CR1 = 0XFF;
}
void ADC_Init(void)
{
	//fADC = fMaster/2,連續轉換模式
	ADC_CR1 = 0x02;
	//選擇通道0(PB0)?
	ADC_CSR = 0X00;
	//數據右對齊
	ADC_CR2 |= 0X08;
	//從低功耗模式喚醒
	ADC_CR1 |= 0X01;
}
void ADConvert(void)
{
	unsigned char count = 0;
	//開啟連續轉換,不可直接寫入0X03
	ADC_CR1 |= 0X02;
	ADC_CR1 |= 0X01;
	ADC_CR1 |= 0x01;
	while(count < 10)
	{
		//等待轉換結束
		while((ADC_CSR & 0X80) == 0);
		//清除轉換結束標志位
		ADC_CSR &= ~0X80;
		ADCValue[count] = (unsigned int)ADC_DRL;
		ADCValue[count] |= (unsigned int)ADC_DRH << 8;
		count++;
	}
	//關閉連續轉換
	ADC_CR1 &= ~0X02;
}
void DigitalFiltering(void)
{
	unsigned char i,j;
	unsigned int temp;
	//對數組排序
	for(i = 10;i >= 1;i--)
	{
		for(j = 0;j <(i-1);j++)
		{
			if(ADCValue[j] > ADCValue[j +1])
			{
				temp = ADCValue[j];
				ADCValue[j] = ADCValue[j +1];
				ADCValue[j +1] = temp;
			}
		}
	}
	//舍棄最大和最小的兩個數,然后求平均值
	voltageADC = 0;
	for(i = 2;i <= 7;i++)
	voltageADC += ADCValue[i];
	voltageADC/6;
}
void Display(void)
{
	unsigned char displayArray[4],i;
	//voltage/3300(mV)= voltageADC/1023
	voltage = (unsigned int)((unsigned long)voltageADC * 3240UL / 1023UL);
	//拆分數據,使用數碼管顯示
	displayArray[3] = voltage / 1000;
	displayArray[2] = (voltage % 1000) / 100;
	displayArray[1] = (voltage % 100) / 10;
	displayArray[0] = voltage % 10;
	//使用數碼管顯示電壓值,單位mV
	for(i = 0;i < 4;i++)
	{
		PG_ODR = shumaguan[displayArray[i]];
		PE_ODR = ~(0X01 << i);
		Delay(100);
		PE_ODR = 0xff;
	}
}
void Delay(unsigned int t)
{
	while(t--);
}

 

0
回復
SKY丶輝煌
LV.10
25
2014-04-10 20:54
看來這款單片機大家了解的甚少啊~
0
回復
秋柳
LV.2
26
2014-04-10 22:17
@SKY丶輝煌
看來這款單片機大家了解的甚少啊~

我覺得其實不是了解甚少,使用的大有人在。

問題在于:1、這單片機比起51系列來,算是新的,高檔點的。這電源網里大部分人都是搞電源的,真正研究mcu的還不是很多。

2、你的這些程序,大部分都是個別功能單獨實現,并不能做成個項目似的。往往開發板會附帶很多這樣的程序,沒必要仔細去讀你的程序。

3、這樣的mcu,或者說STM32,大部分人去使用庫函數來編程,容易調用,容易讀懂,容易嵌入。

所以你這里得到的回答和認可比較少。其實你可以拿些在編程中遇到的問題,跟大家討論下,會更有價值,共同進步!

0
回復
SKY丶輝煌
LV.10
27
2014-04-11 09:18
@秋柳
我覺得其實不是了解甚少,使用的大有人在。問題在于:1、這單片機比起51系列來,算是新的,高檔點的。這電源網里大部分人都是搞電源的,真正研究mcu的還不是很多。2、你的這些程序,大部分都是個別功能單獨實現,并不能做成個項目似的。往往開發板會附帶很多這樣的程序,沒必要仔細去讀你的程序。3、這樣的mcu,或者說STM32,大部分人去使用庫函數來編程,容易調用,容易讀懂,容易嵌入。所以你這里得到的回答和認可比較少。其實你可以拿些在編程中遇到的問題,跟大家討論下,會更有價值,共同進步!
謝謝。說的很對。看來我應該把庫函數的源文件上傳。此貼從此終結,不再更新
0
回復
SKY丶輝煌
LV.10
28
2014-04-11 09:22
SKY丶輝煌
LV.10
29
2014-04-11 09:22
@SKY丶輝煌
AD簡易數字電壓表(庫).rar
0
回復
SKY丶輝煌
LV.10
30
2014-04-11 09:22
@SKY丶輝煌
TIM1邊沿對齊PWM(庫).rar
0
回復
SKY丶輝煌
LV.10
31
2014-04-11 09:22
@SKY丶輝煌
TIM1捕獲比較通道數數(庫).rar
0
回復
主站蜘蛛池模板: 九九热在线视频观看这里只有精品 | 中文字幕+乱码+中文乱码 | 国产又粗又黄又爽又硬的软件 | 中品极品少妇xxx | 国产免费久久精品99RE丫丫 | 91少妇香蕉久久精 | 人妻无码中文久久久久专区 | 婷婷精品进入 | 中国一级黄色片 | 日本aⅴ中文字幕 | 国产处女视频 | 色yeye免费人成网站在线观看 | 99re视频在线免费观看 | 亚洲午夜精品一区二区三区 | 台湾av一区二区三区 | 手机免费av在线 | 国产女人18毛片水真多1 | 香港三级精品三级在线专区 | 蜜桃麻豆WWW久久囤产精品 | 午夜免费福利在线 | 欧美成人A片无码免费 | 啪啪网址大全 | 少妇高潮惨叫正在播放对白 | 亚洲福利在线播放 | 超碰97免费观看 | 亚洲精品无码一区二区三区 | 久久久久国产成人免费精品免费 | 黄色免费一级视频 | 亚洲精品成人网站在线 | 国产在线第一区 | 天堂а在线最新版在线 | 青青草久久| 亚洲AV成人WWW永久无码精品 | 内射白嫩少妇超碰 | 国产91免费视频 | 日韩视频中文字幕视频一区 | 日韩国产一区二区三区 | 无码一区二区三区不卡AV | 国产精品综合久久久精品综合蜜臀 | 精品无码AV无码专区 | 夜色太晚|