乖女从小被C到大H文NP|人妻洗澡被强公日日澡电影|小柔被六个男人躁到早上电影|被男人吃奶跟添下面特舒服|被绑在坐桩机上抹春药BL推文

技術(shù)熱線: 4007-888-234
設(shè)計(jì)開發(fā)

專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

開發(fā)工具

提供開發(fā)工具、應(yīng)用測(cè)試 完善的開發(fā)代碼案例庫(kù)分享

技術(shù)支持

從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產(chǎn)品競(jìng)爭(zhēng)力

新聞中心

提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動(dòng)態(tài)

PIC單片機(jī)C語(yǔ)言編程實(shí)例二

更新時(shí)間: 2019-01-05
閱讀量:3522

6.1 A/D轉(zhuǎn)換的應(yīng)用
例6.1 A/D轉(zhuǎn)換初始化程序
//A/D轉(zhuǎn)換初始化子程序
void adinitial( )
{
ADCON0 = 0x51; //選擇A/D通道為RA2,打開A/D轉(zhuǎn)換器
//在工作狀態(tài),且使AD轉(zhuǎn)換時(shí)鐘為8tosc
ADCON1 = 0X80; //轉(zhuǎn)換結(jié)果右移,及ADRESH寄存器的高6位為”0”
//且把RA2口設(shè)置為模擬量輸入方式
PIE1 = 0X00;
PIE2 = 0X00;
ADIE = 1; //A/D轉(zhuǎn)換中斷允許
PEIE = 1; //外圍中斷允許
TRISA2=1; //設(shè)置RA2為輸入方式
}

6.1.2 程序清單
下面給出一個(gè)調(diào)試通過的例程,可作為讀者編制程序的參考。該程序中用共用體的方式把A/D轉(zhuǎn)換的10位結(jié)果組合在一起。有關(guān)共用體的詳細(xì)資料請(qǐng)參考本書相關(guān)章節(jié)。

include

union adres
{int y1;
unsigned char adre[2];
}adresult; //定義一個(gè)共用體,用于存放A/D轉(zhuǎn)換的結(jié)果
unsigned char i;
unsigned int j;
//系統(tǒng)各I/O口初始化子程序
void initial()
{
TRISD=0X00; //D口為輸出
i=0x00;
}
//A/D轉(zhuǎn)化初始化子程序
void adinitial()
{
ADCON0=0x51; //選擇A/D通道為RA2,打開A/D轉(zhuǎn)換器
//在工作狀態(tài),且使A/D轉(zhuǎn)換時(shí)鐘為8tosc
ADCON1=0X80; //轉(zhuǎn)換結(jié)果右移,及ADRESH寄存器的高6位為”0”
//且把RA2口設(shè)置為模擬量輸入方式
PIE1=0X00;
PIE2=0X00;
ADIE=1; //A/D轉(zhuǎn)換中斷允許
PEIE=1; //外圍中斷允許
TRISA2=1; //設(shè)置RA2為輸入方式
}
//延時(shí)子程序
void delay()
{
for(j=5535;—j;) continue;
}
//報(bào)警子程序
void alarm()
{
i=i^0xFF; //通過異或方式每次把i的各位值取反
PORTD=i; //D口輸出i的值
}
//中斷服務(wù)程序
void interrupt adint(void)
{
ADIF=0; //清除中斷標(biāo)志
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH; //讀取并存儲(chǔ)A/D轉(zhuǎn)換結(jié)果,A/D轉(zhuǎn)換的結(jié)果通過共
//用體的形式放入了變量y1中
if(adresult.y1>0x200)
{
alarm(); //如果輸入的模擬量大于2.5V(對(duì)應(yīng)數(shù)字量
//0X200h),則調(diào)用報(bào)警子程序
delay(); //調(diào)用延時(shí)子程序,使電壓檢測(cè)不要過于頻繁
}
else PORTD=0XF0 ; //如果輸入的模擬量小于2.5V,則與D口相連的
//8個(gè)發(fā)光二極管的低4個(gè)發(fā)亮,表示系統(tǒng)正常
ADGO=1; //啟動(dòng)下一次A/D轉(zhuǎn)換
}
//主程序
main()
{
adinitial(); //A/D轉(zhuǎn)換初始化
initial(); //系統(tǒng)各I/O口初始化
ei(); //總中斷允許
ADGO=1; //啟動(dòng)A/D轉(zhuǎn)換
while(1)
{
;
} //等待中斷,在中斷中循環(huán)檢測(cè)外部電壓
}

