赛元芯片使用
一、環(huán)境部署
查看賽元開發(fā)量產(chǎn)工具手冊(cè)的2 SC LINK仿真使用說(shuō)明章節(jié)
點(diǎn)擊LOAD,仿真器下載程序成功如下圖所示。
二、關(guān)于賽元單片機(jī)的一些使用總結(jié)
2.硬件實(shí)現(xiàn)數(shù)碼管顯示,注意要與芯片上的引腳對(duì)應(yīng),Cx為位選控制引腳,通過(guò)0-7數(shù)值控制位選,Sx為段控制引腳,查表獲取其對(duì)應(yīng)的操作地址。
//led_display.c #include "LED_DISPLAY.H" //-----------------------共陰數(shù)碼管編碼表--------------------------- //uint8_t code LedCodeTab[]={0xD7,0x14,0xCD,0x5D,0x1E,0x5B,0xDB,0x15,0xDf,0x5F,0x9F,0xDA,0xC3,0xDC,0xCB,0x8B,0x00,0xff,0x08}; //-----------------------共陽(yáng)數(shù)碼管編碼表--------------------------- uint8_t code LedCodeTab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //-----------------------LED顯示RAM數(shù)據(jù)緩存數(shù)組---------------- uint8_t data LedTemp[8] = {0,0,0,0,0,0,0,0}; //-----------------------LED顯示RAM配置----------------------- uint8_t xdata LedDisplay[28] _at_ 0X700; void LedSeg_initail(void) { // 軟件實(shí)現(xiàn) #if 0COM1(0);COM2(0);COM3(0);COM4(0);COM5(0);COM6(0);//seg0-7 outputGPIO_Init(GPIO1, _BIT6|_BIT7, GPIO_MODE_OUT_PP);GPIO_Init(GPIO2, _BIT5|_BIT4|_BIT3|_BIT2|_BIT1|_BIT0, GPIO_MODE_OUT_PP);//comm1-6 output//GPIO_Init(GPIO3, _BIT5|_BIT4|_BIT3|_BIT2|_BIT1|_BIT0, GPIO_MODE_OUT_PP);GPIO_Init(GPIO3, _BIT5|_BIT4|_BIT3|_BIT2|_BIT6|_BIT7, GPIO_MODE_OUT_PP);GPIO_WriteBit(GPIO1, _BIT6|_BIT7,0);GPIO_WriteBit(GPIO2, _BIT5|_BIT4|_BIT3|_BIT2|_BIT1|_BIT0,0);GPIO_WriteBit(GPIO3, _BIT5|_BIT4|_BIT3|_BIT2|_BIT6|_BIT7,0); #endif// 硬件實(shí)現(xiàn)DDIC_Init(DDIC_DUTYCYCLE_D6, 0X00, 0XC0, 0X3F, 0XFC); //占空比1/6,P16~P17,P20~P25,P32~P37為DDIC輸出腳DDIC_LEDConfig(); //DDIC配置為L(zhǎng)ED模式DDIC_Cmd(ENABLE); //數(shù)碼管初始化 }/************************************************** *函數(shù)名稱:void LedSegData(UINT8 LedData,LedSelCOM COMx) *函數(shù)功能:LED顯示數(shù)據(jù)轉(zhuǎn)換 *入口參數(shù):LedData LED顯示數(shù)據(jù)COMx COM口選擇(取值范圍:LEDCOM0~7) *出口參數(shù):void *功能說(shuō)明: **************************************************/ void LedSegData(uint8_t LedData,LedSelCOM COMx) {LedTemp[0] |= ((LedData>>0)&0x01)<<COMx;LedTemp[1] |= ((LedData>>1)&0x01)<<COMx;LedTemp[2] |= ((LedData>>2)&0x01)<<COMx;LedTemp[3] |= ((LedData>>3)&0x01)<<COMx;LedTemp[4] |= ((LedData>>4)&0x01)<<COMx;LedTemp[5] |= ((LedData>>5)&0x01)<<COMx;LedTemp[6] |= ((LedData>>6)&0x01)<<COMx;LedTemp[7] |= ((LedData>>7)&0x01)<<COMx; }/************************************************** *函數(shù)名稱:void Led_Display(void) *函數(shù)功能:led *入口參數(shù):無(wú) *出口參數(shù):void *功能說(shuō)明:COM口必須跟使用的COM相對(duì)應(yīng) **************************************************/ void Led_Display(void) {UINT8 i;g_bLEDDispTimerFlag = 0; //數(shù)碼管調(diào)用標(biāo)志位for(i=0;i<8;i++){LedTemp[i]=0; //段顯示清零,此處不能刪除 !!!!!}LedSegData(LedCodeTab[(g_bTimeHourHight16%1000/100)], LEDCOM7); // 第一位數(shù)碼管LedSegData(LedCodeTab[(g_bTimeHourHight16%100/10)], LEDCOM6); // 第二位數(shù)碼管LedSegData(LedCodeTab[(g_bTimeHourHight16%10)], LEDCOM2); // 第三位數(shù)碼管LedSegData(LedCodeTab[(g_bTimeHourLow16%1000/100)], LEDCOM3); // 第四位數(shù)碼管LedSegData(LedCodeTab[(g_bTimeHourLow16%100/10)], LEDCOM4); // 第五位數(shù)碼管LedSegData(LedCodeTab[(g_bTimeHourLow16%10)]&0x7F, LEDCOM5); // 第六位數(shù)碼管,帶小數(shù)點(diǎn)顯示LedDisplay[17] = LedTemp[0];LedDisplay[16] = LedTemp[1];LedDisplay[15] = LedTemp[2];LedDisplay[14] = LedTemp[3];LedDisplay[13] = LedTemp[4];LedDisplay[12] = LedTemp[5];LedDisplay[11] = LedTemp[6];LedDisplay[10] = LedTemp[7]; }//led_display.h #ifndef _LED_DISPLAY_H_ #define _LED_DISPLAY_H_ #include "sc92f754x.h"typedef enum {LEDCOM0 = (uint8_t)0x00,LEDCOM1 = (uint8_t)0x01,LEDCOM2 = (uint8_t)0x02,LEDCOM3 = (uint8_t)0x03,LEDCOM4 = (uint8_t)0x04,LEDCOM5 = (uint8_t)0x05,LEDCOM6 = (uint8_t)0x06,LEDCOM7 = (uint8_t)0x07 } LedSelCOM;void LedSegData(uint8_t LedData,LedSelCOM COMx); void Led_Display(void); #endif3.控制蜂鳴器響的頻率思路:通過(guò)定時(shí)器定時(shí)反轉(zhuǎn)蜂鳴器IO口電平實(shí)現(xiàn)
void Timer0Init(void) { TIM0_TimeBaseInit(TIM0_PRESSEL_FSYS_D1,TIM0_MODE_TIMER); //定時(shí)產(chǎn)生方波驅(qū)動(dòng)蜂鳴器 TIM0_WorkMode0Config(8192-1600); TIM0_Cmd(ENABLE);TIM0_ITConfig(ENABLE,LOW);//使能Timer0計(jì)數(shù) } void Timer0Interrupt() interrupt 1 { TIM0_Mode0SetReloadCounter(8192-1600); //定時(shí)0.1ms, 頻率10KhzT0FlagpwmCount++; if(T0FlagpwmCount>=5) // 2khz { T0FlagpwmCount = 0; BuzzerPWM(); } } void BuzzerPWM(void) { static BOOL Flag = 0;Flag = !Flag;if(Flag) { GPIO_WriteHigh(GPIO1,GPIO_PIN_0);} else{ GPIO_WriteLow(GPIO1,GPIO_PIN_0); } }4.關(guān)于74HC595的使用
#define DCLK(x) if(x){GPIO_WriteHigh(hw_CLK_Pin_36());} else{GPIO_WriteLow(hw_CLK_Pin_36());} #define DATA(x) if(x){GPIO_WriteHigh(hw_DATA_Pin_32());} else{GPIO_WriteLow(hw_DATA_Pin_32());} #define RCLK_L(x) if(x){GPIO_WriteHigh(hw_CS_Pin_35());} else{GPIO_WriteLow(hw_CS_Pin_35());} //全輸出 hc595_send_data(0X00); //不輸出 hc595_send_data(0XFF); void hc595_send_data( u8 input_data ) { u8 i; DCLK(1);//SHCP RCLK_L(1);//STCP for( i = 0 ; i < 8; i++ ) { DATA((input_data >> 7)&0x01); //DS input_data <<= 1; DCLK(0);//SHCP _nop_(); _nop_(); _nop_(); _nop_(); DCLK(1);//SHCP } RCLK_L(0);//STCP _nop_(); _nop_(); _nop_(); _nop_(); RCLK_L(1);//STCP }
5.ADC使用,返回值為0.0到1.0
6.ADC取表值,ADC讀取值轉(zhuǎn)化為范圍為0~100的值。返回值為0.0到1.0(反向)
#include "sc92f754x_adc.h" //表值,獲取ADC讀取值在表中的下標(biāo)值,0~25,再乘以4,即可通過(guò)ADC讀取值轉(zhuǎn)化為范圍為0~100的值。 uint16_t code AdcWaterValue[26] = { 30 , 102 , 107 , 112 , 117 , 126 , 133 , 139 , 145 , 150 , 155 , 160 , 163 , 165 , 167 , 169 , 171 , 173 , 175 , 177 , 179 , 181 , 183 , 185 , 187 , 189 };/************************************************** *函數(shù)名稱:void AdcWaterInit(void) *函數(shù)功能:ADC初始化 *入口參數(shù):void *出口參數(shù):void *功能說(shuō)明:使能ADC通道14,參考電壓為VDD **************************************************/ void AdcWaterInit(void) {ADC_Init(ADC_PRESSEL_FOSC_D6, ADC_Cycle_6Cycle);ADC_ChannelConfig(ADC_CHANNEL_0, ENABLE); // 20201224ADC_Cmd(ENABLE);ADC_VrefConfig(ADC_VREF_VDD); }/************************************************** *函數(shù)名稱:void GetADCValue(void) *函數(shù)功能:得到溫度值在數(shù)組ADCValueToTemp[]的下標(biāo)值 *入口參數(shù):void *出口參數(shù):void *功能說(shuō)明:每個(gè)下標(biāo)值測(cè)十次,去掉最高最低值求平均值 **************************************************/ float GetAdcWaterValue(void) {// 水溫傳感器溫度與電阻關(guān)系: 75度195+-10Ω 110度 72+-5Ω// 直接將最大最小值替換就行了,由于沒有水溫變化曲線,目前是線性處理 //#define MAX_RES 195 //20201109 //#define MIN_RES 72 //20201109 #define MAX_RES 250 //20201225 #define MIN_RES 25 //20201225#define UP_RES 100 //上拉電阻分壓#define MIN_ADC (256*MIN_RES/(MIN_RES+UP_RES))#define MAX_ADC ((uint16_t)256*MAX_RES/(uint16_t)(MAX_RES+UP_RES))// 256*72/172=107 256*195/295=169uint8_t j,TEMP;static uint8_t AdcBuf[20] = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};static uint8_t index = 0;static u16 PreValue = 0;static u16 CurValue = 0;uint16_t AdcWater_Value; float adcValue=0.0;ADC_ChannelConfig(ADC_CHANNEL_0, ENABLE); // 20201224ADC_StartConversion(); //開始一次ADC轉(zhuǎn)換while(!ADC_GetFlagStatus()); //轉(zhuǎn)換完成,等待標(biāo)志位置1ADC_ClearFlag();AdcBuf[index]= ADC_GetConversionValue(); //得到ADC轉(zhuǎn)換值//20201107 當(dāng)ADC 采集到滑阻數(shù)值到達(dá)這個(gè)程度時(shí),電機(jī)不轉(zhuǎn)了,加了這段解決if(AdcBuf[index] >= 0XF0){adcValue = 1.0; // 檢測(cè)有沒有接傳感器}else{index = (++index)%20;CurValue = (AdcBuf[0]+AdcBuf[1]+AdcBuf[2]+AdcBuf[3]+AdcBuf[4]+AdcBuf[5]+AdcBuf[6]+AdcBuf[7]+AdcBuf[8]+AdcBuf[9]+AdcBuf[10]+AdcBuf[11]+AdcBuf[12]+AdcBuf[13]+AdcBuf[14]+AdcBuf[15]+AdcBuf[16]+AdcBuf[17]+AdcBuf[18]+AdcBuf[19])/20;//防止在臨界值擺動(dòng),如果這次的ADC 值與上次ADC 值相差不大,則取上次值。if(Abs(PreValue,CurValue)<2){AdcWater_Value=PreValue;}else{AdcWater_Value=CurValue;}PreValue=AdcWater_Value;for(j=0;j<26;j++){if(AdcWater_Value<AdcWaterValue[0]){TEMP = 0; //取得最小值break; }if((j+1)>25){TEMP = 25; //數(shù)組最大下標(biāo)不越界break;}if((AdcWater_Value >= AdcWaterValue[j]) && (AdcWater_Value < AdcWaterValue[j+1])){ TEMP = j; //得轉(zhuǎn)換值對(duì)應(yīng)數(shù)組下標(biāo)break;} }adcValue=(float)(TEMP*4)/100;if(adcValue>1){adcValue=1;} //防錯(cuò)處理if(adcValue<0){adcValue=0;}}return (1-adcValue); // 輸出反向 }//返回兩個(gè)數(shù)的絕對(duì)差值 u16 Abs(u16 Val1,u16 Val2) {if(Val1 >= Val2){return (Val1-Val2);}else{return (Val2-Val1);} }7.EEPROM使用
#define _VE2PROM_C_ #include "FUNCTION.H" #include "sc92f754x.h"#ifdef _MAIN_C_ #define _EXTERN_ #else #define _EXTERN_ extern #endif_EXTERN_ WORKDATA g_WorkData;#define address0 5 #define address1 6 #define address2 7 #define address3 8 #define address4 9 #define address5 10 #define address6 11 #define address7 12 typedef struct t_WorkData {u8 _0XAA;u8 ReserveBuf[4];u8 _0X55;u8 XorSum; }WORKDATA;BOOL VerifySetting(WORKDATA WorkData,u8 numb) {u8 i;u8 tmpCheckSum = 0x00;u8* pDat=(u8 *)&WorkData;if((WorkData._0X55== 0x55) && (WorkData._0XAA== 0xaa)){for(i = 0; i < (numb-1); i++){tmpCheckSum ^= pDat[i];}if(WorkData.XorSum == tmpCheckSum){return(1);}else{return(0);}}else{return(0);} } void E2promXorSum(WORKDATA *pE2p,u8 length) {u8 i;u8 tmpCheckSum = 0x00;u8* pDat=(u8*)pE2p;pE2p->_0X55 = 0x55;pE2p->_0XAA = 0xaa;for(i = 0; i < (length-1); i++){tmpCheckSum ^= pDat[i];}//printf(" VerifySetting tmpCheckSum=:%d\n",tmpCheckSum);pE2p->XorSum = tmpCheckSum; }void ReadWorkData(void) {u8 high=0;u8 low=0; u8 B8bit=0,B16bit=0,B24bit=0,B32bit=0;IAP_SetHoldTime(IAP_HOLDTIME_1500US); //HoldTime時(shí)間為1MSIAP_SetOperateRange(IAP_OPERATERANGE_ONLY_EEPROM); //只允許EEPROM進(jìn)行IAP操?g_WorkData._0XAA=IAP_ReadByte(address0,IAP_MEMTYPE_EEPROM);g_WorkData.ReserveBuf[0]=IAP_ReadByte(address1,IAP_MEMTYPE_EEPROM);g_WorkData.ReserveBuf[1]=IAP_ReadByte(address2,IAP_MEMTYPE_EEPROM); g_WorkData.ReserveBuf[2]=IAP_ReadByte(address3,IAP_MEMTYPE_EEPROM);g_WorkData.ReserveBuf[3]=IAP_ReadByte(address4,IAP_MEMTYPE_EEPROM); g_WorkData._0X55=IAP_ReadByte(address5,IAP_MEMTYPE_EEPROM);g_WorkData.XorSum=IAP_ReadByte(address6,IAP_MEMTYPE_EEPROM);if(VerifySetting(g_WorkData,sizeof(WORKDATA))){ IAP_SetHoldTime(IAP_HOLDTIME_1500US); //HoldTime時(shí)間為1MSIAP_SetOperateRange(IAP_OPERATERANGE_ONLY_EEPROM); //只允許EEPROM進(jìn)行IAP操?g_WorkData.ReserveBuf[0]=IAP_ReadByte(address1,IAP_MEMTYPE_EEPROM);g_WorkData.ReserveBuf[1]=IAP_ReadByte(address2,IAP_MEMTYPE_EEPROM); g_WorkData.ReserveBuf[2]=IAP_ReadByte(address3,IAP_MEMTYPE_EEPROM);g_WorkData.ReserveBuf[3]=IAP_ReadByte(address4,IAP_MEMTYPE_EEPROM); }else{ g_WorkData._0X55 =0X55;g_WorkData._0XAA = 0Xaa;g_WorkData.ReserveBuf[0]=0;g_WorkData.ReserveBuf[1]=0;g_WorkData.ReserveBuf[2]=0;g_WorkData.ReserveBuf[3]=0;E2promXorSum(&g_WorkData,sizeof(WORKDATA));}//由于測(cè)試時(shí)32位的變量值結(jié)果只有65535,只好使用2個(gè)16位變量代替B8bit=g_WorkData.ReserveBuf[0];B16bit=g_WorkData.ReserveBuf[1];B24bit=g_WorkData.ReserveBuf[2];B32bit=g_WorkData.ReserveBuf[3];g_bTimeHourLow16=(B16bit << 8) | B8bit;g_bTimeHourHight16=(B32bit << 8) | B24bit; }void SaveWorkData(void) {uint8_t i=0;uint8_t *pData; g_WorkData._0XAA = 0XAA;g_WorkData._0X55 = 0X55;g_WorkData.ReserveBuf[0]=g_bTimeHourLow16 & 0xff; // 8位g_WorkData.ReserveBuf[1]=(g_bTimeHourLow16 >> 8) & 0xff; // 16位 g_WorkData.ReserveBuf[2]=g_bTimeHourHight16 & 0xff; // 24位g_WorkData.ReserveBuf[3]=(g_bTimeHourHight16 >> 8) & 0xff; // 32位 E2promXorSum(&g_WorkData,sizeof(WORKDATA));pData = (uint8_t *)&g_WorkData;IAP_SetHoldTime(IAP_HOLDTIME_1500US); //HoldTime時(shí)間為1.5MSIAP_SetOperateRange(IAP_OPERATERANGE_ONLY_EEPROM); //只允許EEPROM進(jìn)行IAP操?for(i=5;i<12;i++){IAP_ProgramByte(i, pData[i-5], IAP_MEMTYPE_EEPROM, 0xf0);} }總結(jié)
- 上一篇: 基于python的脑电地形图显示
- 下一篇: R语言read.csv乱码问题UTF-8