6.2.2 I2C總線工作方式相關(guān)子程序
1.C語(yǔ)言編寫的I2C總線工作方式的初始化子程序
//I2C初始化子程序
void i2cint()
{
SSPCON = 0X08; //初始化SSPCON寄存器
TRISC3 =1; //設(shè)置SCL為輸入口
TRISC4 =1; //設(shè)置SDA為輸入口
TRISA4 = 0;
SSPSTAT=0X80; //初始化SSPSTAT寄存器
SSPADD=0X02; //設(shè)定I2C時(shí)鐘頻率
SSPCON2=0X00; //初始化SSPCON2寄存器
di(); //關(guān)閉總中斷
SSPIF=0; //清SSP中斷標(biāo)志
RA4=0; //關(guān)掉74HC165的移位時(shí)鐘使能,以免74HC165移位
//數(shù)據(jù)輸出與I2C總線的數(shù)據(jù)線發(fā)生沖突(此操作與該
//實(shí)驗(yàn)板的特殊結(jié)構(gòu)有關(guān),不是通用的)
SSPEN=1; //SSP模塊使能
}

2.C語(yǔ)言編寫的I2C總線工作方式傳輸數(shù)據(jù)子程序
需要發(fā)送的數(shù)據(jù)在寄存器j中。
//I2C總線輸出數(shù)據(jù)子程序
i2cout()
{
SEN=1; //產(chǎn)生I2C啟動(dòng)信號(hào)
for(n=0x02;—n;) continue;//給予一定的延時(shí),保證啟動(dòng)
do {
RSEN=1; //產(chǎn)生I2C重啟動(dòng)信號(hào)
}while(SSPIF==0); //如果沒能啟動(dòng),則反復(fù)啟動(dòng),直到啟動(dòng)為止
SSPIF=0; //SSPIF標(biāo)志清0
SSPBUF=0X58; //I2C總線發(fā)送地址字節(jié)
do {

}while(SSPIF==0); //等待地址發(fā)送完畢
SSPIF=0; //SSPIF標(biāo)志清0
SSPBUF=0X01; //I2C總線發(fā)送命令字節(jié)
do {

}while(SSPIF==0); //等待命令發(fā)送完畢
SSPIF=0; //SSPIF標(biāo)志清0
SSPBUF=j; //I2C總線發(fā)送數(shù)據(jù)字節(jié)
do {

}while(SSPIF==0); //等待數(shù)據(jù)發(fā)送完畢
SSPIF=0; //SSPIF標(biāo)志清0
PEN=1; //產(chǎn)生停止條件
do {
;
}while(SSPIF==0); //等待停止條件產(chǎn)生
SSPIF=0; //SSPIF標(biāo)志清0
}
6.2.4程序清單
下面給一個(gè)例程。該程序利用MAX518進(jìn)行D/A轉(zhuǎn)換,且從D/A0引腳輸出一個(gè)正弦波形??勺鳛樽x者編制程序的參考。特別注意,在調(diào)試該程序時(shí),把模板上的鈕子開關(guān)S8拔向高電平,以免發(fā)生資源沖突。

include

//本程序?qū)⑼ㄟ^PIC16F877的I2C方式驅(qū)動(dòng)D/A轉(zhuǎn)換器MAX518,使其D/A0通道輸出
//一個(gè)連續(xù)的正弦波形(注:本程序并沒對(duì)正弦波的頻率進(jìn)行控制)
const char table[ ] = {0X80,0X86,0X8D, 0X93,0X99,0X9F,0XA5,0XAB,
0XB1,0XB7,0XBC,0XC2,0XC7,0XCC,0XD1,0XD6,0XDA,0XDF,0XE3,0XE7,0XEA,0XEE,0XF1,0XF4,0XF6,0XF8,0XFA,0XFC,0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFD,0XFB,0XF9,0XF7,0XF5,0XF2,0XEF,0XEC,0XE9,0XE5,0XE1,0XDD,0XD8,0XD4,0XCF,0XCA,0XC5,0XBF,0XBA,0XB4,0XAE,0XA8,0XA2,0X9C,0X96,0X90,0X89,0X83,0X80,0X79,0X72,0X6C,0X66,0X60,0X5A,0X55,0X4E,0X48,0X43,0X3D,0X38,0X33,0X2E,0X29,0X25,0X20,0X1C,0X18,0X15,0X11,0X0E,0X0B,0X09,0X07,0X05,0X03,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X02,0X04,0X06,0X08,0X0A,0X0D,0X10,0X13,0X16,0X1A,0X1E,0X22,0X27,0X2B,0X30,0X35,0X3A,0X40,0X45,0X4C,0X51,0X57,0X5D,0X63,0X69,0X6F,0X76,0X7C};
//以上的數(shù)組用于存放正弦表,在定義數(shù)組時(shí),前面應(yīng)該加上 const,
//以使數(shù)組存放于ROM中,而不至于占用太多的RAM
unsigned char i;
unsigned char j;
unsigned char n;
//I2C初始化子程序
void i2cint()
{
SSPCON = 0X08; //初始化SSPCON寄存器
TRISC3 =1; //設(shè)置SCL為輸入口
TRISC4 =1; //設(shè)置SDA為輸入口
TRISA4 = 0;
SSPSTAT=0X80; //初始化SSPSTAT寄存器
SSPADD=0X02; //設(shè)定I2C時(shí)鐘頻率
SSPCON2=0X00; //初始化SSPCON2寄存器
di(); //關(guān)閉總中斷
SSPIF=0; //清SSP中斷標(biāo)志
RA4=0; //關(guān)掉74HC165的移位時(shí)鐘使能,以免74HC165
//移位數(shù)據(jù)輸出與I2C總線的數(shù)據(jù)線發(fā)生沖突
SSPEN=1; //SSP模塊使能
}
//I2C總線輸出數(shù)據(jù)子程序
void i2cout()
{
SEN=1; //產(chǎn)生I2C啟動(dòng)信號(hào)
for(n=0x02;—n;) continue;//給予一定的延時(shí),保證啟動(dòng)
do {
RSEN=1; //產(chǎn)生I2C啟動(dòng)信號(hào)
}while(SSPIF==0); //如果沒能啟動(dòng),則反復(fù)啟動(dòng),直到啟動(dòng)為止
SSPIF=0; //SSPIF標(biāo)志清0
SSPBUF=0X58; //I2C總線發(fā)送地址字節(jié)
do {
;
}while(SSPIF==0); //等待地址發(fā)送完畢
SSPIF=0; //SSPIF標(biāo)志清0
SSPBUF=0X01; //I2C總線發(fā)送命令字節(jié)
do {
;
}while(SSPIF==0); //等待命令發(fā)送完畢
SSPIF=0; //SSPIF標(biāo)志清0
SSPBUF=j; //I2C總線發(fā)送數(shù)據(jù)字節(jié)
do {
;
}while(SSPIF==0); //等待數(shù)據(jù)發(fā)送完畢
SSPIF=0; //SSPIF標(biāo)志清0
PEN=1; //產(chǎn)生停止條件
do {
;
}while(SSPIF==0); //等待停止條件產(chǎn)生
SSPIF=0; //SSPIF標(biāo)志清0
}
//主程序
main ()
{
i2cint(); //I2C初始化
while(1){
for(i=0x00;i<=127;++i)
{
j=table[i]; //從數(shù)組中得到需要傳輸?shù)臄?shù)據(jù)量
i2cout(); //利用I2C總線方式送出數(shù)據(jù)
}
}
}

阿坝| 和政县| 萨嘎县| 和平区| 平原县| 通海县| 亚东县| 胶南市| 教育| 北海市| 罗田县| 宁津县| 延津县| 牡丹江市| 山西省| 潼南县| 岐山县| 昭平县| 固阳县| 兰坪| 镇雄县| 无为县| 阜城县| 兴和县| 永靖县| 泌阳县| 滦平县| 江口县| 郴州市| 永城市| 东港市| 大姚县| 高青县| 枣强县| 东安县| 马关县| 游戏| 扎兰屯市| 凌云县| 东明县| 镇远县|